diff --git a/libavformat/utils.c b/libavformat/utils.c index 04a33a0405..79d502cd9e 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -632,6 +632,24 @@ static void update_initial_timestamps(AVFormatContext *s, int stream_index, st->start_time = pts; } +static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt) +{ + AVPacketList *pktl= s->packet_buffer; + + assert(pkt->duration && !st->cur_dts); + + for(; pktl; pktl= pktl->next){ + if(pktl->pkt.stream_index != pkt->stream_index) + continue; + if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE){ + pktl->pkt.pts= pktl->pkt.dts= st->cur_dts; + st->cur_dts += pkt->duration; + pktl->pkt.duration= pkt->duration; + }else + break; + } +} + static void compute_pkt_fields(AVFormatContext *s, AVStream *st, AVCodecParserContext *pc, AVPacket *pkt) { @@ -647,6 +665,9 @@ static void compute_pkt_fields(AVFormatContext *s, AVStream *st, compute_frame_duration(&num, &den, st, pc, pkt); if (den && num) { pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num); + + if(pkt->dts == AV_NOPTS_VALUE && pkt->pts == AV_NOPTS_VALUE && st->cur_dts == 0) + update_initial_durations(s, st, pkt); } } diff --git a/tests/seek.regression.ref b/tests/seek.regression.ref index cb2679b8ef..9e39ef2580 100644 --- a/tests/seek.regression.ref +++ b/tests/seek.regression.ref @@ -1075,57 +1075,57 @@ ret: 0 st: 0 dts:0.480000 pts:0.480000 pos:165884 size:12719 flags:1 ret:-1 st:-1 ts:-0.645825 flags:1 ---------------- tests/data/a-mp2.mp2 -ret: 0 st: 0 dts:-102481911520608.625000 pts:-102481911520608.625000 pos:0 size:417 flags:1 +ret: 0 st: 0 dts:0.000000 pts:0.000000 pos:0 size:417 flags:1 ret: 0 st:-1 ts:-1.000000 flags:0 -ret: 0 st: 0 dts:0.000000 pts:0.000000 pos:417 size:418 flags:1 +ret: 0 st: 0 dts:0.026122 pts:0.026122 pos:417 size:418 flags:1 ret: 0 st:-1 ts:1.894167 flags:1 -ret: 0 st: 0 dts:1.880800 pts:1.880800 pos:30511 size:417 flags:1 +ret: 0 st: 0 dts:1.880800 pts:1.880800 pos:30093 size:418 flags:1 ret: 0 st: 0 ts:0.788333 flags:0 -ret: 0 st: 0 dts:0.809789 pts:0.809789 pos:13374 size:418 flags:1 +ret: 0 st: 0 dts:0.809789 pts:0.809789 pos:12956 size:418 flags:1 ret: 0 st: 0 ts:-0.317500 flags:1 ret: 0 st: 0 dts:0.000000 pts:0.000000 pos:0 size:417 flags:1 ret: 0 st:-1 ts:2.576668 flags:0 -ret: 0 st: 0 dts:2.586100 pts:2.586100 pos:41795 size:418 flags:1 +ret: 0 st: 0 dts:2.586100 pts:2.586100 pos:41377 size:418 flags:1 ret: 0 st:-1 ts:1.470835 flags:1 -ret: 0 st: 0 dts:1.462844 pts:1.462844 pos:23823 size:418 flags:1 +ret: 0 st: 0 dts:1.462844 pts:1.462844 pos:23405 size:418 flags:1 ret: 0 st: 0 ts:0.365000 flags:0 -ret: 0 st: 0 dts:0.365711 pts:0.365711 pos:6269 size:418 flags:1 +ret: 0 st: 0 dts:0.365711 pts:0.365711 pos:5851 size:418 flags:1 ret: 0 st: 0 ts:-0.740833 flags:1 ret: 0 st: 0 dts:0.000000 pts:0.000000 pos:0 size:417 flags:1 ret: 0 st:-1 ts:2.153336 flags:0 -ret: 0 st: 0 dts:2.168144 pts:2.168144 pos:35108 size:418 flags:1 +ret: 0 st: 0 dts:2.168144 pts:2.168144 pos:34690 size:418 flags:1 ret: 0 st:-1 ts:1.047503 flags:1 -ret: 0 st: 0 dts:1.044889 pts:1.044889 pos:17136 size:418 flags:1 +ret: 0 st: 0 dts:1.044889 pts:1.044889 pos:16718 size:418 flags:1 ret: 0 st: 0 ts:-0.058333 flags:0 ret: 0 st: 0 dts:0.000000 pts:0.000000 pos:0 size:417 flags:1 ret: 0 st: 0 ts:2.835833 flags:1 -ret: 0 st: 0 dts:2.821200 pts:2.821200 pos:45557 size:418 flags:1 +ret: 0 st: 0 dts:2.821200 pts:2.821200 pos:45139 size:418 flags:1 ret: 0 st:-1 ts:1.730004 flags:0 -ret: 0 st: 0 dts:1.750189 pts:1.750189 pos:28421 size:418 flags:1 +ret: 0 st: 0 dts:1.750189 pts:1.750189 pos:28003 size:418 flags:1 ret: 0 st:-1 ts:0.624171 flags:1 -ret: 0 st: 0 dts:0.600811 pts:0.600811 pos:10031 size:417 flags:1 +ret: 0 st: 0 dts:0.600811 pts:0.600811 pos:9613 size:418 flags:1 ret: 0 st: 0 ts:-0.481667 flags:0 ret: 0 st: 0 dts:0.000000 pts:0.000000 pos:0 size:417 flags:1 ret: 0 st: 0 ts:2.412500 flags:1 -ret: 0 st: 0 dts:2.403244 pts:2.403244 pos:38870 size:418 flags:1 +ret: 0 st: 0 dts:2.403244 pts:2.403244 pos:38452 size:418 flags:1 ret: 0 st:-1 ts:1.306672 flags:0 -ret: 0 st: 0 dts:1.332233 pts:1.332233 pos:21733 size:418 flags:1 +ret: 0 st: 0 dts:1.332233 pts:1.332233 pos:21315 size:418 flags:1 ret: 0 st:-1 ts:0.200839 flags:1 -ret: 0 st: 0 dts:0.182856 pts:0.182856 pos:3343 size:418 flags:1 +ret: 0 st: 0 dts:0.182856 pts:0.182856 pos:2925 size:418 flags:1 ret: 0 st: 0 ts:-0.904989 flags:0 ret: 0 st: 0 dts:0.000000 pts:0.000000 pos:0 size:417 flags:1 ret: 0 st: 0 ts:1.989178 flags:1 -ret: 0 st: 0 dts:1.985289 pts:1.985289 pos:32182 size:418 flags:1 +ret: 0 st: 0 dts:1.985289 pts:1.985289 pos:31764 size:418 flags:1 ret: 0 st:-1 ts:0.883340 flags:0 -ret: 0 st: 0 dts:0.888156 pts:0.888156 pos:14628 size:418 flags:1 +ret: 0 st: 0 dts:0.888156 pts:0.888156 pos:14210 size:418 flags:1 ret: 0 st:-1 ts:-0.222493 flags:1 ret: 0 st: 0 dts:0.000000 pts:0.000000 pos:0 size:417 flags:1 ret: 0 st: 0 ts:2.671678 flags:0 -ret: 0 st: 0 dts:2.690589 pts:2.690589 pos:43467 size:418 flags:1 +ret: 0 st: 0 dts:2.690589 pts:2.690589 pos:43049 size:418 flags:1 ret: 0 st: 0 ts:1.565844 flags:1 -ret: 0 st: 0 dts:1.541211 pts:1.541211 pos:25077 size:418 flags:1 +ret: 0 st: 0 dts:1.541211 pts:1.541211 pos:24659 size:418 flags:1 ret: 0 st:-1 ts:0.460008 flags:0 -ret: 0 st: 0 dts:0.470200 pts:0.470200 pos:7941 size:418 flags:1 +ret: 0 st: 0 dts:0.470200 pts:0.470200 pos:7523 size:418 flags:1 ret: 0 st:-1 ts:-0.645825 flags:1 ret: 0 st: 0 dts:0.000000 pts:0.000000 pos:0 size:417 flags:1 ----------------