diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2015-05-05 12:44:20 +0200 |
---|---|---|
committer | James Almer <jamrial@gmail.com> | 2015-05-14 19:51:55 -0300 |
commit | 5a8b43285baa744d5450a4a37d98bcfb500c18fe (patch) | |
tree | 1e2649dd93029102bd786d1b668614c68bb6879b | |
parent | 8e94e5d3395ef08622e60033fd8c2969621832e0 (diff) | |
download | ffmpeg-5a8b43285baa744d5450a4a37d98bcfb500c18fe.tar.gz |
avformat/mux: Add avoid_negative_ts_use_pts
This allows using pts instead of dts for negative TS avoidance
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
(cherry picked from commit 7ac5c38ec5baeea6ad647ccc9bb7e97564c50ec2)
-rw-r--r-- | libavformat/internal.h | 2 | ||||
-rw-r--r-- | libavformat/mux.c | 36 |
2 files changed, 26 insertions, 12 deletions
diff --git a/libavformat/internal.h b/libavformat/internal.h index 76ffcc517e..5dacb45133 100644 --- a/libavformat/internal.h +++ b/libavformat/internal.h @@ -97,6 +97,8 @@ struct AVFormatInternal { AVRational offset_timebase; int inject_global_side_data; + + int avoid_negative_ts_use_pts; }; #ifdef __GNUC__ diff --git a/libavformat/mux.c b/libavformat/mux.c index 72d8e942d5..5dd0be8d23 100644 --- a/libavformat/mux.c +++ b/libavformat/mux.c @@ -554,10 +554,11 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt) if (s->avoid_negative_ts > 0) { AVStream *st = s->streams[pkt->stream_index]; int64_t offset = st->mux_ts_offset; + int64_t ts = s->internal->avoid_negative_ts_use_pts ? pkt->pts : pkt->dts; - if (s->internal->offset == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && - (pkt->dts < 0 || s->avoid_negative_ts == AVFMT_AVOID_NEG_TS_MAKE_ZERO)) { - s->internal->offset = -pkt->dts; + if (s->internal->offset == AV_NOPTS_VALUE && ts != AV_NOPTS_VALUE && + (ts < 0 || s->avoid_negative_ts == AVFMT_AVOID_NEG_TS_MAKE_ZERO)) { + s->internal->offset = -ts; s->internal->offset_timebase = st->time_base; } @@ -574,15 +575,26 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt) if (pkt->pts != AV_NOPTS_VALUE) pkt->pts += offset; - av_assert2(pkt->dts == AV_NOPTS_VALUE || pkt->dts >= 0 || s->max_interleave_delta > 0); - if (pkt->dts != AV_NOPTS_VALUE && pkt->dts < 0) { - av_log(s, AV_LOG_WARNING, - "Packets poorly interleaved, failed to avoid negative " - "timestamp %s in stream %d.\n" - "Try -max_interleave_delta 0 as a possible workaround.\n", - av_ts2str(pkt->dts), - pkt->stream_index - ); + if (s->internal->avoid_negative_ts_use_pts) { + if (pkt->pts != AV_NOPTS_VALUE && pkt->pts < 0) { + av_log(s, AV_LOG_WARNING, "failed to avoid negative " + "pts %s in stream %d.\n" + "Try -avoid_negative_ts 1 as a possible workaround.\n", + av_ts2str(pkt->dts), + pkt->stream_index + ); + } + } else { + av_assert2(pkt->dts == AV_NOPTS_VALUE || pkt->dts >= 0 || s->max_interleave_delta > 0); + if (pkt->dts != AV_NOPTS_VALUE && pkt->dts < 0) { + av_log(s, AV_LOG_WARNING, + "Packets poorly interleaved, failed to avoid negative " + "timestamp %s in stream %d.\n" + "Try -max_interleave_delta 0 as a possible workaround.\n", + av_ts2str(pkt->dts), + pkt->stream_index + ); + } } } |