|
31 | 31 | #include "iamf/obu/param_definitions.h" |
32 | 32 | #include "iamf/obu/param_definitions/cart16_param_definition.h" |
33 | 33 | #include "iamf/obu/param_definitions/cart8_param_definition.h" |
| 34 | +#include "iamf/obu/param_definitions/dual_cart8_param_definition.h" |
34 | 35 | #include "iamf/obu/param_definitions/dual_polar_param_definition.h" |
35 | 36 | #include "iamf/obu/param_definitions/polar_param_definition.h" |
36 | 37 | #include "iamf/obu/tests/obu_test_base.h" |
@@ -958,6 +959,73 @@ TEST_F(MixPresentationObuTest, WritesRenderingConfigDualPolarParamDefinition) { |
958 | 959 | InitAndTestWrite(); |
959 | 960 | } |
960 | 961 |
|
| 962 | +TEST_F(MixPresentationObuTest, WritesRenderingConfigDualCart8ParamDefinition) { |
| 963 | + DualCart8ParamDefinition dual_cart8_param_definition; |
| 964 | + dual_cart8_param_definition.parameter_id_ = 1; |
| 965 | + dual_cart8_param_definition.parameter_rate_ = 1; |
| 966 | + dual_cart8_param_definition.param_definition_mode_ = false; |
| 967 | + dual_cart8_param_definition.duration_ = 10; |
| 968 | + dual_cart8_param_definition.constant_subblock_duration_ = 10; |
| 969 | + dual_cart8_param_definition.default_first_x_ = 1; |
| 970 | + dual_cart8_param_definition.default_first_y_ = 2; |
| 971 | + dual_cart8_param_definition.default_first_z_ = 3; |
| 972 | + dual_cart8_param_definition.default_second_x_ = 4; |
| 973 | + dual_cart8_param_definition.default_second_y_ = 5; |
| 974 | + dual_cart8_param_definition.default_second_z_ = 6; |
| 975 | + |
| 976 | + sub_mixes_[0].audio_elements[0].rendering_config = { |
| 977 | + .headphones_rendering_mode = |
| 978 | + RenderingConfig::kHeadphonesRenderingModeStereo, |
| 979 | + .reserved = 0, |
| 980 | + .rendering_config_param_definitions = |
| 981 | + {RenderingConfigParamDefinition::Create( |
| 982 | + ParamDefinition::ParameterDefinitionType:: |
| 983 | + kParameterDefinitionDualCart8, |
| 984 | + dual_cart8_param_definition, {}) |
| 985 | + .value()}, |
| 986 | + .rendering_config_extension_bytes = {}}; |
| 987 | + |
| 988 | + expected_header_ = {kObuIaMixPresentation << 3, 60}; |
| 989 | + expected_payload_ = { |
| 990 | + // Start Mix OBU. |
| 991 | + 10, 1, 'e', 'n', '-', 'u', 's', '\0', 'M', 'i', 'x', ' ', '1', '\0', 1, |
| 992 | + // Start Submix 1 |
| 993 | + 1, 11, 'S', 'u', 'b', 'm', 'i', 'x', ' ', '1', '\0', |
| 994 | + // Start RenderingConfig. |
| 995 | + RenderingConfig::kHeadphonesRenderingModeStereo << 6, |
| 996 | + // `rendering_config_extension_bytes size`. |
| 997 | + 13, |
| 998 | + // Start RenderingConfigParamDefinitions. |
| 999 | + // `num_parameters`. |
| 1000 | + 1, |
| 1001 | + // `param_definition_type`. |
| 1002 | + ParamDefinition::ParameterDefinitionType::kParameterDefinitionDualCart8, |
| 1003 | + // `param_definition`. |
| 1004 | + 1, // parameter_id |
| 1005 | + 1, // parameter_rate |
| 1006 | + 0, // mode |
| 1007 | + 10, // duration |
| 1008 | + 10, // constant_subblock_duration |
| 1009 | + // default_first_x = 1 |
| 1010 | + // default_first_y = 2 |
| 1011 | + // default_first_z = 3 |
| 1012 | + // default_second_x = 4 |
| 1013 | + // default_second_y = 5 |
| 1014 | + // default_second_z = 6 |
| 1015 | + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, |
| 1016 | + // End RenderingConfigParamDefinitions. |
| 1017 | + // End RenderingConfig. |
| 1018 | + 12, 13, 0x80, 0, 14, 15, 16, 0x80, 0, 17, 1, |
| 1019 | + // Start Layout 1 (of Submix 1). |
| 1020 | + (Layout::kLayoutTypeLoudspeakersSsConvention << 6) | |
| 1021 | + LoudspeakersSsConventionLayout::kSoundSystemA_0_2_0, |
| 1022 | + LoudnessInfo::kTruePeak, 0, 18, 0, 19, 0, 20 |
| 1023 | + // End Mix OBU. |
| 1024 | + }; |
| 1025 | + |
| 1026 | + InitAndTestWrite(); |
| 1027 | +} |
| 1028 | + |
961 | 1029 | TEST_F(MixPresentationObuTest, MultipleSubmixesAndLayouts) { |
962 | 1030 | sub_mixes_.push_back( |
963 | 1031 | {.audio_elements = {{ |
@@ -1814,6 +1882,90 @@ TEST(ReadSubMixAudioElementTest, DualPolarParamDefinitionRenderingConfig) { |
1814 | 1882 | EXPECT_EQ(audio_element, expected_submix_audio_element); |
1815 | 1883 | } |
1816 | 1884 |
|
| 1885 | +TEST(ReadSubMixAudioElementTest, DualCart8ParamDefinitionRenderingConfig) { |
| 1886 | + std::vector<uint8_t> source = { |
| 1887 | + // Start SubMixAudioElement. |
| 1888 | + // audio_element_id |
| 1889 | + 11, |
| 1890 | + // localized_element_annotations[0] |
| 1891 | + 'S', 'u', 'b', 'm', 'i', 'x', ' ', '1', '\0', |
| 1892 | + // Start RenderingConfig. |
| 1893 | + RenderingConfig::kHeadphonesRenderingModeBinaural << 6, |
| 1894 | + /*rendering_config_extension_size=*/13, |
| 1895 | + // num_params |
| 1896 | + 1, |
| 1897 | + // Start RenderingConfigParamDefinition. |
| 1898 | + // `param_definition_type`. |
| 1899 | + ParamDefinition::ParameterDefinitionType::kParameterDefinitionDualCart8, |
| 1900 | + // `param_definition`. |
| 1901 | + 1, // parameter_id |
| 1902 | + 1, // parameter_rate |
| 1903 | + 0, // mode |
| 1904 | + 10, // duration |
| 1905 | + 10, // constant_subblock_duration |
| 1906 | + // default_first_x = 1 |
| 1907 | + // default_first_y = 2 |
| 1908 | + // default_first_z = 3 |
| 1909 | + // default_second_x = 4 |
| 1910 | + // default_second_y = 5 |
| 1911 | + // default_second_z = 6 |
| 1912 | + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, |
| 1913 | + // End RenderingConfig. |
| 1914 | + // Start ElementMixGain |
| 1915 | + // Parameter ID. |
| 1916 | + 0x00, |
| 1917 | + // Parameter Rate. |
| 1918 | + 1, |
| 1919 | + // Param Definition Mode (upper bit), next 7 bits reserved. |
| 1920 | + 0x80, |
| 1921 | + // Default Mix Gain. |
| 1922 | + 0, 4 |
| 1923 | + // End ElementMixGain |
| 1924 | + }; |
| 1925 | + auto buffer = |
| 1926 | + MemoryBasedReadBitBuffer::CreateFromSpan(absl::MakeConstSpan(source)); |
| 1927 | + SubMixAudioElement audio_element; |
| 1928 | + EXPECT_THAT(audio_element.ReadAndValidate(/*count_label=*/1, *buffer), |
| 1929 | + IsOk()); |
| 1930 | + |
| 1931 | + DualCart8ParamDefinition dual_cart8_param_definition; |
| 1932 | + dual_cart8_param_definition.parameter_id_ = 1; |
| 1933 | + dual_cart8_param_definition.parameter_rate_ = 1; |
| 1934 | + dual_cart8_param_definition.param_definition_mode_ = false; |
| 1935 | + dual_cart8_param_definition.duration_ = 10; |
| 1936 | + dual_cart8_param_definition.constant_subblock_duration_ = 10; |
| 1937 | + dual_cart8_param_definition.default_first_x_ = 1; |
| 1938 | + dual_cart8_param_definition.default_first_y_ = 2; |
| 1939 | + dual_cart8_param_definition.default_first_z_ = 3; |
| 1940 | + dual_cart8_param_definition.default_second_x_ = 4; |
| 1941 | + dual_cart8_param_definition.default_second_y_ = 5; |
| 1942 | + dual_cart8_param_definition.default_second_z_ = 6; |
| 1943 | + |
| 1944 | + // Set up expected values. |
| 1945 | + SubMixAudioElement expected_submix_audio_element = SubMixAudioElement{ |
| 1946 | + .audio_element_id = 11, |
| 1947 | + .localized_element_annotations = {"Submix 1"}, |
| 1948 | + .rendering_config = |
| 1949 | + { |
| 1950 | + .headphones_rendering_mode = |
| 1951 | + RenderingConfig::kHeadphonesRenderingModeBinaural, |
| 1952 | + .reserved = 0, |
| 1953 | + .rendering_config_param_definitions = |
| 1954 | + {RenderingConfigParamDefinition::Create( |
| 1955 | + ParamDefinition::kParameterDefinitionDualCart8, |
| 1956 | + dual_cart8_param_definition, {}) |
| 1957 | + .value()}, |
| 1958 | + .rendering_config_extension_bytes = {}, |
| 1959 | + }, |
| 1960 | + .element_mix_gain = MixGainParamDefinition()}; |
| 1961 | + expected_submix_audio_element.element_mix_gain.parameter_id_ = 0; |
| 1962 | + expected_submix_audio_element.element_mix_gain.parameter_rate_ = 1; |
| 1963 | + expected_submix_audio_element.element_mix_gain.param_definition_mode_ = true; |
| 1964 | + expected_submix_audio_element.element_mix_gain.reserved_ = 0; |
| 1965 | + expected_submix_audio_element.element_mix_gain.default_mix_gain_ = 4; |
| 1966 | + EXPECT_EQ(audio_element, expected_submix_audio_element); |
| 1967 | +} |
| 1968 | + |
1817 | 1969 | TEST(ReadSubMixAudioElementTest, ExtensionBytesRenderingConfig) { |
1818 | 1970 | std::vector<uint8_t> source = { |
1819 | 1971 | // Start SubMixAudioElement. |
@@ -1940,6 +2092,23 @@ TEST(RenderingConfigParamDefinitionCreate, |
1940 | 2092 | testing::ElementsAreArray(kParamDefinitionBytes)); |
1941 | 2093 | } |
1942 | 2094 |
|
| 2095 | +TEST(RenderingConfigParamDefinitionCreate, |
| 2096 | + SucceedsWithDualCart8ParamDefinition) { |
| 2097 | + const auto kParamDefinitionBytes = std::vector<uint8_t>({1, 2, 3, 4, 5, 123}); |
| 2098 | + auto rendering_config_param_definition = |
| 2099 | + RenderingConfigParamDefinition::Create( |
| 2100 | + ParamDefinition::kParameterDefinitionDualCart8, |
| 2101 | + DualCart8ParamDefinition(), kParamDefinitionBytes); |
| 2102 | + EXPECT_THAT(rendering_config_param_definition, IsOk()); |
| 2103 | + |
| 2104 | + EXPECT_EQ(rendering_config_param_definition->param_definition_type, |
| 2105 | + ParamDefinition::kParameterDefinitionDualCart8); |
| 2106 | + EXPECT_TRUE(std::holds_alternative<DualCart8ParamDefinition>( |
| 2107 | + rendering_config_param_definition->param_definition)); |
| 2108 | + EXPECT_THAT(rendering_config_param_definition->param_definition_bytes, |
| 2109 | + testing::ElementsAreArray(kParamDefinitionBytes)); |
| 2110 | +} |
| 2111 | + |
1943 | 2112 | TEST(RenderingConfigParamDefinitionCreateFromBufferTest, |
1944 | 2113 | FailsWithNonPositionParamDefinition) { |
1945 | 2114 | std::vector<uint8_t> source = {// `param_definition_type`. |
@@ -2099,6 +2268,46 @@ TEST(RenderingConfigParamDefinitionCreateFromBufferTest, |
2099 | 2268 | EXPECT_EQ(param_definition.default_second_distance_, 7); |
2100 | 2269 | } |
2101 | 2270 |
|
| 2271 | +TEST(RenderingConfigParamDefinitionCreateFromBufferTest, |
| 2272 | + SucceedsWithDualCart8ParamDefinition) { |
| 2273 | + std::vector<uint8_t> source = {// `param_definition_type`. |
| 2274 | + ParamDefinition::kParameterDefinitionDualCart8, |
| 2275 | + 1, // parameter_id |
| 2276 | + 1, // parameter_rate |
| 2277 | + 0, // mode |
| 2278 | + 10, // duration |
| 2279 | + 10, // constant_subblock_duration |
| 2280 | + // default_first_x = 1 |
| 2281 | + // default_first_y = 2 |
| 2282 | + // default_first_z = 3 |
| 2283 | + // default_second_x = 4 |
| 2284 | + // default_second_y = 5 |
| 2285 | + // default_second_z = 6 |
| 2286 | + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06}; |
| 2287 | + auto buffer = |
| 2288 | + MemoryBasedReadBitBuffer::CreateFromSpan(absl::MakeConstSpan(source)); |
| 2289 | + |
| 2290 | + auto rendering_config_param_definition = |
| 2291 | + RenderingConfigParamDefinition::CreateFromBuffer(*buffer); |
| 2292 | + EXPECT_THAT(rendering_config_param_definition, IsOk()); |
| 2293 | + |
| 2294 | + EXPECT_EQ(rendering_config_param_definition->param_definition_type, |
| 2295 | + ParamDefinition::kParameterDefinitionDualCart8); |
| 2296 | + EXPECT_TRUE(std::holds_alternative<DualCart8ParamDefinition>( |
| 2297 | + rendering_config_param_definition->param_definition)); |
| 2298 | + const auto& param_definition = std::get<DualCart8ParamDefinition>( |
| 2299 | + rendering_config_param_definition->param_definition); |
| 2300 | + EXPECT_EQ(param_definition.parameter_id_, 1); |
| 2301 | + EXPECT_EQ(param_definition.parameter_rate_, 1); |
| 2302 | + EXPECT_FALSE(param_definition.param_definition_mode_); |
| 2303 | + EXPECT_EQ(param_definition.default_first_x_, 1); |
| 2304 | + EXPECT_EQ(param_definition.default_first_y_, 2); |
| 2305 | + EXPECT_EQ(param_definition.default_first_z_, 3); |
| 2306 | + EXPECT_EQ(param_definition.default_second_x_, 4); |
| 2307 | + EXPECT_EQ(param_definition.default_second_y_, 5); |
| 2308 | + EXPECT_EQ(param_definition.default_second_z_, 6); |
| 2309 | +} |
| 2310 | + |
2102 | 2311 | TEST(ReadMixPresentationLayoutTest, LoudSpeakerWithAnchoredLoudness) { |
2103 | 2312 | std::vector<uint8_t> source = { |
2104 | 2313 | // Start Layout. |
|
0 commit comments