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,