diff options
author | wm4 <nfxjfg@googlemail.com> | 2017-05-23 13:36:38 +0200 |
---|---|---|
committer | wm4 <nfxjfg@googlemail.com> | 2017-06-07 11:08:06 +0200 |
commit | 66cf78e932956eaa7d5a9dab8766efbfc1431e55 (patch) | |
tree | 6fb2a32d50643c5b00d5c7a149d2bba21a7f8142 /libavformat | |
parent | 34c52005605d68f7cd1957b169b6732c7d2447d9 (diff) | |
download | ffmpeg-66cf78e932956eaa7d5a9dab8766efbfc1431e55.tar.gz |
lavf: consider codec framerate for framerate detection
Fixes detection of some TV sample as 24.5 FPS. With the patch applied,
it's detected as 25 FPS.
This is enabled for mpegts only.
Diffstat (limited to 'libavformat')
-rw-r--r-- | libavformat/internal.h | 5 | ||||
-rw-r--r-- | libavformat/mpegts.c | 2 | ||||
-rw-r--r-- | libavformat/utils.c | 10 |
3 files changed, 17 insertions, 0 deletions
diff --git a/libavformat/internal.h b/libavformat/internal.h index c856945ce9..d136c79bdd 100644 --- a/libavformat/internal.h +++ b/libavformat/internal.h @@ -145,6 +145,11 @@ struct AVFormatInternal { * ID3v2 tag useful for MP3 demuxing */ AVDictionary *id3v2_meta; + + /* + * Prefer the codec framerate for avg_frame_rate computation. + */ + int prefer_codec_framerate; }; struct AVStreamInternal { diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c index 3eff1522bd..4d2f5c6802 100644 --- a/libavformat/mpegts.c +++ b/libavformat/mpegts.c @@ -2616,6 +2616,8 @@ static int mpegts_read_header(AVFormatContext *s) int len; int64_t pos, probesize = s->probesize; + s->internal->prefer_codec_framerate = 1; + if (ffio_ensure_seekback(pb, probesize) < 0) av_log(s, AV_LOG_WARNING, "Failed to allocate buffers for seekback\n"); diff --git a/libavformat/utils.c b/libavformat/utils.c index c641377385..38d247c6cd 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -3904,6 +3904,7 @@ FF_ENABLE_DEPRECATION_WARNINGS st->info->codec_info_duration) { int best_fps = 0; double best_error = 0.01; + AVRational codec_frame_rate = avctx->framerate; if (st->info->codec_info_duration >= INT64_MAX / st->time_base.num / 2|| st->info->codec_info_duration_fields >= INT64_MAX / st->time_base.den || @@ -3924,6 +3925,15 @@ FF_ENABLE_DEPRECATION_WARNINGS best_error = error; best_fps = std_fps.num; } + + if (ic->internal->prefer_codec_framerate && codec_frame_rate.num > 0 && codec_frame_rate.den > 0) { + error = fabs(av_q2d(codec_frame_rate) / + av_q2d(std_fps) - 1); + if (error < best_error) { + best_error = error; + best_fps = std_fps.num; + } + } } if (best_fps) av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den, |