changeset 21983:a6b624360aef

better autodetection of framerate in case of h264; it works correctly with b-frames. Patch by Eugen Hoyos (cehoyos ag or at)
author nicodvb
date Tue, 23 Jan 2007 22:26:13 +0000
parents fa66a03e8920
children 607909d7cc56
files libmpdemux/demux_rtp_codec.cpp
diffstat 1 files changed, 8 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/libmpdemux/demux_rtp_codec.cpp	Tue Jan 23 15:28:19 2007 +0000
+++ b/libmpdemux/demux_rtp_codec.cpp	Tue Jan 23 22:26:13 2007 +0000
@@ -4,6 +4,7 @@
 #include "demux_rtp_internal.h"
 extern "C" {
 #include <limits.h>
+#include <math.h>
 #include "stheader.h"
 }
 
@@ -247,19 +248,24 @@
   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 <frame-rate>\" option instead.)\n", fps);
       sh_video->fps = fps;
+      sh_video->frametime=1.0f/fps;
       return;
+        }
+      if (fps>lastfps) lastfps = fps;
     }
     lastPTS = curPTS;
   }