From patchwork Mon Oct 31 21:18:32 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 39097 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:8e01:b0:a3:a294:714c with SMTP id y1csp1160963pzj; Mon, 31 Oct 2022 14:19:23 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5s4m5MJqfZ1lUC3hisiozXAPCiT1JIFZBPH09uew47m6iGepQ4dQXR/x9xhAdZFUBEPhVh X-Received: by 2002:a17:907:75fc:b0:7aa:e0b3:270 with SMTP id jz28-20020a17090775fc00b007aae0b30270mr14444188ejc.680.1667251163242; Mon, 31 Oct 2022 14:19:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1667251163; cv=none; d=google.com; s=arc-20160816; b=Rct+XwoBPH2gXmY/jxdnSBWs116TdWBlbVaIJntN3YKNpJvcd80pPXl9bfcSgJsbwb 0T8pntz6B3GJx+KbIPSLP3bWGQ7lVB0fQ1Iu5jbUnDRmj4auM6Me4lEpfWWgfBJ7iBSo EFWTIIqbSZLfLL8Ue/cAVaz2bYOVKbAZadEJGCSYCAVKuuTzefHwjIDV0WIw5PxjVwKq VaTlXXaoVkyv44HdRPx00fqHqNkVPKF4PE9zOlD3AquyQgEwxNLo2QWVUzxw3liKSBJ0 Q/unqsRgolvL3KCmcvBBNA0sA5HGok62qTCCaBgjNBJ1/f20QFHmpA4/EJNodwFwHNna hqfw== 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=NjMynCYFxzh11JM84mt/PihOR+JFsUcVYYAgxKfXp88=; b=iIiEjIKmDeTczQvoV/JXMtDwFf9rnD3GbmGl6gomMWFyIZu1tVwG3OknCbfkTv6EyR 2Q0MGWEwrR5gkwkUi6s6/GNYXPCn4e0mOug2hdPUSkXKTPlFTaDrDD67+R3OcNqyXi4B LhcFVRUhJOcJiZpAB5y1uZ1SeRLXtipC9bextMxgb6m+29t8bpeGQGUhPSZ51cTsgfzl 3ZUf3Cdk0d067FZCgVb92vHfwWU/1GABVttcxXGAMl4aV9NqRqtjZ2AQVScq95pb174a eEmyn8c9aGUtPHTPhyarGpQcjy4vV17/Bged3dLacUmV2v5xRZJYAvF6Ru6yylUSlux/ P32A== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=hb0pZHUi; 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 js15-20020a17090797cf00b007ade82b938asi1286932ejc.784.2022.10.31.14.19.22; Mon, 31 Oct 2022 14:19:23 -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=hb0pZHUi; 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 BD3EB68BE49; Mon, 31 Oct 2022 23:19:01 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-oa1-f48.google.com (mail-oa1-f48.google.com [209.85.160.48]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0296C68BD8A for ; Mon, 31 Oct 2022 23:18:55 +0200 (EET) Received: by mail-oa1-f48.google.com with SMTP id 586e51a60fabf-13c2cfd1126so14840091fac.10 for ; Mon, 31 Oct 2022 14:18:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=VPN3nrXcN0g5CdqIVnQKMgVWpGWKQ4umtEc7U9GG1aA=; b=hb0pZHUikATT0sDAW7aIF5vgDA8SXl/PrN4+D6RoU/hQeQkG7JGjaIyLfvJ+nvyHH8 4JAh0bbbwVSo7t+cJXKYZFL17wbWq6xkXRr3wdu5zkI1YR8IoGRvWASbCXz8kcdP13wz /vGoTvAejfwdix7ZkbVoPwi8+6u4QZztkpnUm1fs4pwwr3rTGO0lUhR0bUAv0wAKQJXl sBboFuOX9HRQu1PuJqWzO8Uo3rAtaybAM2Lb0zXNqwiZaAPFF8PuLwHmECCOz2EYlP0I i3LdPviGZVe1WEQnLRHX75SVX17Lv+tQgCukbtxNOgN/J5egqjDpgkA4XGrLmoYjrbnp zIDA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=VPN3nrXcN0g5CdqIVnQKMgVWpGWKQ4umtEc7U9GG1aA=; b=OrkUrACL2EPwax9hqhqUq406E9kIV1IGyQlV9KFIHKpYFns8/s0CXXBGwqSSOAAREG OMge12yasOgch3un3oY1GIikZ0J00iX3bkKL4hVzJ1sXtF8SU/B39fPv81NF70rcClif ou7zWN0RErFbuS00b+EzEfZZ50Nz+Mw7mmJzW0nXHsUoBiDd1PmhiZ1duddupnZPGQyo JteYiU7K0gul56leyD0GVXDUQOjsPpfeI+GHkRe3iogVGE+cQX+6XYWTvh3rwVctVha+ aIYbYr1U55XJ4j/Y3GiyQRnHiPn9wBwffnYIOf/StsXp/S5n+xWC50khdkNGoh3BDXUa eJwA== X-Gm-Message-State: ACrzQf2X998Aaa/IGshk3sC5ru35krAXEKhNCN6HNx+oJgWT7/v0HBVN 3qw1cbg1OKlN+Llg5olze0+2cOSz75I= X-Received: by 2002:a05:6870:8092:b0:13c:a773:cac9 with SMTP id q18-20020a056870809200b0013ca773cac9mr8261744oab.146.1667251133257; Mon, 31 Oct 2022 14:18:53 -0700 (PDT) Received: from localhost.localdomain ([191.97.187.183]) by smtp.gmail.com with ESMTPSA id x26-20020a9d629a000000b006619dd066fbsm3183892otk.5.2022.10.31.14.18.52 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 31 Oct 2022 14:18:52 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Mon, 31 Oct 2022 18:18:32 -0300 Message-Id: <20221031211832.8213-4-jamrial@gmail.com> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20221031211554.8176-1-jamrial@gmail.com> References: <20221031211554.8176-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 6/6] avcodec/aacdec: refactor the channel layout derivation code 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: FeR34gHsrdDt Generalize the checks for channels in all positions, and properly support the three height groups (normal, top, bottom) instead of manually setting the relevant channels for the latter two after the normal height tags were parsed. Signed-off-by: James Almer --- libavcodec/aacdec_template.c | 256 ++++++++++++----------------------- libavcodec/aacdectab.h | 27 +++- 2 files changed, 107 insertions(+), 176 deletions(-) diff --git a/libavcodec/aacdec_template.c b/libavcodec/aacdec_template.c index 4a88aeae1d..245fd9f6fe 100644 --- a/libavcodec/aacdec_template.c +++ b/libavcodec/aacdec_template.c @@ -238,13 +238,13 @@ static int assign_pair(struct elem_to_channel e2c_vec[MAX_ELEM_ID], } static int count_paired_channels(uint8_t (*layout_map)[3], int tags, int pos, - int *current) + int current) { int num_pos_channels = 0; int first_cpe = 0; int sce_parity = 0; int i; - for (i = *current; i < tags; i++) { + for (i = current; i < tags; i++) { if (layout_map[i][2] != pos) break; if (layout_map[i][0] == TYPE_CPE) { @@ -259,207 +259,117 @@ static int count_paired_channels(uint8_t (*layout_map)[3], int tags, int pos, first_cpe = 1; } else { num_pos_channels++; - sce_parity ^= 1; + sce_parity ^= (pos != AAC_CHANNEL_LFE); } } if (sce_parity && - ((pos == AAC_CHANNEL_FRONT && first_cpe) || pos == AAC_CHANNEL_SIDE)) + (pos == AAC_CHANNEL_FRONT && first_cpe)) return -1; - *current = i; + return num_pos_channels; } -#define PREFIX_FOR_22POINT2 (AV_CH_LAYOUT_7POINT1_WIDE_BACK|AV_CH_BACK_CENTER|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT|AV_CH_LOW_FREQUENCY_2) -static uint64_t sniff_channel_order(uint8_t (*layout_map)[3], int tags) +static int assign_channels(struct elem_to_channel e2c_vec[MAX_ELEM_ID], uint8_t (*layout_map)[3], + uint64_t *layout, int tags, int layer, int pos, int *current) { - int i, n, total_non_cc_elements; - struct elem_to_channel e2c_vec[4 * MAX_ELEM_ID] = { { 0 } }; - int num_front_channels, num_side_channels, num_back_channels; - uint64_t layout = 0; + int i = *current, j = 0; + int nb_channels = count_paired_channels(layout_map, tags, pos, i); - if (FF_ARRAY_ELEMS(e2c_vec) < tags) + if (nb_channels < 0 || nb_channels > 5) return 0; - i = 0; - num_front_channels = - count_paired_channels(layout_map, tags, AAC_CHANNEL_FRONT, &i); - if (num_front_channels < 0) - return 0; - num_side_channels = - count_paired_channels(layout_map, tags, AAC_CHANNEL_SIDE, &i); - if (num_side_channels < 0) - return 0; - num_back_channels = - count_paired_channels(layout_map, tags, AAC_CHANNEL_BACK, &i); - if (num_back_channels < 0) - return 0; + if (pos == AAC_CHANNEL_LFE) { + while (nb_channels) { + if (aac_channel_map[layer][pos - 1][j] == AV_CHAN_NONE) + return -1; + e2c_vec[i] = (struct elem_to_channel) { + .av_position = 1ULL << aac_channel_map[layer][pos - 1][j], + .syn_ele = layout_map[i][0], + .elem_id = layout_map[i][1], + .aac_position = pos + }; + *layout |= e2c_vec[i].av_position; + i++; + j++; + nb_channels--; + } + *current = i; - if (num_side_channels == 0 && num_back_channels >= 4) { - num_side_channels = 2; - num_back_channels -= 2; + return 0; } - i = 0; - if (num_front_channels & 1) { + while (nb_channels & 1) { + if (aac_channel_map[layer][pos - 1][0] == AV_CHAN_NONE) + return -1; + if (aac_channel_map[layer][pos - 1][0] == AV_CHAN_UNUSED) + break; e2c_vec[i] = (struct elem_to_channel) { - .av_position = AV_CH_FRONT_CENTER, - .syn_ele = TYPE_SCE, + .av_position = 1ULL << aac_channel_map[layer][pos - 1][0], + .syn_ele = layout_map[i][0], .elem_id = layout_map[i][1], - .aac_position = AAC_CHANNEL_FRONT + .aac_position = pos }; - layout |= e2c_vec[i].av_position; + *layout |= e2c_vec[i].av_position; i++; - num_front_channels--; + nb_channels--; } - if (num_front_channels >= 4) { - i += assign_pair(e2c_vec, layout_map, i, - AV_CH_FRONT_LEFT_OF_CENTER, - AV_CH_FRONT_RIGHT_OF_CENTER, - AAC_CHANNEL_FRONT, &layout); - num_front_channels -= 2; - } - if (num_front_channels >= 2) { - i += assign_pair(e2c_vec, layout_map, i, - AV_CH_FRONT_LEFT, - AV_CH_FRONT_RIGHT, - AAC_CHANNEL_FRONT, &layout); - num_front_channels -= 2; - } - if (num_front_channels) - return 0; // Non standard PCE defined layout - if (num_side_channels >= 2) { - i += assign_pair(e2c_vec, layout_map, i, - AV_CH_SIDE_LEFT, - AV_CH_SIDE_RIGHT, - AAC_CHANNEL_SIDE, &layout); - num_side_channels -= 2; - } - if (num_side_channels) - return 0; // Non standard PCE defined layout - - if (num_back_channels >= 2) { + j = (pos != AAC_CHANNEL_SIDE) && nb_channels <= 3 ? 3 : 1; + while (nb_channels >= 2) { + if (aac_channel_map[layer][pos - 1][j] == AV_CHAN_NONE || + aac_channel_map[layer][pos - 1][j+1] == AV_CHAN_NONE) + return -1; i += assign_pair(e2c_vec, layout_map, i, - AV_CH_BACK_LEFT, - AV_CH_BACK_RIGHT, - AAC_CHANNEL_BACK, &layout); - num_back_channels -= 2; - } - if (num_back_channels) { + 1ULL << aac_channel_map[layer][pos - 1][j], + 1ULL << aac_channel_map[layer][pos - 1][j+1], + pos, layout); + j += 2; + nb_channels -= 2; + } + while (nb_channels & 1) { + if (aac_channel_map[layer][pos - 1][5] == AV_CHAN_NONE) + return -1; e2c_vec[i] = (struct elem_to_channel) { - .av_position = AV_CH_BACK_CENTER, - .syn_ele = TYPE_SCE, + .av_position = 1ULL << aac_channel_map[layer][pos - 1][5], + .syn_ele = layout_map[i][0], .elem_id = layout_map[i][1], - .aac_position = AAC_CHANNEL_BACK + .aac_position = pos }; - layout |= e2c_vec[i].av_position; + *layout |= e2c_vec[i].av_position; i++; - num_back_channels--; + nb_channels--; } - if (num_back_channels) - return 0; // Non standard PCE defined layout + if (nb_channels) + return -1; - if (i < tags && layout_map[i][2] == AAC_CHANNEL_LFE) { - e2c_vec[i] = (struct elem_to_channel) { - .av_position = AV_CH_LOW_FREQUENCY, - .syn_ele = TYPE_LFE, - .elem_id = layout_map[i][1], - .aac_position = AAC_CHANNEL_LFE - }; - layout |= e2c_vec[i].av_position; - i++; - } - if (i < tags && layout_map[i][2] == AAC_CHANNEL_LFE) { - e2c_vec[i] = (struct elem_to_channel) { - .av_position = AV_CH_LOW_FREQUENCY_2, - .syn_ele = TYPE_LFE, - .elem_id = layout_map[i][1], - .aac_position = AAC_CHANNEL_LFE - }; - layout |= e2c_vec[i].av_position; - i++; - } - while (i < tags && layout_map[i][2] == AAC_CHANNEL_LFE) { - e2c_vec[i] = (struct elem_to_channel) { - .av_position = UINT64_MAX, - .syn_ele = TYPE_LFE, - .elem_id = layout_map[i][1], - .aac_position = AAC_CHANNEL_LFE - }; - i++; - } + *current = i; - // The previous checks would end up at 4 at this point for chan_config 14 - if (layout == AV_CH_LAYOUT_5POINT1_BACK && tags == 5 && i == 4) { - const uint8_t (*reference_layout_map)[3] = aac_channel_layout_map[13]; - for (int j = 0; j < tags; j++) { - if (layout_map[j][0] != reference_layout_map[j][0] || - layout_map[j][2] != reference_layout_map[j][2]) - goto end_of_layout_definition; - } + return 0; +} - i += assign_pair(e2c_vec, layout_map, i, - AV_CH_TOP_FRONT_LEFT, - AV_CH_TOP_FRONT_RIGHT, - AAC_CHANNEL_FRONT, - &layout); - } - // The previous checks would end up at 8 at this point for 22.2 - if (layout == PREFIX_FOR_22POINT2 && tags == 16 && i == 8) { - const uint8_t (*reference_layout_map)[3] = aac_channel_layout_map[12]; - for (int j = 0; j < tags; j++) { - if (layout_map[j][0] != reference_layout_map[j][0] || - layout_map[j][2] != reference_layout_map[j][2]) - goto end_of_layout_definition; - } +static uint64_t sniff_channel_order(uint8_t (*layout_map)[3], int tags) +{ + int i, n, total_non_cc_elements; + struct elem_to_channel e2c_vec[4 * MAX_ELEM_ID] = { { 0 } }; + uint64_t layout = 0; - e2c_vec[i] = (struct elem_to_channel) { - .av_position = AV_CH_TOP_FRONT_CENTER, - .syn_ele = layout_map[i][0], - .elem_id = layout_map[i][1], - .aac_position = layout_map[i][2] - }; layout |= e2c_vec[i].av_position; i++; - i += assign_pair(e2c_vec, layout_map, i, - AV_CH_TOP_FRONT_LEFT, - AV_CH_TOP_FRONT_RIGHT, - AAC_CHANNEL_FRONT, - &layout); - i += assign_pair(e2c_vec, layout_map, i, - AV_CH_TOP_SIDE_LEFT, - AV_CH_TOP_SIDE_RIGHT, - AAC_CHANNEL_SIDE, - &layout); - e2c_vec[i] = (struct elem_to_channel) { - .av_position = AV_CH_TOP_CENTER, - .syn_ele = layout_map[i][0], - .elem_id = layout_map[i][1], - .aac_position = layout_map[i][2] - }; layout |= e2c_vec[i].av_position; i++; - i += assign_pair(e2c_vec, layout_map, i, - AV_CH_TOP_BACK_LEFT, - AV_CH_TOP_BACK_RIGHT, - AAC_CHANNEL_BACK, - &layout); - e2c_vec[i] = (struct elem_to_channel) { - .av_position = AV_CH_TOP_BACK_CENTER, - .syn_ele = layout_map[i][0], - .elem_id = layout_map[i][1], - .aac_position = layout_map[i][2] - }; layout |= e2c_vec[i].av_position; i++; - e2c_vec[i] = (struct elem_to_channel) { - .av_position = AV_CH_BOTTOM_FRONT_CENTER, - .syn_ele = layout_map[i][0], - .elem_id = layout_map[i][1], - .aac_position = layout_map[i][2] - }; layout |= e2c_vec[i].av_position; i++; - i += assign_pair(e2c_vec, layout_map, i, - AV_CH_BOTTOM_FRONT_LEFT, - AV_CH_BOTTOM_FRONT_RIGHT, - AAC_CHANNEL_FRONT, - &layout); - } + if (FF_ARRAY_ELEMS(e2c_vec) < tags) + return 0; -end_of_layout_definition: + for (n = 0, i = 0; n < 3 && i < tags; n++) { + int ret = assign_channels(e2c_vec, layout_map, &layout, tags, n, AAC_CHANNEL_FRONT, &i); + if (ret < 0) + return 0; + ret = assign_channels(e2c_vec, layout_map, &layout, tags, n, AAC_CHANNEL_SIDE, &i); + if (ret < 0) + return 0; + ret = assign_channels(e2c_vec, layout_map, &layout, tags, n, AAC_CHANNEL_BACK, &i); + if (ret < 0) + return 0; + ret = assign_channels(e2c_vec, layout_map, &layout, tags, n, AAC_CHANNEL_LFE, &i); + if (ret < 0) + return 0; + } total_non_cc_elements = n = i; @@ -655,7 +565,7 @@ static int set_default_channel_config(AACContext *ac, AVCodecContext *avctx, * 7.1 layout was intended. */ if (channel_config == 7 && avctx->strict_std_compliance < FF_COMPLIANCE_STRICT) { - layout_map[2][2] = AAC_CHANNEL_SIDE; + layout_map[2][2] = AAC_CHANNEL_BACK; if (!ac || !ac->warned_71_wide++) { av_log(avctx, AV_LOG_INFO, "Assuming an incorrectly encoded 7.1 channel layout" diff --git a/libavcodec/aacdectab.h b/libavcodec/aacdectab.h index 0e5e47da64..41f1db781d 100644 --- a/libavcodec/aacdectab.h +++ b/libavcodec/aacdectab.h @@ -49,12 +49,12 @@ static const uint8_t aac_channel_layout_map[16][16][3] = { { { 0, } }, { { 0, } }, { { TYPE_SCE, 0, AAC_CHANNEL_FRONT }, { TYPE_CPE, 0, AAC_CHANNEL_FRONT }, { TYPE_CPE, 1, AAC_CHANNEL_BACK }, { TYPE_SCE, 1, AAC_CHANNEL_BACK }, { TYPE_LFE, 0, AAC_CHANNEL_LFE }, }, - { { TYPE_SCE, 0, AAC_CHANNEL_FRONT }, { TYPE_CPE, 0, AAC_CHANNEL_FRONT }, { TYPE_CPE, 1, AAC_CHANNEL_SIDE }, { TYPE_CPE, 2, AAC_CHANNEL_BACK }, { TYPE_LFE, 0, AAC_CHANNEL_LFE }, }, + { { TYPE_SCE, 0, AAC_CHANNEL_FRONT }, { TYPE_CPE, 0, AAC_CHANNEL_FRONT }, { TYPE_CPE, 1, AAC_CHANNEL_BACK }, { TYPE_CPE, 2, AAC_CHANNEL_BACK }, { TYPE_LFE, 0, AAC_CHANNEL_LFE }, }, { { TYPE_SCE, 0, AAC_CHANNEL_FRONT }, // SCE1 = FC, { TYPE_CPE, 0, AAC_CHANNEL_FRONT }, // CPE1 = FLc and FRc, { TYPE_CPE, 1, AAC_CHANNEL_FRONT }, // CPE2 = FL and FR, - { TYPE_CPE, 2, AAC_CHANNEL_SIDE }, // CPE3 = SiL and SiR, + { TYPE_CPE, 2, AAC_CHANNEL_BACK }, // CPE3 = SiL and SiR, { TYPE_CPE, 3, AAC_CHANNEL_BACK }, // CPE4 = BL and BR, { TYPE_SCE, 1, AAC_CHANNEL_BACK }, // SCE2 = BC, { TYPE_LFE, 0, AAC_CHANNEL_LFE }, // LFE1 = LFE1, @@ -62,7 +62,7 @@ static const uint8_t aac_channel_layout_map[16][16][3] = { { TYPE_SCE, 2, AAC_CHANNEL_FRONT }, // SCE3 = TpFC, { TYPE_CPE, 4, AAC_CHANNEL_FRONT }, // CPE5 = TpFL and TpFR, { TYPE_CPE, 5, AAC_CHANNEL_SIDE }, // CPE6 = TpSiL and TpSiR, - { TYPE_SCE, 3, AAC_CHANNEL_FRONT }, // SCE4 = TpC, + { TYPE_SCE, 3, AAC_CHANNEL_SIDE }, // SCE4 = TpC, { TYPE_CPE, 6, AAC_CHANNEL_BACK }, // CPE7 = TpBL and TpBR, { TYPE_SCE, 4, AAC_CHANNEL_BACK }, // SCE5 = TpBC, { TYPE_SCE, 5, AAC_CHANNEL_FRONT }, // SCE6 = BtFC, @@ -72,6 +72,27 @@ static const uint8_t aac_channel_layout_map[16][16][3] = { { { 0, } }, }; +static const int16_t aac_channel_map[3][4][6] = { + { + { AV_CHAN_FRONT_CENTER, AV_CHAN_FRONT_LEFT_OF_CENTER, AV_CHAN_FRONT_RIGHT_OF_CENTER, AV_CHAN_FRONT_LEFT, AV_CHAN_FRONT_RIGHT, AV_CHAN_NONE }, + { AV_CHAN_UNUSED, AV_CHAN_NONE, AV_CHAN_NONE, AV_CHAN_NONE, AV_CHAN_NONE, AV_CHAN_NONE }, + { AV_CHAN_UNUSED, AV_CHAN_SIDE_LEFT, AV_CHAN_SIDE_RIGHT, AV_CHAN_BACK_LEFT, AV_CHAN_BACK_RIGHT, AV_CHAN_BACK_CENTER }, + { AV_CHAN_LOW_FREQUENCY, AV_CHAN_LOW_FREQUENCY_2, AV_CHAN_NONE, AV_CHAN_NONE, AV_CHAN_NONE, AV_CHAN_NONE }, + }, + { + { AV_CHAN_TOP_FRONT_CENTER, AV_CHAN_NONE, AV_CHAN_NONE, AV_CHAN_TOP_FRONT_LEFT, AV_CHAN_TOP_FRONT_RIGHT, AV_CHAN_NONE }, + { AV_CHAN_UNUSED, AV_CHAN_TOP_SIDE_LEFT, AV_CHAN_TOP_SIDE_RIGHT, AV_CHAN_NONE, AV_CHAN_NONE, AV_CHAN_TOP_CENTER}, + { AV_CHAN_UNUSED, AV_CHAN_NONE, AV_CHAN_NONE, AV_CHAN_TOP_BACK_LEFT, AV_CHAN_TOP_BACK_RIGHT, AV_CHAN_TOP_BACK_CENTER}, + { AV_CHAN_NONE, AV_CHAN_NONE, AV_CHAN_NONE, AV_CHAN_NONE, AV_CHAN_NONE, AV_CHAN_NONE}, + }, + { + { AV_CHAN_BOTTOM_FRONT_CENTER, AV_CHAN_NONE, AV_CHAN_NONE, AV_CHAN_BOTTOM_FRONT_LEFT, AV_CHAN_BOTTOM_FRONT_RIGHT, AV_CHAN_NONE }, + { AV_CHAN_NONE, AV_CHAN_NONE, AV_CHAN_NONE, AV_CHAN_NONE, AV_CHAN_NONE, AV_CHAN_NONE }, + { AV_CHAN_NONE, AV_CHAN_NONE, AV_CHAN_NONE, AV_CHAN_NONE, AV_CHAN_NONE, AV_CHAN_NONE }, + { AV_CHAN_NONE, AV_CHAN_NONE, AV_CHAN_NONE, AV_CHAN_NONE, AV_CHAN_NONE, AV_CHAN_NONE }, + }, +}; + #if FF_API_OLD_CHANNEL_LAYOUT static const uint64_t aac_channel_layout[] = { AV_CH_LAYOUT_MONO,