From 4c1f61b1e87974f1b715d69a28429c5e1616ff17 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Sat, 23 Mar 2013 04:30:19 +0100 Subject: [PATCH] ffmpeg: Correct inter stream timestamp discontinuities Signed-off-by: Michael Niedermayer --- ffmpeg.c | 20 ++++++++++++++++++++ ffmpeg.h | 1 + 2 files changed, 21 insertions(+) diff --git a/ffmpeg.c b/ffmpeg.c index 17740d1e59..822f7f8718 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -2942,6 +2942,23 @@ static int process_input(int file_index) if (pkt.dts != AV_NOPTS_VALUE) pkt.dts *= ist->ts_scale; + if (pkt.dts != AV_NOPTS_VALUE && ist->next_dts == AV_NOPTS_VALUE && !copy_ts + && (is->iformat->flags & AVFMT_TS_DISCONT) && ifile->last_ts != AV_NOPTS_VALUE) { + int64_t pkt_dts = av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q); + int64_t delta = pkt_dts - ifile->last_ts; + if(delta < -1LL*dts_delta_threshold*AV_TIME_BASE || + (delta > 1LL*dts_delta_threshold*AV_TIME_BASE && + ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE)){ + ifile->ts_offset -= delta; + av_log(NULL, AV_LOG_DEBUG, + "Inter stream timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", + delta, ifile->ts_offset); + pkt.dts -= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base); + if (pkt.pts != AV_NOPTS_VALUE) + pkt.pts -= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base); + } + } + if (pkt.dts != AV_NOPTS_VALUE && ist->next_dts != AV_NOPTS_VALUE && !copy_ts) { int64_t pkt_dts = av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q); @@ -2979,6 +2996,9 @@ static int process_input(int file_index) } } + if (pkt.dts != AV_NOPTS_VALUE) + ifile->last_ts = av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q); + if (debug_ts) { av_log(NULL, AV_LOG_INFO, "demuxer+ffmpeg -> ist_index:%d type:%s pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s off:%s off_time:%s\n", ifile->ist_index + pkt.stream_index, av_get_media_type_string(ist->st->codec->codec_type), diff --git a/ffmpeg.h b/ffmpeg.h index f7178ff6f5..9a86b506a0 100644 --- a/ffmpeg.h +++ b/ffmpeg.h @@ -278,6 +278,7 @@ typedef struct InputFile { int eagain; /* true if last read attempt returned EAGAIN */ int ist_index; /* index of first stream in input_streams */ int64_t ts_offset; + int64_t last_ts; int nb_streams; /* number of stream that ffmpeg is aware of; may be different from ctx.nb_streams if new streams appear during av_read_frame() */ int nb_streams_warn; /* number of streams that the user was warned of */