summaryrefslogtreecommitdiff
path: root/libavformat
diff options
context:
space:
mode:
authorAnssi Hannula <anssi.hannula@iki.fi>2011-04-28 20:47:40 +0200
committerReinhard Tartler <siretart@sandy.tauware.de>2011-04-29 22:46:13 +0200
commit7c152a458d3fb0a2fb1aef1f05bfee90fe70697e (patch)
tree10d871325c8fe7f40629da6dcfdc1b3f6d5c6b3e /libavformat
parent0247bdee2581a6857a24c5ff297f01d3a3112b11 (diff)
downloadffmpeg-7c152a458d3fb0a2fb1aef1f05bfee90fe70697e.tar.gz
lavf: inspect more frames for fps when container time base is coarse
As per issue2629, most 23.976fps matroska H.264 files are incorrectly detected as 24fps, as the matroska timestamps usually have only millisecond precision. Fix that by doubling the amount of timestamps inspected for frame rate for streams that have coarse time base. This also fixes 29.970 detection in matroska. Signed-off-by: Michael Niedermayer <michaelni@gmx.at> (cherry picked from commit 78431098f9e306ebe27e7698d0ae539e3df2afe9) Tested with mplayer based on this report http://thread.gmane.org/gmane.comp.video.mplayer.user/66043/focus=66063 Signed-off-by: Reinhard Tartler <siretart@tauware.de>
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/utils.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/libavformat/utils.c b/libavformat/utils.c
index 6d6c8308ca..79e70f943e 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -2217,12 +2217,20 @@ int av_find_stream_info(AVFormatContext *ic)
/* check if one codec still needs to be handled */
for(i=0;i<ic->nb_streams;i++) {
+ int fps_analyze_framecount = 20;
+
st = ic->streams[i];
if (!has_codec_parameters(st->codec))
break;
+ /* if the timebase is coarse (like the usual millisecond precision
+ of mkv), we need to analyze more frames to reliably arrive at
+ the correct fps */
+ if (av_q2d(st->time_base) > 0.0005)
+ fps_analyze_framecount *= 2;
/* variable fps and no guess at the real fps */
if( tb_unreliable(st->codec) && !(st->r_frame_rate.num && st->avg_frame_rate.num)
- && st->info->duration_count<20 && st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
+ && st->info->duration_count < fps_analyze_framecount
+ && st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
break;
if(st->parser && st->parser->parser->split && !st->codec->extradata)
break;