Skip to content

Commit bdec7e4

Browse files
Googlerjwcullen
authored andcommitted
Add support for DualCart16ParamDefinition in MixPresentationObu.
This change updates the MixPresentationObu to correctly read, write, and validate RenderingConfigParamDefinitions of type kParameterDefinitionDualCart16. This includes adding DualCart16ParamDefinition to the PositionParamVariant and updating the relevant parsing and writing functions. PiperOrigin-RevId: 844487067
1 parent 9f6f808 commit bdec7e4

File tree

5 files changed

+245
-7
lines changed

5 files changed

+245
-7
lines changed

iamf/obu/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ cc_library(
191191
"//iamf/common/utils:validation_utils",
192192
"//iamf/obu/param_definitions:cart16_param_definition",
193193
"//iamf/obu/param_definitions:cart8_param_definition",
194+
"//iamf/obu/param_definitions:dual_cart16_param_definition",
194195
"//iamf/obu/param_definitions:dual_cart8_param_definition",
195196
"//iamf/obu/param_definitions:dual_polar_param_definition",
196197
"//iamf/obu/param_definitions:polar_param_definition",

iamf/obu/mix_presentation.cc

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
#include "iamf/obu/param_definitions.h"
3737
#include "iamf/obu/param_definitions/cart16_param_definition.h"
3838
#include "iamf/obu/param_definitions/cart8_param_definition.h"
39+
#include "iamf/obu/param_definitions/dual_cart16_param_definition.h"
3940
#include "iamf/obu/param_definitions/dual_cart8_param_definition.h"
4041
#include "iamf/obu/param_definitions/dual_polar_param_definition.h"
4142
#include "iamf/obu/param_definitions/polar_param_definition.h"
@@ -78,8 +79,12 @@ absl::Status WriteRenderingConfigParamDefinition(
7879
rendering_config_param_definition.param_definition)
7980
.ValidateAndWrite(wb));
8081
break;
81-
// TODO(b/467386344): Add support for other rendering config param
82-
// definition types.
82+
case ParamDefinition::ParameterDefinitionType::
83+
kParameterDefinitionDualCart16:
84+
RETURN_IF_NOT_OK(std::get<DualCart16ParamDefinition>(
85+
rendering_config_param_definition.param_definition)
86+
.ValidateAndWrite(wb));
87+
break;
8388
default:
8489
RETURN_IF_NOT_OK(wb.WriteUleb128(
8590
rendering_config_param_definition.param_definition_bytes.size()));
@@ -340,9 +345,9 @@ RenderingConfigParamDefinition::Create(
340345
kParameterDefinitionDualPolar:
341346
case ParamDefinition::ParameterDefinitionType::
342347
kParameterDefinitionDualCart8:
348+
case ParamDefinition::ParameterDefinitionType::
349+
kParameterDefinitionDualCart16:
343350
break;
344-
// TODO(b/467386344): Add support for other rendering config param
345-
// definition types.
346351
default:
347352
return absl::InvalidArgumentError(
348353
"Expected a Position param definition type.");
@@ -403,8 +408,16 @@ RenderingConfigParamDefinition::CreateFromBuffer(ReadBitBuffer& rb) {
403408
param_definition_type),
404409
std::move(param_definition), {});
405410
break;
406-
// TODO(b/467386344): Add support for other rendering config param
407-
// definition types.
411+
case ParamDefinition::ParameterDefinitionType::
412+
kParameterDefinitionDualCart16:
413+
param_definition = DualCart16ParamDefinition();
414+
RETURN_IF_NOT_OK(
415+
param_definition.emplace<DualCart16ParamDefinition>().ReadAndValidate(
416+
rb));
417+
return Create(static_cast<ParamDefinition::ParameterDefinitionType>(
418+
param_definition_type),
419+
std::move(param_definition), {});
420+
break;
408421
default:
409422
DecodedUleb128 param_definition_bytes_size;
410423
RETURN_IF_NOT_OK(rb.ReadULeb128(param_definition_bytes_size));

iamf/obu/mix_presentation.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include "iamf/obu/param_definitions.h"
3030
#include "iamf/obu/param_definitions/cart16_param_definition.h"
3131
#include "iamf/obu/param_definitions/cart8_param_definition.h"
32+
#include "iamf/obu/param_definitions/dual_cart16_param_definition.h"
3233
#include "iamf/obu/param_definitions/dual_cart8_param_definition.h"
3334
#include "iamf/obu/param_definitions/dual_polar_param_definition.h"
3435
#include "iamf/obu/param_definitions/polar_param_definition.h"
@@ -39,7 +40,7 @@ namespace iamf_tools {
3940
using PositionParamVariant =
4041
std::variant<PolarParamDefinition, Cart8ParamDefinition,
4142
Cart16ParamDefinition, DualPolarParamDefinition,
42-
DualCart8ParamDefinition>;
43+
DualCart8ParamDefinition, DualCart16ParamDefinition>;
4344

4445
struct RenderingConfigParamDefinition {
4546
friend bool operator==(const RenderingConfigParamDefinition& lhs,

iamf/obu/tests/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ cc_test(
148148
"//iamf/obu:types",
149149
"//iamf/obu/param_definitions:cart16_param_definition",
150150
"//iamf/obu/param_definitions:cart8_param_definition",
151+
"//iamf/obu/param_definitions:dual_cart16_param_definition",
151152
"//iamf/obu/param_definitions:dual_cart8_param_definition",
152153
"//iamf/obu/param_definitions:dual_polar_param_definition",
153154
"//iamf/obu/param_definitions:polar_param_definition",

iamf/obu/tests/mix_presentation_test.cc

Lines changed: 222 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#include "iamf/obu/param_definitions.h"
3232
#include "iamf/obu/param_definitions/cart16_param_definition.h"
3333
#include "iamf/obu/param_definitions/cart8_param_definition.h"
34+
#include "iamf/obu/param_definitions/dual_cart16_param_definition.h"
3435
#include "iamf/obu/param_definitions/dual_cart8_param_definition.h"
3536
#include "iamf/obu/param_definitions/dual_polar_param_definition.h"
3637
#include "iamf/obu/param_definitions/polar_param_definition.h"
@@ -1026,6 +1027,73 @@ TEST_F(MixPresentationObuTest, WritesRenderingConfigDualCart8ParamDefinition) {
10261027
InitAndTestWrite();
10271028
}
10281029

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+
10291097
TEST_F(MixPresentationObuTest, MultipleSubmixesAndLayouts) {
10301098
sub_mixes_.push_back(
10311099
{.audio_elements = {{
@@ -1966,6 +2034,90 @@ TEST(ReadSubMixAudioElementTest, DualCart8ParamDefinitionRenderingConfig) {
19662034
EXPECT_EQ(audio_element, expected_submix_audio_element);
19672035
}
19682036

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+
19692121
TEST(ReadSubMixAudioElementTest, ExtensionBytesRenderingConfig) {
19702122
std::vector<uint8_t> source = {
19712123
// Start SubMixAudioElement.
@@ -2109,6 +2261,23 @@ TEST(RenderingConfigParamDefinitionCreate,
21092261
testing::ElementsAreArray(kParamDefinitionBytes));
21102262
}
21112263

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+
21122281
TEST(RenderingConfigParamDefinitionCreateFromBufferTest,
21132282
FailsWithNonPositionParamDefinition) {
21142283
std::vector<uint8_t> source = {// `param_definition_type`.
@@ -2308,6 +2477,59 @@ TEST(RenderingConfigParamDefinitionCreateFromBufferTest,
23082477
EXPECT_EQ(param_definition.default_second_z_, 6);
23092478
}
23102479

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+
23112533
TEST(ReadMixPresentationLayoutTest, LoudSpeakerWithAnchoredLoudness) {
23122534
std::vector<uint8_t> source = {
23132535
// Start Layout.

0 commit comments

Comments
 (0)