[FFmpeg-cvslog] ffmpeg: Compensate non monotonicity errors in the audio TSs.

Michael Niedermayer git at videolan.org
Fri Apr 13 02:57:31 CEST 2012


ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Wed Apr 11 20:24:00 2012 +0200| [bd3ea317976820bf921f44c3829a2c48f80823fa] | committer: Michael Niedermayer

ffmpeg: Compensate non monotonicity errors in the audio TSs.

Audio timestamps are passed through by default and when the input
doesnt contain clean timestamps this can lead to non monotonicity
errors. (rounding to a course timebase can cause this too)

Print a warning when the errors in the timestamps are large

Fixes Ticket1167 (regression since timestamps are passed through)

This is a generic workaround that is intended to handle
slightly incorrect input files. It is very possible that some
demuxers contain bugs that lead to wrong timestamps, these demuxers
should of course still be fixed even if this change happens to
hide the issue.

Signed-off-by: Michael Niedermayer <michaelni at gmx.at>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=bd3ea317976820bf921f44c3829a2c48f80823fa
---

 ffmpeg.c |    8 +++++++-
 1 files changed, 7 insertions(+), 1 deletions(-)

diff --git a/ffmpeg.c b/ffmpeg.c
index 093d7cc..f5025b0 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -1132,8 +1132,14 @@ static int encode_audio_frame(AVFormatContext *s, OutputStream *ost,
     if (got_packet) {
         if (pkt.pts != AV_NOPTS_VALUE)
             pkt.pts      = av_rescale_q(pkt.pts,      enc->time_base, ost->st->time_base);
-        if (pkt.dts != AV_NOPTS_VALUE)
+        if (pkt.dts != AV_NOPTS_VALUE) {
+            int64_t max = ost->st->cur_dts + !(s->oformat->flags & AVFMT_TS_NONSTRICT);
             pkt.dts      = av_rescale_q(pkt.dts,      enc->time_base, ost->st->time_base);
+            if (ost->st->cur_dts && ost->st->cur_dts != AV_NOPTS_VALUE &&  max > pkt.dts) {
+                av_log(s, max - pkt.dts > 2 ? AV_LOG_WARNING : AV_LOG_DEBUG, "Audio timestamp %"PRId64" < %"PRId64" invalid, cliping\n", pkt.dts, max);
+                pkt.pts = pkt.dts = max;
+            }
+        }
         if (pkt.duration > 0)
             pkt.duration = av_rescale_q(pkt.duration, enc->time_base, ost->st->time_base);
 



More information about the ffmpeg-cvslog mailing list