mirror of
https://github.com/opencv/opencv.git
synced 2025-07-31 01:47:12 +08:00
Merge pull request #10584 from eruffaldi:F10583_videoio_ffmpeg_lossless
This commit is contained in:
commit
a724525c00
@ -1963,6 +1963,7 @@ static inline bool cv_ff_codec_tag_match(const AVCodecTag *tags, CV_CODEC_ID id,
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool cv_ff_codec_tag_list_match(const AVCodecTag *const *tags, CV_CODEC_ID id, unsigned int tag)
|
||||
{
|
||||
int i;
|
||||
@ -1974,6 +1975,21 @@ static inline bool cv_ff_codec_tag_list_match(const AVCodecTag *const *tags, CV_
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
static inline void cv_ff_codec_tag_dump(const AVCodecTag *const *tags)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; tags && tags[i]; i++) {
|
||||
const AVCodecTag * ptags = tags[i];
|
||||
while (ptags->id != AV_CODEC_ID_NONE)
|
||||
{
|
||||
unsigned int tag = ptags->tag;
|
||||
printf("fourcc tag 0x%08x/'%c%c%c%c' codec_id %04X\n", tag, CV_TAG_TO_PRINTABLE_CHAR4(tag), ptags->id);
|
||||
ptags++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Create a video writer object that uses FFMPEG
|
||||
bool CvVideoWriter_FFMPEG::open( const char * filename, int fourcc,
|
||||
double fps, int width, int height, bool is_color )
|
||||
@ -2017,6 +2033,13 @@ bool CvVideoWriter_FFMPEG::open( const char * filename, int fourcc,
|
||||
input_pix_fmt = AV_PIX_FMT_GRAY8;
|
||||
}
|
||||
|
||||
if (fourcc == -1)
|
||||
{
|
||||
fprintf(stderr,"OpenCV: FFMPEG: format %s / %s\n", fmt->name, fmt->long_name);
|
||||
cv_ff_codec_tag_dump(fmt->codec_tag);
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Lookup codec_id for given fourcc */
|
||||
#if LIBAVCODEC_VERSION_INT<((51<<16)+(49<<8)+0)
|
||||
if( (codec_id = codec_get_bmp_id( fourcc )) == CV_CODEC(CODEC_ID_NONE) )
|
||||
@ -2048,6 +2071,8 @@ bool CvVideoWriter_FFMPEG::open( const char * filename, int fourcc,
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// validate tag
|
||||
if (cv_ff_codec_tag_list_match(fmt->codec_tag, codec_id, fourcc) == false)
|
||||
{
|
||||
@ -2085,11 +2110,78 @@ bool CvVideoWriter_FFMPEG::open( const char * filename, int fourcc,
|
||||
#if LIBAVCODEC_VERSION_INT>((50<<16)+(1<<8)+0)
|
||||
case CV_CODEC(CODEC_ID_JPEGLS):
|
||||
// BGR24 or GRAY8 depending on is_color...
|
||||
// supported: bgr24 rgb24 gray gray16le
|
||||
// as of version 3.4.1
|
||||
codec_pix_fmt = input_pix_fmt;
|
||||
break;
|
||||
#endif
|
||||
case CV_CODEC(CODEC_ID_HUFFYUV):
|
||||
codec_pix_fmt = AV_PIX_FMT_YUV422P;
|
||||
// supported: yuv422p rgb24 bgra
|
||||
// as of version 3.4.1
|
||||
switch(input_pix_fmt)
|
||||
{
|
||||
case AV_PIX_FMT_RGB24:
|
||||
case AV_PIX_FMT_BGRA:
|
||||
codec_pix_fmt = input_pix_fmt;
|
||||
break;
|
||||
case AV_PIX_FMT_BGR24:
|
||||
codec_pix_fmt = AV_PIX_FMT_RGB24;
|
||||
break;
|
||||
default:
|
||||
codec_pix_fmt = AV_PIX_FMT_YUV422P;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case CV_CODEC(CODEC_ID_PNG):
|
||||
// supported: rgb24 rgba rgb48be rgba64be pal8 gray ya8 gray16be ya16be monob
|
||||
// as of version 3.4.1
|
||||
switch(input_pix_fmt)
|
||||
{
|
||||
case AV_PIX_FMT_GRAY8:
|
||||
case AV_PIX_FMT_GRAY16BE:
|
||||
case AV_PIX_FMT_RGB24:
|
||||
case AV_PIX_FMT_BGRA:
|
||||
codec_pix_fmt = input_pix_fmt;
|
||||
break;
|
||||
case AV_PIX_FMT_GRAY16LE:
|
||||
codec_pix_fmt = AV_PIX_FMT_GRAY16BE;
|
||||
break;
|
||||
case AV_PIX_FMT_BGR24:
|
||||
codec_pix_fmt = AV_PIX_FMT_RGB24;
|
||||
break;
|
||||
default:
|
||||
codec_pix_fmt = AV_PIX_FMT_YUV422P;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case CV_CODEC(CODEC_ID_FFV1):
|
||||
// supported: MANY
|
||||
// as of version 3.4.1
|
||||
switch(input_pix_fmt)
|
||||
{
|
||||
case AV_PIX_FMT_GRAY8:
|
||||
case AV_PIX_FMT_GRAY16LE:
|
||||
#ifdef AV_PIX_FMT_BGR0
|
||||
case AV_PIX_FMT_BGR0:
|
||||
#endif
|
||||
case AV_PIX_FMT_BGRA:
|
||||
codec_pix_fmt = input_pix_fmt;
|
||||
break;
|
||||
case AV_PIX_FMT_GRAY16BE:
|
||||
codec_pix_fmt = AV_PIX_FMT_GRAY16LE;
|
||||
break;
|
||||
case AV_PIX_FMT_BGR24:
|
||||
case AV_PIX_FMT_RGB24:
|
||||
#ifdef AV_PIX_FMT_BGR0
|
||||
codec_pix_fmt = AV_PIX_FMT_BGR0;
|
||||
#else
|
||||
codec_pix_fmt = AV_PIX_FMT_BGRA;
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
codec_pix_fmt = AV_PIX_FMT_YUV422P;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case CV_CODEC(CODEC_ID_MJPEG):
|
||||
case CV_CODEC(CODEC_ID_LJPEG):
|
||||
@ -2097,9 +2189,25 @@ bool CvVideoWriter_FFMPEG::open( const char * filename, int fourcc,
|
||||
bitrate_scale = 3;
|
||||
break;
|
||||
case CV_CODEC(CODEC_ID_RAWVIDEO):
|
||||
codec_pix_fmt = input_pix_fmt == AV_PIX_FMT_GRAY8 ||
|
||||
input_pix_fmt == AV_PIX_FMT_GRAY16LE ||
|
||||
input_pix_fmt == AV_PIX_FMT_GRAY16BE ? input_pix_fmt : AV_PIX_FMT_YUV420P;
|
||||
// RGBA is the only RGB fourcc supported by AVI and MKV format
|
||||
if(fourcc == CV_FOURCC('R','G','B','A'))
|
||||
{
|
||||
codec_pix_fmt = AV_PIX_FMT_RGBA;
|
||||
}
|
||||
else
|
||||
{
|
||||
switch(input_pix_fmt)
|
||||
{
|
||||
case AV_PIX_FMT_GRAY8:
|
||||
case AV_PIX_FMT_GRAY16LE:
|
||||
case AV_PIX_FMT_GRAY16BE:
|
||||
codec_pix_fmt = input_pix_fmt;
|
||||
break;
|
||||
default:
|
||||
codec_pix_fmt = AV_PIX_FMT_YUV420P;
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
// good for lossy formats, MPEG, etc.
|
||||
|
Loading…
Reference in New Issue
Block a user