Skip to content

Commit 16e650f

Browse files
Googlerjwcullen
authored andcommitted
Add DualCart8ParamDefinition to RenderingConfigParamDefinitions and implement reading and writing.
PiperOrigin-RevId: 844447874
1 parent d295206 commit 16e650f

File tree

5 files changed

+233
-1
lines changed

5 files changed

+233
-1
lines changed

iamf/obu/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ cc_library(
178178
"//iamf/common/utils:validation_utils",
179179
"//iamf/obu/param_definitions:cart16_param_definition",
180180
"//iamf/obu/param_definitions:cart8_param_definition",
181+
"//iamf/obu/param_definitions:dual_cart8_param_definition",
181182
"//iamf/obu/param_definitions:dual_polar_param_definition",
182183
"//iamf/obu/param_definitions:polar_param_definition",
183184
"@abseil-cpp//absl/base:no_destructor",

iamf/obu/mix_presentation.cc

Lines changed: 19 additions & 0 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_cart8_param_definition.h"
3940
#include "iamf/obu/param_definitions/dual_polar_param_definition.h"
4041
#include "iamf/obu/param_definitions/polar_param_definition.h"
4142
#include "iamf/obu/types.h"
@@ -71,6 +72,12 @@ absl::Status WriteRenderingConfigParamDefinition(
7172
rendering_config_param_definition.param_definition)
7273
.ValidateAndWrite(wb));
7374
break;
75+
case ParamDefinition::ParameterDefinitionType::
76+
kParameterDefinitionDualCart8:
77+
RETURN_IF_NOT_OK(std::get<DualCart8ParamDefinition>(
78+
rendering_config_param_definition.param_definition)
79+
.ValidateAndWrite(wb));
80+
break;
7481
// TODO(b/467386344): Add support for other rendering config param
7582
// definition types.
7683
default:
@@ -331,6 +338,8 @@ RenderingConfigParamDefinition::Create(
331338
case ParamDefinition::ParameterDefinitionType::kParameterDefinitionCart16:
332339
case ParamDefinition::ParameterDefinitionType::
333340
kParameterDefinitionDualPolar:
341+
case ParamDefinition::ParameterDefinitionType::
342+
kParameterDefinitionDualCart8:
334343
break;
335344
// TODO(b/467386344): Add support for other rendering config param
336345
// definition types.
@@ -384,6 +393,16 @@ RenderingConfigParamDefinition::CreateFromBuffer(ReadBitBuffer& rb) {
384393
param_definition_type),
385394
std::move(param_definition), {});
386395
break;
396+
case ParamDefinition::ParameterDefinitionType::
397+
kParameterDefinitionDualCart8:
398+
param_definition = DualCart8ParamDefinition();
399+
RETURN_IF_NOT_OK(
400+
param_definition.emplace<DualCart8ParamDefinition>().ReadAndValidate(
401+
rb));
402+
return Create(static_cast<ParamDefinition::ParameterDefinitionType>(
403+
param_definition_type),
404+
std::move(param_definition), {});
405+
break;
387406
// TODO(b/467386344): Add support for other rendering config param
388407
// definition types.
389408
default:

iamf/obu/mix_presentation.h

Lines changed: 3 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_cart8_param_definition.h"
3233
#include "iamf/obu/param_definitions/dual_polar_param_definition.h"
3334
#include "iamf/obu/param_definitions/polar_param_definition.h"
3435
#include "iamf/obu/types.h"
@@ -37,7 +38,8 @@ namespace iamf_tools {
3738

3839
using PositionParamVariant =
3940
std::variant<PolarParamDefinition, Cart8ParamDefinition,
40-
Cart16ParamDefinition, DualPolarParamDefinition>;
41+
Cart16ParamDefinition, DualPolarParamDefinition,
42+
DualCart8ParamDefinition>;
4143

4244
struct RenderingConfigParamDefinition {
4345
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_cart8_param_definition",
151152
"//iamf/obu/param_definitions:dual_polar_param_definition",
152153
"//iamf/obu/param_definitions:polar_param_definition",
153154
"@abseil-cpp//absl/status",

iamf/obu/tests/mix_presentation_test.cc

Lines changed: 209 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_cart8_param_definition.h"
3435
#include "iamf/obu/param_definitions/dual_polar_param_definition.h"
3536
#include "iamf/obu/param_definitions/polar_param_definition.h"
3637
#include "iamf/obu/tests/obu_test_base.h"
@@ -958,6 +959,73 @@ TEST_F(MixPresentationObuTest, WritesRenderingConfigDualPolarParamDefinition) {
958959
InitAndTestWrite();
959960
}
960961

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+
9611029
TEST_F(MixPresentationObuTest, MultipleSubmixesAndLayouts) {
9621030
sub_mixes_.push_back(
9631031
{.audio_elements = {{
@@ -1814,6 +1882,90 @@ TEST(ReadSubMixAudioElementTest, DualPolarParamDefinitionRenderingConfig) {
18141882
EXPECT_EQ(audio_element, expected_submix_audio_element);
18151883
}
18161884

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+
18171969
TEST(ReadSubMixAudioElementTest, ExtensionBytesRenderingConfig) {
18181970
std::vector<uint8_t> source = {
18191971
// Start SubMixAudioElement.
@@ -1940,6 +2092,23 @@ TEST(RenderingConfigParamDefinitionCreate,
19402092
testing::ElementsAreArray(kParamDefinitionBytes));
19412093
}
19422094

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+
19432112
TEST(RenderingConfigParamDefinitionCreateFromBufferTest,
19442113
FailsWithNonPositionParamDefinition) {
19452114
std::vector<uint8_t> source = {// `param_definition_type`.
@@ -2099,6 +2268,46 @@ TEST(RenderingConfigParamDefinitionCreateFromBufferTest,
20992268
EXPECT_EQ(param_definition.default_second_distance_, 7);
21002269
}
21012270

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

0 commit comments

Comments
 (0)