• 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/common/write_bit_buffer.h"
13 
14 #include <array>
15 #include <cstdint>
16 #include <filesystem>
17 #include <fstream>
18 #include <ios>
19 #include <limits>
20 #include <memory>
21 #include <optional>
22 #include <string>
23 #include <vector>
24 
25 #include "absl/status/status.h"
26 #include "absl/status/status_matchers.h"
27 #include "absl/strings/str_cat.h"
28 #include "absl/types/span.h"
29 #include "gmock/gmock.h"
30 #include "gtest/gtest.h"
31 #include "iamf/cli/tests/cli_test_utils.h"
32 #include "iamf/common/leb_generator.h"
33 #include "iamf/common/utils/bit_buffer_util.h"
34 #include "iamf/common/utils/tests/test_utils.h"
35 #include "iamf/obu/types.h"
36 
37 namespace iamf_tools {
38 namespace {
39 
40 using ::absl::StatusCode::kInvalidArgument;
41 using ::absl_testing::IsOk;
42 using ::absl_testing::StatusIs;
43 
TEST(FlushAndWriteToStream,WritesToOutputStream)44 TEST(FlushAndWriteToStream, WritesToOutputStream) {
45   constexpr std::array<uint8_t, 4> kDataToOutput = {0x00, '\r', '\n', 0x1a};
46   const auto file_to_write_to = GetAndCleanupOutputFileName(".bin");
47   auto output_stream = std::make_optional<std::fstream>(
48       file_to_write_to, std::ios::binary | std::ios::out);
49 
50   WriteBitBuffer wb(0);
51   EXPECT_THAT(wb.WriteUint8Span(absl::MakeConstSpan(kDataToOutput)), IsOk());
52   EXPECT_THAT(wb.FlushAndWriteToFile(output_stream), IsOk());
53   output_stream->close();
54 
55   EXPECT_EQ(std::filesystem::file_size(file_to_write_to), kDataToOutput.size());
56 }
57 
TEST(FlushAndWriteToStream,SucceedsWithoutOutputStream)58 TEST(FlushAndWriteToStream, SucceedsWithoutOutputStream) {
59   std::optional<std::fstream> omit_output_stream = std::nullopt;
60   WriteBitBuffer wb(0);
61 
62   EXPECT_THAT(wb.FlushAndWriteToFile(omit_output_stream), IsOk());
63 }
64 
TEST(FlushAndWriteToStream,FlushesBuffer)65 TEST(FlushAndWriteToStream, FlushesBuffer) {
66   std::optional<std::fstream> omit_output_stream = std::nullopt;
67   WriteBitBuffer wb(0);
68   EXPECT_THAT(wb.WriteUnsignedLiteral(0x01, 8), IsOk());
69 
70   EXPECT_THAT(wb.FlushAndWriteToFile(omit_output_stream), IsOk());
71 
72   EXPECT_TRUE(wb.bit_buffer().empty());
73 }
74 
75 class WriteBitBufferTest : public ::testing::Test {
76  protected:
77   // Validates a write buffer that may or may not be byte-aligned.
ValidateMaybeNotAlignedWriteBuffer(int64_t num_bits,const std::vector<uint8_t> & expected_data)78   void ValidateMaybeNotAlignedWriteBuffer(
79       int64_t num_bits, const std::vector<uint8_t>& expected_data) {
80     // Verify exact number of expected bits were written.
81     EXPECT_EQ(wb_->bit_offset(), num_bits);
82 
83     const unsigned int ceil_num_bytes =
84         num_bits / 8 + (num_bits % 8 == 0 ? 0 : 1);
85 
86     ASSERT_LE(expected_data.size(), ceil_num_bytes);
87 
88     // Compare rounded up to the nearest byte with expected result.
89     EXPECT_EQ(wb_->bit_buffer(), expected_data);
90   }
91 
92   // The buffer is resizable; the initial capacity does not matter.
93   std::unique_ptr<WriteBitBuffer> wb_ = std::make_unique<WriteBitBuffer>(0);
94 };
95 
TEST_F(WriteBitBufferTest,UnsignedLiteralNumBitsEqualsZero)96 TEST_F(WriteBitBufferTest, UnsignedLiteralNumBitsEqualsZero) {
97   EXPECT_THAT(wb_->WriteUnsignedLiteral(0x00, 0), IsOk());
98   ValidateWriteResults(*wb_, {});
99 }
100 
TEST_F(WriteBitBufferTest,UnsignedLiteralOneByteZero)101 TEST_F(WriteBitBufferTest, UnsignedLiteralOneByteZero) {
102   EXPECT_THAT(wb_->WriteUnsignedLiteral(0x00, 8), IsOk());
103   ValidateWriteResults(*wb_, {0x00});
104 }
105 
TEST_F(WriteBitBufferTest,UnsignedLiteralOneByteNonZero)106 TEST_F(WriteBitBufferTest, UnsignedLiteralOneByteNonZero) {
107   EXPECT_THAT(wb_->WriteUnsignedLiteral(0xab, 8), IsOk());
108   ValidateWriteResults(*wb_, {0xab});
109 }
110 
TEST_F(WriteBitBufferTest,UnsignedLiteralTwoBytes)111 TEST_F(WriteBitBufferTest, UnsignedLiteralTwoBytes) {
112   EXPECT_THAT(wb_->WriteUnsignedLiteral(0xffee, 16), IsOk());
113   ValidateWriteResults(*wb_, {0xff, 0xee});
114 }
115 
TEST_F(WriteBitBufferTest,UnsignedLiteralFourBytes)116 TEST_F(WriteBitBufferTest, UnsignedLiteralFourBytes) {
117   EXPECT_THAT(wb_->WriteUnsignedLiteral(0xffeeddcc, 32), IsOk());
118   ValidateWriteResults(*wb_, {0xff, 0xee, 0xdd, 0xcc});
119 }
120 
121 // This test is not byte aligned. So all expected result bits required to
122 // round up to the nearest byte are set to zero.
TEST_F(WriteBitBufferTest,UnsignedLiteralNotByteAligned)123 TEST_F(WriteBitBufferTest, UnsignedLiteralNotByteAligned) {
124   EXPECT_THAT(wb_->WriteUnsignedLiteral(0b11, 2), IsOk());
125   ValidateMaybeNotAlignedWriteBuffer(2, {0b1100'0000});
126 }
127 
TEST_F(WriteBitBufferTest,UnsignedLiteralMixedAlignedAndNotAligned)128 TEST_F(WriteBitBufferTest, UnsignedLiteralMixedAlignedAndNotAligned) {
129   EXPECT_THAT(wb_->WriteUnsignedLiteral(0, 1), IsOk());
130   EXPECT_THAT(wb_->WriteUnsignedLiteral(0xff, 8), IsOk());
131   EXPECT_THAT(wb_->WriteUnsignedLiteral(0, 7), IsOk());
132   ValidateWriteResults(*wb_, {0x7f, 0x80});
133 }
134 
TEST_F(WriteBitBufferTest,UnsignedLiteralNotByteAlignedLarge)135 TEST_F(WriteBitBufferTest, UnsignedLiteralNotByteAlignedLarge) {
136   EXPECT_THAT(
137       wb_->WriteUnsignedLiteral(0b0001'0010'0011'0100'0101'0110'0111, 28),
138       IsOk());
139   ValidateMaybeNotAlignedWriteBuffer(
140       28, {0b0001'0010, 0b0011'0100, 0b0101'0110, 0b0111'0000});
141 }
142 
TEST_F(WriteBitBufferTest,InvalidUnsignedLiteralOverflowOverRequestedNumBits)143 TEST_F(WriteBitBufferTest, InvalidUnsignedLiteralOverflowOverRequestedNumBits) {
144   EXPECT_THAT(wb_->WriteUnsignedLiteral(16, 4), StatusIs(kInvalidArgument));
145 }
146 
TEST_F(WriteBitBufferTest,InvalidUnsignedLiteralOverNumBitsOver32)147 TEST_F(WriteBitBufferTest, InvalidUnsignedLiteralOverNumBitsOver32) {
148   EXPECT_THAT(wb_->WriteUnsignedLiteral(0, /*num_bits=*/33),
149               StatusIs(kInvalidArgument));
150 }
151 
TEST_F(WriteBitBufferTest,UnsignedLiteralZeroNumBits)152 TEST_F(WriteBitBufferTest, UnsignedLiteralZeroNumBits) {
153   EXPECT_THAT(wb_->WriteUnsignedLiteral(0, /*num_bits=*/0), IsOk());
154   EXPECT_THAT(wb_->bit_offset(), 0);
155 }
156 
TEST_F(WriteBitBufferTest,InvalidUnsignedLiteralNegativeNumBits)157 TEST_F(WriteBitBufferTest, InvalidUnsignedLiteralNegativeNumBits) {
158   EXPECT_THAT(wb_->WriteUnsignedLiteral(0, /*num_bits=*/-1),
159               StatusIs(kInvalidArgument));
160 }
161 
TEST_F(WriteBitBufferTest,UnsignedLiteral64OneByteZero)162 TEST_F(WriteBitBufferTest, UnsignedLiteral64OneByteZero) {
163   EXPECT_THAT(wb_->WriteUnsignedLiteral64(0x00, 8), IsOk());
164   ValidateWriteResults(*wb_, {0x00});
165 }
166 
TEST_F(WriteBitBufferTest,UnsignedLiteral64FiveBytes)167 TEST_F(WriteBitBufferTest, UnsignedLiteral64FiveBytes) {
168   EXPECT_THAT(wb_->WriteUnsignedLiteral64(0xffffffffff, 40), IsOk());
169   ValidateWriteResults(*wb_, {0xff, 0xff, 0xff, 0xff, 0xff});
170 }
171 
TEST_F(WriteBitBufferTest,UnsignedLiteral64EightBytes)172 TEST_F(WriteBitBufferTest, UnsignedLiteral64EightBytes) {
173   EXPECT_THAT(wb_->WriteUnsignedLiteral64(0xfedcba9876543210l, 64), IsOk());
174   ValidateWriteResults(*wb_, {0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10});
175 }
176 
177 // These tests are not byte aligned. So all expected result bits required to
178 // round up to the nearest byte are set to zero.
TEST_F(WriteBitBufferTest,UnsignedLiteral64NotByteAlignedSmall)179 TEST_F(WriteBitBufferTest, UnsignedLiteral64NotByteAlignedSmall) {
180   EXPECT_THAT(wb_->WriteUnsignedLiteral64(0b101, 3), IsOk());
181   ValidateMaybeNotAlignedWriteBuffer(3, {0b1010'0000});
182 }
183 
TEST_F(WriteBitBufferTest,UnsignedLiteral64NotByteAlignedLarge)184 TEST_F(WriteBitBufferTest, UnsignedLiteral64NotByteAlignedLarge) {
185   EXPECT_THAT(wb_->WriteUnsignedLiteral64(0x7fffffffffffffff, 63), IsOk());
186   ValidateMaybeNotAlignedWriteBuffer(
187       63, {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe});
188 }
189 
TEST_F(WriteBitBufferTest,InvalidUnsignedLiteral64OverflowOverRequestedNumBits)190 TEST_F(WriteBitBufferTest,
191        InvalidUnsignedLiteral64OverflowOverRequestedNumBits) {
192   EXPECT_THAT(wb_->WriteUnsignedLiteral64(uint64_t{1} << 34, 34),
193               StatusIs(kInvalidArgument));
194 }
195 
TEST_F(WriteBitBufferTest,InvalidUnsignedLiteral64NumBitsOver64)196 TEST_F(WriteBitBufferTest, InvalidUnsignedLiteral64NumBitsOver64) {
197   EXPECT_THAT(wb_->WriteUnsignedLiteral64(0, /*num_bits=*/65),
198               StatusIs(kInvalidArgument));
199 }
200 
TEST_F(WriteBitBufferTest,Signed8Zero)201 TEST_F(WriteBitBufferTest, Signed8Zero) {
202   EXPECT_THAT(wb_->WriteSigned8(0x00), IsOk());
203   ValidateWriteResults(*wb_, {0x00});
204 }
205 
TEST_F(WriteBitBufferTest,Signed8MaxPositive)206 TEST_F(WriteBitBufferTest, Signed8MaxPositive) {
207   EXPECT_THAT(wb_->WriteSigned8(127), IsOk());
208   ValidateWriteResults(*wb_, {0x7f});
209 }
210 
TEST_F(WriteBitBufferTest,Signed8MinPositive)211 TEST_F(WriteBitBufferTest, Signed8MinPositive) {
212   EXPECT_THAT(wb_->WriteSigned8(1), IsOk());
213   ValidateWriteResults(*wb_, {0x01});
214 }
215 
TEST_F(WriteBitBufferTest,Signed8MinNegative)216 TEST_F(WriteBitBufferTest, Signed8MinNegative) {
217   EXPECT_THAT(wb_->WriteSigned8(-128), IsOk());
218   ValidateWriteResults(*wb_, {0x80});
219 }
220 
TEST_F(WriteBitBufferTest,Signed8MaxNegative)221 TEST_F(WriteBitBufferTest, Signed8MaxNegative) {
222   EXPECT_THAT(wb_->WriteSigned8(-1), IsOk());
223   ValidateWriteResults(*wb_, {0xff});
224 }
225 
TEST_F(WriteBitBufferTest,Signed16Zero)226 TEST_F(WriteBitBufferTest, Signed16Zero) {
227   EXPECT_THAT(wb_->WriteSigned16(0x00), IsOk());
228   ValidateWriteResults(*wb_, {0x00, 0x00});
229 }
230 
TEST_F(WriteBitBufferTest,Signed16MaxPositive)231 TEST_F(WriteBitBufferTest, Signed16MaxPositive) {
232   EXPECT_THAT(wb_->WriteSigned16(32767), IsOk());
233   ValidateWriteResults(*wb_, {0x7f, 0xff});
234 }
235 
TEST_F(WriteBitBufferTest,Signed16MinPositive)236 TEST_F(WriteBitBufferTest, Signed16MinPositive) {
237   EXPECT_THAT(wb_->WriteSigned16(1), IsOk());
238   ValidateWriteResults(*wb_, {0x00, 0x01});
239 }
240 
TEST_F(WriteBitBufferTest,Signed16MinNegative)241 TEST_F(WriteBitBufferTest, Signed16MinNegative) {
242   EXPECT_THAT(wb_->WriteSigned16(-32768), IsOk());
243   ValidateWriteResults(*wb_, {0x80, 0x00});
244 }
245 
TEST_F(WriteBitBufferTest,Signed16MaxNegative)246 TEST_F(WriteBitBufferTest, Signed16MaxNegative) {
247   EXPECT_THAT(wb_->WriteSigned16(-1), IsOk());
248   ValidateWriteResults(*wb_, {0xff, 0xff});
249 }
250 
TEST_F(WriteBitBufferTest,InvalidInternalNullTerminator)251 TEST_F(WriteBitBufferTest, InvalidInternalNullTerminator) {
252   const std::string kInternalNull("a\0b", 3);
253 
254   EXPECT_THAT(wb_->WriteString(kInternalNull), StatusIs(kInvalidArgument));
255   EXPECT_EQ(wb_->bit_offset(), 0);
256 }
257 
TEST_F(WriteBitBufferTest,EmptyLiteralString)258 TEST_F(WriteBitBufferTest, EmptyLiteralString) {
259   const std::string kEmptyString = "";
260 
261   EXPECT_THAT(wb_->WriteString(kEmptyString), IsOk());
262 
263   ValidateWriteResults(*wb_, {'\0'});
264 }
265 
TEST_F(WriteBitBufferTest,StringOnlyNullCharacter)266 TEST_F(WriteBitBufferTest, StringOnlyNullCharacter) {
267   const std::string kEmptyString = "\0";
268 
269   EXPECT_THAT(wb_->WriteString(kEmptyString), IsOk());
270 
271   ValidateWriteResults(*wb_, {'\0'});
272 }
273 
TEST_F(WriteBitBufferTest,StringAscii)274 TEST_F(WriteBitBufferTest, StringAscii) {
275   const std::string kAsciiInput = "ABC\0";
276 
277   EXPECT_THAT(wb_->WriteString(kAsciiInput), IsOk());
278 
279   ValidateWriteResults(*wb_, {'A', 'B', 'C', '\0'});
280 }
281 
TEST_F(WriteBitBufferTest,StringUtf8)282 TEST_F(WriteBitBufferTest, StringUtf8) {
283   const std::string kUtf8Input(
284       "\xc3\xb3"          // A 1-byte UTF-8 character.
285       "\xf0\x9d\x85\x9f"  // A 4-byte UTF-8 character.
286       "\0");
287 
288   EXPECT_THAT(wb_->WriteString(kUtf8Input), IsOk());
289 
290   ValidateWriteResults(*wb_,
291                        {0xc3, 0xb3,              // A 1-byte UTF-8 character.
292                         0xf0, 0x9d, 0x85, 0x9f,  // A 4-byte UTF-8 character.
293                         '\0'});
294 }
295 
TEST_F(WriteBitBufferTest,StringMaxLength)296 TEST_F(WriteBitBufferTest, StringMaxLength) {
297   // Make a string and expected output with 127 non-NULL characters, followed by
298   // a NULL character.
299   const std::string kMaxLengthString =
300       absl::StrCat(std::string(kIamfMaxStringSize - 1, 'a'), "\0");
301   std::vector<uint8_t> expected_result(kIamfMaxStringSize, 'a');
302   expected_result.back() = '\0';
303 
304   EXPECT_THAT(wb_->WriteString(kMaxLengthString), IsOk());
305   ValidateWriteResults(*wb_, expected_result);
306 }
307 
TEST_F(WriteBitBufferTest,InvalidStringTooLong)308 TEST_F(WriteBitBufferTest, InvalidStringTooLong) {
309   const std::string kMaxLengthString(kIamfMaxStringSize, 'a');
310 
311   EXPECT_THAT(wb_->WriteString(kMaxLengthString), StatusIs(kInvalidArgument));
312   EXPECT_EQ(wb_->bit_offset(), 0);
313 }
314 
TEST_F(WriteBitBufferTest,WriteUint8SpanWorksForEmptySpan)315 TEST_F(WriteBitBufferTest, WriteUint8SpanWorksForEmptySpan) {
316   constexpr absl::Span<const uint8_t> kEmptySpan = {};
317 
318   EXPECT_THAT(wb_->WriteUint8Span(kEmptySpan), IsOk());
319 
320   ValidateWriteResults(*wb_, {});
321 }
322 
TEST_F(WriteBitBufferTest,WriteUint8SpanWorksWhenBufferIsByteAligned)323 TEST_F(WriteBitBufferTest, WriteUint8SpanWorksWhenBufferIsByteAligned) {
324   const std::vector<uint8_t> kFivebytes = {0, 10, 20, 30, 255};
325 
326   EXPECT_THAT(wb_->WriteUint8Span(absl::MakeConstSpan(kFivebytes)), IsOk());
327 
328   ValidateWriteResults(*wb_, kFivebytes);
329 }
330 
TEST_F(WriteBitBufferTest,WriteUint8SpanWorksWhenBufferIsNotByteAligned)331 TEST_F(WriteBitBufferTest, WriteUint8SpanWorksWhenBufferIsNotByteAligned) {
332   // Force the buffer to be mis-aligned.
333   EXPECT_THAT(wb_->WriteUnsignedLiteral(0, 1), IsOk());
334   // It is OK to write a span, even when the underlying buffer is mis-aligned.
335   EXPECT_THAT(wb_->WriteUint8Span({0xff}), IsOk());
336   EXPECT_THAT(wb_->WriteUnsignedLiteral(0, 7), IsOk());
337 
338   ValidateWriteResults(*wb_,
339                        {
340                            0b0111'1111,  // The first mis-aligned bit, then
341                                          // the first 7-bits of the span.
342                            0b1000'0000   // The final bit of the span, then the
343                                          // final 7 mis-aligned bits.
344                        });
345 }
346 
TEST_F(WriteBitBufferTest,WriteUleb128Min)347 TEST_F(WriteBitBufferTest, WriteUleb128Min) {
348   EXPECT_THAT(wb_->WriteUleb128(0), IsOk());
349   ValidateWriteResults(*wb_, {0x00});
350 }
351 
TEST_F(WriteBitBufferTest,WriteUleb128Max)352 TEST_F(WriteBitBufferTest, WriteUleb128Max) {
353   EXPECT_THAT(wb_->WriteUleb128(std::numeric_limits<DecodedUleb128>::max()),
354               IsOk());
355   ValidateWriteResults(*wb_, {0xff, 0xff, 0xff, 0xff, 0x0f});
356 }
357 
TEST_F(WriteBitBufferTest,WriteUleb128IsControlledByGeneratorPassedInConstructor)358 TEST_F(WriteBitBufferTest,
359        WriteUleb128IsControlledByGeneratorPassedInConstructor) {
360   auto leb_generator =
361       LebGenerator::Create(LebGenerator::GenerationMode::kFixedSize, 5);
362   ASSERT_NE(leb_generator, nullptr);
363   wb_ = std::make_unique<WriteBitBuffer>(1, *leb_generator);
364 
365   EXPECT_THAT(wb_->WriteUleb128(0), IsOk());
366 
367   ValidateWriteResults(*wb_, {0x80, 0x80, 0x80, 0x80, 0x00});
368 }
369 
TEST_F(WriteBitBufferTest,WriteMinUleb128DefaultsToGeneratingMinimalUleb128s)370 TEST_F(WriteBitBufferTest, WriteMinUleb128DefaultsToGeneratingMinimalUleb128s) {
371   EXPECT_THAT(wb_->WriteUleb128(129), IsOk());
372 
373   ValidateWriteResults(*wb_, {0x81, 0x01});
374 }
375 
TEST_F(WriteBitBufferTest,WriteMinUleb128CanFailWithFixedSizeGenerator)376 TEST_F(WriteBitBufferTest, WriteMinUleb128CanFailWithFixedSizeGenerator) {
377   auto leb_generator =
378       LebGenerator::Create(LebGenerator::GenerationMode::kFixedSize, 1);
379   ASSERT_NE(leb_generator, nullptr);
380   wb_ = std::make_unique<WriteBitBuffer>(1, *leb_generator);
381 
382   EXPECT_FALSE(wb_->WriteUleb128(128).ok());
383 }
384 
385 struct WriteIso14496_1ExpandedTestCase {
386   uint32_t size_of_instance;
387   const std::vector<uint8_t> expected_source_data;
388 };
389 
390 using WriteIso14496_1Expanded =
391     ::testing::TestWithParam<WriteIso14496_1ExpandedTestCase>;
392 
TEST_P(WriteIso14496_1Expanded,WriteIso14496_1Expanded)393 TEST_P(WriteIso14496_1Expanded, WriteIso14496_1Expanded) {
394   WriteBitBuffer wb(0);
395   EXPECT_THAT(wb.WriteIso14496_1Expanded(GetParam().size_of_instance), IsOk());
396 
397   EXPECT_EQ(wb.bit_buffer(), GetParam().expected_source_data);
398 }
399 
400 INSTANTIATE_TEST_SUITE_P(OneByteOutput, WriteIso14496_1Expanded,
401                          testing::ValuesIn<WriteIso14496_1ExpandedTestCase>({
402                              {0, {0x00}},
403                              {1, {0x01}},
404                              {127, {0x7f}},
405                          }));
406 
407 INSTANTIATE_TEST_SUITE_P(TwoByteOutput, WriteIso14496_1Expanded,
408                          testing::ValuesIn<WriteIso14496_1ExpandedTestCase>({
409                              {128, {0x81, 0x00}},
410                              {129, {0x81, 0x01}},
411                              {0x3fff, {0xff, 0x7f}},
412                          }));
413 
414 INSTANTIATE_TEST_SUITE_P(FiveByteOutput, WriteIso14496_1Expanded,
415                          testing::ValuesIn<WriteIso14496_1ExpandedTestCase>({
416                              {0x10000000, {0x81, 0x80, 0x80, 0x80, 0x00}},
417                              {0xf0000000, {0x8f, 0x80, 0x80, 0x80, 0x00}},
418                          }));
419 
420 INSTANTIATE_TEST_SUITE_P(MaxOutput, WriteIso14496_1Expanded,
421                          testing::ValuesIn<WriteIso14496_1ExpandedTestCase>({
422                              {std::numeric_limits<uint32_t>::max(),
423                               {0x8f, 0xff, 0xff, 0xff, 0x7f}},
424                          }));
425 
TEST_F(WriteBitBufferTest,CapacityMayBeSmaller)426 TEST_F(WriteBitBufferTest, CapacityMayBeSmaller) {
427   // The buffer may have a small initial capacity and resize as needed.
428   constexpr int64_t kInitialCapacity = 0;
429   wb_ = std::make_unique<WriteBitBuffer>(kInitialCapacity);
430   const std::vector<uint8_t> kSixBytes = {0, 1, 2, 3, 4, 5};
431 
432   EXPECT_THAT(wb_->WriteUint8Span(absl::MakeConstSpan(kSixBytes)), IsOk());
433   ValidateWriteResults(*wb_, kSixBytes);
434 }
435 
TEST_F(WriteBitBufferTest,CapacityMayBeLarger)436 TEST_F(WriteBitBufferTest, CapacityMayBeLarger) {
437   // The buffer may have a larger that capacity that necessary.
438   wb_ = std::make_unique<WriteBitBuffer>(/*initial_capacity=*/100);
439   const std::vector<uint8_t> kSixBytes = {0, 1, 2, 3, 4, 5};
440 
441   EXPECT_THAT(wb_->WriteUint8Span(absl::MakeConstSpan(kSixBytes)), IsOk());
442   ValidateWriteResults(*wb_, kSixBytes);
443 }
444 
TEST_F(WriteBitBufferTest,ConsecutiveWrites)445 TEST_F(WriteBitBufferTest, ConsecutiveWrites) {
446   // The buffer accumulates data from all write calls.
447   EXPECT_THAT(wb_->WriteUnsignedLiteral(0x01, 8), IsOk());
448   EXPECT_THAT(wb_->WriteUnsignedLiteral64(0x0203040506070809, 64), IsOk());
449   EXPECT_THAT(wb_->WriteUleb128(128), IsOk());
450   ValidateWriteResults(*wb_,
451                        {// From `WriteUnsignedLiteral()`.
452                         0x01,
453                         // From `WriteUnsignedLiteral64()`.
454                         0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
455                         // From `WriteLeb128()`.
456                         0x80, 0x01});
457 }
458 
TEST_F(WriteBitBufferTest,UseAfterReset)459 TEST_F(WriteBitBufferTest, UseAfterReset) {
460   EXPECT_THAT(wb_->WriteUnsignedLiteral(0xabcd, 16), IsOk());
461   ValidateWriteResults(*wb_, {0xab, 0xcd});
462 
463   // Resetting the buffer clears it.
464   wb_->Reset();
465   ValidateWriteResults(*wb_, {});
466 
467   // The buffer can be used after reset . There is no trace of data before the
468   // reset.
469   EXPECT_THAT(wb_->WriteUnsignedLiteral(100, 8), IsOk());
470   ValidateWriteResults(*wb_, {100});
471 }
472 
473 }  // namespace
474 }  // namespace iamf_tools
475