From patchwork Thu Jan 16 01:33:01 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dylan Marcus X-Patchwork-Id: 17379 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 62389449DB5 for ; Thu, 16 Jan 2020 03:33:48 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 34D3F68AFE1; Thu, 16 Jan 2020 03:33:48 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from smtp125.iad3a.emailsrvr.com (smtp125.iad3a.emailsrvr.com [173.203.187.125]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9A60768AE4C for ; Thu, 16 Jan 2020 03:33:41 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=mach1studios.com; s=20180116-m1eaj1ip; t=1579138420; bh=7sRF9WTi3M75Klq91BXO0zscpza8Y2N9gpptBSCYwTU=; h=From:To:Subject:Date:From; b=OgrSdqc12mLu1AkAV8HD9ae+1bLFy7hqNGqUiJF+PfP5dnF8+paB5Vt1I8EaaeNn0 ym+qTZgPn+enNIjinvX6JsuthhiZkZc3RvkN3FKKtIwGX3fm4J4gjyJW+5CMD8w42o U4A8LsCPRTCl/eD4F4S99rPJN3ke83yJKsVixlSI= X-Auth-ID: dylan@mach1studios.com Received: by smtp16.relay.iad3a.emailsrvr.com (Authenticated sender: dylan-AT-mach1studios.com) with ESMTPSA id 33A115CCE; Wed, 15 Jan 2020 20:33:40 -0500 (EST) X-Sender-Id: dylan@mach1studios.com Received: from localhost.localdomain (cpe-67-244-110-140.nyc.res.rr.com [67.244.110.140]) (using TLSv1.2 with cipher AES128-SHA256) by 0.0.0.0:587 (trex/5.7.12); Wed, 15 Jan 2020 20:33:40 -0500 From: Dylan Marcus To: ffmpeg-devel@ffmpeg.org Date: Wed, 15 Jan 2020 20:33:01 -0500 Message-Id: <20200116013301.5362-1-dylan@mach1studios.com> X-Mailer: git-send-email 2.16.3 Subject: [FFmpeg-devel] [PATCH] avutil/avcodec: expanded on channel configurations for spatial audio 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 Cc: Dylan Marcus MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- Changelog | 1 + libavcodec/aacenc.h | 16 ++++++++++++ libavutil/channel_layout.c | 8 ++++++ libavutil/channel_layout.h | 64 ++++++++++++++++++++++++++-------------------- 4 files changed, 61 insertions(+), 28 deletions(-) diff --git a/Changelog b/Changelog index 2ccd2645fc..08918e95da 100644 --- a/Changelog +++ b/Changelog @@ -30,6 +30,7 @@ version : - MPEG-H 3D Audio support in mp4 - thistogram filter - freezeframes filter +- Support for Mach1 Spatial audio channel configurations version 4.2: diff --git a/libavcodec/aacenc.h b/libavcodec/aacenc.h index 5a015ca92e..a0f99680ee 100644 --- a/libavcodec/aacenc.h +++ b/libavcodec/aacenc.h @@ -368,6 +368,22 @@ static const AACPCEInfo aac_pce_configs[] = { .config_map = { 10, TYPE_CPE, TYPE_SCE, TYPE_CPE, TYPE_SCE, TYPE_CPE, TYPE_CPE, TYPE_CPE, TYPE_SCE, TYPE_CPE, TYPE_SCE }, .reorder_map = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, }, + { + .layout = AV_CH_LAYOUT_MACH1SPATIAL_8, + .num_ele = { 4, 0, 4, 0 }, + .pairing = { { 0 }, { 0 }, { 0 } }, + .index = { { 0, 1, 4, 5 }, { 0 }, { 2, 3, 6, 7 } }, + .config_map = { 8, TYPE_SCE, TYPE_SCE, TYPE_SCE, TYPE_SCE, TYPE_SCE, TYPE_SCE, TYPE_SCE, TYPE_SCE }, + .reorder_map = { 0, 1, 2, 3, 4, 5, 6, 7 }, + }, + { + .layout = AV_CH_LAYOUT_MACH1SPATIAL_8_ST, + .num_ele = { 5, 0, 4, 0 }, + .pairing = { { 0, 1 }, { 0 }, { 0 } }, + .index = { {0, 1, 4, 5, 0 }, { 0 }, { 2, 3, 6, 7 } }, + .config_map = { 9, TYPE_SCE, TYPE_SCE, TYPE_SCE, TYPE_SCE, TYPE_SCE, TYPE_SCE, TYPE_SCE, TYPE_SCE, TYPE_CPE }, + .reorder_map = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, + }, }; /** diff --git a/libavutil/channel_layout.c b/libavutil/channel_layout.c index 3bd5ee29b7..37119fd023 100644 --- a/libavutil/channel_layout.c +++ b/libavutil/channel_layout.c @@ -62,6 +62,12 @@ static const struct channel_name channel_names[] = { [33] = { "SDL", "surround direct left" }, [34] = { "SDR", "surround direct right" }, [35] = { "LFE2", "low frequency 2" }, + [36] = { "BFL", "bottom front left" }, + [37] = { "BFR", "bottom front right" }, + [38] = { "BBL", "bottom back left" }, + [39] = { "BBR", "bottom back right" }, + [40] = { "STL", "spatial stereo left" }, + [41] = { "STR", "spatial stereo right" }, }; static const char *get_channel_name(int channel_id) @@ -104,6 +110,8 @@ static const struct { { "octagonal", 8, AV_CH_LAYOUT_OCTAGONAL }, { "hexadecagonal", 16, AV_CH_LAYOUT_HEXADECAGONAL }, { "downmix", 2, AV_CH_LAYOUT_STEREO_DOWNMIX, }, + { "mach1spatial-8", 8, AV_CH_LAYOUT_MACH1SPATIAL_8 }, + { "mach1spatial-8.2", 10, AV_CH_LAYOUT_MACH1SPATIAL_8_ST}, }; static uint64_t get_channel_layout_single(const char *name, int name_len) diff --git a/libavutil/channel_layout.h b/libavutil/channel_layout.h index 50bb8f03c5..5bb2415155 100644 --- a/libavutil/channel_layout.h +++ b/libavutil/channel_layout.h @@ -64,6 +64,10 @@ #define AV_CH_TOP_BACK_LEFT 0x00008000 #define AV_CH_TOP_BACK_CENTER 0x00010000 #define AV_CH_TOP_BACK_RIGHT 0x00020000 +#define AV_CH_BOTTOM_FRONT_LEFT 0x0000001000000000ULL +#define AV_CH_BOTTOM_FRONT_RIGHT 0x0000002000000000ULL +#define AV_CH_BOTTOM_BACK_LEFT 0x0000004000000000ULL +#define AV_CH_BOTTOM_BACK_RIGHT 0x0000008000000000ULL #define AV_CH_STEREO_LEFT 0x20000000 ///< Stereo downmix. #define AV_CH_STEREO_RIGHT 0x40000000 ///< See AV_CH_STEREO_LEFT. #define AV_CH_WIDE_LEFT 0x0000000080000000ULL @@ -71,6 +75,8 @@ #define AV_CH_SURROUND_DIRECT_LEFT 0x0000000200000000ULL #define AV_CH_SURROUND_DIRECT_RIGHT 0x0000000400000000ULL #define AV_CH_LOW_FREQUENCY_2 0x0000000800000000ULL +#define AV_CH_SPATIAL_STEREO_LEFT 0x0000010000000000ULL ///< Non diegetic stereo for spatial channel formats +#define AV_CH_SPATIAL_STEREO_RIGHT 0x0000020000000000ULL ///< See AV_CH_SPATIAL_STEREO_LEFT /** Channel mask value used for AVCodecContext.request_channel_layout to indicate that the user requests the channel order of the decoder output @@ -82,34 +88,36 @@ * @defgroup channel_mask_c Audio channel layouts * @{ * */ -#define AV_CH_LAYOUT_MONO (AV_CH_FRONT_CENTER) -#define AV_CH_LAYOUT_STEREO (AV_CH_FRONT_LEFT|AV_CH_FRONT_RIGHT) -#define AV_CH_LAYOUT_2POINT1 (AV_CH_LAYOUT_STEREO|AV_CH_LOW_FREQUENCY) -#define AV_CH_LAYOUT_2_1 (AV_CH_LAYOUT_STEREO|AV_CH_BACK_CENTER) -#define AV_CH_LAYOUT_SURROUND (AV_CH_LAYOUT_STEREO|AV_CH_FRONT_CENTER) -#define AV_CH_LAYOUT_3POINT1 (AV_CH_LAYOUT_SURROUND|AV_CH_LOW_FREQUENCY) -#define AV_CH_LAYOUT_4POINT0 (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_CENTER) -#define AV_CH_LAYOUT_4POINT1 (AV_CH_LAYOUT_4POINT0|AV_CH_LOW_FREQUENCY) -#define AV_CH_LAYOUT_2_2 (AV_CH_LAYOUT_STEREO|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT) -#define AV_CH_LAYOUT_QUAD (AV_CH_LAYOUT_STEREO|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) -#define AV_CH_LAYOUT_5POINT0 (AV_CH_LAYOUT_SURROUND|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT) -#define AV_CH_LAYOUT_5POINT1 (AV_CH_LAYOUT_5POINT0|AV_CH_LOW_FREQUENCY) -#define AV_CH_LAYOUT_5POINT0_BACK (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) -#define AV_CH_LAYOUT_5POINT1_BACK (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_LOW_FREQUENCY) -#define AV_CH_LAYOUT_6POINT0 (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_CENTER) -#define AV_CH_LAYOUT_6POINT0_FRONT (AV_CH_LAYOUT_2_2|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) -#define AV_CH_LAYOUT_HEXAGONAL (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_BACK_CENTER) -#define AV_CH_LAYOUT_6POINT1 (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_CENTER) -#define AV_CH_LAYOUT_6POINT1_BACK (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_BACK_CENTER) -#define AV_CH_LAYOUT_6POINT1_FRONT (AV_CH_LAYOUT_6POINT0_FRONT|AV_CH_LOW_FREQUENCY) -#define AV_CH_LAYOUT_7POINT0 (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) -#define AV_CH_LAYOUT_7POINT0_FRONT (AV_CH_LAYOUT_5POINT0|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) -#define AV_CH_LAYOUT_7POINT1 (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) -#define AV_CH_LAYOUT_7POINT1_WIDE (AV_CH_LAYOUT_5POINT1|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) -#define AV_CH_LAYOUT_7POINT1_WIDE_BACK (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) -#define AV_CH_LAYOUT_OCTAGONAL (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_CENTER|AV_CH_BACK_RIGHT) -#define AV_CH_LAYOUT_HEXADECAGONAL (AV_CH_LAYOUT_OCTAGONAL|AV_CH_WIDE_LEFT|AV_CH_WIDE_RIGHT|AV_CH_TOP_BACK_LEFT|AV_CH_TOP_BACK_RIGHT|AV_CH_TOP_BACK_CENTER|AV_CH_TOP_FRONT_CENTER|AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_FRONT_RIGHT) -#define AV_CH_LAYOUT_STEREO_DOWNMIX (AV_CH_STEREO_LEFT|AV_CH_STEREO_RIGHT) +#define AV_CH_LAYOUT_MONO (AV_CH_FRONT_CENTER) +#define AV_CH_LAYOUT_STEREO (AV_CH_FRONT_LEFT|AV_CH_FRONT_RIGHT) +#define AV_CH_LAYOUT_2POINT1 (AV_CH_LAYOUT_STEREO|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_2_1 (AV_CH_LAYOUT_STEREO|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_SURROUND (AV_CH_LAYOUT_STEREO|AV_CH_FRONT_CENTER) +#define AV_CH_LAYOUT_3POINT1 (AV_CH_LAYOUT_SURROUND|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_4POINT0 (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_4POINT1 (AV_CH_LAYOUT_4POINT0|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_2_2 (AV_CH_LAYOUT_STEREO|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT) +#define AV_CH_LAYOUT_QUAD (AV_CH_LAYOUT_STEREO|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_5POINT0 (AV_CH_LAYOUT_SURROUND|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT) +#define AV_CH_LAYOUT_5POINT1 (AV_CH_LAYOUT_5POINT0|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_5POINT0_BACK (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_5POINT1_BACK (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_6POINT0 (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_6POINT0_FRONT (AV_CH_LAYOUT_2_2|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) +#define AV_CH_LAYOUT_HEXAGONAL (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_6POINT1 (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_6POINT1_BACK (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_6POINT1_FRONT (AV_CH_LAYOUT_6POINT0_FRONT|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_7POINT0 (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_7POINT0_FRONT (AV_CH_LAYOUT_5POINT0|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) +#define AV_CH_LAYOUT_7POINT1 (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_7POINT1_WIDE (AV_CH_LAYOUT_5POINT1|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) +#define AV_CH_LAYOUT_7POINT1_WIDE_BACK (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) +#define AV_CH_LAYOUT_OCTAGONAL (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_CENTER|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_HEXADECAGONAL (AV_CH_LAYOUT_OCTAGONAL|AV_CH_WIDE_LEFT|AV_CH_WIDE_RIGHT|AV_CH_TOP_BACK_LEFT|AV_CH_TOP_BACK_RIGHT|AV_CH_TOP_BACK_CENTER|AV_CH_TOP_FRONT_CENTER|AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_FRONT_RIGHT) +#define AV_CH_LAYOUT_STEREO_DOWNMIX (AV_CH_STEREO_LEFT|AV_CH_STEREO_RIGHT) +#define AV_CH_LAYOUT_MACH1SPATIAL_8 (AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_FRONT_RIGHT|AV_CH_TOP_BACK_LEFT|AV_CH_TOP_BACK_RIGHT|AV_CH_BOTTOM_FRONT_LEFT|AV_CH_BOTTOM_FRONT_RIGHT|AV_CH_BOTTOM_BACK_LEFT|AV_CH_BOTTOM_BACK_RIGHT) +#define AV_CH_LAYOUT_MACH1SPATIAL_8_ST (AV_CH_LAYOUT_MACH1SPATIAL_8|AV_CH_SPATIAL_STEREO_LEFT|AV_CH_SPATIAL_STEREO_RIGHT) enum AVMatrixEncoding { AV_MATRIX_ENCODING_NONE,