From d0079fde8b311ac66b775ac47691273809de97d3 Mon Sep 17 00:00:00 2001 From: David Pesce Date: Fri, 13 Nov 2020 16:10:35 +0100 Subject: [PATCH] Add some ITU BS.2094 definitions in commons lookup tables. Add HOA format lookup method for audioStream. Add HOA format lookup methods using normalization integer index. --- include/adm/common_definitions.hpp | 25 ++++++ src/common_definitions.cpp | 139 ++++++++++++++++++++++++++--- 2 files changed, 153 insertions(+), 11 deletions(-) diff --git a/include/adm/common_definitions.hpp b/include/adm/common_definitions.hpp index 4afd2044..c0f86770 100644 --- a/include/adm/common_definitions.hpp +++ b/include/adm/common_definitions.hpp @@ -54,6 +54,24 @@ namespace adm { ADM_EXPORT const std::map audioTrackFormatLookupTable(); + /** + * @brief Lookup table for AudioStreamFormats + * + * Specified speaker labels: + * + * - M+000, M+022, M-022, M+SC, M-SC, M+030, M-030, M+045, M-045, + * M+060, M-060, M+090, M-090, M+110, M-110, M+135, M-135, M+180 + * - U+000, U+030, U-030, U+045, U-045, U+090, U-090, U+110, U-110, + * U+135, U-135, U+180, UH+180 + * - T+000, B+000, B+045, B-045 + * - LFE1, LFE2 + * + * @return Map with the speaker label specified in ITU-R BS.2051 as key and + * the corresponding AudioStreamFormatID as value. + */ + ADM_EXPORT const std::map + audioStreamFormatLookupTable(); + /** * @brief Lookup table for SpeakerLabels of loudspeaker setup * @@ -87,5 +105,12 @@ namespace adm { */ ADM_EXPORT const adm::AudioTrackFormatId audioTrackFormatHoaLookup( int order, int degree, std::string normalization); + ADM_EXPORT const adm::AudioTrackFormatId audioTrackFormatHoaLookup( + int order, int degree, int normalization); + + ADM_EXPORT const adm::AudioStreamFormatId audioStreamFormatHoaLookup( + int order, int degree, std::string normalization); + ADM_EXPORT const adm::AudioStreamFormatId audioStreamFormatHoaLookup( + int order, int degree, int normalization); } // namespace adm diff --git a/src/common_definitions.cpp b/src/common_definitions.cpp index cd894639..bf8395d4 100644 --- a/src/common_definitions.cpp +++ b/src/common_definitions.cpp @@ -12,15 +12,20 @@ namespace adm { return std::map{ {"0+1+0", adm::parseAudioPackFormatId("AP_00010001")}, {"0+2+0", adm::parseAudioPackFormatId("AP_00010002")}, + {"0+3+0", adm::parseAudioPackFormatId("AP_0001000a")}, + {"0+4+0", adm::parseAudioPackFormatId("AP_0001000b")}, {"0+5+0", adm::parseAudioPackFormatId("AP_00010003")}, + {"0+6+0", adm::parseAudioPackFormatId("AP_0001000d")}, + {"0+7+0", adm::parseAudioPackFormatId("AP_0001000f")}, {"2+5+0", adm::parseAudioPackFormatId("AP_00010004")}, + {"2+7+0", adm::parseAudioPackFormatId("AP_00010014")}, + {"3+7+0", adm::parseAudioPackFormatId("AP_00010007")}, {"4+5+0", adm::parseAudioPackFormatId("AP_00010005")}, {"4+5+1", adm::parseAudioPackFormatId("AP_00010010")}, - {"3+7+0", adm::parseAudioPackFormatId("AP_00010007")}, + {"4+7+0", adm::parseAudioPackFormatId("AP_00010017")}, {"4+9+0", adm::parseAudioPackFormatId("AP_00010008")}, + {"9+9+0", adm::parseAudioPackFormatId("AP_00010011")}, {"9+10+3", adm::parseAudioPackFormatId("AP_00010009")}, - {"0+7+0", adm::parseAudioPackFormatId("AP_0001000f")}, - {"4+7+0", adm::parseAudioPackFormatId("AP_00010017")}, {"SN3D-Order1-3D", adm::parseAudioPackFormatId("AP_00040001")}, {"SN3D-Order2-3D", adm::parseAudioPackFormatId("AP_00040002")}, {"SN3D-Order3-3D", adm::parseAudioPackFormatId("AP_00040003")}, @@ -60,6 +65,8 @@ namespace adm { {"M-090", adm::parseAudioTrackFormatId("AT_0001000b_01")}, {"M+110", adm::parseAudioTrackFormatId("AT_00010005_01")}, {"M-110", adm::parseAudioTrackFormatId("AT_00010006_01")}, + {"M+135_Diff", adm::parseAudioTrackFormatId("AT_0001001a_01")}, + {"M-135_Diff", adm::parseAudioTrackFormatId("AT_0001001b_01")}, {"M+135", adm::parseAudioTrackFormatId("AT_0001001c_01")}, {"M-135", adm::parseAudioTrackFormatId("AT_0001001d_01")}, {"M+180", adm::parseAudioTrackFormatId("AT_00010009_01")}, @@ -102,15 +109,84 @@ namespace adm { {"LFE2", adm::parseAudioTrackFormatId("AT_00010021_01")}}; }; + ADM_EXPORT const std::map + audioStreamFormatLookupTable() { + return std::map{ + {"M+000", adm::parseAudioStreamFormatId("AS_00010003")}, + {"M+022", adm::parseAudioStreamFormatId("AS_00010007")}, + {"M-022", adm::parseAudioStreamFormatId("AS_00010008")}, + {"M+SC", adm::parseAudioStreamFormatId("AS_00010024")}, + {"M-SC", adm::parseAudioStreamFormatId("AS_00010025")}, + {"M+030", adm::parseAudioStreamFormatId("AS_00010001")}, + {"M-030", adm::parseAudioStreamFormatId("AS_00010002")}, + {"M+045", adm::parseAudioStreamFormatId("AS_00010026")}, + {"M-045", adm::parseAudioStreamFormatId("AS_00010027")}, + {"M+060", adm::parseAudioStreamFormatId("AS_00010018")}, + {"M-060", adm::parseAudioStreamFormatId("AS_00010019")}, + {"M+090", adm::parseAudioStreamFormatId("AS_0001000a")}, + {"M-090", adm::parseAudioStreamFormatId("AS_0001000b")}, + {"M+110", adm::parseAudioStreamFormatId("AS_00010005")}, + {"M-110", adm::parseAudioStreamFormatId("AS_00010006")}, + {"M+135_Diff", adm::parseAudioStreamFormatId("AS_0001001a")}, + {"M-135_Diff", adm::parseAudioStreamFormatId("AS_0001001b")}, + {"M+135", adm::parseAudioStreamFormatId("AS_0001001c")}, + {"M-135", adm::parseAudioStreamFormatId("AS_0001001d")}, + {"M+180", adm::parseAudioStreamFormatId("AS_00010009")}, + {"U+000", adm::parseAudioStreamFormatId("AS_0001000e")}, + // {"U+022", adm::parseAudioStreamFormatId("")}, + // {"U-022", adm::parseAudioStreamFormatId("")}, + {"U+030", adm::parseAudioStreamFormatId("AS_0001000d")}, + {"U-030", adm::parseAudioStreamFormatId("AS_0001000f")}, + {"U+045", adm::parseAudioStreamFormatId("AS_00010022")}, + {"U-045", adm::parseAudioStreamFormatId("AS_00010023")}, + // {"U+060", adm::parseAudioStreamFormatId("")}, + // {"U-060", adm::parseAudioStreamFormatId("")}, + {"U+090", adm::parseAudioStreamFormatId("AS_00010013")}, + {"U-090", adm::parseAudioStreamFormatId("AS_00010014")}, + {"U+110", adm::parseAudioStreamFormatId("AS_00010010")}, + {"U-110", adm::parseAudioStreamFormatId("AS_00010012")}, + {"U+135", adm::parseAudioStreamFormatId("AS_0001001e")}, + {"U-135", adm::parseAudioStreamFormatId("AS_0001001f")}, + {"U+180", adm::parseAudioStreamFormatId("AS_00010011")}, + {"UH+180", adm::parseAudioStreamFormatId("AS_00010028")}, + {"T+000", adm::parseAudioStreamFormatId("AS_0001000c")}, + {"B+000", adm::parseAudioStreamFormatId("AS_00010015")}, + // {"B+022", adm::parseAudioStreamFormatId("")}, + // {"B-022", adm::parseAudioStreamFormatId("")}, + // {"B+030", adm::parseAudioStreamFormatId("")}, + // {"B-030", adm::parseAudioStreamFormatId("")}, + {"B+045", adm::parseAudioStreamFormatId("AS_00010016")}, + {"B-045", adm::parseAudioStreamFormatId("AS_00010017")}, + // {"B+060", adm::parseAudioStreamFormatId("")}, + // {"B-060", adm::parseAudioStreamFormatId("")}, + // {"B+090", adm::parseAudioStreamFormatId("")}, + // {"B-090", adm::parseAudioStreamFormatId("")}, + // {"B+110", adm::parseAudioStreamFormatId("")}, + // {"B-110", adm::parseAudioStreamFormatId("")}, + // {"B+135", adm::parseAudioStreamFormatId("")}, + // {"B-135", adm::parseAudioStreamFormatId("")}, + // {"B+180", adm::parseAudioStreamFormatId("")}, + {"LFE", adm::parseAudioStreamFormatId("AS_00010004")}, + {"LFE1", adm::parseAudioStreamFormatId("AS_00010020")}, + {"LFE2", adm::parseAudioStreamFormatId("AS_00010021")}}; + } + const std::map> speakerLabelsLookupTable() { return std::map>{ {"0+1+0", {"M+000"}}, {"0+2+0", {"M+030", "M-030"}}, + {"0+3+0", {"M+030", "M-030", "M+000"}}, + {"0+4+0", {"M+030", "M-030", "M+000", "M+180"}}, {"0+5+0", {"M+030", "M-030", "M+000", "LFE", "M+110", "M-110"}}, + {"0+6+0", {"M+030", "M-030", "M+000", "LFE", "M+110", "M-110", "M+180"}}, + {"0+7+0", {"M+030", "M-030", "M+000", "LFE", "M+090", "M-090", "M+135", "M-135"}}, {"2+5+0", {"M+030", "M-030", "M+000", "LFE", "M+110", "M-110", "U+030", "U-030"}}, + {"2+7+0", + {"M+030", "M-030", "M+000", "LFE", "M+110", "M-110", "U+090", + "U-090", "M+SC", "M-SC"}}, {"4+5+0", {"M+030", "M-030", "M+000", "LFE", "M+110", "M-110", "U+030", "U-030", "U+110", "U-110"}}, @@ -119,20 +195,21 @@ namespace adm { "U+110", "U-110", "B+000"}}, {"3+7+0", {"M+000", "M+030", "M-030", "U+045", "U-045", "M+090", "M-090", - "M+135", "M-135", "UH+180", "LFE1", "LFE2"}}, + "M+135", "M-135", "UH+180", "LFE1", "LFE2"}}, + {"4+7+0", + {"M+030", "M-030", "M+000", "LFE", "M+090", "M-090", "M+135", + "M-135", "U+045", "U-045", "U+135", "U-135"}}, {"4+9+0", {"M+030", "M-030", "M+000", "LFE", "M+090", "M-090", "M+135", "M-135", "U+045", "U-045", "U+135", "U-135", "M+SC", "M-SC"}}, + {"9+9+0", + {"M+030", "M-030", "M+000", "LFE", "M+110", "M-110", "U+090", "U-090", + "M+135_Diff", "M-135_Diff", "U+030", "U-030", "U+000", "U+110", "U-110", + "U+090", "U-090", "U+135", "U-135"}}, {"9+10+3", {"M+060", "M-060", "M+000", "LFE1", "M+135", "M-135", "M+030", "M-030", "M+180", "LFE2", "M+090", "M-090", "U+045", "U-045", "U+000", "T+000", "U+135", "U-135", - "U+090", "U-090", "U+180", "B+000", "B+045", "B-045"}}, - {"0+7+0", - {"M+030", "M-030", "M+000", "LFE", "M+090", "M-090", "M+135", - "M-135"}}, - {"4+7+0", - {"M+030", "M-030", "M+000", "LFE", "M+090", "M-090", "M+135", "M-135", - "U+045", "U-045", "U+135", "U-135"}}}; + "U+090", "U-090", "U+180", "B+000", "B+045", "B-045"}}}; } const adm::AudioTrackFormatId audioTrackFormatHoaLookup( @@ -155,6 +232,46 @@ namespace adm { AudioTrackFormatIdCounter(1)); } + const adm::AudioTrackFormatId audioTrackFormatHoaLookup( + int order, int degree, int normalization) + { + // ACN starts from 0, while AudioTrackFormatId starts from 1 + int trackFormatIdValue = + order * order + order + degree + 1 + normalization * 0x100; + return adm::AudioTrackFormatId(TypeDefinition::HOA, + AudioTrackFormatIdValue(trackFormatIdValue), + AudioTrackFormatIdCounter(1)); + } + + const adm::AudioStreamFormatId audioStreamFormatHoaLookup( + int order, int degree, std::string normalization) { + int normalizationTypeValue; + if (normalization == "SN3D") { + normalizationTypeValue = 0; + } else if (normalization == "N3D") { + normalizationTypeValue = 1; + } else if (normalization == "FuMa") { + normalizationTypeValue = 2; + } else { + throw std::invalid_argument("Not a supported normalization value."); + } + // ACN starts from 0, while AudioTrackFormatId starts from 1 + int trackFormatIdValue = + order * order + order + degree + 1 + normalizationTypeValue * 0x100; + return adm::AudioStreamFormatId(TypeDefinition::HOA, + AudioStreamFormatIdValue(trackFormatIdValue)); + } + + const adm::AudioStreamFormatId audioStreamFormatHoaLookup(int order, + int degree, + int normalization) { + // ACN starts from 0, while AudioTrackFormatId starts from 1 + int trackFormatIdValue = + order * order + order + degree + 1 + normalization * 0x100; + return adm::AudioStreamFormatId(TypeDefinition::HOA, + AudioStreamFormatIdValue(trackFormatIdValue)); + } + std::shared_ptr getCommonDefinitions() { std::stringstream commonDefinitions; getEmbeddedFile("common_definitions.xml", commonDefinitions);