blob: dfbffce02c55b2eb15304aa71f6aa769b4a3d0d9 [file] [log] [blame]
/*
* Copyright (c) 2024, Alliance for Open Media. All rights reserved
*
* This source code is subject to the terms of the BSD 3-Clause Clear License
* and the Alliance for Open Media Patent License 1.0. If the BSD 3-Clause Clear
* License was not distributed with this source code in the LICENSE file, you
* can obtain it at www.aomedia.org/license/software-license/bsd-3-c-c. If the
* Alliance for Open Media Patent License 1.0 was not distributed with this
* source code in the PATENTS file, you can obtain it at
* www.aomedia.org/license/patent.
*/
#include "iamf/cli/channel_label.h"
#include <optional>
#include <vector>
#include "absl/status/status_matchers.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "iamf/obu/audio_element.h"
#include "iamf/obu/recon_gain_info_parameter_data.h"
namespace iamf_tools {
namespace {
using ::absl_testing::IsOk;
using ::absl_testing::IsOkAndHolds;
using ::testing::IsEmpty;
using enum ChannelLabel::Label;
using enum ChannelAudioLayerConfig::ExpandedLoudspeakerLayout;
using enum ChannelAudioLayerConfig::LoudspeakerLayout;
constexpr std::optional<ChannelAudioLayerConfig::ExpandedLoudspeakerLayout>
kNoExpandedLayout = std::nullopt;
using enum ChannelAudioLayerConfig::LoudspeakerLayout;
using enum ReconGainElement::ReconGainFlagBitmask;
TEST(GetDemixedLabel, SucceedsForDemixedStereo) {
EXPECT_THAT(ChannelLabel::GetDemixedLabel(kR2), IsOkAndHolds(kDemixedR2));
}
TEST(GetDemixedLabel, SucceedsForDemixed3_1_2) {
EXPECT_THAT(ChannelLabel::GetDemixedLabel(kL3), IsOkAndHolds(kDemixedL3));
EXPECT_THAT(ChannelLabel::GetDemixedLabel(kR3), IsOkAndHolds(kDemixedR3));
}
TEST(GetDemixedLabel, SucceedsForDemixed5_1_2) {
EXPECT_THAT(ChannelLabel::GetDemixedLabel(kL5), IsOkAndHolds(kDemixedL5));
EXPECT_THAT(ChannelLabel::GetDemixedLabel(kR5), IsOkAndHolds(kDemixedR5));
EXPECT_THAT(ChannelLabel::GetDemixedLabel(kLs5), IsOkAndHolds(kDemixedLs5));
EXPECT_THAT(ChannelLabel::GetDemixedLabel(kRs5), IsOkAndHolds(kDemixedRs5));
EXPECT_THAT(ChannelLabel::GetDemixedLabel(kLtf2), IsOkAndHolds(kDemixedLtf2));
EXPECT_THAT(ChannelLabel::GetDemixedLabel(kRtf2), IsOkAndHolds(kDemixedRtf2));
}
TEST(GetDemixedLabel, SucceedsForDemixed7_1_4) {
EXPECT_THAT(ChannelLabel::GetDemixedLabel(kL7), IsOkAndHolds(kDemixedL7));
EXPECT_THAT(ChannelLabel::GetDemixedLabel(kR7), IsOkAndHolds(kDemixedR7));
EXPECT_THAT(ChannelLabel::GetDemixedLabel(kLrs7), IsOkAndHolds(kDemixedLrs7));
EXPECT_THAT(ChannelLabel::GetDemixedLabel(kRrs7), IsOkAndHolds(kDemixedRrs7));
EXPECT_THAT(ChannelLabel::GetDemixedLabel(kLtb4), IsOkAndHolds(kDemixedLtb4));
EXPECT_THAT(ChannelLabel::GetDemixedLabel(kRtb4), IsOkAndHolds(kDemixedRtb4));
}
TEST(GetDemixedLabel, InvalidForL2) {
EXPECT_FALSE(ChannelLabel::GetDemixedLabel(kL2).ok());
}
TEST(GetDemixedLabel, InvalidForCentre) {
EXPECT_FALSE(ChannelLabel::GetDemixedLabel(kCentre).ok());
}
TEST(GetDemixedLabel, InvalidForLFE) {
EXPECT_FALSE(ChannelLabel::GetDemixedLabel(kCentre).ok());
}
TEST(GetDemixedLabel, InvalidForAmbisonics) {
EXPECT_FALSE(ChannelLabel::GetDemixedLabel(kA0).ok());
}
TEST(AmbisonicsChannelNumberToLabel, SucceedsForZerothOrderAmbisonics) {
constexpr int kFirstZerothOrderAmbisonicsChannel = 0;
EXPECT_THAT(ChannelLabel::AmbisonicsChannelNumberToLabel(
kFirstZerothOrderAmbisonicsChannel),
IsOkAndHolds(kA0));
}
TEST(AmbisonicsChannelNumberToLabel, SucceedsForFourthOrderAmbisonics) {
constexpr int kFirstFourthOrderAmbisonicsChannel = 16;
constexpr int kLastFourthOrderAmbisonicsChannel = 24;
EXPECT_THAT(ChannelLabel::AmbisonicsChannelNumberToLabel(
kFirstFourthOrderAmbisonicsChannel),
IsOkAndHolds(kA16));
EXPECT_THAT(ChannelLabel::AmbisonicsChannelNumberToLabel(
kLastFourthOrderAmbisonicsChannel),
IsOkAndHolds(kA24));
}
TEST(AmbisonicsChannelNumberToLabel, InvalidForFifthOrderAmbisonics) {
constexpr int kFirstFifthOrderAmbisonicsChannel = 25;
constexpr int kLastFifthOrderAmbisonicsChannel = 35;
EXPECT_FALSE(ChannelLabel::AmbisonicsChannelNumberToLabel(
kFirstFifthOrderAmbisonicsChannel)
.ok());
EXPECT_FALSE(ChannelLabel::AmbisonicsChannelNumberToLabel(
kLastFifthOrderAmbisonicsChannel)
.ok());
}
TEST(AmbisonicsChannelNumberToLabel, InvalidForFourteenthOrderAmbisonics) {
constexpr int kFirstFourteenthOrderAmbisonicsChannel = 196;
constexpr int kLastFourteenthOrderAmbisonicsChannel = 224;
EXPECT_FALSE(ChannelLabel::AmbisonicsChannelNumberToLabel(
kFirstFourteenthOrderAmbisonicsChannel)
.ok());
EXPECT_FALSE(ChannelLabel::AmbisonicsChannelNumberToLabel(
kLastFourteenthOrderAmbisonicsChannel)
.ok());
}
TEST(LookupEarChannelOrderFromScalableLoudspeakerLayout,
SucceedsForChannelBasedLayout) {
EXPECT_THAT(ChannelLabel::LookupEarChannelOrderFromScalableLoudspeakerLayout(
ChannelAudioLayerConfig::kLayoutMono, kNoExpandedLayout),
IsOk());
}
TEST(LookupEarChannelOrderFromScalableLoudspeakerLayout,
FailsForReservedLayouts10Through14) {
EXPECT_FALSE(ChannelLabel::LookupEarChannelOrderFromScalableLoudspeakerLayout(
kLayoutReserved10, kNoExpandedLayout)
.ok());
EXPECT_FALSE(ChannelLabel::LookupEarChannelOrderFromScalableLoudspeakerLayout(
kLayoutReserved11, kNoExpandedLayout)
.ok());
EXPECT_FALSE(ChannelLabel::LookupEarChannelOrderFromScalableLoudspeakerLayout(
kLayoutReserved12, kNoExpandedLayout)
.ok());
EXPECT_FALSE(ChannelLabel::LookupEarChannelOrderFromScalableLoudspeakerLayout(
kLayoutReserved13, kNoExpandedLayout)
.ok());
EXPECT_FALSE(ChannelLabel::LookupEarChannelOrderFromScalableLoudspeakerLayout(
kLayoutReserved14, kNoExpandedLayout)
.ok());
}
TEST(LookupEarChannelOrderFromScalableLoudspeakerLayout,
InvalidWhenExpandedLayoutIsInconsistent) {
EXPECT_FALSE(ChannelLabel::LookupEarChannelOrderFromScalableLoudspeakerLayout(
ChannelAudioLayerConfig::kLayoutExpanded, kNoExpandedLayout)
.ok());
}
struct ExpandedLayoutAndChannelOrderTestCase {
ChannelAudioLayerConfig::ExpandedLoudspeakerLayout expanded_layout;
std::vector<ChannelLabel::Label> ordered_labels;
};
using LookupEarChannelOrderFromScalableLoudspeakerLayoutTest =
::testing::TestWithParam<ExpandedLayoutAndChannelOrderTestCase>;
TEST_P(LookupEarChannelOrderFromScalableLoudspeakerLayoutTest,
HoldsExpectedValue) {
EXPECT_THAT(ChannelLabel::LookupEarChannelOrderFromScalableLoudspeakerLayout(
kLayoutExpanded, GetParam().expanded_layout),
IsOkAndHolds(GetParam().ordered_labels));
}
INSTANTIATE_TEST_SUITE_P(
ExpandedLayoutLFE, LookupEarChannelOrderFromScalableLoudspeakerLayoutTest,
::testing::ValuesIn<ExpandedLayoutAndChannelOrderTestCase>(
{{kExpandedLayoutLFE,
{kOmitted, kOmitted, kOmitted, kLFE, kOmitted, kOmitted, kOmitted,
kOmitted, kOmitted, kOmitted, kOmitted, kOmitted}}}));
INSTANTIATE_TEST_SUITE_P(
kExpandedLayoutStereoS,
LookupEarChannelOrderFromScalableLoudspeakerLayoutTest,
::testing::ValuesIn<ExpandedLayoutAndChannelOrderTestCase>(
{{kExpandedLayoutStereoS,
{kOmitted, kOmitted, kOmitted, kOmitted, kLs5, kRs5, kOmitted,
kOmitted, kOmitted, kOmitted}}}));
INSTANTIATE_TEST_SUITE_P(
ExpandedLayoutStereoSS,
LookupEarChannelOrderFromScalableLoudspeakerLayoutTest,
::testing::ValuesIn<ExpandedLayoutAndChannelOrderTestCase>(
{{kExpandedLayoutStereoSS,
{kOmitted, kOmitted, kOmitted, kOmitted, kLss7, kRss7, kOmitted,
kOmitted, kOmitted, kOmitted, kOmitted, kOmitted}}}));
INSTANTIATE_TEST_SUITE_P(
ExpandedLayoutStereoRS,
LookupEarChannelOrderFromScalableLoudspeakerLayoutTest,
::testing::ValuesIn<ExpandedLayoutAndChannelOrderTestCase>(
{{kExpandedLayoutStereoRS,
{kOmitted, kOmitted, kOmitted, kOmitted, kOmitted, kOmitted, kLrs7,
kRrs7, kOmitted, kOmitted, kOmitted, kOmitted}}}));
INSTANTIATE_TEST_SUITE_P(
ExpandedLayoutStereoTF,
LookupEarChannelOrderFromScalableLoudspeakerLayoutTest,
::testing::ValuesIn<ExpandedLayoutAndChannelOrderTestCase>(
{{kExpandedLayoutStereoTF,
{kOmitted, kOmitted, kOmitted, kOmitted, kOmitted, kOmitted, kOmitted,
kOmitted, kLtf4, kRtf4, kOmitted, kOmitted}}}));
INSTANTIATE_TEST_SUITE_P(
ExpandedLayoutStereoTB,
LookupEarChannelOrderFromScalableLoudspeakerLayoutTest,
::testing::ValuesIn<ExpandedLayoutAndChannelOrderTestCase>(
{{kExpandedLayoutStereoTB,
{kOmitted, kOmitted, kOmitted, kOmitted, kOmitted, kOmitted, kOmitted,
kOmitted, kOmitted, kOmitted, kLtb4, kRtb4}}}));
INSTANTIATE_TEST_SUITE_P(
ExpandedLayoutStereoTop4Ch,
LookupEarChannelOrderFromScalableLoudspeakerLayoutTest,
::testing::ValuesIn<ExpandedLayoutAndChannelOrderTestCase>(
{{kExpandedLayoutTop4Ch,
{kOmitted, kOmitted, kOmitted, kOmitted, kOmitted, kOmitted, kOmitted,
kOmitted, kLtf4, kRtf4, kLtb4, kRtb4}}}));
INSTANTIATE_TEST_SUITE_P(
ExpandedLayoutStereo9_1_6Ch,
LookupEarChannelOrderFromScalableLoudspeakerLayoutTest,
::testing::ValuesIn<ExpandedLayoutAndChannelOrderTestCase>(
{{kExpandedLayout9_1_6_ch,
{kFL, kFR, kFC, kLFE, kBL, kBR, kFLc, kFRc, kSiL, kSiR, kTpFL, kTpFR,
kTpBL, kTpBR, kTpSiL, kTpSiR}}}));
INSTANTIATE_TEST_SUITE_P(
ExpandedLayoutStereoF,
LookupEarChannelOrderFromScalableLoudspeakerLayoutTest,
::testing::ValuesIn<ExpandedLayoutAndChannelOrderTestCase>(
{{kExpandedLayoutStereoF,
{kFL, kFR, kOmitted, kOmitted, kOmitted, kOmitted, kOmitted, kOmitted,
kOmitted, kOmitted, kOmitted, kOmitted, kOmitted, kOmitted, kOmitted,
kOmitted}}}));
INSTANTIATE_TEST_SUITE_P(
ExpandedLayoutStereoSi,
LookupEarChannelOrderFromScalableLoudspeakerLayoutTest,
::testing::ValuesIn<ExpandedLayoutAndChannelOrderTestCase>(
{{kExpandedLayoutStereoSi,
{kOmitted, kOmitted, kOmitted, kOmitted, kOmitted, kOmitted, kOmitted,
kOmitted, kSiL, kSiR, kOmitted, kOmitted, kOmitted, kOmitted,
kOmitted, kOmitted}}}));
INSTANTIATE_TEST_SUITE_P(
ExpandedLayoutStereoTpSi,
LookupEarChannelOrderFromScalableLoudspeakerLayoutTest,
::testing::ValuesIn<ExpandedLayoutAndChannelOrderTestCase>(
{{kExpandedLayoutStereoTpSi,
{kOmitted, kOmitted, kOmitted, kOmitted, kOmitted, kOmitted, kOmitted,
kOmitted, kOmitted, kOmitted, kOmitted, kOmitted, kOmitted, kOmitted,
kTpSiL, kTpSiR}}}));
INSTANTIATE_TEST_SUITE_P(
ExpandedLayoutTp6ch, LookupEarChannelOrderFromScalableLoudspeakerLayoutTest,
::testing::ValuesIn<ExpandedLayoutAndChannelOrderTestCase>(
{{kExpandedLayoutTop6Ch,
{kOmitted, kOmitted, kOmitted, kOmitted, kOmitted, kOmitted, kOmitted,
kOmitted, kOmitted, kOmitted, kTpFL, kTpFR, kTpBL, kTpBR, kTpSiL,
kTpSiR}}}));
TEST(LookupLabelsToReconstructFromScalableLoudspeakerLayout,
SucceedsForChannelBasedLayout) {
EXPECT_THAT(
ChannelLabel::LookupLabelsToReconstructFromScalableLoudspeakerLayout(
kLayoutMono, kNoExpandedLayout),
IsOk());
}
TEST(LookupLabelsToReconstructFromScalableLoudspeakerLayout,
FailsForReservedLayouts10Through14) {
EXPECT_FALSE(
ChannelLabel::LookupLabelsToReconstructFromScalableLoudspeakerLayout(
kLayoutReserved10, kNoExpandedLayout)
.ok());
EXPECT_FALSE(
ChannelLabel::LookupLabelsToReconstructFromScalableLoudspeakerLayout(
kLayoutReserved11, kNoExpandedLayout)
.ok());
EXPECT_FALSE(
ChannelLabel::LookupLabelsToReconstructFromScalableLoudspeakerLayout(
kLayoutReserved12, kNoExpandedLayout)
.ok());
EXPECT_FALSE(
ChannelLabel::LookupLabelsToReconstructFromScalableLoudspeakerLayout(
kLayoutReserved13, kNoExpandedLayout)
.ok());
EXPECT_FALSE(
ChannelLabel::LookupLabelsToReconstructFromScalableLoudspeakerLayout(
kLayoutReserved14, kNoExpandedLayout)
.ok());
}
TEST(LookupLabelsToReconstructFromScalableLoudspeakerLayout,
InvalidWhenExpandedLayoutIsInconsistent) {
EXPECT_FALSE(
ChannelLabel::LookupLabelsToReconstructFromScalableLoudspeakerLayout(
ChannelAudioLayerConfig::kLayoutExpanded, kNoExpandedLayout)
.ok());
}
using LookupLabelsToReconstructFromScalableLoudspeakerLayout =
::testing::TestWithParam<
ChannelAudioLayerConfig::ExpandedLoudspeakerLayout>;
TEST_P(LookupLabelsToReconstructFromScalableLoudspeakerLayout,
ReturnsEmptySet) {
EXPECT_THAT(
ChannelLabel::LookupLabelsToReconstructFromScalableLoudspeakerLayout(
kLayoutExpanded, GetParam()),
IsOkAndHolds(IsEmpty()));
}
INSTANTIATE_TEST_SUITE_P(
BaseEnhancedProfileExpandedLayoutsReturnEmptySet,
LookupLabelsToReconstructFromScalableLoudspeakerLayout,
::testing::ValuesIn<ChannelAudioLayerConfig::ExpandedLoudspeakerLayout>(
{kExpandedLayoutLFE, kExpandedLayoutStereoS, kExpandedLayoutStereoSS,
kExpandedLayoutStereoRS, kExpandedLayoutStereoTF,
kExpandedLayoutStereoTB, kExpandedLayoutTop4Ch, kExpandedLayout3_0_ch,
kExpandedLayout9_1_6_ch, kExpandedLayoutStereoF,
kExpandedLayoutStereoSi, kExpandedLayoutStereoTpSi,
kExpandedLayoutTop6Ch}));
TEST(GetDemixedChannelLabelForReconGain, SucceedsForL3) {
EXPECT_THAT(ChannelLabel::GetDemixedChannelLabelForReconGain(kLayout3_1_2_ch,
kReconGainFlagL),
IsOkAndHolds(kDemixedL3));
}
TEST(GetDemixedChannelLabelForReconGain, SucceedsForL5) {
EXPECT_THAT(ChannelLabel::GetDemixedChannelLabelForReconGain(kLayout5_1_ch,
kReconGainFlagL),
IsOkAndHolds(kDemixedL5));
}
TEST(GetDemixedChannelLabelForReconGain, SucceedsForL7) {
EXPECT_THAT(ChannelLabel::GetDemixedChannelLabelForReconGain(kLayout7_1_2_ch,
kReconGainFlagL),
IsOkAndHolds(kDemixedL7));
}
TEST(GetDemixedChannelLabelForReconGain, SucceedsForR2) {
EXPECT_THAT(ChannelLabel::GetDemixedChannelLabelForReconGain(kLayoutStereo,
kReconGainFlagR),
IsOkAndHolds(kDemixedR2));
}
TEST(GetDemixedChannelLabelForReconGain, SucceedsForR3) {
EXPECT_THAT(ChannelLabel::GetDemixedChannelLabelForReconGain(kLayout3_1_2_ch,
kReconGainFlagR),
IsOkAndHolds(kDemixedR3));
}
TEST(GetDemixedChannelLabelForReconGain, SucceedsForR5) {
EXPECT_THAT(ChannelLabel::GetDemixedChannelLabelForReconGain(kLayout5_1_ch,
kReconGainFlagR),
IsOkAndHolds(kDemixedR5));
}
TEST(GetDemixedChannelLabelForReconGain, SucceedsForR7) {
EXPECT_THAT(ChannelLabel::GetDemixedChannelLabelForReconGain(kLayout7_1_2_ch,
kReconGainFlagR),
IsOkAndHolds(kDemixedR7));
}
TEST(GetDemixedChannelLabelForReconGain, SucceedsForLs5) {
EXPECT_THAT(ChannelLabel::GetDemixedChannelLabelForReconGain(
kLayout5_1_ch, kReconGainFlagLss),
IsOkAndHolds(kDemixedLs5));
}
TEST(GetDemixedChannelLabelForReconGain, SucceedsForRs5) {
EXPECT_THAT(ChannelLabel::GetDemixedChannelLabelForReconGain(
kLayout5_1_ch, kReconGainFlagRss),
IsOkAndHolds(kDemixedRs5));
}
TEST(GetDemixedChannelLabelForReconGain, SucceedsForLtf2) {
EXPECT_THAT(ChannelLabel::GetDemixedChannelLabelForReconGain(
kLayout5_1_ch, kReconGainFlagLtf),
IsOkAndHolds(kDemixedLtf2));
}
TEST(GetDemixedChannelLabelForReconGain, SucceedsForRtf2) {
EXPECT_THAT(ChannelLabel::GetDemixedChannelLabelForReconGain(
kLayout5_1_ch, kReconGainFlagRtf),
IsOkAndHolds(kDemixedRtf2));
}
TEST(GetDemixedChannelLabelForReconGain, SucceedsForLrs7) {
EXPECT_THAT(ChannelLabel::GetDemixedChannelLabelForReconGain(
kLayout7_1_2_ch, kReconGainFlagLrs),
IsOkAndHolds(kDemixedLrs7));
}
TEST(GetDemixedChannelLabelForReconGain, SucceedsForRrs7) {
EXPECT_THAT(ChannelLabel::GetDemixedChannelLabelForReconGain(
kLayout7_1_2_ch, kReconGainFlagRrs),
IsOkAndHolds(kDemixedRrs7));
}
TEST(GetDemixedChannelLabelForReconGain, SucceedsForLtb4) {
EXPECT_THAT(ChannelLabel::GetDemixedChannelLabelForReconGain(
kLayout5_1_4_ch, kReconGainFlagLtb),
IsOkAndHolds(kDemixedLtb4));
}
TEST(GetDemixedChannelLabelForReconGain, SucceedsForRtb4) {
EXPECT_THAT(ChannelLabel::GetDemixedChannelLabelForReconGain(
kLayout5_1_4_ch, kReconGainFlagRtb),
IsOkAndHolds(kDemixedRtb4));
}
TEST(GetDemixedChannelLabelForReconGain, FailsForReconGainFlagC) {
EXPECT_FALSE(ChannelLabel::GetDemixedChannelLabelForReconGain(kLayoutStereo,
kReconGainFlagC)
.ok());
}
TEST(GetDemixedChannelLabelForReconGain, FailsForReconGainFlagLfe) {
EXPECT_FALSE(ChannelLabel::GetDemixedChannelLabelForReconGain(
kLayout5_1_ch, kReconGainFlagLfe)
.ok());
}
TEST(GetDemixedChannelLabelForReconGain,
FailsForReconGainFlagLWithoutAppropriateLayout) {
EXPECT_FALSE(ChannelLabel::GetDemixedChannelLabelForReconGain(kLayoutStereo,
kReconGainFlagL)
.ok());
}
TEST(GetDemixedChannelLabelForReconGain,
FailsForReconGainFlagRWithoutAppropriateLayout) {
EXPECT_FALSE(ChannelLabel::GetDemixedChannelLabelForReconGain(kLayoutMono,
kReconGainFlagR)
.ok());
}
} // namespace
} // namespace iamf_tools