changeset 3058:33ecae58665a libavformat

revert 12156 Log: Make timestamp interpolation work with mpeg2 field pictures. Cleaner/simpler solutions are welcome. ---- A IMHO cleaner solution has been implemented.
author michael
date Wed, 20 Feb 2008 20:24:38 +0000
parents b2853b499660
children f982a5a75e40
files avformat.h utils.c
diffstat 2 files changed, 11 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/avformat.h	Wed Feb 20 10:19:35 2008 +0000
+++ b/avformat.h	Wed Feb 20 20:24:38 2008 +0000
@@ -337,8 +337,8 @@
     struct AVCodecParserContext *parser;
 
     int64_t cur_dts;
-    int last_IP_duration[2];
-    int64_t last_IP_pts[2];
+    int last_IP_duration;
+    int64_t last_IP_pts;
     /* av_seek_frame() support */
     AVIndexEntry *index_entries; /**< only used if the format does not
                                     support seeking natively */
--- a/utils.c	Wed Feb 20 10:19:35 2008 +0000
+++ b/utils.c	Wed Feb 20 20:24:38 2008 +0000
@@ -703,30 +703,21 @@
     /* interpolate PTS and DTS if they are not present */
     if(delay <=1){
         if (presentation_delayed) {
-            int fields= 2 + (pc ? pc->repeat_pict : 0);
-            int field_duration= pkt->duration / fields;
-            int parity= pc ? pc->parity : 0;
             /* DTS = decompression timestamp */
             /* PTS = presentation timestamp */
             if (pkt->dts == AV_NOPTS_VALUE)
-                pkt->dts = st->last_IP_pts[parity];
+                pkt->dts = st->last_IP_pts;
             update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
             if (pkt->dts == AV_NOPTS_VALUE)
                 pkt->dts = st->cur_dts;
 
             /* this is tricky: the dts must be incremented by the duration
             of the frame we are displaying, i.e. the last I- or P-frame */
-            st->cur_dts = pkt->dts;
-            for(i=0; i<fields; i++){
-                int p= (parity + i)&1;
-                if(!st->last_IP_duration[p])
-                    st->last_IP_duration[p]= field_duration;
-                st->cur_dts += st->last_IP_duration[p];
-                st->last_IP_pts[p]= pkt->pts;
-                if(pkt->pts != AV_NOPTS_VALUE)
-                    st->last_IP_pts[p] += i*field_duration;
-                st->last_IP_duration[p]= field_duration;
-            }
+            if (st->last_IP_duration == 0)
+                st->last_IP_duration = pkt->duration;
+            st->cur_dts = pkt->dts + st->last_IP_duration;
+            st->last_IP_duration  = pkt->duration;
+            st->last_IP_pts= pkt->pts;
             /* cannot compute PTS if not present (we can compute it only
             by knowing the future */
         } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
@@ -1024,8 +1015,7 @@
             av_parser_close(st->parser);
             st->parser = NULL;
         }
-        st->last_IP_pts[0] =
-        st->last_IP_pts[1] = AV_NOPTS_VALUE;
+        st->last_IP_pts = AV_NOPTS_VALUE;
         st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
     }
 }
@@ -1633,8 +1623,7 @@
     for(i=0; i<ic->nb_streams; i++){
         st= ic->streams[i];
         st->cur_dts= st->first_dts;
-        st->last_IP_pts[0] =
-        st->last_IP_pts[1] = AV_NOPTS_VALUE;
+        st->last_IP_pts = AV_NOPTS_VALUE;
     }
 }
 
@@ -2193,8 +2182,7 @@
 
     /* default pts setting is MPEG-like */
     av_set_pts_info(st, 33, 1, 90000);
-    st->last_IP_pts[0] =
-    st->last_IP_pts[1] = AV_NOPTS_VALUE;
+    st->last_IP_pts = AV_NOPTS_VALUE;
     for(i=0; i<MAX_REORDER_DELAY+1; i++)
         st->pts_buffer[i]= AV_NOPTS_VALUE;