Skip to content

Commit 8da8596

Browse files
Googlerjwcullen
authored andcommitted
Add support for Cart16ParamDefinition in MixPresentationObu.
This change updates the MixPresentationObu to handle the new Cart16ParamDefinition type within RenderingConfigParamDefinition. This includes adding it to the variant, and implementing its reading and writing logic. Tests are added to cover the new functionality. PiperOrigin-RevId: 843816492
1 parent f7e7089 commit 8da8596

File tree

5 files changed

+210
-1
lines changed

5 files changed

+210
-1
lines changed

iamf/obu/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ cc_library(
163163
"//iamf/common/utils:map_utils",
164164
"//iamf/common/utils:numeric_utils",
165165
"//iamf/common/utils:validation_utils",
166+
"//iamf/obu/param_definitions:cart16_param_definition",
166167
"//iamf/obu/param_definitions:cart8_param_definition",
167168
"//iamf/obu/param_definitions:dual_polar_param_definition",
168169
"//iamf/obu/param_definitions:polar_param_definition",

iamf/obu/mix_presentation.cc

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include "iamf/common/write_bit_buffer.h"
3535
#include "iamf/obu/obu_header.h"
3636
#include "iamf/obu/param_definitions.h"
37+
#include "iamf/obu/param_definitions/cart16_param_definition.h"
3738
#include "iamf/obu/param_definitions/cart8_param_definition.h"
3839
#include "iamf/obu/param_definitions/dual_polar_param_definition.h"
3940
#include "iamf/obu/param_definitions/polar_param_definition.h"
@@ -59,6 +60,11 @@ absl::Status WriteRenderingConfigParamDefinition(
5960
rendering_config_param_definition.param_definition)
6061
.ValidateAndWrite(wb));
6162
break;
63+
case ParamDefinition::ParameterDefinitionType::kParameterDefinitionCart16:
64+
RETURN_IF_NOT_OK(std::get<Cart16ParamDefinition>(
65+
rendering_config_param_definition.param_definition)
66+
.ValidateAndWrite(wb));
67+
break;
6268
case ParamDefinition::ParameterDefinitionType::
6369
kParameterDefinitionDualPolar:
6470
RETURN_IF_NOT_OK(std::get<DualPolarParamDefinition>(
@@ -322,6 +328,7 @@ RenderingConfigParamDefinition::Create(
322328
switch (param_definition_type) {
323329
case ParamDefinition::ParameterDefinitionType::kParameterDefinitionPolar:
324330
case ParamDefinition::ParameterDefinitionType::kParameterDefinitionCart8:
331+
case ParamDefinition::ParameterDefinitionType::kParameterDefinitionCart16:
325332
case ParamDefinition::ParameterDefinitionType::
326333
kParameterDefinitionDualPolar:
327334
break;
@@ -358,6 +365,15 @@ RenderingConfigParamDefinition::CreateFromBuffer(ReadBitBuffer& rb) {
358365
param_definition_type),
359366
std::move(param_definition), {});
360367
break;
368+
case ParamDefinition::ParameterDefinitionType::kParameterDefinitionCart16:
369+
param_definition = Cart16ParamDefinition();
370+
RETURN_IF_NOT_OK(
371+
param_definition.emplace<Cart16ParamDefinition>().ReadAndValidate(
372+
rb));
373+
return Create(static_cast<ParamDefinition::ParameterDefinitionType>(
374+
param_definition_type),
375+
std::move(param_definition), {});
376+
break;
361377
case ParamDefinition::ParameterDefinitionType::
362378
kParameterDefinitionDualPolar:
363379
param_definition = DualPolarParamDefinition();

iamf/obu/mix_presentation.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "iamf/obu/obu_base.h"
2828
#include "iamf/obu/obu_header.h"
2929
#include "iamf/obu/param_definitions.h"
30+
#include "iamf/obu/param_definitions/cart16_param_definition.h"
3031
#include "iamf/obu/param_definitions/cart8_param_definition.h"
3132
#include "iamf/obu/param_definitions/dual_polar_param_definition.h"
3233
#include "iamf/obu/param_definitions/polar_param_definition.h"
@@ -36,7 +37,7 @@ namespace iamf_tools {
3637

3738
using PositionParamVariant =
3839
std::variant<PolarParamDefinition, Cart8ParamDefinition,
39-
DualPolarParamDefinition>;
40+
Cart16ParamDefinition, DualPolarParamDefinition>;
4041

4142
struct RenderingConfigParamDefinition {
4243
friend bool operator==(const RenderingConfigParamDefinition& lhs,

iamf/obu/tests/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ cc_test(
146146
"//iamf/obu:obu_header",
147147
"//iamf/obu:param_definitions",
148148
"//iamf/obu:types",
149+
"//iamf/obu/param_definitions:cart16_param_definition",
149150
"//iamf/obu/param_definitions:cart8_param_definition",
150151
"//iamf/obu/param_definitions:dual_polar_param_definition",
151152
"//iamf/obu/param_definitions:polar_param_definition",

iamf/obu/tests/mix_presentation_test.cc

Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include "iamf/common/write_bit_buffer.h"
3030
#include "iamf/obu/obu_header.h"
3131
#include "iamf/obu/param_definitions.h"
32+
#include "iamf/obu/param_definitions/cart16_param_definition.h"
3233
#include "iamf/obu/param_definitions/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"
@@ -827,6 +828,67 @@ TEST_F(MixPresentationObuTest, WritesRenderingConfigCart8ParamDefinition) {
827828
InitAndTestWrite();
828829
}
829830

831+
TEST_F(MixPresentationObuTest, WritesRenderingConfigCart16ParamDefinition) {
832+
Cart16ParamDefinition cart16_param_definition;
833+
cart16_param_definition.parameter_id_ = 1;
834+
cart16_param_definition.parameter_rate_ = 1;
835+
cart16_param_definition.param_definition_mode_ = false;
836+
cart16_param_definition.duration_ = 10;
837+
cart16_param_definition.constant_subblock_duration_ = 10;
838+
cart16_param_definition.default_x_ = 1;
839+
cart16_param_definition.default_y_ = 2;
840+
cart16_param_definition.default_z_ = 3;
841+
842+
sub_mixes_[0].audio_elements[0].rendering_config = {
843+
.headphones_rendering_mode =
844+
RenderingConfig::kHeadphonesRenderingModeStereo,
845+
.reserved = 0,
846+
.rendering_config_param_definitions =
847+
{RenderingConfigParamDefinition::Create(
848+
ParamDefinition::ParameterDefinitionType::
849+
kParameterDefinitionCart16,
850+
cart16_param_definition, {})
851+
.value()},
852+
.rendering_config_extension_bytes = {}};
853+
854+
expected_header_ = {kObuIaMixPresentation << 3, 60};
855+
expected_payload_ = {
856+
// Start Mix OBU.
857+
10, 1, 'e', 'n', '-', 'u', 's', '\0', 'M', 'i', 'x', ' ', '1', '\0', 1,
858+
// Start Submix 1
859+
1, 11, 'S', 'u', 'b', 'm', 'i', 'x', ' ', '1', '\0',
860+
// Start RenderingConfig.
861+
RenderingConfig::kHeadphonesRenderingModeStereo << 6,
862+
// `rendering_config_extension_bytes size`.
863+
13,
864+
// Start RenderingConfigParamDefinitions.
865+
// `num_parameters`.
866+
1,
867+
// `param_definition_type`.
868+
ParamDefinition::ParameterDefinitionType::kParameterDefinitionCart16,
869+
// `param_definition`.
870+
1, // parameter_id
871+
1, // parameter_rate
872+
0, // mode
873+
10, // duration
874+
10, // constant_subblock_duration
875+
// default_x = 1 (16 bits)
876+
// default_y = 2 (16 bits)
877+
// default_z = 3 (16 bits)
878+
0x00, 0x01, 0x00, 0x02, 0x00, 0x03,
879+
// End RenderingConfigParamDefinitions.
880+
// End RenderingConfig.
881+
12, 13, 0x80, 0, 14, 15, 16, 0x80, 0, 17, 1,
882+
// Start Layout 1 (of Submix 1).
883+
(Layout::kLayoutTypeLoudspeakersSsConvention << 6) |
884+
LoudspeakersSsConventionLayout::kSoundSystemA_0_2_0,
885+
LoudnessInfo::kTruePeak, 0, 18, 0, 19, 0, 20
886+
// End Mix OBU.
887+
};
888+
889+
InitAndTestWrite();
890+
}
891+
830892
TEST_F(MixPresentationObuTest, WritesRenderingConfigDualPolarParamDefinition) {
831893
DualPolarParamDefinition dual_polar_param_definition;
832894
dual_polar_param_definition.parameter_id_ = 1;
@@ -1588,6 +1650,84 @@ TEST(ReadSubMixAudioElementTest, Cart8ParamDefinitionRenderingConfig) {
15881650
EXPECT_EQ(audio_element, expected_submix_audio_element);
15891651
}
15901652

1653+
TEST(ReadSubMixAudioElementTest, Cart16ParamDefinitionRenderingConfig) {
1654+
std::vector<uint8_t> source = {
1655+
// Start SubMixAudioElement.
1656+
// audio_element_id
1657+
11,
1658+
// localized_element_annotations[0]
1659+
'S', 'u', 'b', 'm', 'i', 'x', ' ', '1', '\0',
1660+
// Start RenderingConfig.
1661+
RenderingConfig::kHeadphonesRenderingModeBinaural << 6,
1662+
/*rendering_config_extension_size=*/13,
1663+
// num_params
1664+
1,
1665+
// Start RenderingConfigParamDefinition.
1666+
// `param_definition_type`.
1667+
ParamDefinition::ParameterDefinitionType::kParameterDefinitionCart16,
1668+
// `param_definition`.
1669+
1, // parameter_id
1670+
1, // parameter_rate
1671+
0, // mode
1672+
10, // duration
1673+
10, // constant_subblock_duration
1674+
// default_x = 1
1675+
// default_y = 2
1676+
// default_z = 3
1677+
0x00, 0x01, 0x00, 0x02, 0x00, 0x03,
1678+
// End RenderingConfig.
1679+
// Start ElementMixGain
1680+
// Parameter ID.
1681+
0x00,
1682+
// Parameter Rate.
1683+
1,
1684+
// Param Definition Mode (upper bit), next 7 bits reserved.
1685+
0x80,
1686+
// Default Mix Gain.
1687+
0, 4
1688+
// End ElementMixGain
1689+
};
1690+
auto buffer =
1691+
MemoryBasedReadBitBuffer::CreateFromSpan(absl::MakeConstSpan(source));
1692+
SubMixAudioElement audio_element;
1693+
EXPECT_THAT(audio_element.ReadAndValidate(/*count_label=*/1, *buffer),
1694+
IsOk());
1695+
1696+
Cart16ParamDefinition cart16_param_definition;
1697+
cart16_param_definition.parameter_id_ = 1;
1698+
cart16_param_definition.parameter_rate_ = 1;
1699+
cart16_param_definition.param_definition_mode_ = false;
1700+
cart16_param_definition.duration_ = 10;
1701+
cart16_param_definition.constant_subblock_duration_ = 10;
1702+
cart16_param_definition.default_x_ = 1;
1703+
cart16_param_definition.default_y_ = 2;
1704+
cart16_param_definition.default_z_ = 3;
1705+
1706+
// Set up expected values.
1707+
SubMixAudioElement expected_submix_audio_element = SubMixAudioElement{
1708+
.audio_element_id = 11,
1709+
.localized_element_annotations = {"Submix 1"},
1710+
.rendering_config =
1711+
{
1712+
.headphones_rendering_mode =
1713+
RenderingConfig::kHeadphonesRenderingModeBinaural,
1714+
.reserved = 0,
1715+
.rendering_config_param_definitions =
1716+
{RenderingConfigParamDefinition::Create(
1717+
ParamDefinition::kParameterDefinitionCart16,
1718+
cart16_param_definition, {})
1719+
.value()},
1720+
.rendering_config_extension_bytes = {},
1721+
},
1722+
.element_mix_gain = MixGainParamDefinition()};
1723+
expected_submix_audio_element.element_mix_gain.parameter_id_ = 0;
1724+
expected_submix_audio_element.element_mix_gain.parameter_rate_ = 1;
1725+
expected_submix_audio_element.element_mix_gain.param_definition_mode_ = true;
1726+
expected_submix_audio_element.element_mix_gain.reserved_ = 0;
1727+
expected_submix_audio_element.element_mix_gain.default_mix_gain_ = 4;
1728+
EXPECT_EQ(audio_element, expected_submix_audio_element);
1729+
}
1730+
15911731
TEST(ReadSubMixAudioElementTest, DualPolarParamDefinitionRenderingConfig) {
15921732
std::vector<uint8_t> source = {
15931733
// Start SubMixAudioElement.
@@ -1767,6 +1907,22 @@ TEST(RenderingConfigParamDefinitionCreate, SucceedsWithCart8ParamDefinition) {
17671907
testing::ElementsAreArray(kParamDefinitionBytes));
17681908
}
17691909

1910+
TEST(RenderingConfigParamDefinitionCreate, SucceedsWithCart16ParamDefinition) {
1911+
const auto kParamDefinitionBytes = std::vector<uint8_t>({1, 2, 3, 4, 5, 123});
1912+
auto rendering_config_param_definition =
1913+
RenderingConfigParamDefinition::Create(
1914+
ParamDefinition::kParameterDefinitionCart16, Cart16ParamDefinition(),
1915+
kParamDefinitionBytes);
1916+
EXPECT_THAT(rendering_config_param_definition, IsOk());
1917+
1918+
EXPECT_EQ(rendering_config_param_definition->param_definition_type,
1919+
ParamDefinition::kParameterDefinitionCart16);
1920+
EXPECT_TRUE(std::holds_alternative<Cart16ParamDefinition>(
1921+
rendering_config_param_definition->param_definition));
1922+
EXPECT_THAT(rendering_config_param_definition->param_definition_bytes,
1923+
testing::ElementsAreArray(kParamDefinitionBytes));
1924+
}
1925+
17701926
TEST(RenderingConfigParamDefinitionCreate,
17711927
SucceedsWithDualPolarParamDefinition) {
17721928
const auto kParamDefinitionBytes = std::vector<uint8_t>({1, 2, 3, 4, 5, 123});
@@ -1867,6 +2023,40 @@ TEST(RenderingConfigParamDefinitionCreateFromBufferTest,
18672023
EXPECT_EQ(param_definition.default_z_, 3);
18682024
}
18692025

2026+
TEST(RenderingConfigParamDefinitionCreateFromBufferTest,
2027+
SucceedsWithCart16ParamDefinition) {
2028+
std::vector<uint8_t> source = {// `param_definition_type`.
2029+
ParamDefinition::kParameterDefinitionCart16,
2030+
1, // parameter_id
2031+
1, // parameter_rate
2032+
0, // mode
2033+
10, // duration
2034+
10, // constant_subblock_duration
2035+
// default_x = 1 (16 bits)
2036+
// default_y = 2 (16 bits)
2037+
// default_z = 3 (16 bits)
2038+
0x00, 0x01, 0x00, 0x02, 0x00, 0x03};
2039+
auto buffer =
2040+
MemoryBasedReadBitBuffer::CreateFromSpan(absl::MakeConstSpan(source));
2041+
2042+
auto rendering_config_param_definition =
2043+
RenderingConfigParamDefinition::CreateFromBuffer(*buffer);
2044+
EXPECT_THAT(rendering_config_param_definition, IsOk());
2045+
2046+
EXPECT_EQ(rendering_config_param_definition->param_definition_type,
2047+
ParamDefinition::kParameterDefinitionCart16);
2048+
EXPECT_TRUE(std::holds_alternative<Cart16ParamDefinition>(
2049+
rendering_config_param_definition->param_definition));
2050+
const auto& param_definition = std::get<Cart16ParamDefinition>(
2051+
rendering_config_param_definition->param_definition);
2052+
EXPECT_EQ(param_definition.parameter_id_, 1);
2053+
EXPECT_EQ(param_definition.parameter_rate_, 1);
2054+
EXPECT_FALSE(param_definition.param_definition_mode_);
2055+
EXPECT_EQ(param_definition.default_x_, 1);
2056+
EXPECT_EQ(param_definition.default_y_, 2);
2057+
EXPECT_EQ(param_definition.default_z_, 3);
2058+
}
2059+
18702060
TEST(RenderingConfigParamDefinitionCreateFromBufferTest,
18712061
SucceedsWithDualPolarParamDefinition) {
18722062
std::vector<uint8_t> source = {// `param_definition_type`.

0 commit comments

Comments
 (0)