1 /*
2 * Copyright (c) 2023, Alliance for Open Media. All rights reserved
3 *
4 * This source code is subject to the terms of the BSD 3-Clause Clear License
5 * and the Alliance for Open Media Patent License 1.0. If the BSD 3-Clause Clear
6 * License was not distributed with this source code in the LICENSE file, you
7 * can obtain it at www.aomedia.org/license/software-license/bsd-3-c-c. If the
8 * Alliance for Open Media Patent License 1.0 was not distributed with this
9 * source code in the PATENTS file, you can obtain it at
10 * www.aomedia.org/license/patent.
11 */
12 #include "iamf/obu/param_definitions.h"
13
14 #include <cstdint>
15 #include <memory>
16 #include <utility>
17 #include <vector>
18
19 #include "absl/status/status.h"
20 #include "absl/status/status_matchers.h"
21 #include "absl/types/span.h"
22 #include "gmock/gmock.h"
23 #include "gtest/gtest.h"
24 #include "iamf/common/leb_generator.h"
25 #include "iamf/common/read_bit_buffer.h"
26 #include "iamf/common/utils/tests/test_utils.h"
27 #include "iamf/common/write_bit_buffer.h"
28 #include "iamf/obu/demixing_info_parameter_data.h"
29 #include "iamf/obu/demixing_param_definition.h"
30 #include "iamf/obu/types.h"
31
32 namespace iamf_tools {
33 namespace {
34
35 using ::absl_testing::IsOk;
36
37 constexpr DecodedUleb128 kParameterId = 100;
38 constexpr DecodedUleb128 kParameterRate = 48000;
39 constexpr DecodedUleb128 kDuration = 64;
40
PopulateParameterDefinition(ParamDefinition & param_definition)41 void PopulateParameterDefinition(ParamDefinition& param_definition) {
42 param_definition.parameter_id_ = 0;
43 param_definition.parameter_rate_ = 1;
44 param_definition.param_definition_mode_ = 1;
45 param_definition.reserved_ = 0;
46 }
47
48 class ParamDefinitionTestBase : public testing::Test {
49 public:
50 ParamDefinitionTestBase() = default;
51
Init()52 void Init() {
53 // Initialize the `subblock_durations_` vector then loop to populate it.
54 param_definition_->InitializeSubblockDurations(
55 static_cast<DecodedUleb128>(subblock_durations_.size()));
56 for (int i = 0; i < subblock_durations_.size(); ++i) {
57 EXPECT_THAT(
58 param_definition_->SetSubblockDuration(i, subblock_durations_[i]),
59 IsOk());
60 }
61 }
62
TestWrite(std::vector<uint8_t> expected_data)63 void TestWrite(std::vector<uint8_t> expected_data) {
64 ASSERT_NE(leb_generator_, nullptr);
65 WriteBitBuffer wb(expected_data.size(), *leb_generator_);
66 EXPECT_EQ(param_definition_->ValidateAndWrite(wb).code(),
67 expected_status_code_);
68 if (expected_status_code_ == absl::StatusCode::kOk) {
69 ValidateWriteResults(wb, expected_data);
70 }
71 }
72
73 protected:
74 std::unique_ptr<ParamDefinition> param_definition_;
75 std::vector<DecodedUleb128> subblock_durations_ = {};
76 absl::StatusCode expected_status_code_ = absl::StatusCode::kOk;
77
78 std::unique_ptr<LebGenerator> leb_generator_ = LebGenerator::Create();
79 };
80
TEST(MixGainParamDefinition,CopyConstructible)81 TEST(MixGainParamDefinition, CopyConstructible) {
82 MixGainParamDefinition mix_gain_param_definition;
83 mix_gain_param_definition.param_definition_mode_ = 0;
84 mix_gain_param_definition.parameter_id_ = kParameterId;
85 mix_gain_param_definition.parameter_rate_ = kParameterRate;
86 mix_gain_param_definition.duration_ = kDuration;
87 mix_gain_param_definition.constant_subblock_duration_ = kDuration;
88 mix_gain_param_definition.default_mix_gain_ = -16;
89
90 const auto other = mix_gain_param_definition;
91
92 EXPECT_EQ(mix_gain_param_definition, other);
93 }
94
95 class MixGainParamDefinitionTest : public ParamDefinitionTestBase {
96 public:
MixGainParamDefinitionTest()97 MixGainParamDefinitionTest() {
98 auto mix_gain = std::make_unique<MixGainParamDefinition>();
99 mix_gain_ = mix_gain.get();
100 PopulateParameterDefinition(*mix_gain_);
101 mix_gain->default_mix_gain_ = 0;
102 param_definition_ = std::move(mix_gain);
103 }
104
105 protected:
106 // Alias for accessing the sub-class data.
107 MixGainParamDefinition* mix_gain_;
108 };
109
TEST_F(MixGainParamDefinitionTest,GetTypeHasCorrectValue)110 TEST_F(MixGainParamDefinitionTest, GetTypeHasCorrectValue) {
111 ASSERT_TRUE(mix_gain_->GetType().has_value());
112 EXPECT_EQ(*mix_gain_->GetType(),
113 ParamDefinition::kParameterDefinitionMixGain);
114 }
115
TEST_F(MixGainParamDefinitionTest,DefaultParamDefinitionMode1)116 TEST_F(MixGainParamDefinitionTest, DefaultParamDefinitionMode1) {
117 Init();
118
119 TestWrite({// Parameter ID.
120 0x00,
121 // Parameter Rate.
122 1,
123 // Param Definition Mode (upper bit).
124 0x80,
125 // Default Mix Gain.
126 0, 0});
127 }
128
TEST_F(MixGainParamDefinitionTest,ParameterId)129 TEST_F(MixGainParamDefinitionTest, ParameterId) {
130 param_definition_->parameter_id_ = 1;
131 Init();
132
133 TestWrite({// Parameter ID.
134 0x01,
135 // Same as default.
136 1, 0x80, 0, 0});
137 }
138
TEST_F(MixGainParamDefinitionTest,NonMinimalLeb)139 TEST_F(MixGainParamDefinitionTest, NonMinimalLeb) {
140 leb_generator_ =
141 LebGenerator::Create(LebGenerator::GenerationMode::kFixedSize, 2);
142 param_definition_->parameter_id_ = 1;
143 param_definition_->parameter_rate_ = 5;
144 Init();
145
146 TestWrite({// Parameter ID.
147 0x81, 0x00,
148 // Parameter Rate.
149 0x85, 0x00,
150 // Same as default.
151 0x80, 0, 0});
152 }
153
TEST_F(MixGainParamDefinitionTest,ParameterRate)154 TEST_F(MixGainParamDefinitionTest, ParameterRate) {
155 param_definition_->parameter_rate_ = 64;
156 Init();
157
158 TestWrite({0x00,
159 // Parameter Rate.
160 64,
161 // Same as default.
162 0x80, 0, 0});
163 }
164
TEST_F(MixGainParamDefinitionTest,DefaultMixGain)165 TEST_F(MixGainParamDefinitionTest, DefaultMixGain) {
166 mix_gain_->default_mix_gain_ = 3;
167 Init();
168
169 TestWrite({0x00, 1, 0x80,
170 // Default Mix Gain.
171 0, 3});
172 }
173
TEST_F(MixGainParamDefinitionTest,ParameterRateMustNotBeZero)174 TEST_F(MixGainParamDefinitionTest, ParameterRateMustNotBeZero) {
175 param_definition_->parameter_rate_ = 0;
176 Init();
177
178 EXPECT_FALSE(param_definition_->Validate().ok());
179 }
180
TEST_F(MixGainParamDefinitionTest,ParamDefinitionMode0WithConstantSubblockDurationNonZero)181 TEST_F(MixGainParamDefinitionTest,
182 ParamDefinitionMode0WithConstantSubblockDurationNonZero) {
183 param_definition_->param_definition_mode_ = false;
184 param_definition_->duration_ = 3;
185 param_definition_->constant_subblock_duration_ = 3;
186 Init();
187
188 TestWrite({// Parameter ID.
189 0x00,
190 // Parameter Rate.
191 1,
192 // Param Definition Mode (upper bit).
193 0,
194 // Duration.
195 3,
196 // Constant Subblock Duration.
197 3,
198 // Default Mix Gain.
199 0, 0});
200 }
201
TEST_F(MixGainParamDefinitionTest,ParamDefinitionMode0WithConstantSubblockDurationZeroIncludesDurations)202 TEST_F(MixGainParamDefinitionTest,
203 ParamDefinitionMode0WithConstantSubblockDurationZeroIncludesDurations) {
204 param_definition_->param_definition_mode_ = false;
205 param_definition_->duration_ = 10;
206 param_definition_->constant_subblock_duration_ = 0;
207 subblock_durations_ = {1, 2, 3, 4};
208 Init();
209
210 TestWrite({// Parameter ID.
211 0x00,
212 // Parameter Rate.
213 1,
214 // Parameter Definition Mode (upper bit).
215 0,
216 // Duration.
217 10,
218 // Constant Subblock Duration.
219 0,
220 // Num subblocks.
221 4,
222 // Subblock 0.
223 1,
224 // Subblock 1.
225 2,
226 // Subblock 2.
227 3,
228 // Subblock 3.
229 4,
230 // Default Mix Gain.
231 0, 0});
232 }
233
TEST_F(MixGainParamDefinitionTest,InvalidWhenExplicitSubblockDurationsDoNotSumToDuration)234 TEST_F(MixGainParamDefinitionTest,
235 InvalidWhenExplicitSubblockDurationsDoNotSumToDuration) {
236 param_definition_->param_definition_mode_ = false;
237 param_definition_->duration_ = 100;
238 param_definition_->constant_subblock_duration_ = 0;
239 subblock_durations_ = {1, 2, 3, 4}; // Does not sum 100.
240 Init();
241
242 EXPECT_FALSE(param_definition_->Validate().ok());
243 }
244
TEST_F(MixGainParamDefinitionTest,InvalidWhenDurationIsZero)245 TEST_F(MixGainParamDefinitionTest, InvalidWhenDurationIsZero) {
246 param_definition_->param_definition_mode_ = false;
247 param_definition_->duration_ = 0;
248 param_definition_->constant_subblock_duration_ = 0;
249 subblock_durations_ = {0};
250 Init();
251
252 EXPECT_FALSE(param_definition_->Validate().ok());
253 }
254
TEST_F(MixGainParamDefinitionTest,InvalidWhenSubblockDurationIsZero)255 TEST_F(MixGainParamDefinitionTest, InvalidWhenSubblockDurationIsZero) {
256 param_definition_->param_definition_mode_ = false;
257 param_definition_->duration_ = 10;
258 param_definition_->constant_subblock_duration_ = 0;
259 subblock_durations_ = {5, 0, 5};
260
261 EXPECT_FALSE(param_definition_->Validate().ok());
262 }
263
TEST(DemixingParamDefinition,CopyConstructible)264 TEST(DemixingParamDefinition, CopyConstructible) {
265 DemixingParamDefinition demixing_param_definition;
266 demixing_param_definition.param_definition_mode_ = 0;
267 demixing_param_definition.parameter_id_ = kParameterId;
268 demixing_param_definition.parameter_rate_ = kParameterRate;
269 demixing_param_definition.duration_ = kDuration;
270 demixing_param_definition.constant_subblock_duration_ = kDuration;
271 demixing_param_definition.default_demixing_info_parameter_data_.dmixp_mode =
272 DemixingInfoParameterData::kDMixPMode1;
273 demixing_param_definition.default_demixing_info_parameter_data_.reserved = 0;
274 demixing_param_definition.default_demixing_info_parameter_data_.default_w = 0;
275 demixing_param_definition.default_demixing_info_parameter_data_
276 .reserved_for_future_use = 0;
277
278 const auto other = demixing_param_definition;
279
280 EXPECT_EQ(demixing_param_definition, other);
281 }
282
283 class DemixingParamDefinitionTest : public ParamDefinitionTestBase {
284 public:
DemixingParamDefinitionTest()285 DemixingParamDefinitionTest() {
286 auto demixing = std::make_unique<DemixingParamDefinition>();
287 demixing_ = demixing.get();
288 PopulateParameterDefinition(*demixing_);
289 demixing->param_definition_mode_ = 0;
290 demixing->duration_ = kDuration;
291 demixing->constant_subblock_duration_ = kDuration;
292 demixing->default_demixing_info_parameter_data_.dmixp_mode =
293 DemixingInfoParameterData::kDMixPMode1;
294 demixing->default_demixing_info_parameter_data_.reserved = 0;
295 demixing->default_demixing_info_parameter_data_.default_w = 0;
296 demixing->default_demixing_info_parameter_data_.reserved_for_future_use = 0;
297 param_definition_ = std::move(demixing);
298 }
299
300 protected:
301 // Alias for accessing the sub-class data.
302 DemixingParamDefinition* demixing_;
303 };
304
TEST_F(DemixingParamDefinitionTest,GetTypeHasCorrectValue)305 TEST_F(DemixingParamDefinitionTest, GetTypeHasCorrectValue) {
306 EXPECT_TRUE(demixing_->GetType().has_value());
307 EXPECT_EQ(*demixing_->GetType(),
308 ParamDefinition::kParameterDefinitionDemixing);
309 }
310
TEST_F(DemixingParamDefinitionTest,DefaultParamDefinitionMode0)311 TEST_F(DemixingParamDefinitionTest, DefaultParamDefinitionMode0) {
312 Init();
313
314 TestWrite({// Parameter ID.
315 0x00,
316 // Parameter Rate.
317 0x01,
318 // Parameter Definition Mode (upper bit).
319 0x00,
320 // Duration.
321 64,
322 // Constant Subblock Duration.
323 64,
324 // Default Demixing Info Parameter Data.
325 DemixingInfoParameterData::kDMixPMode1 << 5, 0});
326 }
327
TEST_F(DemixingParamDefinitionTest,ParameterId)328 TEST_F(DemixingParamDefinitionTest, ParameterId) {
329 param_definition_->parameter_id_ = 1;
330 Init();
331
332 TestWrite({// Parameter ID.
333 0x01,
334 // Same as default.
335 0x01, 0x00, 64, 64, DemixingInfoParameterData::kDMixPMode1 << 5,
336 0});
337 }
338
TEST_F(DemixingParamDefinitionTest,ParameterRate)339 TEST_F(DemixingParamDefinitionTest, ParameterRate) {
340 param_definition_->parameter_rate_ = 2;
341 Init();
342
343 TestWrite({0x00,
344 // Parameter Rate.
345 0x02,
346 // Same as default.
347 0x00, 64, 64, DemixingInfoParameterData::kDMixPMode1 << 5, 0});
348 }
349
TEST_F(DemixingParamDefinitionTest,EqualDurationAndConstantSubblockDuration)350 TEST_F(DemixingParamDefinitionTest, EqualDurationAndConstantSubblockDuration) {
351 param_definition_->duration_ = 32;
352 param_definition_->constant_subblock_duration_ = 32;
353 Init();
354
355 TestWrite({0x00, 0x01, 0x00,
356 // Duration.
357 32,
358 // Constant Subblock Duration.
359 32, 0, 0});
360 }
361
TEST_F(DemixingParamDefinitionTest,InvalidWhenDurationDoesNotEqualConstantSubblockDuration)362 TEST_F(DemixingParamDefinitionTest,
363 InvalidWhenDurationDoesNotEqualConstantSubblockDuration) {
364 param_definition_->duration_ = 64;
365 param_definition_->constant_subblock_duration_ = 65;
366 Init();
367
368 EXPECT_FALSE(param_definition_->Validate().ok());
369 }
370
TEST_F(DemixingParamDefinitionTest,DefaultDmixPMode)371 TEST_F(DemixingParamDefinitionTest, DefaultDmixPMode) {
372 demixing_->default_demixing_info_parameter_data_.dmixp_mode =
373 DemixingInfoParameterData::kDMixPMode2;
374 Init();
375
376 TestWrite({0x00, 0x01, 0x00, 64, 64,
377 // `dmixp_mode`.
378 DemixingInfoParameterData::kDMixPMode2 << 5,
379 // `default_w`.
380 0});
381 }
382
TEST_F(DemixingParamDefinitionTest,DefaultW)383 TEST_F(DemixingParamDefinitionTest, DefaultW) {
384 demixing_->default_demixing_info_parameter_data_.default_w = 1;
385 Init();
386
387 TestWrite({0x00, 0x01, 0x00, 64, 64,
388 DemixingInfoParameterData::kDMixPMode1 << 5,
389 // `default_w`.
390 1 << 4});
391 }
392
TEST_F(DemixingParamDefinitionTest,NonMinimalLebGeneratorAffectsAllLeb128s)393 TEST_F(DemixingParamDefinitionTest, NonMinimalLebGeneratorAffectsAllLeb128s) {
394 leb_generator_ =
395 LebGenerator::Create(LebGenerator::GenerationMode::kFixedSize, 2);
396 param_definition_->parameter_id_ = 0;
397 param_definition_->parameter_rate_ = 1;
398 param_definition_->duration_ = 64;
399 param_definition_->constant_subblock_duration_ = 64;
400 Init();
401
402 TestWrite({// `parameter_id`.
403 0x80, 0x00,
404 // `parameter_rate`.
405 0x81, 0x00,
406 // `param_definition_mode` (1), reserved (7).
407 0x00,
408 // `duration`.
409 0xc0, 0x00,
410 // `constant_subblock_duration`.
411 0xc0, 0x00, DemixingInfoParameterData::kDMixPMode1 << 5, 0});
412 }
413
TEST_F(DemixingParamDefinitionTest,InvalidWhenConstantSubblockDurationIsZero)414 TEST_F(DemixingParamDefinitionTest, InvalidWhenConstantSubblockDurationIsZero) {
415 param_definition_->duration_ = 64;
416 param_definition_->constant_subblock_duration_ = 0;
417 subblock_durations_ = {32, 32};
418 Init();
419
420 EXPECT_FALSE(param_definition_->Validate().ok());
421 }
422
TEST_F(DemixingParamDefinitionTest,InvalidWhenImpliedNumSubblocksIsNotOne)423 TEST_F(DemixingParamDefinitionTest, InvalidWhenImpliedNumSubblocksIsNotOne) {
424 param_definition_->duration_ = 64;
425 param_definition_->constant_subblock_duration_ = 32;
426 Init();
427
428 EXPECT_FALSE(param_definition_->Validate().ok());
429 }
430
TEST_F(DemixingParamDefinitionTest,InvalidWhenParamDefinitionModeIsOne)431 TEST_F(DemixingParamDefinitionTest, InvalidWhenParamDefinitionModeIsOne) {
432 param_definition_->param_definition_mode_ = true;
433 Init();
434
435 EXPECT_FALSE(param_definition_->Validate().ok());
436 }
437
TEST(ReconGainParamDefinition,CopyConstructible)438 TEST(ReconGainParamDefinition, CopyConstructible) {
439 ReconGainParamDefinition recon_gain_param_definition(0);
440 recon_gain_param_definition.param_definition_mode_ = 0;
441 recon_gain_param_definition.parameter_id_ = kParameterId;
442 recon_gain_param_definition.parameter_rate_ = kParameterRate;
443 recon_gain_param_definition.duration_ = kDuration;
444 recon_gain_param_definition.constant_subblock_duration_ = kDuration;
445
446 const auto other = recon_gain_param_definition;
447
448 EXPECT_EQ(recon_gain_param_definition, other);
449 }
450
451 class ReconGainParamDefinitionTest : public ParamDefinitionTestBase {
452 public:
ReconGainParamDefinitionTest()453 ReconGainParamDefinitionTest() {
454 auto recon_gain = std::make_unique<ReconGainParamDefinition>(0);
455 recon_gain_param_definition_ = recon_gain.get();
456 PopulateParameterDefinition(*recon_gain);
457 recon_gain->param_definition_mode_ = 0;
458 recon_gain->reserved_ = 0;
459 recon_gain->duration_ = kDuration;
460 recon_gain->constant_subblock_duration_ = kDuration;
461 param_definition_ = std::move(recon_gain);
462 }
463
464 // Alias for accessing the sub-class data.
465 ReconGainParamDefinition* recon_gain_param_definition_;
466 };
467
TEST_F(ReconGainParamDefinitionTest,GetTypeHasCorrectValue)468 TEST_F(ReconGainParamDefinitionTest, GetTypeHasCorrectValue) {
469 EXPECT_TRUE(param_definition_->GetType().has_value());
470 EXPECT_EQ(*param_definition_->GetType(),
471 ParamDefinition::kParameterDefinitionReconGain);
472 }
473
TEST_F(ReconGainParamDefinitionTest,Default)474 TEST_F(ReconGainParamDefinitionTest, Default) {
475 Init();
476
477 TestWrite({// Parameter ID.
478 0x00,
479 // Parameter Rate.
480 0x01,
481 // Parameter Definition Mode (upper bit).
482 0x00,
483 // Duration.
484 64,
485 // Constant Subblock Duration.
486 64});
487 }
488
TEST_F(ReconGainParamDefinitionTest,ParameterId)489 TEST_F(ReconGainParamDefinitionTest, ParameterId) {
490 param_definition_->parameter_id_ = 1;
491 Init();
492
493 TestWrite({// Parameter ID.
494 0x01,
495 // Same as default.
496 0x01, 0x00, 64, 64});
497 }
498
TEST_F(ReconGainParamDefinitionTest,ParameterRate)499 TEST_F(ReconGainParamDefinitionTest, ParameterRate) {
500 param_definition_->parameter_id_ = 1;
501 Init();
502
503 TestWrite({0x01,
504 // Parameter Rate.
505 0x01,
506 // Same as default.
507 0x00, 64, 64});
508 }
509
TEST_F(ReconGainParamDefinitionTest,Duration)510 TEST_F(ReconGainParamDefinitionTest, Duration) {
511 param_definition_->duration_ = 32;
512 param_definition_->constant_subblock_duration_ = 32;
513 Init();
514
515 TestWrite({0x00, 0x01, 0x00,
516 // Duration.
517 32,
518 // Constant Subblock Duration.
519 32});
520 }
521
TEST_F(ReconGainParamDefinitionTest,AuxiliaryDataNotWritten)522 TEST_F(ReconGainParamDefinitionTest, AuxiliaryDataNotWritten) {
523 Init();
524
525 // Fill in some auxililary data.
526 recon_gain_param_definition_->aux_data_ = {
527 {
528 .recon_gain_is_present_flag = false,
529 .channel_numbers_for_layer = {2, 0, 0},
530 },
531 {
532 .recon_gain_is_present_flag = true,
533 .channel_numbers_for_layer = {5, 1, 2},
534 },
535 };
536
537 // Same as the bitstream in the `ReconGainParamDefinitionTest.Default` test
538 // above, without the auxiliary data.
539 TestWrite({// Parameter ID.
540 0x00,
541 // Parameter Rate.
542 0x01,
543 // Parameter Definition Mode (upper bit).
544 0x00,
545 // Duration.
546 64,
547 // Constant Subblock Duration.
548 64});
549 }
550
TEST_F(ReconGainParamDefinitionTest,NonMinimalLebGeneratorAffectsAllLeb128s)551 TEST_F(ReconGainParamDefinitionTest, NonMinimalLebGeneratorAffectsAllLeb128s) {
552 leb_generator_ =
553 LebGenerator::Create(LebGenerator::GenerationMode::kFixedSize, 2);
554 param_definition_->parameter_id_ = 0;
555 param_definition_->parameter_rate_ = 1;
556 param_definition_->constant_subblock_duration_ = 64;
557 Init();
558
559 TestWrite({// `parameter_id`.
560 0x80, 0x00,
561 // `parameter_rate`.
562 0x81, 0x00,
563 // `param_definition_mode` (1), reserved (7).
564 0x00,
565 // `duration`.
566 0x80 | 64, 0x00,
567 // `constant_subblock_duration`.
568 0x80 | 64, 0x00});
569 }
570
TEST_F(ReconGainParamDefinitionTest,InvalidWhenConstantSubblockDurationIsZero)571 TEST_F(ReconGainParamDefinitionTest,
572 InvalidWhenConstantSubblockDurationIsZero) {
573 param_definition_->duration_ = 64;
574 param_definition_->constant_subblock_duration_ = 0;
575 subblock_durations_ = {32, 32};
576 Init();
577
578 EXPECT_FALSE(param_definition_->Validate().ok());
579 }
580
TEST_F(ReconGainParamDefinitionTest,InvalidWhenImpliedNumSubblocksIsNotOne)581 TEST_F(ReconGainParamDefinitionTest, InvalidWhenImpliedNumSubblocksIsNotOne) {
582 param_definition_->duration_ = 64;
583 param_definition_->constant_subblock_duration_ = 32;
584 Init();
585
586 EXPECT_FALSE(param_definition_->Validate().ok());
587 }
588
TEST_F(ReconGainParamDefinitionTest,InvalidWhenDurationDoesNotEqualConstantSubblockDuration)589 TEST_F(ReconGainParamDefinitionTest,
590 InvalidWhenDurationDoesNotEqualConstantSubblockDuration) {
591 param_definition_->duration_ = 64;
592 param_definition_->constant_subblock_duration_ = 65;
593 Init();
594
595 EXPECT_FALSE(param_definition_->Validate().ok());
596 }
597
TEST_F(ReconGainParamDefinitionTest,InvalidWhenParamDefinitionModeIsOne)598 TEST_F(ReconGainParamDefinitionTest, InvalidWhenParamDefinitionModeIsOne) {
599 param_definition_->param_definition_mode_ = true;
600 Init();
601
602 EXPECT_FALSE(param_definition_->Validate().ok());
603 }
604
TEST(ExtendedParamDefinition,CopyConstructible)605 TEST(ExtendedParamDefinition, CopyConstructible) {
606 ExtendedParamDefinition extended_param_definition(
607 ParamDefinition::kParameterDefinitionReservedStart);
608 extended_param_definition.param_definition_mode_ = 1;
609 extended_param_definition.parameter_id_ = kParameterId;
610 extended_param_definition.parameter_rate_ = kParameterRate;
611 extended_param_definition.param_definition_size_ = 5;
612 extended_param_definition.param_definition_bytes_ = {'e', 'x', 't', 'r', 'a'};
613
614 const auto other = extended_param_definition;
615
616 EXPECT_EQ(extended_param_definition, other);
617 }
618
619 class ExtendedParamDefinitionTest : public ParamDefinitionTestBase {
620 public:
621 ExtendedParamDefinitionTest() = default;
Init(ParamDefinition::ParameterDefinitionType param_definition_type)622 void Init(ParamDefinition::ParameterDefinitionType param_definition_type) {
623 auto extended_param_definition =
624 std::make_unique<ExtendedParamDefinition>(param_definition_type);
625 extended_param_definition_ = extended_param_definition.get();
626 PopulateParameterDefinition(*extended_param_definition);
627 param_definition_ = std::move(extended_param_definition);
628 ParamDefinitionTestBase::Init();
629 }
630
631 protected:
632 // Alias for accessing the sub-class data.
633 ExtendedParamDefinition* extended_param_definition_;
634 };
635
TEST_F(ExtendedParamDefinitionTest,GetTypeHasCorrectValue)636 TEST_F(ExtendedParamDefinitionTest, GetTypeHasCorrectValue) {
637 Init(ParamDefinition::kParameterDefinitionReservedEnd);
638
639 EXPECT_TRUE(param_definition_->GetType().has_value());
640 EXPECT_EQ(*param_definition_->GetType(),
641 ParamDefinition::kParameterDefinitionReservedEnd);
642 }
643
TEST_F(ExtendedParamDefinitionTest,SizeMayBeZero)644 TEST_F(ExtendedParamDefinitionTest, SizeMayBeZero) {
645 Init(ParamDefinition::kParameterDefinitionReservedEnd);
646 extended_param_definition_->param_definition_size_ = 0;
647 extended_param_definition_->param_definition_bytes_ = {};
648
649 TestWrite({// Param Definition Size.
650 0x00});
651 }
652
TEST_F(ExtendedParamDefinitionTest,WritesOnlySizeAndParamDefinitionBytes)653 TEST_F(ExtendedParamDefinitionTest, WritesOnlySizeAndParamDefinitionBytes) {
654 Init(ParamDefinition::kParameterDefinitionReservedEnd);
655 extended_param_definition_->param_definition_size_ = 4;
656 extended_param_definition_->param_definition_bytes_ = {0x01, 0x02, 0x03,
657 0x04};
658
659 TestWrite({// Param Definition Size.
660 0x04,
661 // Param Definition Bytes.
662 0x01, 0x02, 0x03, 0x04});
663 }
664
TEST_F(ExtendedParamDefinitionTest,WriteFailsIfSizeIsInconsistent)665 TEST_F(ExtendedParamDefinitionTest, WriteFailsIfSizeIsInconsistent) {
666 Init(ParamDefinition::kParameterDefinitionReservedEnd);
667 extended_param_definition_->param_definition_size_ = 0;
668 extended_param_definition_->param_definition_bytes_ = {100};
669
670 expected_status_code_ = absl::StatusCode::kInvalidArgument;
671 TestWrite({});
672 }
673
TEST(ReadMixGainParamDefinitionTest,DefaultMixGainMode1)674 TEST(ReadMixGainParamDefinitionTest, DefaultMixGainMode1) {
675 MixGainParamDefinition param_definition;
676 std::vector<uint8_t> source = {
677 // Parameter ID.
678 0x00,
679 // Parameter Rate.
680 1,
681 // Param Definition Mode (upper bit), next 7 bits reserved.
682 0x80,
683 // Default Mix Gain.
684 0, 4};
685 auto buffer = MemoryBasedReadBitBuffer::CreateFromSpan(
686 1024, absl::MakeConstSpan(source));
687 EXPECT_THAT(param_definition.ReadAndValidate(*buffer), IsOk());
688 EXPECT_EQ(*param_definition.GetType(),
689 ParamDefinition::kParameterDefinitionMixGain);
690 EXPECT_EQ(param_definition.default_mix_gain_, 4);
691 }
692
TEST(ReadMixGainParamDefinitionTest,DefaultMixGainWithSubblockArray)693 TEST(ReadMixGainParamDefinitionTest, DefaultMixGainWithSubblockArray) {
694 MixGainParamDefinition param_definition;
695 std::vector<uint8_t> source = {
696 // Parameter ID.
697 0x00,
698 // Parameter Rate.
699 1,
700 // Param Definition Mode (upper bit), next 7 bits reserved.
701 0x00,
702 // `duration` (64).
703 0xc0, 0x00,
704 // `constant_subblock_duration`.
705 0x00,
706 // `num_subblocks`
707 0x02,
708 // `subblock_durations`
709 // `subblock_duration[0]`
710 40,
711 // `subblock_duration[1]`
712 24,
713 // Default Mix Gain.
714 0, 3};
715 auto buffer = MemoryBasedReadBitBuffer::CreateFromSpan(
716 1024, absl::MakeConstSpan(source));
717 EXPECT_THAT(param_definition.ReadAndValidate(*buffer), IsOk());
718 EXPECT_EQ(*param_definition.GetType(),
719 ParamDefinition::kParameterDefinitionMixGain);
720 EXPECT_EQ(param_definition.default_mix_gain_, 3);
721 }
722
TEST(ReadReconGainParamDefinitionTest,Default)723 TEST(ReadReconGainParamDefinitionTest, Default) {
724 std::vector<uint8_t> bitstream = {// Parameter ID.
725 0x00,
726 // Parameter Rate.
727 0x01,
728 // Parameter Definition Mode (upper bit).
729 0x00,
730 // Duration.
731 64,
732 // Constant Subblock Duration.
733 64};
734 auto buffer = MemoryBasedReadBitBuffer::CreateFromSpan(
735 1024, absl::MakeConstSpan(bitstream));
736 ReconGainParamDefinition param_definition = ReconGainParamDefinition(0);
737 EXPECT_TRUE(param_definition.ReadAndValidate(*buffer).ok());
738 EXPECT_EQ(*param_definition.GetType(),
739 ParamDefinition::kParameterDefinitionReconGain);
740 }
741
TEST(ReadReconGainParamDefinitionTest,Mode1)742 TEST(ReadReconGainParamDefinitionTest, Mode1) {
743 std::vector<uint8_t> bitstream = {
744 // Parameter ID.
745 0x00,
746 // Parameter Rate.
747 1,
748 // Param Definition Mode (upper bit), next 7 bits reserved.
749 0x80};
750 auto buffer = MemoryBasedReadBitBuffer::CreateFromSpan(
751 1024, absl::MakeConstSpan(bitstream));
752 ReconGainParamDefinition param_definition = ReconGainParamDefinition(0);
753 EXPECT_THAT(param_definition.ReadAndValidate(*buffer), IsOk());
754 }
755
TEST(ReadReconGainParamDefinitionTest,Mode0NonZeroSubblockDuration)756 TEST(ReadReconGainParamDefinitionTest, Mode0NonZeroSubblockDuration) {
757 std::vector<uint8_t> bitstream = {
758 // Parameter ID.
759 0x00,
760 // Parameter Rate.
761 1,
762 // Param Definition Mode (upper bit), next 7 bits reserved.
763 0x00,
764 // `duration`.
765 0xc0, 0x00,
766 // `constant_subblock_duration`.
767 0xc0, 0x00};
768 auto buffer = MemoryBasedReadBitBuffer::CreateFromSpan(
769 1024, absl::MakeConstSpan(bitstream));
770 ReconGainParamDefinition param_definition = ReconGainParamDefinition(0);
771 EXPECT_THAT(param_definition.ReadAndValidate(*buffer), IsOk());
772 }
773
TEST(ReadReconGainParamDefinitionTest,Mode0SubblockArray)774 TEST(ReadReconGainParamDefinitionTest, Mode0SubblockArray) {
775 std::vector<uint8_t> bitstream = {
776 // Parameter ID.
777 0x00,
778 // Parameter Rate.
779 1,
780 // Param Definition Mode (upper bit), next 7 bits reserved.
781 0x00,
782 // `duration` (64).
783 0xc0, 0x00,
784 // `constant_subblock_duration` (64).
785 0xc0, 0x00,
786 // `num_subblocks`
787 0x02,
788 // `subblock_durations`
789 // `subblock_duration[0]`
790 64};
791 auto buffer = MemoryBasedReadBitBuffer::CreateFromSpan(
792 1024, absl::MakeConstSpan(bitstream));
793 ReconGainParamDefinition param_definition = ReconGainParamDefinition(0);
794 EXPECT_THAT(param_definition.ReadAndValidate(*buffer), IsOk());
795 }
796
TEST(ReadDemixingParamDefinitionTest,DefaultDmixPMode)797 TEST(ReadDemixingParamDefinitionTest, DefaultDmixPMode) {
798 std::vector<uint8_t> bitstream = {// Parameter ID.
799 0x00,
800 // Parameter Rate.
801 0x01,
802 // Parameter Definition Mode (upper bit).
803 0x00,
804 // Duration.
805 64,
806 // Constant Subblock Duration.
807 64,
808 // `dmixp_mode`.
809 DemixingInfoParameterData::kDMixPMode2 << 5,
810 // `default_w`.
811 0};
812
813 auto buffer = MemoryBasedReadBitBuffer::CreateFromSpan(
814 1024, absl::MakeConstSpan(bitstream));
815 DemixingParamDefinition param_definition = DemixingParamDefinition();
816 EXPECT_THAT(param_definition.ReadAndValidate(*buffer), IsOk());
817 EXPECT_EQ(*param_definition.GetType(),
818 ParamDefinition::kParameterDefinitionDemixing);
819 EXPECT_EQ(param_definition.default_demixing_info_parameter_data_.dmixp_mode,
820 DemixingInfoParameterData::kDMixPMode2);
821 }
822
TEST(ReadDemixingParamDefinitionTest,DefaultW)823 TEST(ReadDemixingParamDefinitionTest, DefaultW) {
824 std::vector<uint8_t> bitstream = {// Parameter ID.
825 0x00,
826 // Parameter Rate.
827 0x01,
828 // Parameter Definition Mode (upper bit).
829 0x00,
830 // Duration.
831 64,
832 // Constant Subblock Duration.
833 64,
834 // `dmixp_mode`.
835 DemixingInfoParameterData::kDMixPMode1 << 5,
836 // `default_w`.
837 1 << 4};
838
839 auto buffer = MemoryBasedReadBitBuffer::CreateFromSpan(
840 1024, absl::MakeConstSpan(bitstream));
841 DemixingParamDefinition param_definition = DemixingParamDefinition();
842 EXPECT_THAT(param_definition.ReadAndValidate(*buffer), IsOk());
843 EXPECT_EQ(*param_definition.GetType(),
844 ParamDefinition::kParameterDefinitionDemixing);
845 EXPECT_EQ(param_definition.default_demixing_info_parameter_data_.dmixp_mode,
846 DemixingInfoParameterData::kDMixPMode1);
847 EXPECT_EQ(param_definition.default_demixing_info_parameter_data_.default_w,
848 1);
849 }
850
851 constexpr auto kExtensiontype =
852 ParamDefinition::kParameterDefinitionReservedStart;
TEST(ExtendedParamDefinition,ReadAndValidateWithZeroSize)853 TEST(ExtendedParamDefinition, ReadAndValidateWithZeroSize) {
854 std::vector<uint8_t> bitstream = {// param_definition_size.
855 0x00};
856
857 auto buffer = MemoryBasedReadBitBuffer::CreateFromSpan(
858 1024, absl::MakeConstSpan(bitstream));
859 ExtendedParamDefinition param_definition =
860 ExtendedParamDefinition(kExtensiontype);
861 EXPECT_THAT(param_definition.ReadAndValidate(*buffer), IsOk());
862
863 EXPECT_EQ(*param_definition.GetType(), kExtensiontype);
864 EXPECT_EQ(param_definition.param_definition_size_, 0);
865 EXPECT_TRUE(param_definition.param_definition_bytes_.empty());
866 }
867
TEST(ExtendedParamDefinition,ReadAndValidateWithNonZeroSize)868 TEST(ExtendedParamDefinition, ReadAndValidateWithNonZeroSize) {
869 const DecodedUleb128 kExpectedParamDefinitionSize = 5;
870 const std::vector<uint8_t> kExpectedParamDefinitionBytes = {'e', 'x', 't',
871 'r', 'a'};
872 std::vector<uint8_t> bitstream = {// param_definition_size.
873 0x05,
874 // param_definition_bytes.
875 'e', 'x', 't', 'r', 'a'};
876
877 auto buffer = MemoryBasedReadBitBuffer::CreateFromSpan(
878 1024, absl::MakeConstSpan(bitstream));
879 ExtendedParamDefinition param_definition =
880 ExtendedParamDefinition(kExtensiontype);
881 EXPECT_THAT(param_definition.ReadAndValidate(*buffer), IsOk());
882
883 EXPECT_EQ(*param_definition.GetType(), kExtensiontype);
884 EXPECT_EQ(param_definition.param_definition_size_,
885 kExpectedParamDefinitionSize);
886 EXPECT_EQ(param_definition.param_definition_bytes_,
887 kExpectedParamDefinitionBytes);
888 }
889
TEST(ExtendedParamDefinitionEqualityOperator,Equals)890 TEST(ExtendedParamDefinitionEqualityOperator, Equals) {
891 ExtendedParamDefinition lhs(
892 ParamDefinition::kParameterDefinitionReservedStart);
893 lhs.param_definition_size_ = 5;
894 lhs.param_definition_bytes_ = {'e', 'x', 't', 'r', 'a'};
895 ExtendedParamDefinition rhs(
896 ParamDefinition::kParameterDefinitionReservedStart);
897 rhs.param_definition_size_ = 5;
898 rhs.param_definition_bytes_ = {'e', 'x', 't', 'r', 'a'};
899
900 EXPECT_TRUE(lhs == rhs);
901 }
902
TEST(ExtendedParamDefinitionEqualityOperator,NotEqualsWhenTypeIsDifferent)903 TEST(ExtendedParamDefinitionEqualityOperator, NotEqualsWhenTypeIsDifferent) {
904 const ExtendedParamDefinition lhs(
905 ParamDefinition::kParameterDefinitionReservedStart);
906 const ExtendedParamDefinition rhs(
907 ParamDefinition::kParameterDefinitionReservedEnd);
908
909 EXPECT_NE(lhs, rhs);
910 }
911
TEST(ExtendedParamDefinitionEqualityOperator,NotEqualsWhenPayloadIsDifferent)912 TEST(ExtendedParamDefinitionEqualityOperator, NotEqualsWhenPayloadIsDifferent) {
913 ExtendedParamDefinition lhs(
914 ParamDefinition::kParameterDefinitionReservedStart);
915 lhs.param_definition_size_ = 3;
916 lhs.param_definition_bytes_ = {'e', 'x', 't'};
917 ExtendedParamDefinition rhs(
918 ParamDefinition::kParameterDefinitionReservedStart);
919 rhs.param_definition_size_ = 5;
920 rhs.param_definition_bytes_ = {'e', 'x', 't', 'r', 'a'};
921
922 EXPECT_NE(lhs, rhs);
923 }
924
925 } // namespace
926 } // namespace iamf_tools
927