From patchwork Fri Mar 18 22:47:48 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 34848 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6838:3486:0:0:0:0 with SMTP id ek6csp2173581nkb; Fri, 18 Mar 2022 15:48:10 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxEn8WATWJHi7FIniKMweVKPI/ieDwyXUKh9ytkiMin3akiSq0LbdU2EKRnOLopmDj5QWXx X-Received: by 2002:a05:6402:5243:b0:418:e5f7:7b1 with SMTP id t3-20020a056402524300b00418e5f707b1mr11904573edd.153.1647643690546; Fri, 18 Mar 2022 15:48:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1647643690; cv=none; d=google.com; s=arc-20160816; b=zqXjuINfxEtGQMYxzd/gCPz4fOU95/fjxeXex6f67Y7BR7Su9oykrH6j0jBC8ONR83 oRDIQt3OTh07YCaoarS7htC6UleStdPyPPjeKTYTsPCDvocMoo6X4lp0LDmI5iN6UiRA KJ2GN77HyZETMiw+54HrLuRthDj/FlJDYdggFnwBNwvWDa6dki8vgeiFxpG9D+42rfVf SjSqGSuMh1iyI36u/Bvvsjxxl6RZWH/8kovU9NdHSwEyOKaBEQ8rI6iIkd1GSGJI6B55 dpjifEpIvhngJ86Yy3+Za0hwkMyITfjD0CVMxeWqCS4lEV9G+bHKExCMPJ/ShXXdz+Py 8EoA== 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=IJNuualDE46k1X7b6t30qZWjNqWikEeuTArtZuNxRbU=; b=A7Pht0nzS2zScfIZtna2x4qZTvFnS4MJvfoURq1IyOQ10CfrfEzfvU7FlNVIJysBga 2aeQetToxCPvn+HG2xMg0+yoBVIk6+KMozCEbpRlyT8SoXG2+3OjGCNEMj9hhi+yNaRd 4rYQboZ8uNJrALF1K5tVvvGjn4MaesLGLP/j5HNU8itft7AiZsrl9A+9zzDfPT79xV1k gupARbKzrxPkY1dMLEMl+HbM4o44Kt89wqXABpyTVNiZ/8Qipy68BIjg2IYRei4M4IVU m3LNSUOr+YQb1X8kv2vVAL78i7XAefiRzwlGrll3drbH4qpVKZLdx05hMNJuDtJc3yTD EQhA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=VeZoTlL0; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 1-20020a170906100100b006df76385d6dsi2242678ejm.525.2022.03.18.15.48.10; Fri, 18 Mar 2022 15:48:10 -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=@gmail.com header.s=20210112 header.b=VeZoTlL0; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 76E3C68B13C; Sat, 19 Mar 2022 00:48:08 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ot1-f43.google.com (mail-ot1-f43.google.com [209.85.210.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 431E168AF4C for ; Sat, 19 Mar 2022 00:48:02 +0200 (EET) Received: by mail-ot1-f43.google.com with SMTP id a7-20020a9d5c87000000b005ad1467cb59so6515786oti.5 for ; Fri, 18 Mar 2022 15:48:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=cFZG8ghhwT7YzitE1878UncTlYqnjj+wrkR+XZt5cms=; b=VeZoTlL09n3g5/8NaoQn+UTi2O/B+O+b8uPGn8BQ+fZvM/sXw8YLIDTMEWL0B03XB0 0yAcyhJtLuB94HF16NgycH7WJAvyrJmEOokbA4Kmh1BLduq/56bmB7zqz3Uob/kSSD6G Kn3FirSrt9f6TsbxxXJowzFJbgokQ+oTH8ddHnZsRpOGNy2YS/MGInUwJwLRRkueA+70 Md5KtqPcmgCVDXB67/DgT0Wo3sAwRzd0GdpWyRKnRcMl9e0cCiGPUyurMpvDsSN3woa6 xhg/Cp/wnAGO/KsXzI3T6yhElufOV3hAaLcqSpErLSpJQ3Al72VpHY4IGdR8dB8jtLsw 1Jyw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=cFZG8ghhwT7YzitE1878UncTlYqnjj+wrkR+XZt5cms=; b=prOeo4bbId4jDfSAhMRdOFO1Ai760V+tUoyRot+DNG+qZjbns9dc1nbFXw7/b2w0ym uXHo87V60/sCia48k35SOmPQwfJosMcZLwcOZKzxxiRy6lqBtsjZpdLouz7dDMC2A9XG 7IGay7kx3EMrQ8iKLgUgtPYYhSbUMsbNJ+1H/nsvXEYxSQVWhRzjeawmzQVGflS2GjWQ 62SUIu1ffvxNB9FGsH+D3wIqBbLudjGCOKC3ZZatg1l9iQ/Wu7pgaAjajcgu+V3vVzY1 vrOBpKd1JKS0oYrZ5qRbAmydqMPHJpVVFTwnqNi5DNQlBdaiTdaN2bbxwjZKSPWTqE4a 3oWA== X-Gm-Message-State: AOAM533DZMuYS1u/3lfYRyrVNU+YkCm4/INNsps3s1SIVCT0mBCz8/7w 6tfsfixf6GAOVb4E7hcpTp8GfVqOnAIT4Q== X-Received: by 2002:a9d:6b0a:0:b0:5b2:3355:5ec8 with SMTP id g10-20020a9d6b0a000000b005b233555ec8mr4044418otp.51.1647643680497; Fri, 18 Mar 2022 15:48:00 -0700 (PDT) Received: from localhost.localdomain ([186.136.131.95]) by smtp.gmail.com with ESMTPSA id x22-20020a056830115600b005ad1076095csm4431678otq.21.2022.03.18.15.47.59 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Mar 2022 15:48:00 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Fri, 18 Mar 2022 19:47:48 -0300 Message-Id: <20220318224748.44929-1-jamrial@gmail.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220318221907.44594-1-jamrial@gmail.com> References: <20220318221907.44594-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 4/4] ffmpeg: replace custom channel_layout code with an SpecifierOpt based one 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: vXI4qFIncb6L This is cleaner and allows fine tuning which stream the option is applied to. Signed-off-by: James Almer --- fftools/ffmpeg.h | 2 ++ fftools/ffmpeg_opt.c | 84 ++++++++++++++++++-------------------------- 2 files changed, 36 insertions(+), 50 deletions(-) diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h index 6a19dc9c7c..1e14bf9fa9 100644 --- a/fftools/ffmpeg.h +++ b/fftools/ffmpeg.h @@ -96,6 +96,8 @@ typedef struct OptionsContext { SpecifierOpt *codec_names; int nb_codec_names; + SpecifierOpt *audio_ch_layouts; + int nb_audio_ch_layouts; SpecifierOpt *audio_channels; int nb_audio_channels; SpecifierOpt *audio_sample_rate; diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c index 70e6502f22..f5c759c6d1 100644 --- a/fftools/ffmpeg_opt.c +++ b/fftools/ffmpeg_opt.c @@ -55,6 +55,7 @@ static const char *const opt_name_codec_names[] = {"c", "codec", "acodec", "vcodec", "scodec", "dcodec", NULL}; static const char *const opt_name_audio_channels[] = {"ac", NULL}; +static const char *const opt_name_audio_ch_layouts[] = {"channel_layout", NULL}; static const char *const opt_name_audio_sample_rate[] = {"ar", NULL}; static const char *const opt_name_frame_rates[] = {"r", NULL}; static const char *const opt_name_max_frame_rates[] = {"fpsmax", NULL}; @@ -1124,6 +1125,15 @@ static int open_input_file(OptionsContext *o, const char *filename) av_dict_set_int(&o->g->format_opts, "channels", o->audio_channels[o->nb_audio_channels - 1].u.i, 0); } } + if (o->nb_audio_ch_layouts) { + const AVClass *priv_class; + if (file_iformat && (priv_class = file_iformat->priv_class) && + av_opt_find(&priv_class, "ch_layout", NULL, 0, + AV_OPT_SEARCH_FAKE_OBJ)) { + av_dict_set(&o->g->format_opts, "ch_layout", o->audio_ch_layouts[o->nb_audio_ch_layouts - 1].u.str, 0); + } + + } if (o->nb_frame_rates) { const AVClass *priv_class; /* set the format-level framerate option; @@ -1946,6 +1956,7 @@ static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, in if (!ost->stream_copy) { int channels = 0; + char *layout = NULL; char *sample_fmt = NULL; MATCH_PER_STREAM_OPT(audio_channels, i, channels, oc, st); @@ -1954,6 +1965,27 @@ static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, in audio_enc->ch_layout.nb_channels = channels; } + MATCH_PER_STREAM_OPT(audio_ch_layouts, str, layout, oc, st); + if (layout) { + if (av_channel_layout_from_string(&audio_enc->ch_layout, layout) < 0) { +#if FF_API_OLD_CHANNEL_LAYOUT + uint64_t mask; + AV_NOWARN_DEPRECATED({ + mask = av_get_channel_layout(layout); + }) + if (!mask) { +#endif + av_log(NULL, AV_LOG_FATAL, "Unknown channel layout: %s\n", layout); + exit_program(1); +#if FF_API_OLD_CHANNEL_LAYOUT + } + av_log(NULL, AV_LOG_WARNING, "Channel layout '%s' uses a deprecated syntax.\n", + layout); + av_channel_layout_from_mask(&audio_enc->ch_layout, mask); +#endif + } + } + MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st); if (sample_fmt && (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) { @@ -3235,54 +3267,6 @@ static int opt_timecode(void *optctx, const char *opt, const char *arg) return ret; } -static int opt_channel_layout(void *optctx, const char *opt, const char *arg) -{ - OptionsContext *o = optctx; - char layout_str[32]; - char *stream_str; - char *ac_str; - int ret, ac_str_size; - AVChannelLayout layout = { 0 }; - - ret = av_channel_layout_from_string(&layout, arg); - if (ret < 0) { -#if FF_API_OLD_CHANNEL_LAYOUT - uint64_t mask; - AV_NOWARN_DEPRECATED({ - mask = av_get_channel_layout(arg); - }) - if (!mask) { -#endif - av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg); - return AVERROR(EINVAL); -#if FF_API_OLD_CHANNEL_LAYOUT - } - av_log(NULL, AV_LOG_WARNING, "Channel layout '%s' uses a deprecated syntax.\n", - arg); - av_channel_layout_from_mask(&layout, mask); -#endif - } - - ret = opt_default_new(o, opt, arg); - if (ret < 0) - return ret; - - /* set 'ac' option based on channel layout */ - snprintf(layout_str, sizeof(layout_str), "%d", layout.nb_channels); - stream_str = strchr(opt, ':'); - ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0); - ac_str = av_mallocz(ac_str_size); - if (!ac_str) - return AVERROR(ENOMEM); - av_strlcpy(ac_str, "ac", 3); - if (stream_str) - av_strlcat(ac_str, stream_str, ac_str_size); - ret = parse_option(o, ac_str, layout_str, options); - av_free(ac_str); - - return ret; -} - static int opt_audio_qscale(void *optctx, const char *opt, const char *arg) { OptionsContext *o = optctx; @@ -3827,8 +3811,8 @@ const OptionDef options[] = { { "sample_fmt", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_SPEC | OPT_STRING | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(sample_fmts) }, "set sample format", "format" }, - { "channel_layout", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE | - OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_channel_layout }, + { "channel_layout", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_SPEC | + OPT_STRING | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_ch_layouts) }, "set channel layout", "layout" }, { "af", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_filters }, "set audio filters", "filter_graph" },