# HG changeset patch # User benoit # Date 1188806186 0 # Node ID b08793768c302004f970504e7032c12f72ecbd1f # Parent 4ca7ed628eff9059ab4b17908a47b28334f09afa 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 diff -r 4ca7ed628eff -r b08793768c30 utils.c --- 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;