diff options
Diffstat (limited to 'chromium/third_party/ffmpeg/libavformat/mxf.c')
-rw-r--r-- | chromium/third_party/ffmpeg/libavformat/mxf.c | 46 |
1 files changed, 29 insertions, 17 deletions
diff --git a/chromium/third_party/ffmpeg/libavformat/mxf.c b/chromium/third_party/ffmpeg/libavformat/mxf.c index 4a4158a1d33..d20ed946ac6 100644 --- a/chromium/third_party/ffmpeg/libavformat/mxf.c +++ b/chromium/third_party/ffmpeg/libavformat/mxf.c @@ -45,6 +45,7 @@ const MXFCodecUL ff_mxf_codec_uls[] = { { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x71,0x00,0x00,0x00 }, 13, AV_CODEC_ID_DNXHD }, /* SMPTE VC-3/DNxHD */ { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x03,0x02,0x00,0x00 }, 14, AV_CODEC_ID_DNXHD }, /* SMPTE VC-3/DNxHD */ { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x01,0x32,0x00,0x00 }, 14, AV_CODEC_ID_H264 }, /* H.264/MPEG-4 AVC Intra */ + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x01,0x31,0x11,0x01 }, 14, AV_CODEC_ID_H264 }, /* H.264/MPEG-4 AVC SPS/PPS in-band */ { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x01,0x01,0x02,0x02,0x01 }, 16, AV_CODEC_ID_V210 }, /* V210 */ /* SoundEssenceCompression */ { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 }, 13, AV_CODEC_ID_PCM_S16LE }, /* Uncompressed */ @@ -107,7 +108,7 @@ int ff_mxf_decode_pixel_layout(const char pixel_layout[16], enum AVPixelFormat * return -1; } -static const MXFSamplesPerFrame mxf_samples_per_frames[] = { +static const MXFSamplesPerFrame mxf_spf[] = { { { 1001, 24000 }, { 2002, 0, 0, 0, 0, 0 } }, // FILM 23.976 { { 1, 24}, { 2000, 0, 0, 0, 0, 0 } }, // FILM 24 { { 1001, 30000 }, { 1602, 1601, 1602, 1601, 1602, 0 } }, // NTSC 29.97 @@ -116,22 +117,33 @@ static const MXFSamplesPerFrame mxf_samples_per_frames[] = { { { 1, 50 }, { 960, 0, 0, 0, 0, 0 } }, // PAL 50 }; -const MXFSamplesPerFrame *ff_mxf_get_samples_per_frame(AVFormatContext *s, AVRational time_base) +static const AVRational mxf_time_base[] = { + { 1001, 24000 }, + { 1, 24}, + { 1001, 30000 }, + { 1001, 60000 }, + { 1, 25 }, + { 1, 50 }, + { 0, 0} +}; + +const MXFSamplesPerFrame *ff_mxf_get_samples_per_frame(AVFormatContext *s, + AVRational time_base) { - int i; - for (i = 0; i < FF_ARRAY_ELEMS(mxf_samples_per_frames); i++) { - if (!av_cmp_q(mxf_samples_per_frames[i].time_base, time_base)) - return &mxf_samples_per_frames[i]; - } + int idx = av_find_nearest_q_idx(time_base, mxf_time_base); + AVRational diff = av_sub_q(time_base, mxf_time_base[idx]); - // Find closest container time base for approximative codec time base like 1/29.97, 1/30, ... - for (i = 0; i < FF_ARRAY_ELEMS(mxf_samples_per_frames); i++) { - if (fabs(av_q2d(mxf_samples_per_frames[i].time_base) - av_q2d(time_base)) < 0.0001) { - av_log(s, AV_LOG_WARNING, "%d/%d input time base matched %d/%d container time base\n", - time_base.num, time_base.den, - mxf_samples_per_frames[i].time_base.num, mxf_samples_per_frames[i].time_base.den); - return &mxf_samples_per_frames[i]; - } - } - return NULL; + diff.num = abs(diff.num); + + if (av_cmp_q(diff, (AVRational){1, 1000}) >= 0) + return NULL; + + if (av_cmp_q(time_base, mxf_time_base[idx])) + av_log(s, AV_LOG_WARNING, + "%d/%d input time base matched %d/%d container time base\n", + time_base.num, time_base.den, + mxf_spf[idx].time_base.num, + mxf_spf[idx].time_base.den); + + return &mxf_spf[idx]; } |