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}
This commit is contained in:
Danil Chapovalov 2020-07-08 11:24:19 +02:00 committed by Commit Bot
parent e88c95e516
commit a9e1b49704
2 changed files with 33 additions and 0 deletions

View file

@ -162,6 +162,12 @@ bool BitBuffer::ConsumeBits(size_t bit_count) {
bool BitBuffer::ReadNonSymmetric(uint32_t* val, uint32_t num_values) { bool BitBuffer::ReadNonSymmetric(uint32_t* val, uint32_t num_values) {
RTC_DCHECK_GT(num_values, 0); RTC_DCHECK_GT(num_values, 0);
RTC_DCHECK_LE(num_values, uint32_t{1} << 31); 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); size_t count_bits = CountBits(num_values);
uint32_t num_min_bits_values = (uint32_t{1} << count_bits) - num_values; uint32_t num_min_bits_values = (uint32_t{1} << count_bits) - num_values;
@ -308,6 +314,11 @@ bool BitBufferWriter::WriteBits(uint64_t val, size_t bit_count) {
bool BitBufferWriter::WriteNonSymmetric(uint32_t val, uint32_t num_values) { bool BitBufferWriter::WriteNonSymmetric(uint32_t val, uint32_t num_values) {
RTC_DCHECK_LT(val, num_values); RTC_DCHECK_LT(val, num_values);
RTC_DCHECK_LE(num_values, uint32_t{1} << 31); 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); size_t count_bits = CountBits(num_values);
uint32_t num_min_bits_values = (uint32_t{1} << count_bits) - num_values; uint32_t num_min_bits_values = (uint32_t{1} << count_bits) - num_values;

View file

@ -254,6 +254,28 @@ TEST(BitBufferWriterTest, NonSymmetricReadsMatchesWrites) {
EXPECT_THAT(values, ElementsAre(0, 1, 2, 3, 4, 5)); 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) { uint64_t GolombEncoded(uint32_t val) {
val++; val++;
uint32_t bit_counter = val; uint32_t bit_counter = val;