• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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