From patchwork Mon Feb 26 02:53:31 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: "pkv.stream" X-Patchwork-Id: 7738 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.181.170 with SMTP id m39csp904405jaj; Sun, 25 Feb 2018 18:53:47 -0800 (PST) X-Google-Smtp-Source: AG47ELtDMHimKIjeJUanfAL+xpxmsviEkD97br0qOWoDJaxSSAfEPVya7Yv94bvxSu3fHsIq1E5K X-Received: by 10.28.143.149 with SMTP id r143mr7035103wmd.24.1519613627428; Sun, 25 Feb 2018 18:53:47 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1519613627; cv=none; d=google.com; s=arc-20160816; b=NXURCGZ2LPUOlGhV8+Ww8frouYX5Y+KIjCfkuW0uQpWwykYW+zoMFrqEQYYQN1CtwJ dfpBel1f5PuR2lmM++3pp3x95fYk6eqY9pKVlG//+MYDQVkV5IOUXtoD8H+AdyA19mMa Bx1LPtBPwOVFMOqRBXKeFz6LO5tbHXnaU+61SgthP4XqTjNqnG+cf/BoA7lYfJVhdhF2 kDwjpYshNaI1K4KjLqHUXN/tr6Coa+1EPki5oZ2ZFJVEN3jlrcwAS9Vu5U5mxkY/iy8a ZT/sqYHigJ4cgBkg8CRBMfZGsdr4+XctwZa/IqFb2F8I2EogdgPyANCoWqhBPep9q7ii PicQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:subject :content-language:mime-version:user-agent:date:message-id:from:to :dkim-signature:delivered-to:arc-authentication-results; bh=yVVFPQ0Ubz/EgrMWC5vR663dm1cSlVNyU8iAG9qjzoQ=; b=ZRBhEQg7W3TafbyU0ggfHc86PwdaEIk584gtKQYUTikfK8ZQBrvoHWaJdX9ZUz52Dd Y0HzmAPny2mrJ7TBeaGq5Hqhr3XoV7mt8/6mlcaHpvlX//shWj+1IaiWV+jtgPDSiUCk HiXNyQuAyZWY2jBYo8VK0KYqxtnzNCvdZgsSNGMsvGqtzph/Z3U03OQxgr0o1HP0r0Iv G9KMjtFrVCAAhisfOM11G9ZnsZAR9kPcaqXJ9HpjwnikCh4dvuGbCP+CKM+18PUUFb1B yYvgxnO5QgRjpnEfGbXaOT6URDa772JS3i4uqZYJV1mqc+7xtvqkZUJO9oc+CqjClQc4 7TXw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=W4Cg3cDP; 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 l18si647535wmc.229.2018.02.25.18.53.46; Sun, 25 Feb 2018 18:53:47 -0800 (PST) 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=20161025 header.b=W4Cg3cDP; 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 AB57268A2C2; Mon, 26 Feb 2018 04:53:41 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr0-f178.google.com (mail-wr0-f178.google.com [209.85.128.178]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E7BBA68A29E for ; Mon, 26 Feb 2018 04:53:34 +0200 (EET) Received: by mail-wr0-f178.google.com with SMTP id u49so19625471wrc.10 for ; Sun, 25 Feb 2018 18:53:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=to:from:subject:message-id:date:user-agent:mime-version :content-language; bh=otMY4rsURCWenm623r4MiWeOHYbyiweQ92TdzDFpxD0=; b=W4Cg3cDPExKGL7tgOWtN5J5+HPcoigc6i3B/oLN8XdvDwFkJLpb1wsBqehtT13Hz8f Vn4Dk6ogXz8dFVoQ7AXNo4muWGnWlFS2sGF5x/vpDNRiqOUylwZtfQ5sWDAxqbdWhZtG lWLMZwJlSaQOuh15vqxBHFnlxmIroHTTw2aDHHo10zEOlP4c1sKnEmLGe0i8BWlP01VX VfLPOJsItIXr95vX51/Ec2Eja4fVSv+4hiXxlT8rftgzhL3aLhDweenMQTa2tk4Ek4bc HY/8uY9l1GDyrDDRekRX9Spj9+lTl+hkq1nEmNLkNtbmsiHO+QV4Pw05XXQ9d/W/ObNh RGbw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:to:from:subject:message-id:date:user-agent :mime-version:content-language; bh=otMY4rsURCWenm623r4MiWeOHYbyiweQ92TdzDFpxD0=; b=bBTL94ZJiLAqI+QIvENojiS1f+Vl7BjKK3NxvKbu/xGVqFKwudEYEzcasaNabIrQSW PZKyOvHwd3QCdgcqV5ZsxvXwHsV5Rat3SP86Lv8IIXqYXn5Bdsbfj/IL3p1mU5wz2EkV oJH7nFu0sCp5VEdnA4aFrN8iTnJFysj+u3oG2f9ugughp6ryGF6NvNKAoS/Zm4xVP3Ry ujakSU5uQ4RPvxg90JUHgkUz0Xxa1hl1NiHQeRo7soYw3TcHCXlekHHw+rDVNEqktYj4 OTHJnuCtk48n3dzDO8QyQCnq3i/DsrBchHsOUctAxDj0Znpe1HGxog4rqBBxvFwD72va 3OWw== X-Gm-Message-State: APf1xPB2x6ias1rhD/y5DxjPULS6WTmNhk2iDRJL2Ny05LQI8Nqc3Pqz kJ1ozXVcQ0pJlH19JnBYmOEOOA== X-Received: by 10.223.161.211 with SMTP id v19mr5803457wrv.184.1519613618180; Sun, 25 Feb 2018 18:53:38 -0800 (PST) Received: from [192.168.0.101] (176-159-7-188.abo.bbox.fr. [176.159.7.188]) by smtp.googlemail.com with ESMTPSA id y64sm21851691wrb.56.2018.02.25.18.53.32 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 25 Feb 2018 18:53:32 -0800 (PST) To: ffmpeg-devel@ffmpeg.org From: "pkv.stream" Message-ID: <77677cb0-5615-6de6-da8b-069c24819e3b@gmail.com> Date: Mon, 26 Feb 2018 03:53:31 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 MIME-Version: 1.0 Content-Language: fr Subject: [FFmpeg-devel] [DEVEL][PATCH] ffmpeg: Fix channel_layout bug on non-default layout X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 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" Hi Michael, this is a ping. You had reviewed earlier versions of the patch but had left the latest version without comments (3 months ago). This is a patch for ticket 6706 : The -channel_layout option is not working when the channel layout is not a default one (ex: for 4 channels, quad is interpreted as 4.0 which is the default layout for 4 channels; or octagonal interpreted as 7.1). This leads to the spurious auto-insertion of an auto-resampler filter remapping the channels even if input and output have identical channel layouts. I had two solutions for solving the bug: 1) adding a new option (channelmask) which can store channel_layout as an offset in a SpecifierOpt ; 2) or having channel_layout option use both offset .off and .func. You suggested the second solution. But I found out it requires to add a function in cmdutils in order to parse correctly the duplicated option. IMO solution (1) is simpler. I attach again the first solution  (one patch) as well as the second (two patches) for your advisement. The patch passes fate. thanks. From ecd706479f033e91001da4ddb699baf4f3440caa Mon Feb 26 02:33:20 2018 From: pkviet Date: Mon, 26 Feb 2018 02:33:20 +0100 Subject: [PATCH] ffmpeg: Fix regression for channel_layout option Fix for Ticket 6706. Fix regression with channel_layout option which is not passed correctly from output streams to filters when the channel layout is not a default one. Signed-off-by: pkviet --- fftools/ffmpeg.h | 2 ++ fftools/ffmpeg_opt.c | 38 +++++++++++++++++++++++++++++++++----- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h index 8195f73e8b..c2af200023 100644 --- a/fftools/ffmpeg.h +++ b/fftools/ffmpeg.h @@ -107,6 +107,8 @@ typedef struct OptionsContext { int nb_audio_channels; SpecifierOpt *audio_sample_rate; int nb_audio_sample_rate; + SpecifierOpt *channel_layouts; + int nb_channel_layouts; SpecifierOpt *frame_rates; int nb_frame_rates; SpecifierOpt *frame_sizes; diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c index 1b591d9695..c9384242ca 100644 --- a/fftools/ffmpeg_opt.c +++ b/fftools/ffmpeg_opt.c @@ -1816,6 +1816,7 @@ static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, in char *sample_fmt = NULL; MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st); + MATCH_PER_STREAM_OPT(channel_layouts, ui64, audio_enc->channel_layout, oc, st); MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st); if (sample_fmt && @@ -2448,7 +2449,11 @@ loop_end: (count + 1) * sizeof(*f->sample_rates)); } if (ost->enc_ctx->channels) { - f->channel_layout = av_get_default_channel_layout(ost->enc_ctx->channels); + if (ost->enc_ctx->channel_layout) { + f->channel_layout = ost->enc_ctx->channel_layout; + } else { + f->channel_layout = av_get_default_channel_layout(ost->enc_ctx->channels); + } } else if (ost->enc->channel_layouts) { count = 0; while (ost->enc->channel_layouts[count]) @@ -3024,8 +3029,8 @@ 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, channels, ac_str_size; + char *ac_str, *cm_str; + int ret, channels, ac_str_size, stream_str_size; uint64_t layout; layout = av_get_channel_layout(arg); @@ -3037,12 +3042,31 @@ static int opt_channel_layout(void *optctx, const char *opt, const char *arg) ret = opt_default_new(o, opt, layout_str); if (ret < 0) return ret; + stream_str = strchr(opt, ':'); + stream_str_size = (stream_str ? strlen(stream_str) : 0); + /* Set 'channelmask' option which stores channel_layout as bitmask + * (uint64) in SpecifierOpt, enabling access to channel_layout through + * MATCH_PER_STREAM_OPT. + */ + ac_str_size = 12 + stream_str_size; + ac_str = av_mallocz(ac_str_size); + if (!ac_str) { + return AVERROR(ENOMEM); + } + av_strlcpy(ac_str, "channelmask", 12); + 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); + if (ret < 0) { + return ret; + } /* set 'ac' option based on channel layout */ channels = av_get_channel_layout_nb_channels(layout); snprintf(layout_str, sizeof(layout_str), "%d", channels); - stream_str = strchr(opt, ':'); - ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0); + ac_str_size = 3 + stream_str_size; ac_str = av_mallocz(ac_str_size); if (!ac_str) return AVERROR(ENOMEM); @@ -3595,6 +3619,10 @@ const OptionDef options[] = { { "channel_layout", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_channel_layout }, "set channel layout", "layout" }, + /* internal OptionDef used to enable storage of channel_layout option in a SpecifierOpt */ + { "channelmask", OPT_AUDIO | HAS_ARG | OPT_INT64 | OPT_SPEC | + OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(channel_layouts) }, + "stores channel layout in SpecifierOpt ", "channelmask" }, { "af", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_filters }, "set audio filters", "filter_graph" }, { "guess_layout_max", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC | OPT_EXPERT | OPT_INPUT, { .off = OFFSET(guess_layout_max) },