aboutsummaryrefslogtreecommitdiff
path: root/rtc_base/bit_buffer_unittest.cc
diff options
context:
space:
mode:
authorDanil Chapovalov <danilchap@webrtc.org>2019-07-03 14:41:50 +0200
committerCommit Bot <commit-bot@chromium.org>2019-07-03 13:30:01 +0000
commita2b30d89402639fb253f9e1f630d4a3e46c6e261 (patch)
tree44f31c7cafc739c2a81605ffea667c4103651b4b /rtc_base/bit_buffer_unittest.cc
parent9eee121a8f3a4c42c583413b083aeedee600629e (diff)
downloadwebrtc-a2b30d89402639fb253f9e1f630d4a3e46c6e261.tar.gz
Add functions to read from/write to bitstream values with known max value
Bug: webrtc:10342 Change-Id: I701b09de574eb463daaf8d2c19008ac3452879eb Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/144033 Commit-Queue: Danil Chapovalov <danilchap@webrtc.org> Reviewed-by: Karl Wiberg <kwiberg@webrtc.org> Reviewed-by: Philip Eliasson <philipel@webrtc.org> Cr-Commit-Position: refs/heads/master@{#28465}
Diffstat (limited to 'rtc_base/bit_buffer_unittest.cc')
-rw-r--r--rtc_base/bit_buffer_unittest.cc76
1 files changed, 76 insertions, 0 deletions
diff --git a/rtc_base/bit_buffer_unittest.cc b/rtc_base/bit_buffer_unittest.cc
index 20c0049cb8..b3521b4951 100644
--- a/rtc_base/bit_buffer_unittest.cc
+++ b/rtc_base/bit_buffer_unittest.cc
@@ -14,10 +14,13 @@
#include "rtc_base/arraysize.h"
#include "rtc_base/byte_buffer.h"
+#include "test/gmock.h"
#include "test/gtest.h"
namespace rtc {
+using ::testing::ElementsAre;
+
TEST(BitBufferTest, ConsumeBits) {
const uint8_t bytes[64] = {0};
BitBuffer buffer(bytes, 32);
@@ -178,6 +181,79 @@ TEST(BitBufferTest, SetOffsetValues) {
#endif
}
+TEST(BitBufferTest, ReadNonSymmetricSameNumberOfBitsWhenNumValuesPowerOf2) {
+ const uint8_t bytes[2] = {0xf3, 0xa0};
+ BitBuffer reader(bytes, 2);
+
+ uint32_t values[4];
+ ASSERT_EQ(reader.RemainingBitCount(), 16u);
+ EXPECT_TRUE(reader.ReadNonSymmetric(&values[0], /*num_values=*/1 << 4));
+ EXPECT_TRUE(reader.ReadNonSymmetric(&values[1], /*num_values=*/1 << 4));
+ EXPECT_TRUE(reader.ReadNonSymmetric(&values[2], /*num_values=*/1 << 4));
+ EXPECT_TRUE(reader.ReadNonSymmetric(&values[3], /*num_values=*/1 << 4));
+ ASSERT_EQ(reader.RemainingBitCount(), 0u);
+
+ EXPECT_THAT(values, ElementsAre(0xf, 0x3, 0xa, 0x0));
+}
+
+TEST(BitBufferWriterTest,
+ WriteNonSymmetricSameNumberOfBitsWhenNumValuesPowerOf2) {
+ uint8_t bytes[2] = {};
+ BitBufferWriter writer(bytes, 2);
+
+ ASSERT_EQ(writer.RemainingBitCount(), 16u);
+ EXPECT_TRUE(writer.WriteNonSymmetric(0xf, /*num_values=*/1 << 4));
+ ASSERT_EQ(writer.RemainingBitCount(), 12u);
+ EXPECT_TRUE(writer.WriteNonSymmetric(0x3, /*num_values=*/1 << 4));
+ ASSERT_EQ(writer.RemainingBitCount(), 8u);
+ EXPECT_TRUE(writer.WriteNonSymmetric(0xa, /*num_values=*/1 << 4));
+ ASSERT_EQ(writer.RemainingBitCount(), 4u);
+ EXPECT_TRUE(writer.WriteNonSymmetric(0x0, /*num_values=*/1 << 4));
+ ASSERT_EQ(writer.RemainingBitCount(), 0u);
+
+ EXPECT_THAT(bytes, ElementsAre(0xf3, 0xa0));
+}
+
+TEST(BitBufferWriterTest, NonSymmetricReadsMatchesWrites) {
+ uint8_t bytes[2] = {};
+ BitBufferWriter writer(bytes, 2);
+
+ EXPECT_EQ(BitBufferWriter::SizeNonSymmetricBits(/*val=*/1, /*num_values=*/6),
+ 2u);
+ EXPECT_EQ(BitBufferWriter::SizeNonSymmetricBits(/*val=*/2, /*num_values=*/6),
+ 3u);
+ // Values [0, 1] can fit into two bit.
+ ASSERT_EQ(writer.RemainingBitCount(), 16u);
+ EXPECT_TRUE(writer.WriteNonSymmetric(/*val=*/0, /*num_values=*/6));
+ ASSERT_EQ(writer.RemainingBitCount(), 14u);
+ EXPECT_TRUE(writer.WriteNonSymmetric(/*val=*/1, /*num_values=*/6));
+ ASSERT_EQ(writer.RemainingBitCount(), 12u);
+ // Values [2, 5] require 3 bits.
+ EXPECT_TRUE(writer.WriteNonSymmetric(/*val=*/2, /*num_values=*/6));
+ ASSERT_EQ(writer.RemainingBitCount(), 9u);
+ EXPECT_TRUE(writer.WriteNonSymmetric(/*val=*/3, /*num_values=*/6));
+ ASSERT_EQ(writer.RemainingBitCount(), 6u);
+ EXPECT_TRUE(writer.WriteNonSymmetric(/*val=*/4, /*num_values=*/6));
+ ASSERT_EQ(writer.RemainingBitCount(), 3u);
+ EXPECT_TRUE(writer.WriteNonSymmetric(/*val=*/5, /*num_values=*/6));
+ ASSERT_EQ(writer.RemainingBitCount(), 0u);
+
+ // Bit values are
+ // 00.01.100.101.110.111 = 00011001|01110111 = 0x19|77
+ EXPECT_THAT(bytes, ElementsAre(0x19, 0x77));
+
+ rtc::BitBuffer reader(bytes, 2);
+ uint32_t values[6];
+ EXPECT_TRUE(reader.ReadNonSymmetric(&values[0], /*num_values=*/6));
+ EXPECT_TRUE(reader.ReadNonSymmetric(&values[1], /*num_values=*/6));
+ EXPECT_TRUE(reader.ReadNonSymmetric(&values[2], /*num_values=*/6));
+ EXPECT_TRUE(reader.ReadNonSymmetric(&values[3], /*num_values=*/6));
+ EXPECT_TRUE(reader.ReadNonSymmetric(&values[4], /*num_values=*/6));
+ EXPECT_TRUE(reader.ReadNonSymmetric(&values[5], /*num_values=*/6));
+
+ EXPECT_THAT(values, ElementsAre(0, 1, 2, 3, 4, 5));
+}
+
uint64_t GolombEncoded(uint32_t val) {
val++;
uint32_t bit_counter = val;