changeset 1941:c2d0bdc9e6f1 libavformat

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
author diego
date Wed, 21 Mar 2007 10:48:10 +0000
parents 1a7f66384792
children 70b741fa63eb
files utils.c
diffstat 1 files changed, 4 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/utils.c	Wed Mar 21 10:28:03 2007 +0000
+++ b/utils.c	Wed Mar 21 10:48:10 2007 +0000
@@ -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;
     }