mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-11-26 19:01:44 +02:00
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).
This commit is contained in:
parent
ba1141d8a9
commit
57021a68d9
@ -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…
Reference in New Issue
Block a user