blob: 143ea6fab339debbb4e25a5118973979e6dd2e76 [file] [log] [blame]
Noah Richardsbbf7c862015-04-21 16:30:13 -07001/*
2 * Copyright 2015 The WebRTC Project Authors. All rights reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include "webrtc/base/bitbuffer.h"
12#include "webrtc/base/bytebuffer.h"
13#include "webrtc/base/common.h"
14#include "webrtc/base/gunit.h"
15
16namespace rtc {
17
18TEST(BitBufferTest, ConsumeBits) {
19 const uint8 bytes[64] = {0};
20 BitBuffer buffer(bytes, 32);
21 uint64 total_bits = 32 * 8;
22 EXPECT_EQ(total_bits, buffer.RemainingBitCount());
23 EXPECT_TRUE(buffer.ConsumeBits(3));
24 total_bits -= 3;
25 EXPECT_EQ(total_bits, buffer.RemainingBitCount());
26 EXPECT_TRUE(buffer.ConsumeBits(3));
27 total_bits -= 3;
28 EXPECT_EQ(total_bits, buffer.RemainingBitCount());
29 EXPECT_TRUE(buffer.ConsumeBits(15));
30 total_bits -= 15;
31 EXPECT_EQ(total_bits, buffer.RemainingBitCount());
32 EXPECT_TRUE(buffer.ConsumeBits(37));
33 total_bits -= 37;
34 EXPECT_EQ(total_bits, buffer.RemainingBitCount());
35
36 EXPECT_FALSE(buffer.ConsumeBits(32 * 8));
37 EXPECT_EQ(total_bits, buffer.RemainingBitCount());
38}
39
40TEST(BitBufferTest, ReadBytesAligned) {
41 const uint8 bytes[] = {0x0A, 0xBC, 0xDE, 0xF1, 0x23, 0x45, 0x67, 0x89};
42 uint8 val8;
43 uint16 val16;
44 uint32 val32;
45 BitBuffer buffer(bytes, 8);
46 EXPECT_TRUE(buffer.ReadUInt8(&val8));
47 EXPECT_EQ(0x0Au, val8);
48 EXPECT_TRUE(buffer.ReadUInt8(&val8));
49 EXPECT_EQ(0xBCu, val8);
50 EXPECT_TRUE(buffer.ReadUInt16(&val16));
51 EXPECT_EQ(0xDEF1u, val16);
52 EXPECT_TRUE(buffer.ReadUInt32(&val32));
53 EXPECT_EQ(0x23456789u, val32);
54}
55
56TEST(BitBufferTest, ReadBytesOffset4) {
57 const uint8 bytes[] = {0x0A, 0xBC, 0xDE, 0xF1, 0x23, 0x45, 0x67, 0x89, 0x0A};
58 uint8 val8;
59 uint16 val16;
60 uint32 val32;
61 BitBuffer buffer(bytes, 9);
62 EXPECT_TRUE(buffer.ConsumeBits(4));
63
64 EXPECT_TRUE(buffer.ReadUInt8(&val8));
65 EXPECT_EQ(0xABu, val8);
66 EXPECT_TRUE(buffer.ReadUInt8(&val8));
67 EXPECT_EQ(0xCDu, val8);
68 EXPECT_TRUE(buffer.ReadUInt16(&val16));
69 EXPECT_EQ(0xEF12u, val16);
70 EXPECT_TRUE(buffer.ReadUInt32(&val32));
71 EXPECT_EQ(0x34567890u, val32);
72}
73
74TEST(BitBufferTest, ReadBytesOffset3) {
75 // The pattern we'll check against is counting down from 0b1111. It looks
76 // weird here because it's all offset by 3.
77 // Byte pattern is:
78 // 56701234
79 // 0b00011111,
80 // 0b11011011,
81 // 0b10010111,
82 // 0b01010011,
83 // 0b00001110,
84 // 0b11001010,
85 // 0b10000110,
86 // 0b01000010
87 // xxxxx <-- last 5 bits unused.
88
89 // The bytes. It almost looks like counting down by two at a time, except the
90 // jump at 5->3->0, since that's when the high bit is turned off.
91 const uint8 bytes[] = {0x1F, 0xDB, 0x97, 0x53, 0x0E, 0xCA, 0x86, 0x42};
92
93 uint8 val8;
94 uint16 val16;
95 uint32 val32;
96 BitBuffer buffer(bytes, 8);
97 EXPECT_TRUE(buffer.ConsumeBits(3));
98 EXPECT_TRUE(buffer.ReadUInt8(&val8));
99 EXPECT_EQ(0xFEu, val8);
100 EXPECT_TRUE(buffer.ReadUInt16(&val16));
101 EXPECT_EQ(0xDCBAu, val16);
102 EXPECT_TRUE(buffer.ReadUInt32(&val32));
103 EXPECT_EQ(0x98765432u, val32);
104 // 5 bits left unread. Not enough to read a uint8.
105 EXPECT_EQ(5u, buffer.RemainingBitCount());
106 EXPECT_FALSE(buffer.ReadUInt8(&val8));
107}
108
109TEST(BitBufferTest, ReadBits) {
110 // Bit values are:
111 // 0b01001101,
112 // 0b00110010
113 const uint8 bytes[] = {0x4D, 0x32};
114 uint32_t val;
115 BitBuffer buffer(bytes, 2);
116 EXPECT_TRUE(buffer.ReadBits(&val, 3));
117 // 0b010
118 EXPECT_EQ(0x2u, val);
119 EXPECT_TRUE(buffer.ReadBits(&val, 2));
120 // 0b01
121 EXPECT_EQ(0x1u, val);
122 EXPECT_TRUE(buffer.ReadBits(&val, 7));
123 // 0b1010011
124 EXPECT_EQ(0x53u, val);
125 EXPECT_TRUE(buffer.ReadBits(&val, 2));
126 // 0b00
127 EXPECT_EQ(0x0u, val);
128 EXPECT_TRUE(buffer.ReadBits(&val, 1));
129 // 0b1
130 EXPECT_EQ(0x1u, val);
131 EXPECT_TRUE(buffer.ReadBits(&val, 1));
132 // 0b0
133 EXPECT_EQ(0x0u, val);
134
135 EXPECT_FALSE(buffer.ReadBits(&val, 1));
136}
137
138uint64 GolombEncoded(uint32 val) {
139 val++;
140 uint32 bit_counter = val;
141 uint64 bit_count = 0;
142 while (bit_counter > 0) {
143 bit_count++;
144 bit_counter >>= 1;
145 }
146 return static_cast<uint64>(val) << (64 - (bit_count * 2 - 1));
147}
148
149TEST(BitBufferTest, GolombString) {
150 char test_string[] = "my precious";
151 for (size_t i = 0; i < ARRAY_SIZE(test_string); ++i) {
152 uint64 encoded_val = GolombEncoded(test_string[i]);
153 // Use ByteBuffer to convert to bytes, to account for endianness (BitBuffer
154 // requires network order).
155 ByteBuffer byteBuffer;
156 byteBuffer.WriteUInt64(encoded_val);
157 BitBuffer buffer(reinterpret_cast<const uint8*>(byteBuffer.Data()),
158 byteBuffer.Length());
159 uint32 decoded_val;
160 EXPECT_TRUE(buffer.ReadExponentialGolomb(&decoded_val));
161 EXPECT_EQ(test_string[i], static_cast<char>(decoded_val));
162 }
163}
164
165TEST(BitBufferTest, NoGolombOverread) {
166 const uint8 bytes[] = {0x00, 0xFF, 0xFF};
167 // Make sure the bit buffer correctly enforces byte length on golomb reads.
168 // If it didn't, the above buffer would be valid at 3 bytes.
169 BitBuffer buffer(bytes, 1);
170 uint32 decoded_val;
171 EXPECT_FALSE(buffer.ReadExponentialGolomb(&decoded_val));
172
173 BitBuffer longer_buffer(bytes, 2);
174 EXPECT_FALSE(longer_buffer.ReadExponentialGolomb(&decoded_val));
175
176 BitBuffer longest_buffer(bytes, 3);
177 EXPECT_TRUE(longest_buffer.ReadExponentialGolomb(&decoded_val));
178 // Golomb should have read 9 bits, so 0x01FF, and since it is golomb, the
179 // result is 0x01FF - 1 = 0x01FE.
180 EXPECT_EQ(0x01FEu, decoded_val);
181}
182
183} // namespace rtc