From ef29ff34ff9222a55c5e4672ba2ace3b21db630c Mon Sep 17 00:00:00 2001 From: nicodvb Date: Tue, 23 Jan 2007 22:26:13 +0000 Subject: [PATCH] better autodetection of framerate in case of h264; it works correctly with b-frames. Patch by Eugen Hoyos (cehoyos ag or at) git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@22001 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libmpdemux/demux_rtp_codec.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/libmpdemux/demux_rtp_codec.cpp b/libmpdemux/demux_rtp_codec.cpp index eda8b04c82..0eb3e60e93 100644 --- a/libmpdemux/demux_rtp_codec.cpp +++ b/libmpdemux/demux_rtp_codec.cpp @@ -4,6 +4,7 @@ #include "demux_rtp_internal.h" extern "C" { #include +#include #include "stheader.h" } @@ -247,19 +248,24 @@ static void needVideoFrameRate(demuxer_t* demuxer, unsigned char* packetData; unsigned packetDataLen; float lastPTS = 0.0, curPTS; unsigned const maxNumFramesToWaitFor = 300; + int lastfps = 0; for (unsigned i = 0; i < maxNumFramesToWaitFor; ++i) { if (!awaitRTPPacket(demuxer, d_video, packetData, packetDataLen, curPTS)) { break; } - if (curPTS > lastPTS && lastPTS != 0.0) { + if (curPTS != lastPTS && lastPTS != 0.0) { // Use the difference between these two "pts"s to guess the frame rate. // (should really check that there were no missing frames inbetween)##### // Guess the frame rate as an integer. If it's not, use "-fps" instead. - fps = (int)(1/(curPTS-lastPTS) + 0.5); // rounding + fps = (int)(1/fabs(curPTS-lastPTS) + 0.5); // rounding + if (fps == lastfps) { fprintf(stderr, "demux_rtp: Guessed the video frame rate as %d frames-per-second.\n\t(If this is wrong, use the \"-fps \" option instead.)\n", fps); sh_video->fps = fps; + sh_video->frametime=1.0f/fps; return; + } + if (fps>lastfps) lastfps = fps; } lastPTS = curPTS; }