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