From patchwork Thu Jun 27 08:44:02 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 50192 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:bc92:0:b0:482:c625:d099 with SMTP id p18csp317022vqy; Thu, 27 Jun 2024 01:44:48 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUdGMN125u2ckLp+syERDaeAsZnP0B2LsMv024+/2/iBqIHPdw+GY7pbS7prf1dTmMykvj0M/3Q7JBv4tyWlnKi90nMd4BplAvu6g== X-Google-Smtp-Source: AGHT+IG7IQIPPsTMSwCULMhjQOqDEND0gJwAYNmvEp9ZTbfEOVnaTMTnejB4UyRDG93MRW1V0lgk X-Received: by 2002:a05:6512:3a8b:b0:52c:e1d4:8ecd with SMTP id 2adb3069b0e04-52ce1d49146mr10605141e87.8.1719477888643; Thu, 27 Jun 2024 01:44:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1719477888; cv=none; d=google.com; s=arc-20160816; b=f1vkMiRfvn6GpwZBs0HgVyMXJSWZP1hQySJ97eRAQTUl6cGm2uMU9OgqeLDdGo2kF/ VEGGr3yVuIha6P5LoxKbEVyN9ID/KWNjFJZ4XAfj5CP9Tr8TYgqo3LjFD+MR0c4xLi51 kV2AxGQOy7zJg0NpS+9WUp58tio7+anaVw9v1priPTMgi0i3EADx9Yn309y/Kx4TQwVF IDkG/VfHqOv8E8i/6h8UT1yExbC6UYDOR/c4CnvLxKNEF5zjhaHIzqUDdRryP4IUB488 22EfdcaiLGDrwKmiN0cZG8WxGoiO9/x3Bx9oZLqYMRsI7+Z9HV+jC9/+hVpsVIAzqQri VtIg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=iRuxntoBYOS7443iw5mnmeBmy9N0c57R+7SGNpstHeU=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=fZd7uUWYNOV/qbFmkVj4IZPbVYQ9vriI1EcT2xXL/cmkpSZBOnm7wLg76sVDS8FkB/ 5XY5jSekIsHPc9dutIkQIVUh1AbH2VESRlzbZwhgQfLNcaT2aATRHbYospLDpXDJ1lWC 8wgVZdUbdCQZshJ4dA6tNjanKbOdA6ij+i5jOtZ31ro0ccxJsYbzQf1SGRpvgIH+q/b7 lzLyalxFpdLYekwdhgECBi42xMwSCeuVhjo5vnWSQuAge0NF+I11qfN4RQWu/npN2M/W 8TFKUDxpwhMv/MQrpREOxtHE6Zhu/x95CFNWgPtXD21To2/mWeyQZvP30pU5kRGYqoko +cQA==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=BK7i0nQv; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 2adb3069b0e04-52e7131ecf2si263078e87.620.2024.06.27.01.44.48; Thu, 27 Jun 2024 01:44:48 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=BK7i0nQv; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id BAED068D5B7; Thu, 27 Jun 2024 11:44:23 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9492468C5BB for ; Thu, 27 Jun 2024 11:44:13 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=BK7i0nQv; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id 27DB14DA2 for ; Thu, 27 Jun 2024 10:44:13 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id p2LZxeuRa15E for ; Thu, 27 Jun 2024 10:44:10 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1719477850; bh=MsQa3HB198GOt83vPVL99dnBDWq3xLHg/Ix3w26msqM=; h=From:To:Subject:Date:In-Reply-To:References:From; b=BK7i0nQvrSDP0r7vCjoe7Ghy9bpOPaXEoNIzsf/ODas1RmD4TBaTrB+HoiLA92WhA qan0PlE2gcIetULpfzoKg9ry9nLsEEVdN1Lb337ZE2nIufivfOk7UvrTjNVsckbXYf Zgo1zBEAA1gd7uN/pSMVtiogqOgsWWjp4Q9aYF0Z+DAIH/PRH5JFDDKk6Dmbyv82YR ath0uAFno9UlykUs0EVQj9soAkdaMCoge9mGxbOSZI7w3TL30fQZH02k56O4Dz+Ihd wZW3NE0MBcjLAGW+jh0PzvcMypBxNIXEKiPUhsNeNbJOQARa/Jj9Yv+cvgrQZUCRNi OTBolR8K2JysA== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id 95B7E207 for ; Thu, 27 Jun 2024 10:44:10 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 605563A083A for ; Thu, 27 Jun 2024 10:44:04 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Thu, 27 Jun 2024 10:44:02 +0200 Message-ID: <20240627084402.32474-3-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240627084402.32474-1-anton@khirnov.net> References: <20240627084402.32474-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/3] fftools/ffmpeg_mux_init: make encoder_opts local to ost_add() X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 59g+4nEbVovQ It is no longer needed after this function returns. --- fftools/ffmpeg.h | 2 -- fftools/ffmpeg_mux.c | 1 - fftools/ffmpeg_mux_init.c | 71 ++++++++++++++++++++++----------------- 3 files changed, 40 insertions(+), 34 deletions(-) diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h index 8e849bbedc..8b51659693 100644 --- a/fftools/ffmpeg.h +++ b/fftools/ffmpeg.h @@ -586,8 +586,6 @@ typedef struct OutputStream { FilterGraph *fg_simple; OutputFilter *filter; - AVDictionary *encoder_opts; - char *attachment_filename; /* stats */ diff --git a/fftools/ffmpeg_mux.c b/fftools/ffmpeg_mux.c index 055e2f3678..de3e052152 100644 --- a/fftools/ffmpeg_mux.c +++ b/fftools/ffmpeg_mux.c @@ -813,7 +813,6 @@ static void ost_free(OutputStream **post) av_packet_free(&ms->bsf_pkt); av_packet_free(&ms->pkt); - av_dict_free(&ost->encoder_opts); av_freep(&ost->kf.pts); av_expr_free(ost->kf.pexpr); diff --git a/fftools/ffmpeg_mux_init.c b/fftools/ffmpeg_mux_init.c index 447d6a5329..3e4661fd6d 100644 --- a/fftools/ffmpeg_mux_init.c +++ b/fftools/ffmpeg_mux_init.c @@ -905,7 +905,7 @@ static int new_stream_subtitle(Muxer *mux, const OptionsContext *o, return 0; } -static int streamcopy_init(const Muxer *mux, OutputStream *ost) +static int streamcopy_init(const Muxer *mux, OutputStream *ost, AVDictionary **encoder_opts) { MuxStream *ms = ms_from_ost(ost); @@ -928,7 +928,7 @@ static int streamcopy_init(const Muxer *mux, OutputStream *ost) ret = avcodec_parameters_to_context(codec_ctx, ist->par); if (ret >= 0) - ret = av_opt_set_dict(codec_ctx, &ost->encoder_opts); + ret = av_opt_set_dict(codec_ctx, encoder_opts); if (ret < 0) { av_log(ost, AV_LOG_FATAL, "Error setting up codec context options.\n"); @@ -1039,6 +1039,7 @@ static int ost_add(Muxer *mux, const OptionsContext *o, enum AVMediaType type, OutputStream *ost; const AVCodec *enc; AVStream *st; + AVDictionary *encoder_opts = NULL; int ret = 0, keep_pix_fmt = 0, autoscale = 1; int threads_manual = 0; AVRational enc_tb = { 0, 0 }; @@ -1160,10 +1161,10 @@ static int ost_add(Muxer *mux, const OptionsContext *o, enum AVMediaType type, const char *enc_time_base = NULL; ret = filter_codec_opts(o->g->codec_opts, enc->codec_id, - oc, st, enc->codec, &ost->encoder_opts, + oc, st, enc->codec, &encoder_opts, &mux->enc_opts_used); if (ret < 0) - return ret; + goto fail; MATCH_PER_STREAM_OPT(presets, str, preset, oc, st); @@ -1187,7 +1188,7 @@ static int ost_add(Muxer *mux, const OptionsContext *o, enum AVMediaType type, break; } *arg++ = 0; - av_dict_set(&ost->encoder_opts, buf, arg, AV_DICT_DONT_OVERWRITE); + av_dict_set(&encoder_opts, buf, arg, AV_DICT_DONT_OVERWRITE); } while (!s->eof_reached); av_bprint_finalize(&bprint, NULL); avio_closep(&s); @@ -1195,7 +1196,7 @@ static int ost_add(Muxer *mux, const OptionsContext *o, enum AVMediaType type, if (ret) { av_log(ost, AV_LOG_FATAL, "Preset %s specified, but could not be opened.\n", preset); - return ret; + goto fail; } MATCH_PER_STREAM_OPT(enc_stats_pre, str, enc_stats_pre, oc, st); @@ -1207,7 +1208,7 @@ static int ost_add(Muxer *mux, const OptionsContext *o, enum AVMediaType type, ret = enc_stats_init(ost, &ost->enc_stats_pre, 1, enc_stats_pre, format); if (ret < 0) - return ret; + goto fail; } MATCH_PER_STREAM_OPT(enc_stats_post, str, enc_stats_post, oc, st); @@ -1219,7 +1220,7 @@ static int ost_add(Muxer *mux, const OptionsContext *o, enum AVMediaType type, ret = enc_stats_init(ost, &ost->enc_stats_post, 0, enc_stats_post, format); if (ret < 0) - return ret; + goto fail; } MATCH_PER_STREAM_OPT(mux_stats, str, mux_stats, oc, st); @@ -1231,7 +1232,7 @@ static int ost_add(Muxer *mux, const OptionsContext *o, enum AVMediaType type, ret = enc_stats_init(ost, &ms->stats, 0, mux_stats, format); if (ret < 0) - return ret; + goto fail; } MATCH_PER_STREAM_OPT(enc_time_bases, str, enc_time_base, oc, st); @@ -1253,7 +1254,8 @@ static int ost_add(Muxer *mux, const OptionsContext *o, enum AVMediaType type, #endif ) { av_log(ost, AV_LOG_FATAL, "Invalid time base: %s\n", enc_time_base); - return ret < 0 ? ret : AVERROR(EINVAL); + ret = ret < 0 ? ret : AVERROR(EINVAL); + goto fail; } #if FFMPEG_OPT_ENC_TIME_BASE_NUM if (q.num < 0) @@ -1265,28 +1267,28 @@ static int ost_add(Muxer *mux, const OptionsContext *o, enum AVMediaType type, enc_tb = q; } - threads_manual = !!av_dict_get(ost->encoder_opts, "threads", NULL, 0); + threads_manual = !!av_dict_get(encoder_opts, "threads", NULL, 0); - ret = av_opt_set_dict2(ost->enc_ctx, &ost->encoder_opts, AV_OPT_SEARCH_CHILDREN); + ret = av_opt_set_dict2(ost->enc_ctx, &encoder_opts, AV_OPT_SEARCH_CHILDREN); if (ret < 0) { av_log(ost, AV_LOG_ERROR, "Error applying encoder options: %s\n", av_err2str(ret)); - return ret; + goto fail; } - ret = check_avoptions(ost->encoder_opts); + ret = check_avoptions(encoder_opts); if (ret < 0) - return ret; + goto fail; // default to automatic thread count if (!threads_manual) ost->enc_ctx->thread_count = 0; } else { ret = filter_codec_opts(o->g->codec_opts, AV_CODEC_ID_NONE, oc, st, - NULL, &ost->encoder_opts, + NULL, &encoder_opts, &mux->enc_opts_used); if (ret < 0) - return ret; + goto fail; } @@ -1302,7 +1304,8 @@ static int ost_add(Muxer *mux, const OptionsContext *o, enum AVMediaType type, if (av_parse_ratio(&q, time_base, INT_MAX, 0, NULL) < 0 || q.num <= 0 || q.den <= 0) { av_log(ost, AV_LOG_FATAL, "Invalid time base: %s\n", time_base); - return AVERROR(EINVAL); + ret = AVERROR(EINVAL); + goto fail; } st->time_base = q; } @@ -1325,7 +1328,7 @@ static int ost_add(Muxer *mux, const OptionsContext *o, enum AVMediaType type, ret = av_bsf_list_parse_str(bsfs, &ms->bsf_ctx); if (ret < 0) { av_log(ost, AV_LOG_ERROR, "Error parsing bitstream filter sequence '%s': %s\n", bsfs, av_err2str(ret)); - return ret; + goto fail; } } @@ -1378,12 +1381,12 @@ static int ost_add(Muxer *mux, const OptionsContext *o, enum AVMediaType type, case AVMEDIA_TYPE_SUBTITLE: ret = new_stream_subtitle (mux, o, ost); break; } if (ret < 0) - return ret; + goto fail; if (type == AVMEDIA_TYPE_VIDEO || type == AVMEDIA_TYPE_AUDIO) { ret = ost_get_filters(o, oc, ost, &filters); if (ret < 0) - return ret; + goto fail; } if (ost->enc && @@ -1431,7 +1434,7 @@ static int ost_add(Muxer *mux, const OptionsContext *o, enum AVMediaType type, if (threads_manual) { ret = av_opt_get(ost->enc_ctx, "threads", 0, (uint8_t**)&opts.nb_threads); if (ret < 0) - return ret; + goto fail; } if (ofilter) { @@ -1443,18 +1446,19 @@ static int ost_add(Muxer *mux, const OptionsContext *o, enum AVMediaType type, } av_freep(&opts.nb_threads); if (ret < 0) - return ret; + goto fail; ret = sch_connect(mux->sch, SCH_ENC(ms->sch_idx_enc), SCH_MSTREAM(mux->sch_idx, ms->sch_idx)); if (ret < 0) - return ret; + goto fail; } else if (ost->ist) { int sched_idx = ist_output_add(ost->ist, ost); if (sched_idx < 0) { av_log(ost, AV_LOG_ERROR, "Error binding an input stream\n"); - return sched_idx; + ret = sched_idx; + goto fail; } ms->sch_idx_src = sched_idx; @@ -1462,24 +1466,24 @@ static int ost_add(Muxer *mux, const OptionsContext *o, enum AVMediaType type, ret = sch_connect(mux->sch, SCH_DEC(sched_idx), SCH_ENC(ms->sch_idx_enc)); if (ret < 0) - return ret; + goto fail; ret = sch_connect(mux->sch, SCH_ENC(ms->sch_idx_enc), SCH_MSTREAM(mux->sch_idx, ms->sch_idx)); if (ret < 0) - return ret; + goto fail; } else { ret = sch_connect(mux->sch, SCH_DSTREAM(ost->ist->file->index, sched_idx), SCH_MSTREAM(ost->file->index, ms->sch_idx)); if (ret < 0) - return ret; + goto fail; } } if (ost->ist && !ost->enc) { - ret = streamcopy_init(mux, ost); + ret = streamcopy_init(mux, ost, &encoder_opts); if (ret < 0) - return ret; + goto fail; } // copy estimated duration as a hint to the muxer @@ -1491,7 +1495,12 @@ static int ost_add(Muxer *mux, const OptionsContext *o, enum AVMediaType type, if (post) *post = ost; - return 0; + ret = 0; + +fail: + av_dict_free(&encoder_opts); + + return ret; } static int map_auto_video(Muxer *mux, const OptionsContext *o)