From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 20A9D448B0 for ; Sun, 30 Oct 2022 19:19:47 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E921168BD23; Sun, 30 Oct 2022 21:19:44 +0200 (EET) Received: from mail-vs1-f48.google.com (mail-vs1-f48.google.com [209.85.217.48]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C931D68BC9A for ; Sun, 30 Oct 2022 21:19:38 +0200 (EET) Received: by mail-vs1-f48.google.com with SMTP id l190so8953387vsc.10 for ; Sun, 30 Oct 2022 12:19:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=to:subject:message-id:date:from:references:in-reply-to:mime-version :from:to:cc:subject:date:message-id:reply-to; bh=7fe33YNRXx8Mol3JMwOfP8sNvK6MAdjs+TydtoUt54Y=; b=Sx64A8N7ILsYWQCKG9T62Dx6tehK919+AQaUJLCQAcVQFBVc6x99LqxnjBX+PyTMJt R41tZBW5ZZ9jImT2pD0ugMJjgZQFT8O9oMoEqPzsxLHkv4Wipp6oAFR7YKt0BR/vxgM5 bnxcYJWo54/p/sD7ZWUP+Gi5DGD1Jz8drYuAnuUgk7N8uYsTOJ4Bw6eomzvcAChM1y48 feDDy2+X3RMrRgklNuBmvpsWj6tCnAXmflF2OptZs3SwT5khYd/uq1Q028X7WFdSDLa+ 5CxmYVENvqjFF+h8T2eXDWGnOwPCdIIHJ4bXqvB2m+l2LGfkZGRia4X2HA/HmfF9DIQA O4Ng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=to:subject:message-id:date:from:references:in-reply-to:mime-version :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=7fe33YNRXx8Mol3JMwOfP8sNvK6MAdjs+TydtoUt54Y=; b=BSe5HI6CJLkLR7g1HYu20pY+9HB6FftxUpYiurpbRNdaocYX573/NtDdMedi8ff1JD nHM/RqGrvdsV2A9TY9MllwTB+U29HC+BDrXfWB2TNNg7LuK/d5tlaUZAwYKNXFPHswi/ 2XZppTFaC5cJNa9Zo819Cn0FuSDHehjgPY5c9lD5oNR/HWqEer0Nc8sMDSmHjyyY/riR Ywyne0UVyw4z4H0R3xBnug/s7FAC2Id3vB1WxRGXBgO0wgJ7WgCYXvC3N+i7c3I1K6nq ILGqGPT9/9bt71GaEYK/mm92HD4xjluu1MhQxr95p2DWHJMEgZffX3Tp7HI8IV1uOrI9 9Kig== X-Gm-Message-State: ACrzQf2wGsjtKwjvAj/73BlHA8ckRww7fcgptWgr4ouwUGEHPDYccdaF PAvEK+MJd9ZUGvMp2rki/K9XcXiDIIw6CrslGcoOShG7 X-Google-Smtp-Source: AMsMyM6KcpJthYA8FAIkiF9kTpeSX6Mh1HNgqx6WhoD70auZD4BPZZX12sodftcIwNnr5CYalSnayKXSHf5TznMXyxk= X-Received: by 2002:a67:d50c:0:b0:3aa:3ebf:6b73 with SMTP id l12-20020a67d50c000000b003aa3ebf6b73mr3111698vsj.15.1667157577235; Sun, 30 Oct 2022 12:19:37 -0700 (PDT) MIME-Version: 1.0 Received: by 2002:a05:612c:612:b0:314:ac6a:1eb7 with HTTP; Sun, 30 Oct 2022 12:19:36 -0700 (PDT) In-Reply-To: <2a8d16ba-7f6a-720e-f068-d6bfcaf2679b@gmail.com> References: <103b6b6c-5c56-2af7-bde6-1e1706d21930@gmail.com> <3a38e8dc-0c3a-eec2-9278-75f2bc6118aa@gmail.com> <01478b24-aae8-ad9c-9947-cefb696ffb39@gmail.com> <2a8d16ba-7f6a-720e-f068-d6bfcaf2679b@gmail.com> From: Paul B Mahol Date: Sun, 30 Oct 2022 20:19:36 +0100 Message-ID: To: FFmpeg development discussions and patches Subject: Re: [FFmpeg-devel] [PATCH] avfilter: add ambisonic decoder filter 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 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: On 10/30/22, James Almer wrote: > On 10/30/2022 3:58 PM, Paul B Mahol wrote: >> On 10/30/22, James Almer wrote: >>> On 10/30/2022 3:29 PM, Paul B Mahol wrote: >>>> On 10/30/22, James Almer wrote: >>>>> >>>>> >>>>> On 10/30/2022 3:19 PM, Paul B Mahol wrote: >>>>>> On 10/30/22, James Almer wrote: >>>>>>> On 10/30/2022 12:34 PM, Paul B Mahol wrote: >>>>>>>> +static const struct { >>>>>>>> + const int order; >>>>>>>> + const int inputs; >>>>>>>> + const int speakers; >>>>>>>> + const int near_field; >>>>>>>> + const int type; >>>>>>>> + const double xover; >>>>>>>> + const AVChannelLayout outlayout; >>>>>>>> + const double *speakers_azimuth; >>>>>>>> + const double *speakers_elevation; >>>>>>>> + const double *speakers_distance; >>>>>>>> +} ambisonic_tab[] = { >>>>>>>> + [MONO] = { >>>>>>>> + .order = 0, >>>>>>>> + .inputs = 1, >>>>>>>> + .speakers = 1, >>>>>>>> + .near_field = NF_NONE, >>>>>>>> + .xover = 0., >>>>>>>> + .outlayout = (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO, >>>>>>>> + .speakers_azimuth = (const double[1]){ 0. }, >>>>>>>> + .speakers_distance = (const double[1]){ 1. }, >>>>>>>> + }, >>>>>>>> + [STEREO] = { >>>>>>>> + .order = 1, >>>>>>>> + .inputs = 4, >>>>>>>> + .speakers = 2, >>>>>>>> + .near_field = NF_NONE, >>>>>>>> + .xover = 0., >>>>>>>> + .outlayout = (AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO, >>>>>>>> + .speakers_azimuth = (const double[2]){ -30, 30}, >>>>>>>> + .speakers_distance = same_distance, >>>>>>>> + }, >>>>>>>> + [STEREO_DOWNMIX] = { >>>>>>>> + .order = 1, >>>>>>>> + .inputs = 4, >>>>>>>> + .speakers = 2, >>>>>>>> + .near_field = NF_NONE, >>>>>>>> + .xover = 0., >>>>>>>> + .outlayout = >>>>>>>> (AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO_DOWNMIX, >>>>>>>> + .speakers_azimuth = (const double[2]){ -90, 90 }, >>>>>>>> + .speakers_distance = same_distance, >>>>>>>> + }, >>>>>>>> + [SURROUND] = { >>>>>>>> + .order = 1, >>>>>>>> + .inputs = 4, >>>>>>>> + .speakers = 3, >>>>>>>> + .near_field = NF_NONE, >>>>>>>> + .xover = 0., >>>>>>>> + .outlayout = (AVChannelLayout)AV_CHANNEL_LAYOUT_SURROUND, >>>>>>>> + .speakers_azimuth = (const double[3]){ -45, 45, 0 }, >>>>>>>> + .speakers_distance = same_distance, >>>>>>>> + }, >>>>>>>> + [L2_1] = { >>>>>>>> + .order = 1, >>>>>>>> + .inputs = 4, >>>>>>>> + .speakers = 3, >>>>>>>> + .near_field = NF_NONE, >>>>>>>> + .xover = 0., >>>>>>>> + .outlayout = (AVChannelLayout)AV_CHANNEL_LAYOUT_2_1, >>>>>>>> + .speakers_azimuth = (const double[3]){ -45, 45, 180 }, >>>>>>>> + .speakers_distance = same_distance, >>>>>>>> + }, >>>>>>>> + [TRIANGLE] = { >>>>>>>> + .order = 1, >>>>>>>> + .inputs = 4, >>>>>>>> + .speakers = 3, >>>>>>>> + .type = 1, >>>>>>>> + .near_field = NF_NONE, >>>>>>>> + .xover = 0., >>>>>>>> + .outlayout = (AVChannelLayout)AV_CHANNEL_LAYOUT_SURROUND, >>>>>>>> + .speakers_azimuth = (const double[3]){ -120, 120, 0 }, >>>>>>>> + .speakers_distance = same_distance, >>>>>>>> + }, >>>>>>>> + [QUAD] = { >>>>>>>> + .order = 1, >>>>>>>> + .inputs = 4, >>>>>>>> + .speakers = 4, >>>>>>>> + .near_field = NF_NONE, >>>>>>>> + .xover = 0., >>>>>>>> + .outlayout = (AVChannelLayout)AV_CHANNEL_LAYOUT_QUAD, >>>>>>>> + .speakers_azimuth = (const double[4]){ -45, 45, -135, 135 >>>>>>>> }, >>>>>>>> + .speakers_distance = same_distance, >>>>>>>> + }, >>>>>>>> + [SQUARE] = { >>>>>>>> + .order = 1, >>>>>>>> + .inputs = 4, >>>>>>>> + .speakers = 4, >>>>>>>> + .type = 1, >>>>>>>> + .near_field = NF_NONE, >>>>>>>> + .xover = 0., >>>>>>>> + .outlayout = (AVChannelLayout)AV_CHANNEL_LAYOUT_4POINT0, >>>>>>>> + .speakers_azimuth = (const double[4]){ 0, -90, 180, 90 }, >>>>>>>> + .speakers_distance = same_distance, >>>>>>>> + }, >>>>>>>> + [L4_0] = { >>>>>>>> + .order = 1, >>>>>>>> + .inputs = 4, >>>>>>>> + .speakers = 4, >>>>>>>> + .near_field = NF_NONE, >>>>>>>> + .xover = 0., >>>>>>>> + .outlayout = (AVChannelLayout)AV_CHANNEL_LAYOUT_4POINT0, >>>>>>>> + .speakers_azimuth = (const double[4]){ -30, 30, 0, 180 }, >>>>>>>> + .speakers_distance = same_distance, >>>>>>>> + }, >>>>>>>> + [L5_0] = { >>>>>>>> + .order = 1, >>>>>>>> + .inputs = 4, >>>>>>>> + .speakers = 5, >>>>>>>> + .near_field = NF_NONE, >>>>>>>> + .xover = 0., >>>>>>>> + .outlayout = >>>>>>>> (AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT0_BACK, >>>>>>>> + .speakers_azimuth = (const double[5]){ -30, 30, 0, -145, >>>>>>>> 145 >>>>>>>> }, >>>>>>>> + .speakers_distance = same_distance, >>>>>>>> + }, >>>>>>>> + [L5_0_SIDE] = { >>>>>>>> + .order = 1, >>>>>>>> + .inputs = 4, >>>>>>>> + .speakers = 5, >>>>>>>> + .near_field = NF_NONE, >>>>>>>> + .xover = 0., >>>>>>>> + .outlayout = (AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT0, >>>>>>>> + .speakers_azimuth = (const double[5]){ -30, 30, 0, -110, >>>>>>>> 110 >>>>>>>> }, >>>>>>>> + .speakers_distance = same_distance, >>>>>>>> + }, >>>>>>>> + [L6_0] = { >>>>>>>> + .order = 1, >>>>>>>> + .inputs = 4, >>>>>>>> + .speakers = 6, >>>>>>>> + .near_field = NF_NONE, >>>>>>>> + .xover = 0., >>>>>>>> + .outlayout = (AVChannelLayout)AV_CHANNEL_LAYOUT_6POINT0, >>>>>>>> + .speakers_azimuth = (const double[6]){ -30, 30, 0, 180, >>>>>>>> -110, >>>>>>>> 110 >>>>>>>> }, >>>>>>>> + .speakers_distance = same_distance, >>>>>>>> + }, >>>>>>>> + [L7_0] = { >>>>>>>> + .order = 1, >>>>>>>> + .inputs = 4, >>>>>>>> + .speakers = 7, >>>>>>>> + .near_field = NF_NONE, >>>>>>>> + .xover = 0., >>>>>>>> + .outlayout = (AVChannelLayout)AV_CHANNEL_LAYOUT_7POINT0, >>>>>>>> + .speakers_azimuth = (const double[7]){ -30, 30, 0, -145, >>>>>>>> 145, >>>>>>>> -110, 110 }, >>>>>>>> + .speakers_distance = same_distance, >>>>>>>> + }, >>>>>>>> + [TETRA] = { >>>>>>>> + .order = 1, >>>>>>>> + .inputs = 4, >>>>>>>> + .speakers = 4, >>>>>>>> + .type = 2, >>>>>>>> + .near_field = NF_NONE, >>>>>>>> + .xover = 0., >>>>>>>> + .outlayout = (AVChannelLayout)AV_CHANNEL_LAYOUT_QUAD, >>>>>>>> + .speakers_azimuth = (const double[4]){ -90, 90, 0, 180 }, >>>>>>>> + .speakers_elevation = (const double[4]){ -35.3, -35.3, >>>>>>>> 35.3, >>>>>>>> 35.3 >>>>>>>> }, >>>>>>>> + .speakers_distance = same_distance, >>>>>>>> + }, >>>>>>>> + [CUBE] = { >>>>>>>> + .order = 1, >>>>>>>> + .inputs = 4, >>>>>>>> + .speakers = 8, >>>>>>>> + .type = 2, >>>>>>>> + .near_field = NF_NONE, >>>>>>>> + .xover = 0., >>>>>>>> + .outlayout = (AVChannelLayout)AV_CHANNEL_LAYOUT_7POINT1, >>>>>>> >>>>>>> 7.1 defines an LFE channel, which is clearly not intended here, so >>>>>>> it >>>>>>> should be either: >>>>>>> >>>>>>> .outlayout = (AVChannelLayout)AV_CHANNEL_LAYOUT_MASK(8, >>>>>>> AV_CH_LAYOUT_QUAD | >>>>>>> AV_CH_TOP_FRONT_LEFT | >>>>>>> AV_CH_TOP_FRONT_RIGHT | >>>>>>> AV_CH_TOP_BACK_LEFT | >>>>>>> AV_CH_TOP_BACK_RIGHT), >>>>>>> >>>>>>> Or the AV_CHANNEL_LAYOUT_CUBE layout (using the exact same bitmask >>>>>>> as >>>>>>> above) after the patch i sent just now is committed. >>>>>> >>>>>> CUBE is as real cube in 3d space. No current layout in API can be >>>>>> described correctly. >>>>> >>>>> the TOP_* channels are in a different height layer than the other >>>>> channels, namely above them. The result for this bitmask is a 3D cube >>>>> layout (Left and right speakers both front and back, in two different >>>>> height layers). >>>> >>>> https://en.wikipedia.org/wiki/Ambisonic_reproduction_systems#Cube >>> >>> "If all speakers are placed in room corners", So a 7.1 layout, besides >>> defining one channel as LFE, is also not ideal given that it defines two >>> speaker positions in places other than the room corners, and by no means >>> describes a 3D cube since all speakers are at the same height. >>> The TOP channel ids let you assign four channels to speakers placed in >>> the top room corners. >> >> 7.1 is there just because it have 8 channels. No other reasons. > > If you want to just say "there are eight channels", then make the > AVChannelLayout define 8 channels of order UNSPEC. Let the user then > figure out what to do with them. But if you want to actually give each > channel a position, then you need to use the proper IDs to describe the > intended layout. > > Using 7.1 here is lying to the user, as it's telling them he needs to > place two speakers at the front, two at the back, two to the sides, and > all at the same height, plus one channel wrongly feeding the sub woofer. > Not to mention what would happen if you try to downmix the stream. swr > would just generate awful results. > Meanwhile, using cube you'll tell the user to place one speaker on every > corner in the room, or a downmixer how to properly handle the channels > to get good results (e.g. on headphones). I never claimed it is perfect solution. Is there a way to let it use unspec but still not confuse swr to abort and do pointless messages? _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".