diff utils.c @ 1569:d440e6a53bae libavformat

the next r_frame_rate try ... discard first duration accumulate remaining durations add 15000/1001 and 12000/1001
author michael
date Tue, 12 Dec 2006 14:07:46 +0000
parents e2fcff5c3d7d
children cffb8f8e1ed6
line wrap: on
line diff
--- a/utils.c	Tue Dec 12 12:29:33 2006 +0000
+++ b/utils.c	Tue Dec 12 14:07:46 2006 +0000
@@ -1760,10 +1760,10 @@
 /* maximum duration until we stop analysing the stream */
 #define MAX_STREAM_DURATION  ((int)(AV_TIME_BASE * 3.0))
 
-#define MAX_STD_TIMEBASES (60*12+3)
+#define MAX_STD_TIMEBASES (60*12+5)
 static int get_std_framerate(int i){
     if(i<60*12) return i*1001;
-    else        return ((int[]){24,30,60})[i-60*12]*1000*12;
+    else        return ((int[]){24,30,60,12,15})[i-60*12]*1000*12;
 }
 
 /**
@@ -1894,18 +1894,21 @@
 
 //                if(st->codec->codec_type == CODEC_TYPE_VIDEO)
 //                    av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
+                if(duration_count[index] > 0){
                 for(i=1; i<MAX_STD_TIMEBASES; i++){
                     int framerate= get_std_framerate(i);
                     int ticks= lrintf(dur*framerate/(1001*12));
                     double error= dur - ticks*1001*12/(double)framerate;
                     duration_error[index][i] += error*error;
                 }
+                }
                 duration_count[index]++;
 
                 if(st->codec_info_nb_frames == 0 && 0)
                     st->codec_info_duration += duration;
             }
-            last_dts[pkt->stream_index]= pkt->dts;
+            if(last == AV_NOPTS_VALUE || duration_count[index]<=1)
+                last_dts[pkt->stream_index]= pkt->dts;
         }
         if(st->parser && st->parser->parser->split && !st->codec->extradata){
             int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);