changeset 2421:b08793768c30 libavformat

If a stream has no start time, but the first packet has a 'pts', use that pts to set the start_time. patch by Neil Brown: [neilb suse de] original thread: [FFmpeg-devel] [patch 3/3] Make timing calculations less dependant on start_time being defined. date: 08/16/2007 08:27 AM
author benoit
date Mon, 03 Sep 2007 07:56:26 +0000
parents 4ca7ed628eff
children f3a8f7d55bd1
files utils.c
diffstat 1 files changed, 8 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/utils.c	Mon Sep 03 07:28:58 2007 +0000
+++ b/utils.c	Mon Sep 03 07:56:26 2007 +0000
@@ -590,7 +590,9 @@
     return 0;
 }
 
-static void update_initial_timestamps(AVFormatContext *s, int stream_index, int64_t dts){
+static void update_initial_timestamps(AVFormatContext *s, int stream_index,
+                                      int64_t dts, int64_t pts)
+{
     AVStream *st= s->streams[stream_index];
     AVPacketList *pktl= s->packet_buffer;
 
@@ -613,6 +615,8 @@
         if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
             st->start_time= pktl->pkt.pts;
     }
+    if (st->start_time == AV_NOPTS_VALUE)
+        st->start_time = pts;
 }
 
 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
@@ -670,7 +674,7 @@
             /* PTS = presentation time stamp */
             if (pkt->dts == AV_NOPTS_VALUE)
                 pkt->dts = st->last_IP_pts;
-            update_initial_timestamps(s, pkt->stream_index, pkt->dts);
+            update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
             if (pkt->dts == AV_NOPTS_VALUE)
                 pkt->dts = st->cur_dts;
 
@@ -696,7 +700,7 @@
             /* presentation is not delayed : PTS and DTS are the same */
             if(pkt->pts == AV_NOPTS_VALUE)
                 pkt->pts = pkt->dts;
-            update_initial_timestamps(s, pkt->stream_index, pkt->pts);
+            update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
             if(pkt->pts == AV_NOPTS_VALUE)
                 pkt->pts = st->cur_dts;
             pkt->dts = pkt->pts;
@@ -713,7 +717,7 @@
         if(pkt->dts == AV_NOPTS_VALUE)
             pkt->dts= st->pts_buffer[0];
         if(delay>1){
-            update_initial_timestamps(s, pkt->stream_index, pkt->dts); // this should happen on the first packet
+            update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
         }
         if(pkt->dts > st->cur_dts)
             st->cur_dts = pkt->dts;