|
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_cart16_param_definition.h" |
34 | 35 | #include "iamf/obu/param_definitions/dual_cart8_param_definition.h" |
35 | 36 | #include "iamf/obu/param_definitions/dual_polar_param_definition.h" |
36 | 37 | #include "iamf/obu/param_definitions/polar_param_definition.h" |
@@ -1026,6 +1027,73 @@ TEST_F(MixPresentationObuTest, WritesRenderingConfigDualCart8ParamDefinition) { |
1026 | 1027 | InitAndTestWrite(); |
1027 | 1028 | } |
1028 | 1029 |
|
| 1030 | +TEST_F(MixPresentationObuTest, WritesRenderingConfigDualCart16ParamDefinition) { |
| 1031 | + DualCart16ParamDefinition dual_cart16_param_definition; |
| 1032 | + dual_cart16_param_definition.parameter_id_ = 1; |
| 1033 | + dual_cart16_param_definition.parameter_rate_ = 1; |
| 1034 | + dual_cart16_param_definition.param_definition_mode_ = false; |
| 1035 | + dual_cart16_param_definition.duration_ = 10; |
| 1036 | + dual_cart16_param_definition.constant_subblock_duration_ = 10; |
| 1037 | + dual_cart16_param_definition.default_first_x_ = 1; |
| 1038 | + dual_cart16_param_definition.default_first_y_ = 2; |
| 1039 | + dual_cart16_param_definition.default_first_z_ = 3; |
| 1040 | + dual_cart16_param_definition.default_second_x_ = 4; |
| 1041 | + dual_cart16_param_definition.default_second_y_ = 5; |
| 1042 | + dual_cart16_param_definition.default_second_z_ = 6; |
| 1043 | + |
| 1044 | + sub_mixes_[0].audio_elements[0].rendering_config = { |
| 1045 | + .headphones_rendering_mode = |
| 1046 | + RenderingConfig::kHeadphonesRenderingModeStereo, |
| 1047 | + .reserved = 0, |
| 1048 | + .rendering_config_param_definitions = |
| 1049 | + {RenderingConfigParamDefinition::Create( |
| 1050 | + ParamDefinition::ParameterDefinitionType:: |
| 1051 | + kParameterDefinitionDualCart16, |
| 1052 | + dual_cart16_param_definition, {}) |
| 1053 | + .value()}, |
| 1054 | + .rendering_config_extension_bytes = {}}; |
| 1055 | + |
| 1056 | + expected_header_ = {kObuIaMixPresentation << 3, 66}; |
| 1057 | + expected_payload_ = { |
| 1058 | + // Start Mix OBU. |
| 1059 | + 10, 1, 'e', 'n', '-', 'u', 's', '\0', 'M', 'i', 'x', ' ', '1', '\0', 1, |
| 1060 | + // Start Submix 1 |
| 1061 | + 1, 11, 'S', 'u', 'b', 'm', 'i', 'x', ' ', '1', '\0', |
| 1062 | + // Start RenderingConfig. |
| 1063 | + RenderingConfig::kHeadphonesRenderingModeStereo << 6, |
| 1064 | + // `rendering_config_extension_bytes size`. |
| 1065 | + 19, |
| 1066 | + // Start RenderingConfigParamDefinitions. |
| 1067 | + // `num_parameters`. |
| 1068 | + 1, |
| 1069 | + // `param_definition_type`. |
| 1070 | + ParamDefinition::ParameterDefinitionType::kParameterDefinitionDualCart16, |
| 1071 | + // `param_definition`. |
| 1072 | + 1, // parameter_id |
| 1073 | + 1, // parameter_rate |
| 1074 | + 0, // mode |
| 1075 | + 10, // duration |
| 1076 | + 10, // constant_subblock_duration |
| 1077 | + // default_first_x = 1 (16 bits) |
| 1078 | + // default_first_y = 2 (16 bits) |
| 1079 | + // default_first_z = 3 (16 bits) |
| 1080 | + // default_second_x = 4 (16 bits) |
| 1081 | + // default_second_y = 5 (16 bits) |
| 1082 | + // default_second_z = 6 (16 bits) |
| 1083 | + 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, |
| 1084 | + // End RenderingConfigParamDefinitions. |
| 1085 | + // End RenderingConfig. |
| 1086 | + 12, 13, 0x80, 0, 14, 15, 16, 0x80, 0, 17, 1, |
| 1087 | + // Start Layout 1 (of Submix 1). |
| 1088 | + (Layout::kLayoutTypeLoudspeakersSsConvention << 6) | |
| 1089 | + LoudspeakersSsConventionLayout::kSoundSystemA_0_2_0, |
| 1090 | + LoudnessInfo::kTruePeak, 0, 18, 0, 19, 0, 20 |
| 1091 | + // End Mix OBU. |
| 1092 | + }; |
| 1093 | + |
| 1094 | + InitAndTestWrite(); |
| 1095 | +} |
| 1096 | + |
1029 | 1097 | TEST_F(MixPresentationObuTest, MultipleSubmixesAndLayouts) { |
1030 | 1098 | sub_mixes_.push_back( |
1031 | 1099 | {.audio_elements = {{ |
@@ -1966,6 +2034,90 @@ TEST(ReadSubMixAudioElementTest, DualCart8ParamDefinitionRenderingConfig) { |
1966 | 2034 | EXPECT_EQ(audio_element, expected_submix_audio_element); |
1967 | 2035 | } |
1968 | 2036 |
|
| 2037 | +TEST(ReadSubMixAudioElementTest, DualCart16ParamDefinitionRenderingConfig) { |
| 2038 | + std::vector<uint8_t> source = { |
| 2039 | + // Start SubMixAudioElement. |
| 2040 | + // audio_element_id |
| 2041 | + 11, |
| 2042 | + // localized_element_annotations[0] |
| 2043 | + 'S', 'u', 'b', 'm', 'i', 'x', ' ', '1', '\0', |
| 2044 | + // Start RenderingConfig. |
| 2045 | + RenderingConfig::kHeadphonesRenderingModeBinaural << 6, |
| 2046 | + /*rendering_config_extension_size=*/19, |
| 2047 | + // num_params |
| 2048 | + 1, |
| 2049 | + // Start RenderingConfigParamDefinition. |
| 2050 | + // `param_definition_type`. |
| 2051 | + ParamDefinition::ParameterDefinitionType::kParameterDefinitionDualCart16, |
| 2052 | + // `param_definition`. |
| 2053 | + 1, // parameter_id |
| 2054 | + 1, // parameter_rate |
| 2055 | + 0, // mode |
| 2056 | + 10, // duration |
| 2057 | + 10, // constant_subblock_duration |
| 2058 | + // default_first_x = 1 (16 bits) |
| 2059 | + // default_first_y = 2 (16 bits) |
| 2060 | + // default_first_z = 3 (16 bits) |
| 2061 | + // default_second_x = 4 (16 bits) |
| 2062 | + // default_second_y = 5 (16 bits) |
| 2063 | + // default_second_z = 6 (16 bits) |
| 2064 | + 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, |
| 2065 | + // End RenderingConfig. |
| 2066 | + // Start ElementMixGain |
| 2067 | + // Parameter ID. |
| 2068 | + 0x00, |
| 2069 | + // Parameter Rate. |
| 2070 | + 1, |
| 2071 | + // Param Definition Mode (upper bit), next 7 bits reserved. |
| 2072 | + 0x80, |
| 2073 | + // Default Mix Gain. |
| 2074 | + 0, 4 |
| 2075 | + // End ElementMixGain |
| 2076 | + }; |
| 2077 | + auto buffer = |
| 2078 | + MemoryBasedReadBitBuffer::CreateFromSpan(absl::MakeConstSpan(source)); |
| 2079 | + SubMixAudioElement audio_element; |
| 2080 | + EXPECT_THAT(audio_element.ReadAndValidate(/*count_label=*/1, *buffer), |
| 2081 | + IsOk()); |
| 2082 | + |
| 2083 | + DualCart16ParamDefinition dual_cart16_param_definition; |
| 2084 | + dual_cart16_param_definition.parameter_id_ = 1; |
| 2085 | + dual_cart16_param_definition.parameter_rate_ = 1; |
| 2086 | + dual_cart16_param_definition.param_definition_mode_ = false; |
| 2087 | + dual_cart16_param_definition.duration_ = 10; |
| 2088 | + dual_cart16_param_definition.constant_subblock_duration_ = 10; |
| 2089 | + dual_cart16_param_definition.default_first_x_ = 1; |
| 2090 | + dual_cart16_param_definition.default_first_y_ = 2; |
| 2091 | + dual_cart16_param_definition.default_first_z_ = 3; |
| 2092 | + dual_cart16_param_definition.default_second_x_ = 4; |
| 2093 | + dual_cart16_param_definition.default_second_y_ = 5; |
| 2094 | + dual_cart16_param_definition.default_second_z_ = 6; |
| 2095 | + |
| 2096 | + // Set up expected values. |
| 2097 | + SubMixAudioElement expected_submix_audio_element = SubMixAudioElement{ |
| 2098 | + .audio_element_id = 11, |
| 2099 | + .localized_element_annotations = {"Submix 1"}, |
| 2100 | + .rendering_config = |
| 2101 | + { |
| 2102 | + .headphones_rendering_mode = |
| 2103 | + RenderingConfig::kHeadphonesRenderingModeBinaural, |
| 2104 | + .reserved = 0, |
| 2105 | + .rendering_config_param_definitions = |
| 2106 | + {RenderingConfigParamDefinition::Create( |
| 2107 | + ParamDefinition::kParameterDefinitionDualCart16, |
| 2108 | + dual_cart16_param_definition, {}) |
| 2109 | + .value()}, |
| 2110 | + .rendering_config_extension_bytes = {}, |
| 2111 | + }, |
| 2112 | + .element_mix_gain = MixGainParamDefinition()}; |
| 2113 | + expected_submix_audio_element.element_mix_gain.parameter_id_ = 0; |
| 2114 | + expected_submix_audio_element.element_mix_gain.parameter_rate_ = 1; |
| 2115 | + expected_submix_audio_element.element_mix_gain.param_definition_mode_ = true; |
| 2116 | + expected_submix_audio_element.element_mix_gain.reserved_ = 0; |
| 2117 | + expected_submix_audio_element.element_mix_gain.default_mix_gain_ = 4; |
| 2118 | + EXPECT_EQ(audio_element, expected_submix_audio_element); |
| 2119 | +} |
| 2120 | + |
1969 | 2121 | TEST(ReadSubMixAudioElementTest, ExtensionBytesRenderingConfig) { |
1970 | 2122 | std::vector<uint8_t> source = { |
1971 | 2123 | // Start SubMixAudioElement. |
@@ -2109,6 +2261,23 @@ TEST(RenderingConfigParamDefinitionCreate, |
2109 | 2261 | testing::ElementsAreArray(kParamDefinitionBytes)); |
2110 | 2262 | } |
2111 | 2263 |
|
| 2264 | +TEST(RenderingConfigParamDefinitionCreate, |
| 2265 | + SucceedsWithDualCart16ParamDefinition) { |
| 2266 | + const auto kParamDefinitionBytes = std::vector<uint8_t>({1, 2, 3, 4, 5, 123}); |
| 2267 | + auto rendering_config_param_definition = |
| 2268 | + RenderingConfigParamDefinition::Create( |
| 2269 | + ParamDefinition::kParameterDefinitionDualCart16, |
| 2270 | + DualCart16ParamDefinition(), kParamDefinitionBytes); |
| 2271 | + EXPECT_THAT(rendering_config_param_definition, IsOk()); |
| 2272 | + |
| 2273 | + EXPECT_EQ(rendering_config_param_definition->param_definition_type, |
| 2274 | + ParamDefinition::kParameterDefinitionDualCart16); |
| 2275 | + EXPECT_TRUE(std::holds_alternative<DualCart16ParamDefinition>( |
| 2276 | + rendering_config_param_definition->param_definition)); |
| 2277 | + EXPECT_THAT(rendering_config_param_definition->param_definition_bytes, |
| 2278 | + testing::ElementsAreArray(kParamDefinitionBytes)); |
| 2279 | +} |
| 2280 | + |
2112 | 2281 | TEST(RenderingConfigParamDefinitionCreateFromBufferTest, |
2113 | 2282 | FailsWithNonPositionParamDefinition) { |
2114 | 2283 | std::vector<uint8_t> source = {// `param_definition_type`. |
@@ -2308,6 +2477,59 @@ TEST(RenderingConfigParamDefinitionCreateFromBufferTest, |
2308 | 2477 | EXPECT_EQ(param_definition.default_second_z_, 6); |
2309 | 2478 | } |
2310 | 2479 |
|
| 2480 | +TEST(RenderingConfigParamDefinitionCreateFromBufferTest, |
| 2481 | + SucceedsWithDualCart16ParamDefinition) { |
| 2482 | + std::vector<uint8_t> source = { |
| 2483 | + // `param_definition_type`. |
| 2484 | + ParamDefinition::kParameterDefinitionDualCart16, |
| 2485 | + 1, // parameter_id |
| 2486 | + 1, // parameter_rate |
| 2487 | + 0, // mode |
| 2488 | + 10, // duration |
| 2489 | + 10, // constant_subblock_duration |
| 2490 | + // default_first_x = 1 (16 bits) |
| 2491 | + // default_first_y = 2 (16 bits) |
| 2492 | + // default_first_z = 3 (16 bits) |
| 2493 | + // default_second_x = 4 (16 bits) |
| 2494 | + // default_second_y = 5 (16 bits) |
| 2495 | + // default_second_z = 6 (16 bits) |
| 2496 | + 0x00, |
| 2497 | + 0x01, |
| 2498 | + 0x00, |
| 2499 | + 0x02, |
| 2500 | + 0x00, |
| 2501 | + 0x03, |
| 2502 | + 0x00, |
| 2503 | + 0x04, |
| 2504 | + 0x00, |
| 2505 | + 0x05, |
| 2506 | + 0x00, |
| 2507 | + 0x06, |
| 2508 | + }; |
| 2509 | + auto buffer = |
| 2510 | + MemoryBasedReadBitBuffer::CreateFromSpan(absl::MakeConstSpan(source)); |
| 2511 | + |
| 2512 | + auto rendering_config_param_definition = |
| 2513 | + RenderingConfigParamDefinition::CreateFromBuffer(*buffer); |
| 2514 | + EXPECT_THAT(rendering_config_param_definition, IsOk()); |
| 2515 | + |
| 2516 | + EXPECT_EQ(rendering_config_param_definition->param_definition_type, |
| 2517 | + ParamDefinition::kParameterDefinitionDualCart16); |
| 2518 | + EXPECT_TRUE(std::holds_alternative<DualCart16ParamDefinition>( |
| 2519 | + rendering_config_param_definition->param_definition)); |
| 2520 | + const auto& param_definition = std::get<DualCart16ParamDefinition>( |
| 2521 | + rendering_config_param_definition->param_definition); |
| 2522 | + EXPECT_EQ(param_definition.parameter_id_, 1); |
| 2523 | + EXPECT_EQ(param_definition.parameter_rate_, 1); |
| 2524 | + EXPECT_FALSE(param_definition.param_definition_mode_); |
| 2525 | + EXPECT_EQ(param_definition.default_first_x_, 1); |
| 2526 | + EXPECT_EQ(param_definition.default_first_y_, 2); |
| 2527 | + EXPECT_EQ(param_definition.default_first_z_, 3); |
| 2528 | + EXPECT_EQ(param_definition.default_second_x_, 4); |
| 2529 | + EXPECT_EQ(param_definition.default_second_y_, 5); |
| 2530 | + EXPECT_EQ(param_definition.default_second_z_, 6); |
| 2531 | +} |
| 2532 | + |
2311 | 2533 | TEST(ReadMixPresentationLayoutTest, LoudSpeakerWithAnchoredLoudness) { |
2312 | 2534 | std::vector<uint8_t> source = { |
2313 | 2535 | // Start Layout. |
|
0 commit comments