[FFmpeg-cvslog] r15468 - trunk/libavformat/mov.c

bcoudurier subversion
Tue Sep 30 04:44:57 CEST 2008


Author: bcoudurier
Date: Tue Sep 30 04:44:57 2008
New Revision: 15468

Log:
support negative ctts in some way, unset wrong dts

Modified:
   trunk/libavformat/mov.c

Modified: trunk/libavformat/mov.c
==============================================================================
--- trunk/libavformat/mov.c	(original)
+++ trunk/libavformat/mov.c	Tue Sep 30 04:44:57 2008
@@ -133,6 +133,7 @@ typedef struct MOVStreamContext {
     unsigned drefs_count;
     MOV_dref_t *drefs;
     int dref_id;
+    int wrong_dts; ///< dts are wrong due to negative ctts
 } MOVStreamContext;
 
 typedef struct MOVContext {
@@ -1166,15 +1167,13 @@ static int mov_read_ctts(MOVContext *c, 
         int duration =get_be32(pb);
 
         if (duration < 0) {
-            av_log(c->fc, AV_LOG_WARNING, "negative ctts, ignoring\n");
-            sc->ctts_count = 0;
-            url_fskip(pb, 8 * (entries - i - 1));
-            break;
+            sc->wrong_dts = 1;
+            st->codec->has_b_frames = 1;
         }
         sc->ctts_data[i].count   = count;
         sc->ctts_data[i].duration= duration;
 
-        sc->time_rate= ff_gcd(sc->time_rate, duration);
+        sc->time_rate= ff_gcd(sc->time_rate, FFABS(duration));
     }
     return 0;
 }
@@ -1882,6 +1881,8 @@ static int mov_read_packet(AVFormatConte
             sc->sample_to_ctime_index++;
             sc->sample_to_ctime_sample = 0;
         }
+        if (sc->wrong_dts)
+            pkt->dts = AV_NOPTS_VALUE;
     } else {
         AVStream *st = s->streams[sc->ffindex];
         int64_t next_dts = (sc->current_sample < sc->sample_count) ?




More information about the ffmpeg-cvslog mailing list