From df7625ed62897debf950e842116dc800afd8b5d7 Mon Sep 17 00:00:00 2001 From: Wolfram Gloger Date: Wed, 21 Mar 2007 10:48:10 +0000 Subject: [PATCH] av_estimate_timings_from_pts() flushes the packet queue but doesn't reset the streams' cur_dts values. This can lead to a fatal "error, non monotone timestamps ..." message later, because the out-of-date cur_dts values are used to compute some packet's dts. Fix this by calling av_read_frame_flush() and eliminate code duplication in the process. The additional hunk gives more detailed error messages. patch by Wolfram Gloger, wmglo dent.med.uni-muenchen de Originally committed as revision 8465 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/utils.c | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/libavformat/utils.c b/libavformat/utils.c index 417e81c5d7..8330a429f1 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -1460,21 +1460,7 @@ static void av_estimate_timings_from_pts(AVFormatContext *ic, offset_t old_offse int64_t end_time; int64_t filesize, offset, duration; - /* free previous packet */ - if (ic->cur_st && ic->cur_st->parser) - av_free_packet(&ic->cur_pkt); - ic->cur_st = NULL; - - /* flush packet queue */ - flush_packet_queue(ic); - - for(i=0;inb_streams;i++) { - st = ic->streams[i]; - if (st->parser) { - av_parser_close(st->parser); - st->parser= NULL; - } - } + av_read_frame_flush(ic); /* we read the first packets to get the first PTS (not fully accurate, but it is enough now) */ @@ -2129,11 +2115,12 @@ static int compute_pkt_fields2(AVStream *st, AVPacket *pkt){ } if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){ - av_log(NULL, AV_LOG_ERROR, "error, non monotone timestamps %"PRId64" >= %"PRId64"\n", st->cur_dts, pkt->dts); + av_log(NULL, AV_LOG_ERROR, "error, non monotone timestamps %"PRId64" >= %"PRId64" st:%d\n", st->cur_dts, pkt->dts, st->index); return -1; } if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){ - av_log(NULL, AV_LOG_ERROR, "error, pts < dts\n"); + av_log(NULL, AV_LOG_ERROR, "error, pts < dts (%"PRId64" < %"PRId64")\n", + pkt->pts, pkt->dts); return -1; }