From faa366003b58ba26484070ca408be4b9d5473a73 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Tue, 24 Sep 2024 12:31:12 +0200 Subject: [PATCH] fftools/ffmpeg_mux_init: consolidate connecting source to mux stream --- fftools/ffmpeg_mux_init.c | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/fftools/ffmpeg_mux_init.c b/fftools/ffmpeg_mux_init.c index 50ce45ef1b..944176ca5d 100644 --- a/fftools/ffmpeg_mux_init.c +++ b/fftools/ffmpeg_mux_init.c @@ -899,7 +899,8 @@ ost_bind_filter(const Muxer *mux, MuxStream *ms, OutputFilter *ofilter, const OptionsContext *o, AVRational enc_tb, enum VideoSyncMethod vsync_method, int keep_pix_fmt, int autoscale, int threads_manual, - const ViewSpecifier *vs) + const ViewSpecifier *vs, + SchedulerNode *src) { OutputStream *ost = &ms->ost; AVCodecContext *enc_ctx = ost->enc->enc_ctx; @@ -1005,12 +1006,9 @@ ost_bind_filter(const Muxer *mux, MuxStream *ms, OutputFilter *ofilter, if (ret < 0) return ret; - ret = sch_connect(mux->sch, SCH_ENC(ms->sch_idx_enc), - SCH_MSTREAM(mux->sch_idx, ms->sch_idx)); - if (ret < 0) - return ret; + *src = SCH_ENC(ms->sch_idx_enc); - return ret; + return 0; } static int streamcopy_init(const OptionsContext *o, const Muxer *mux, @@ -1188,6 +1186,7 @@ static int ost_add(Muxer *mux, const OptionsContext *o, enum AVMediaType type, OutputStream *ost; const AVCodec *enc; AVStream *st; + SchedulerNode src = { .type = SCH_NODE_TYPE_NONE }; AVDictionary *encoder_opts = NULL; int ret = 0, keep_pix_fmt = 0, autoscale = 1; int threads_manual = 0; @@ -1535,12 +1534,10 @@ static int ost_add(Muxer *mux, const OptionsContext *o, enum AVMediaType type, if (ost->enc && (type == AVMEDIA_TYPE_VIDEO || type == AVMEDIA_TYPE_AUDIO)) { ret = ost_bind_filter(mux, ms, ofilter, o, enc_tb, vsync_method, - keep_pix_fmt, autoscale, threads_manual, vs); + keep_pix_fmt, autoscale, threads_manual, vs, &src); if (ret < 0) goto fail; } else if (ost->ist) { - SchedulerNode src; - ret = ist_use(ost->ist, !!ost->enc, NULL, &src); if (ret < 0) { av_log(ost, AV_LOG_ERROR, @@ -1549,24 +1546,26 @@ static int ost_add(Muxer *mux, const OptionsContext *o, enum AVMediaType type, } ms->sch_idx_src = src.idx; + // src refers to a decoder for transcoding, demux stream otherwise if (ost->enc) { ret = sch_connect(mux->sch, src, SCH_ENC(ms->sch_idx_enc)); if (ret < 0) goto fail; - - ret = sch_connect(mux->sch, SCH_ENC(ms->sch_idx_enc), - SCH_MSTREAM(mux->sch_idx, ms->sch_idx)); - if (ret < 0) - goto fail; - } else { - ret = sch_connect(mux->sch, - src, SCH_MSTREAM(ost->file->index, ms->sch_idx)); - if (ret < 0) - goto fail; + src = SCH_ENC(ms->sch_idx_enc); } } + if (src.type != SCH_NODE_TYPE_NONE) { + ret = sch_connect(mux->sch, + src, SCH_MSTREAM(mux->sch_idx, ms->sch_idx)); + if (ret < 0) + goto fail; + } else { + // only attachment streams don't have a source + av_assert0(type == AVMEDIA_TYPE_ATTACHMENT && ms->sch_idx < 0); + } + if (ost->ist && !ost->enc) { ret = streamcopy_init(o, mux, ost, &encoder_opts); if (ret < 0)