Skip to content

Commit de8c93e

Browse files
committed
Expose proto interface for element_gain_offset_config.
- Add relevant test vectors. - b/391851526: Use a structure to be flexible between dB and Q7.8 input. PiperOrigin-RevId: 856765912
1 parent 8c3d662 commit de8c93e

File tree

10 files changed

+600
-0
lines changed

10 files changed

+600
-0
lines changed

iamf/cli/proto/BUILD

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,12 @@ proto_library(
3838
deps = [":obu_header_proto"],
3939
)
4040

41+
proto_library(
42+
name = "element_gain_offset_config_proto",
43+
srcs = ["element_gain_offset_config.proto"],
44+
deps = [":types_proto"],
45+
)
46+
4147
proto_library(
4248
name = "encoder_control_metadata_proto",
4349
srcs = ["encoder_control_metadata.proto"],
@@ -54,6 +60,7 @@ proto_library(
5460
name = "mix_presentation_proto",
5561
srcs = ["mix_presentation.proto"],
5662
deps = [
63+
":element_gain_offset_config_proto",
5764
":obu_header_proto",
5865
":param_definitions_proto",
5966
],
@@ -141,6 +148,11 @@ cc_proto_library(
141148
deps = [":codec_config_proto"],
142149
)
143150

151+
cc_proto_library(
152+
name = "element_gain_offset_config_cc_proto",
153+
deps = [":element_gain_offset_config_proto"],
154+
)
155+
144156
cc_proto_library(
145157
name = "encoder_control_metadata_cc_proto",
146158
deps = [":encoder_control_metadata_proto"],
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// Copyright (c) 2026, Alliance for Open Media. All rights reserved
2+
//
3+
// This source code is subject to the terms of the BSD 3-Clause Clear License
4+
// and the Alliance for Open Media Patent License 1.0. If the BSD 3-Clause Clear
5+
// License was not distributed with this source code in the LICENSE file, you
6+
// can obtain it at www.aomedia.org/license/software-license/bsd-3-c-c. If the
7+
// Alliance for Open Media Patent License 1.0 was not distributed with this
8+
// source code in the PATENTS file, you can obtain it at
9+
// www.aomedia.org/license/patent.
10+
11+
edition = "2023";
12+
13+
package iamf_tools_cli_proto;
14+
15+
import "iamf/cli/proto/types.proto";
16+
17+
option java_outer_classname = "ElementGainOffsetConfig";
18+
option java_multiple_files = true;
19+
20+
message ElementGainOffsetConfig {
21+
message ValueType {
22+
QFormatOrFloatingPoint element_gain_offset = 1;
23+
}
24+
25+
message RangeType {
26+
QFormatOrFloatingPoint default_element_gain_offset = 1;
27+
QFormatOrFloatingPoint min_element_gain_offset = 2;
28+
QFormatOrFloatingPoint max_element_gain_offset = 3;
29+
}
30+
31+
oneof element_gain_offset_config_type {
32+
ValueType value_type = 1;
33+
RangeType range_type = 2;
34+
}
35+
}

iamf/cli/proto/mix_presentation.proto

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ edition = "2023";
1212

1313
package iamf_tools_cli_proto;
1414

15+
import "iamf/cli/proto/element_gain_offset_config.proto";
1516
import "iamf/cli/proto/obu_header.proto";
1617
import "iamf/cli/proto/param_definitions.proto";
1718

@@ -58,7 +59,10 @@ message RenderingConfig {
5859
uint32 rendering_config_extension_size = 3 [deprecated = true];
5960
repeated RenderingConfigParamDefinition rendering_config_param_definitions =
6061
5;
62+
ElementGainOffsetConfig element_gain_offset_config = 6;
6163
bytes rendering_config_extension_bytes = 4;
64+
65+
// Next ID: 7
6266
}
6367

6468
message SubMixAudioElement {

iamf/cli/proto_conversion/proto_to_obu/BUILD

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,9 +149,11 @@ cc_library(
149149
srcs = ["mix_presentation_generator.cc"],
150150
hdrs = ["mix_presentation_generator.h"],
151151
deps = [
152+
"//iamf/cli/proto:element_gain_offset_config_cc_proto",
152153
"//iamf/cli/proto:mix_presentation_cc_proto",
153154
"//iamf/cli/proto:param_definitions_cc_proto",
154155
"//iamf/cli/proto:parameter_data_cc_proto",
156+
"//iamf/cli/proto:types_cc_proto",
155157
"//iamf/cli/proto:user_metadata_cc_proto",
156158
"//iamf/cli/proto_conversion:lookup_tables",
157159
"//iamf/cli/proto_conversion:proto_utils",
@@ -160,6 +162,7 @@ cc_library(
160162
"//iamf/common/utils:map_utils",
161163
"//iamf/common/utils:numeric_utils",
162164
"//iamf/common/utils:validation_utils",
165+
"//iamf/obu:element_gain_offset_config",
163166
"//iamf/obu:mix_presentation",
164167
"//iamf/obu:rendering_config",
165168
"//iamf/obu:types",

iamf/cli/proto_conversion/proto_to_obu/mix_presentation_generator.cc

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,19 @@
2626
#include "absl/strings/str_cat.h"
2727
#include "absl/strings/string_view.h"
2828
#include "absl/types/span.h"
29+
#include "iamf/cli/proto/element_gain_offset_config.pb.h"
2930
#include "iamf/cli/proto/mix_presentation.pb.h"
3031
#include "iamf/cli/proto/param_definitions.pb.h"
3132
#include "iamf/cli/proto/parameter_data.pb.h"
33+
#include "iamf/cli/proto/types.pb.h"
3234
#include "iamf/cli/proto_conversion/lookup_tables.h"
3335
#include "iamf/cli/proto_conversion/proto_utils.h"
3436
#include "iamf/common/q_format_or_floating_point.h"
3537
#include "iamf/common/utils/macros.h"
3638
#include "iamf/common/utils/map_utils.h"
3739
#include "iamf/common/utils/numeric_utils.h"
3840
#include "iamf/common/utils/validation_utils.h"
41+
#include "iamf/obu/element_gain_offset_config.h"
3942
#include "iamf/obu/mix_presentation.h"
4043
#include "iamf/obu/param_definitions/cart16_param_definition.h"
4144
#include "iamf/obu/param_definitions/cart8_param_definition.h"
@@ -283,6 +286,46 @@ CreateRenderingConfigParamDefinition(
283286
}
284287
}
285288

289+
absl::StatusOr<ElementGainOffsetConfig> CreateElementGainOffsetConfig(
290+
const iamf_tools_cli_proto::ElementGainOffsetConfig&
291+
input_element_gain_offset_config) {
292+
if (input_element_gain_offset_config.has_value_type()) {
293+
const auto element_gain_offset = ProtoToQFormatOrFloatingPoint(
294+
input_element_gain_offset_config.value_type().element_gain_offset());
295+
if (!element_gain_offset.ok()) {
296+
return element_gain_offset.status();
297+
}
298+
return ElementGainOffsetConfig::MakeValueType(*element_gain_offset);
299+
} else if (input_element_gain_offset_config.has_range_type()) {
300+
const auto default_element_gain_offset = ProtoToQFormatOrFloatingPoint(
301+
input_element_gain_offset_config.range_type()
302+
.default_element_gain_offset());
303+
if (!default_element_gain_offset.ok()) {
304+
return default_element_gain_offset.status();
305+
}
306+
const auto min_element_gain_offset = ProtoToQFormatOrFloatingPoint(
307+
input_element_gain_offset_config.range_type()
308+
.min_element_gain_offset());
309+
if (!min_element_gain_offset.ok()) {
310+
return min_element_gain_offset.status();
311+
}
312+
const auto max_element_gain_offset = ProtoToQFormatOrFloatingPoint(
313+
input_element_gain_offset_config.range_type()
314+
.max_element_gain_offset());
315+
if (!max_element_gain_offset.ok()) {
316+
return max_element_gain_offset.status();
317+
}
318+
319+
return ElementGainOffsetConfig::CreateRangeType(
320+
*default_element_gain_offset, *min_element_gain_offset,
321+
*max_element_gain_offset);
322+
} else {
323+
return absl::InvalidArgumentError(
324+
"ElementGainOffsetConfig must have one of value_type or "
325+
"range_type set.");
326+
}
327+
}
328+
286329
absl::Status FillRenderingConfig(
287330
const iamf_tools_cli_proto::RenderingConfig& input_rendering_config,
288331
RenderingConfig& rendering_config) {
@@ -333,6 +376,15 @@ absl::Status FillRenderingConfig(
333376
*rendering_config_param_definition);
334377
}
335378

379+
if (input_rendering_config.has_element_gain_offset_config()) {
380+
auto element_gain_offset_config = CreateElementGainOffsetConfig(
381+
input_rendering_config.element_gain_offset_config());
382+
if (!element_gain_offset_config.ok()) {
383+
return element_gain_offset_config.status();
384+
}
385+
rendering_config.element_gain_offset_config = *element_gain_offset_config;
386+
}
387+
336388
rendering_config.rendering_config_extension_bytes.resize(
337389
input_rendering_config.rendering_config_extension_bytes().size());
338390
return StaticCastSpanIfInRange(

iamf/cli/proto_conversion/proto_to_obu/tests/BUILD

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,10 +156,14 @@ cc_test(
156156
name = "mix_presentation_generator_test",
157157
srcs = ["mix_presentation_generator_test.cc"],
158158
deps = [
159+
"//iamf/cli/proto:element_gain_offset_config_cc_proto",
159160
"//iamf/cli/proto:mix_presentation_cc_proto",
160161
"//iamf/cli/proto:param_definitions_cc_proto",
162+
"//iamf/cli/proto:types_cc_proto",
161163
"//iamf/cli/proto_conversion/proto_to_obu:mix_presentation_generator",
162164
"//iamf/cli/tests:cli_test_utils",
165+
"//iamf/common:q_format_or_floating_point",
166+
"//iamf/obu:element_gain_offset_config",
163167
"//iamf/obu:mix_presentation",
164168
"//iamf/obu:rendering_config",
165169
"//iamf/obu:types",

iamf/cli/proto_conversion/proto_to_obu/tests/mix_presentation_generator_test.cc

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,13 @@
2525
#include "absl/strings/string_view.h"
2626
#include "gmock/gmock.h"
2727
#include "gtest/gtest.h"
28+
#include "iamf/cli/proto/element_gain_offset_config.pb.h"
2829
#include "iamf/cli/proto/mix_presentation.pb.h"
2930
#include "iamf/cli/proto/param_definitions.pb.h"
31+
#include "iamf/cli/proto/types.pb.h"
3032
#include "iamf/cli/tests/cli_test_utils.h"
33+
#include "iamf/common/q_format_or_floating_point.h"
34+
#include "iamf/obu/element_gain_offset_config.h"
3135
#include "iamf/obu/mix_presentation.h"
3236
#include "iamf/obu/param_definitions/cart16_param_definition.h"
3337
#include "iamf/obu/param_definitions/cart8_param_definition.h"
@@ -1554,5 +1558,96 @@ TEST(CopyUserLayoutExtension, IgnoresDeprecatedInfoTypeSizeField) {
15541558
std::vector<uint8_t>({'a', 'b', 'c'}));
15551559
}
15561560

1561+
TEST(Generate, CopiesRenderingConfigWithElementGainOffsetValueQ78) {
1562+
MixPresentationObuMetadatas mix_presentation_metadata;
1563+
auto* first_mix_presentation_metadata = mix_presentation_metadata.Add();
1564+
FillMixPresentationMetadata(first_mix_presentation_metadata);
1565+
first_mix_presentation_metadata->mutable_sub_mixes(0)
1566+
->mutable_audio_elements(0)
1567+
->mutable_rendering_config()
1568+
->mutable_element_gain_offset_config()
1569+
->mutable_value_type()
1570+
->mutable_element_gain_offset()
1571+
->set_q7_dot8(256);
1572+
1573+
MixPresentationGenerator generator(mix_presentation_metadata);
1574+
std::list<MixPresentationObu> generated_obus;
1575+
EXPECT_THAT(generator.Generate(kAppendBuildInformationTag, generated_obus),
1576+
IsOk());
1577+
1578+
const auto& generated_rendering_config =
1579+
generated_obus.front().sub_mixes_[0].audio_elements[0].rendering_config;
1580+
EXPECT_EQ(generated_rendering_config.element_gain_offset_config,
1581+
ElementGainOffsetConfig::MakeValueType(
1582+
QFormatOrFloatingPoint::MakeFromQ7_8(256)));
1583+
}
1584+
1585+
TEST(Generate, CopiesRenderingConfigWithElementGainOffsetValueFloat) {
1586+
MixPresentationObuMetadatas mix_presentation_metadata;
1587+
auto* first_mix_presentation_metadata = mix_presentation_metadata.Add();
1588+
FillMixPresentationMetadata(first_mix_presentation_metadata);
1589+
first_mix_presentation_metadata->mutable_sub_mixes(0)
1590+
->mutable_audio_elements(0)
1591+
->mutable_rendering_config()
1592+
->mutable_element_gain_offset_config()
1593+
->mutable_value_type()
1594+
->mutable_element_gain_offset()
1595+
->set_floating_point(1.0);
1596+
1597+
MixPresentationGenerator generator(mix_presentation_metadata);
1598+
std::list<MixPresentationObu> generated_obus;
1599+
EXPECT_THAT(generator.Generate(kAppendBuildInformationTag, generated_obus),
1600+
IsOk());
1601+
1602+
const auto& generated_rendering_config =
1603+
generated_obus.front().sub_mixes_[0].audio_elements[0].rendering_config;
1604+
EXPECT_EQ(generated_rendering_config.element_gain_offset_config,
1605+
ElementGainOffsetConfig::MakeValueType(
1606+
*QFormatOrFloatingPoint::CreateFromFloatingPoint(1.0)));
1607+
}
1608+
1609+
TEST(Generate, CopiesRenderingConfigWithElementGainOffsetRangeQ78) {
1610+
MixPresentationObuMetadatas mix_presentation_metadata;
1611+
auto* first_mix_presentation_metadata = mix_presentation_metadata.Add();
1612+
FillMixPresentationMetadata(first_mix_presentation_metadata);
1613+
auto& range_type = *first_mix_presentation_metadata->mutable_sub_mixes(0)
1614+
->mutable_audio_elements(0)
1615+
->mutable_rendering_config()
1616+
->mutable_element_gain_offset_config()
1617+
->mutable_range_type();
1618+
range_type.mutable_default_element_gain_offset()->set_q7_dot8(256);
1619+
range_type.mutable_min_element_gain_offset()->set_q7_dot8(0);
1620+
range_type.mutable_max_element_gain_offset()->set_q7_dot8(512);
1621+
1622+
MixPresentationGenerator generator(mix_presentation_metadata);
1623+
std::list<MixPresentationObu> generated_obus;
1624+
EXPECT_THAT(generator.Generate(kAppendBuildInformationTag, generated_obus),
1625+
IsOk());
1626+
1627+
const auto& generated_rendering_config =
1628+
generated_obus.front().sub_mixes_[0].audio_elements[0].rendering_config;
1629+
EXPECT_EQ(generated_rendering_config.element_gain_offset_config,
1630+
*ElementGainOffsetConfig::CreateRangeType(
1631+
QFormatOrFloatingPoint::MakeFromQ7_8(256),
1632+
QFormatOrFloatingPoint::MakeFromQ7_8(0),
1633+
QFormatOrFloatingPoint::MakeFromQ7_8(512)));
1634+
}
1635+
1636+
TEST(Generate, ElementGainOffsetConfigMustHaveValueOrRangeType) {
1637+
MixPresentationObuMetadatas mix_presentation_metadata;
1638+
auto* first_mix_presentation_metadata = mix_presentation_metadata.Add();
1639+
FillMixPresentationMetadata(first_mix_presentation_metadata);
1640+
// Create an `element_gain_offset_config` but do not fill in any fields.
1641+
first_mix_presentation_metadata->mutable_sub_mixes(0)
1642+
->mutable_audio_elements(0)
1643+
->mutable_rendering_config()
1644+
->mutable_element_gain_offset_config();
1645+
MixPresentationGenerator generator(mix_presentation_metadata);
1646+
1647+
std::list<MixPresentationObu> generated_obus;
1648+
EXPECT_THAT(generator.Generate(kAppendBuildInformationTag, generated_obus),
1649+
Not(IsOk()));
1650+
}
1651+
15571652
} // namespace
15581653
} // namespace iamf_tools

0 commit comments

Comments
 (0)