From: Anton Khirnov <[email protected]> Only some formats allows non-monotonous DTS, remuxing to a format not supporting it requires overwriting the values to something acceptable.
Hack partially based on a commit by Michael Niedermayer <[email protected]> Should fix (or work around) bug 458. Signed-off-by: Luca Barbato <[email protected]> --- Would be probably nicer if we check that the input IS supporting them and issue a warning and ask for a sample if it does not. avconv.c | 22 ++++++++++++++++++++++ avconv.h | 2 ++ avconv_opt.c | 1 + 3 files changed, 25 insertions(+) diff --git a/avconv.c b/avconv.c index 658dadc..c8f0536 100644 --- a/avconv.c +++ b/avconv.c @@ -348,6 +348,28 @@ static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost) bsfc = bsfc->next; } + if (!(s->oformat->flags & AVFMT_NOTIMESTAMPS) && + ost->last_mux_dts != AV_NOPTS_VALUE && + pkt->dts < ost->last_mux_dts + !(s->oformat->flags & AVFMT_TS_NONSTRICT)) { + av_log(NULL, AV_LOG_WARNING, + "Non-monotonous DTS in output stream %d:%d not supported " + "by the output format; " + "previous: %"PRId64", current: %"PRId64"; ", + ost->file_index, ost->st->index, ost->last_mux_dts, pkt->dts); + if (exit_on_error) { + av_log(NULL, AV_LOG_FATAL, "aborting.\n"); + exit(1); + } + av_log(NULL, AV_LOG_WARNING, "changing to %"PRId64". This may result " + "in incorrect timestamps in the output file.\n", + ost->last_mux_dts + 1); + + pkt->dts = ost->last_mux_dts + 1; + if (pkt->pts != AV_NOPTS_VALUE) + pkt->pts = FFMAX(pkt->pts, pkt->dts); + } + ost->last_mux_dts = pkt->dts; + pkt->stream_index = ost->index; ret = av_interleaved_write_frame(s, pkt); if (ret < 0) { diff --git a/avconv.h b/avconv.h index 782e0c0..1244d86 100644 --- a/avconv.h +++ b/avconv.h @@ -266,6 +266,8 @@ typedef struct OutputStream { /* pts of the first frame encoded for this stream, used for limiting * recording time */ int64_t first_pts; + /* dts of the last packet sent to the muxer */ + int64_t last_mux_dts; AVBitStreamFilterContext *bitstream_filters; AVCodec *enc; int64_t max_frames; diff --git a/avconv_opt.c b/avconv_opt.c index 1a4d891..0cf3b8b 100644 --- a/avconv_opt.c +++ b/avconv_opt.c @@ -904,6 +904,7 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e av_dict_copy(&ost->resample_opts, o->g->resample_opts, 0); ost->pix_fmts[0] = ost->pix_fmts[1] = AV_PIX_FMT_NONE; + ost->last_mux_dts = AV_NOPTS_VALUE; return ost; } -- 1.8.1.5 _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
