Fix support for BitBuffer::ReadNonSymmetric(&value, 1)

Bug: None
Change-Id: I4a9076cbb250a8f5c60a90d509f57d1067a71a14
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/178808
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Reviewed-by: Magnus Flodman <mflodman@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#31671}
diff --git a/rtc_base/bit_buffer.cc b/rtc_base/bit_buffer.cc
index a6dc1c7..540141f 100644
--- a/rtc_base/bit_buffer.cc
+++ b/rtc_base/bit_buffer.cc
@@ -162,6 +162,12 @@
 bool BitBuffer::ReadNonSymmetric(uint32_t* val, uint32_t num_values) {
   RTC_DCHECK_GT(num_values, 0);
   RTC_DCHECK_LE(num_values, uint32_t{1} << 31);
+  if (num_values == 1) {
+    // When there is only one possible value, it requires zero bits to store it.
+    // But ReadBits doesn't support reading zero bits.
+    *val = 0;
+    return true;
+  }
   size_t count_bits = CountBits(num_values);
   uint32_t num_min_bits_values = (uint32_t{1} << count_bits) - num_values;
 
@@ -308,6 +314,11 @@
 bool BitBufferWriter::WriteNonSymmetric(uint32_t val, uint32_t num_values) {
   RTC_DCHECK_LT(val, num_values);
   RTC_DCHECK_LE(num_values, uint32_t{1} << 31);
+  if (num_values == 1) {
+    // When there is only one possible value, it requires zero bits to store it.
+    // But WriteBits doesn't support writing zero bits.
+    return true;
+  }
   size_t count_bits = CountBits(num_values);
   uint32_t num_min_bits_values = (uint32_t{1} << count_bits) - num_values;
 
diff --git a/rtc_base/bit_buffer_unittest.cc b/rtc_base/bit_buffer_unittest.cc
index 441cd26..656682c 100644
--- a/rtc_base/bit_buffer_unittest.cc
+++ b/rtc_base/bit_buffer_unittest.cc
@@ -254,6 +254,28 @@
   EXPECT_THAT(values, ElementsAre(0, 1, 2, 3, 4, 5));
 }
 
+TEST(BitBufferTest, ReadNonSymmetricOnlyValueConsumesNoBits) {
+  const uint8_t bytes[2] = {};
+  BitBuffer reader(bytes, 2);
+  uint32_t value = 0xFFFFFFFF;
+  ASSERT_EQ(reader.RemainingBitCount(), 16u);
+
+  EXPECT_TRUE(reader.ReadNonSymmetric(&value, /*num_values=*/1));
+
+  EXPECT_EQ(value, 0u);
+  EXPECT_EQ(reader.RemainingBitCount(), 16u);
+}
+
+TEST(BitBufferWriterTest, WriteNonSymmetricOnlyValueConsumesNoBits) {
+  uint8_t bytes[2] = {};
+  BitBufferWriter writer(bytes, 2);
+  ASSERT_EQ(writer.RemainingBitCount(), 16u);
+
+  EXPECT_TRUE(writer.WriteNonSymmetric(0, /*num_values=*/1));
+
+  EXPECT_EQ(writer.RemainingBitCount(), 16u);
+}
+
 uint64_t GolombEncoded(uint32_t val) {
   val++;
   uint32_t bit_counter = val;