Commit 10208a47 authored by diego's avatar diego

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


git-svn-id: file:///var/local/repositories/ffmpeg/trunk@8465 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent c93965d5
...@@ -1460,21 +1460,7 @@ static void av_estimate_timings_from_pts(AVFormatContext *ic, offset_t old_offse ...@@ -1460,21 +1460,7 @@ static void av_estimate_timings_from_pts(AVFormatContext *ic, offset_t old_offse
int64_t end_time; int64_t end_time;
int64_t filesize, offset, duration; int64_t filesize, offset, duration;
/* free previous packet */ av_read_frame_flush(ic);
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;i<ic->nb_streams;i++) {
st = ic->streams[i];
if (st->parser) {
av_parser_close(st->parser);
st->parser= NULL;
}
}
/* we read the first packets to get the first PTS (not fully /* we read the first packets to get the first PTS (not fully
accurate, but it is enough now) */ accurate, but it is enough now) */
...@@ -2129,11 +2115,12 @@ static int compute_pkt_fields2(AVStream *st, AVPacket *pkt){ ...@@ -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){ 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; return -1;
} }
if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){ 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; return -1;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment