Check for pts==dts on I/P frames in the presence of non low delay decoding and
authorMichael Niedermayer <michaelni@gmx.at>
Sun, 19 Oct 2008 01:02:48 +0000 (01:02 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 19 Oct 2008 01:02:48 +0000 (01:02 +0000)
discard these invalid timestamps.
fixes issue171.

Originally committed as revision 15641 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/utils.c

index f4377fed3d60489f489ba6ce30b5e9ce7bd8babb..51bc5c58fb7aafc59124fc3c8d7c2c367fd102ed 100644 (file)
@@ -838,6 +838,14 @@ static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
         pkt->dts -= 1LL<<st->pts_wrap_bits;
     }
 
         pkt->dts -= 1LL<<st->pts_wrap_bits;
     }
 
+    // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
+    // we take the conservative approach and discard both
+    // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
+    if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
+        av_log(s, AV_LOG_ERROR, "invalid dts/pts combination\n");
+        pkt->dts= pkt->pts= AV_NOPTS_VALUE;
+    }
+
     if (pkt->duration == 0) {
         compute_frame_duration(&num, &den, st, pc, pkt);
         if (den && num) {
     if (pkt->duration == 0) {
         compute_frame_duration(&num, &den, st, pc, pkt);
         if (den && num) {