fftools/ffmpeg_mux: set stream duration after the timebase is certainly known

Stop assuming the encoder knows the muxing timebase, which does not
always have to hold (e.g. due to bitstream filters).
pull/389/head
Anton Khirnov 2 years ago
parent ba1141d8a9
commit 57021a68d9
  1. 4
      fftools/ffmpeg_enc.c
  2. 5
      fftools/ffmpeg_mux.c
  3. 3
      fftools/ffmpeg_mux.h
  4. 10
      fftools/ffmpeg_mux_init.c

@ -445,10 +445,6 @@ int enc_open(OutputStream *ost, AVFrame *frame)
if (ost->st->time_base.num <= 0 || ost->st->time_base.den <= 0)
ost->st->time_base = av_add_q(ost->enc_ctx->time_base, (AVRational){0, 1});
// copy estimated duration as a hint to the muxer
if (ost->st->duration <= 0 && ist && ist->st->duration > 0)
ost->st->duration = av_rescale_q(ist->st->duration, ist->st->time_base, ost->st->time_base);
ost->mux_timebase = enc_ctx->time_base;
ret = of_stream_init(of, ost);

@ -666,6 +666,11 @@ int of_stream_init(OutputFile *of, OutputStream *ost)
if (ret < 0)
return ret;
if (ms->stream_duration) {
ost->st->duration = av_rescale_q(ms->stream_duration, ms->stream_duration_tb,
ost->st->time_base);
}
ost->initialized = 1;
return mux_check_init(mux);

@ -69,6 +69,9 @@ typedef struct MuxStream {
* used for making up missing dts values */
int64_t last_mux_dts;
int64_t stream_duration;
AVRational stream_duration_tb;
// audio streamcopy - state for av_rescale_delta()
int64_t ts_rescale_delta_last;

@ -914,10 +914,6 @@ static int streamcopy_init(const Muxer *mux, OutputStream *ost)
ost->st->time_base = av_add_q(av_stream_get_codec_timebase(ost->st), (AVRational){0, 1});
}
// copy estimated duration as a hint to the muxer
if (ost->st->duration <= 0 && ist->st->duration > 0)
ost->st->duration = av_rescale_q(ist->st->duration, ist->st->time_base, ost->st->time_base);
if (!ms->copy_prior_start) {
ms->ts_copy_start = (mux->of.start_time == AV_NOPTS_VALUE) ?
0 : mux->of.start_time;
@ -1283,6 +1279,12 @@ static OutputStream *ost_add(Muxer *mux, const OptionsContext *o,
exit_program(1);
}
// copy estimated duration as a hint to the muxer
if (ost->ist && ost->ist->st->duration > 0) {
ms->stream_duration = ist->st->duration;
ms->stream_duration_tb = ist->st->time_base;
}
return ost;
}

Loading…
Cancel
Save