[Ffmpeg-devel] [PATCH] Bug in av_estimate_timings_from_pts
Wolfram Gloger
wmglo
Sun Mar 18 15:11:13 CET 2007
Hi,
The recent timestamp changes to libavformat/utils.c exposed a
longstanding bug:
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.
The appended patch fixes this by calling av_read_frame_flush(), which
also eliminates code duplication.
The additional hunk gives more detailed error messages.
Regards,
Wolfram.
diff -Naur trunk/libavformat/utils.c ffmpeg-wg/libavformat/utils.c
--- trunk/libavformat/utils.c Sat Mar 17 16:05:04 2007
+++ ffmpeg-wg/libavformat/utils.c Sun Mar 18 14:15:01 2007
@@ -1460,21 +1460,7 @@
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;i<ic->nb_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 @@
}
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;
}
More information about the ffmpeg-devel
mailing list