mirror of https://git.ffmpeg.org/ffmpeg.git
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>
This commit is contained in:
parent
36993527dd
commit
7ac5c38ec5
|
@ -97,6 +97,8 @@ struct AVFormatInternal {
|
||||||
AVRational offset_timebase;
|
AVRational offset_timebase;
|
||||||
|
|
||||||
int inject_global_side_data;
|
int inject_global_side_data;
|
||||||
|
|
||||||
|
int avoid_negative_ts_use_pts;
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
|
|
|
@ -557,10 +557,11 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt)
|
||||||
if (s->avoid_negative_ts > 0) {
|
if (s->avoid_negative_ts > 0) {
|
||||||
AVStream *st = s->streams[pkt->stream_index];
|
AVStream *st = s->streams[pkt->stream_index];
|
||||||
int64_t offset = st->mux_ts_offset;
|
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 &&
|
if (s->internal->offset == AV_NOPTS_VALUE && ts != AV_NOPTS_VALUE &&
|
||||||
(pkt->dts < 0 || s->avoid_negative_ts == AVFMT_AVOID_NEG_TS_MAKE_ZERO)) {
|
(ts < 0 || s->avoid_negative_ts == AVFMT_AVOID_NEG_TS_MAKE_ZERO)) {
|
||||||
s->internal->offset = -pkt->dts;
|
s->internal->offset = -ts;
|
||||||
s->internal->offset_timebase = st->time_base;
|
s->internal->offset_timebase = st->time_base;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -577,15 +578,26 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt)
|
||||||
if (pkt->pts != AV_NOPTS_VALUE)
|
if (pkt->pts != AV_NOPTS_VALUE)
|
||||||
pkt->pts += offset;
|
pkt->pts += offset;
|
||||||
|
|
||||||
av_assert2(pkt->dts == AV_NOPTS_VALUE || pkt->dts >= 0 || s->max_interleave_delta > 0);
|
if (s->internal->avoid_negative_ts_use_pts) {
|
||||||
if (pkt->dts != AV_NOPTS_VALUE && pkt->dts < 0) {
|
if (pkt->pts != AV_NOPTS_VALUE && pkt->pts < 0) {
|
||||||
av_log(s, AV_LOG_WARNING,
|
av_log(s, AV_LOG_WARNING, "failed to avoid negative "
|
||||||
"Packets poorly interleaved, failed to avoid negative "
|
"pts %s in stream %d.\n"
|
||||||
"timestamp %s in stream %d.\n"
|
"Try -avoid_negative_ts 1 as a possible workaround.\n",
|
||||||
"Try -max_interleave_delta 0 as a possible workaround.\n",
|
av_ts2str(pkt->dts),
|
||||||
av_ts2str(pkt->dts),
|
pkt->stream_index
|
||||||
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
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue