Hack partially based on a commit by Michael Niedermayer <michaelni@gmx.at> Should fix (or work around) bug 458.tags/n2.0
@@ -348,6 +348,25 @@ static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost) | |||||
bsfc = bsfc->next; | 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; 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; | pkt->stream_index = ost->index; | ||||
ret = av_interleaved_write_frame(s, pkt); | ret = av_interleaved_write_frame(s, pkt); | ||||
if (ret < 0) { | if (ret < 0) { | ||||
@@ -266,6 +266,8 @@ typedef struct OutputStream { | |||||
/* pts of the first frame encoded for this stream, used for limiting | /* pts of the first frame encoded for this stream, used for limiting | ||||
* recording time */ | * recording time */ | ||||
int64_t first_pts; | int64_t first_pts; | ||||
/* dts of the last packet sent to the muxer */ | |||||
int64_t last_mux_dts; | |||||
AVBitStreamFilterContext *bitstream_filters; | AVBitStreamFilterContext *bitstream_filters; | ||||
AVCodec *enc; | AVCodec *enc; | ||||
int64_t max_frames; | int64_t max_frames; | ||||
@@ -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); | av_dict_copy(&ost->resample_opts, o->g->resample_opts, 0); | ||||
ost->pix_fmts[0] = ost->pix_fmts[1] = AV_PIX_FMT_NONE; | ost->pix_fmts[0] = ost->pix_fmts[1] = AV_PIX_FMT_NONE; | ||||
ost->last_mux_dts = AV_NOPTS_VALUE; | |||||
return ost; | return ost; | ||||
} | } | ||||