• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024, 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/utils/bit_buffer_util.h"
13 
14 #include <cstdint>
15 #include <vector>
16 
17 #include "absl/status/status.h"
18 #include "absl/status/status_matchers.h"
19 #include "gmock/gmock.h"
20 #include "gtest/gtest.h"
21 
22 using absl::StatusCode::kResourceExhausted;
23 namespace iamf_tools {
24 namespace {
25 
26 using ::absl_testing::IsOk;
27 
TEST(CanWriteBits,EmptyBuffer)28 TEST(CanWriteBits, EmptyBuffer) {
29   std::vector<uint8_t> bit_buffer;
30   EXPECT_THAT(CanWriteBits(/*allow_resizing=*/true, /*num_bits=*/2,
31                            /*bit_offset=*/0, bit_buffer),
32               IsOk());
33   // Requested to write 2 bits, which fit into one byte.
34   EXPECT_EQ(bit_buffer.size(), 1);
35 }
36 
TEST(CanWriteBits,EmptyBufferNoResize)37 TEST(CanWriteBits, EmptyBufferNoResize) {
38   std::vector<uint8_t> bit_buffer;
39   EXPECT_EQ(CanWriteBits(/*allow_resizing=*/false, /*num_bits=*/2,
40                          /*bit_offset=*/0, bit_buffer)
41                 .code(),
42             kResourceExhausted);
43 }
44 
TEST(CanWriteBits,BufferHasSpace)45 TEST(CanWriteBits, BufferHasSpace) {
46   std::vector<uint8_t> bit_buffer;
47   // Buffer can hold a byte.
48   bit_buffer.resize(1);
49   EXPECT_THAT(CanWriteBits(/*allow_resizing=*/false, /*num_bits=*/2,
50                            /*bit_offset=*/0, bit_buffer),
51               IsOk());
52 }
53 
TEST(CanWriteBytes,EmptyBuffer)54 TEST(CanWriteBytes, EmptyBuffer) {
55   std::vector<uint8_t> bit_buffer;
56   EXPECT_THAT(CanWriteBytes(/*allow_resizing=*/true, /*num_bytes=*/3,
57                             /*bit_offset=*/0, bit_buffer),
58               IsOk());
59   // Requested to write 3 bytes.
60   EXPECT_EQ(bit_buffer.size(), 3);
61 }
62 
TEST(CanWriteBytes,BufferHasSpace)63 TEST(CanWriteBytes, BufferHasSpace) {
64   std::vector<uint8_t> bit_buffer;
65   bit_buffer.resize(3);
66   EXPECT_THAT(CanWriteBytes(/*allow_resizing=*/false, /*num_bytes=*/3,
67                             /*bit_offset=*/0, bit_buffer),
68               IsOk());
69 }
70 
TEST(WriteBit,WriteSeveralBits)71 TEST(WriteBit, WriteSeveralBits) {
72   std::vector<uint8_t> bit_buffer;
73   int64_t bit_offset = 0;
74   // First bit to write.
75   EXPECT_THAT(CanWriteBits(/*allow_resizing=*/true, /*num_bits=*/1, bit_offset,
76                            bit_buffer),
77               IsOk());
78   EXPECT_EQ(bit_buffer.size(), 1);
79   EXPECT_THAT(WriteBit(/*bit=*/1, bit_offset, bit_buffer), IsOk());
80   EXPECT_EQ(bit_buffer[0], 128);  // {10000000}.
81   EXPECT_EQ(bit_offset, 1);
82 
83   // Write several bits: this time request 3 bytes - 1 bit worth of space, for a
84   // total of 3 bytes.
85   EXPECT_THAT(CanWriteBits(/*allow_resizing=*/true, /*num_bits=*/23, bit_offset,
86                            bit_buffer),
87               IsOk());
88   EXPECT_EQ(bit_buffer.size(), 3);
89 
90   EXPECT_THAT(WriteBit(/*bit=*/1, bit_offset, bit_buffer), IsOk());
91   EXPECT_THAT(WriteBit(/*bit=*/1, bit_offset, bit_buffer), IsOk());
92   EXPECT_THAT(WriteBit(/*bit=*/1, bit_offset, bit_buffer), IsOk());
93   EXPECT_THAT(WriteBit(/*bit=*/1, bit_offset, bit_buffer), IsOk());
94   EXPECT_THAT(WriteBit(/*bit=*/1, bit_offset, bit_buffer), IsOk());
95   EXPECT_THAT(WriteBit(/*bit=*/0, bit_offset, bit_buffer), IsOk());
96   EXPECT_THAT(WriteBit(/*bit=*/1, bit_offset, bit_buffer), IsOk());
97 
98   // --- End writing first byte.
99   EXPECT_EQ(bit_buffer[0], 253);  // {11111101}.
100   EXPECT_EQ(bit_offset, 8);
101 
102   EXPECT_THAT(WriteBit(/*bit=*/0, bit_offset, bit_buffer), IsOk());
103   EXPECT_THAT(WriteBit(/*bit=*/0, bit_offset, bit_buffer), IsOk());
104   EXPECT_THAT(WriteBit(/*bit=*/0, bit_offset, bit_buffer), IsOk());
105   EXPECT_THAT(WriteBit(/*bit=*/1, bit_offset, bit_buffer), IsOk());
106   EXPECT_THAT(WriteBit(/*bit=*/0, bit_offset, bit_buffer), IsOk());
107   EXPECT_THAT(WriteBit(/*bit=*/0, bit_offset, bit_buffer), IsOk());
108   EXPECT_THAT(WriteBit(/*bit=*/1, bit_offset, bit_buffer), IsOk());
109   EXPECT_THAT(WriteBit(/*bit=*/1, bit_offset, bit_buffer), IsOk());
110 
111   // --- End writing second byte
112   EXPECT_EQ(bit_buffer[1], 19);  // {00010011}.
113   EXPECT_EQ(bit_offset, 16);
114 
115   EXPECT_EQ(bit_buffer[2], 0);  // {00000000}.
116 }
117 
118 }  // namespace
119 }  // namespace iamf_tools
120