mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-13 05:40:42 +01:00
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:
parent
e88c95e516
commit
a9e1b49704
2 changed files with 33 additions and 0 deletions
|
@ -162,6 +162,12 @@ bool BitBuffer::ConsumeBits(size_t bit_count) {
|
|||
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::WriteBits(uint64_t val, size_t bit_count) {
|
|||
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;
|
||||
|
||||
|
|
|
@ -254,6 +254,28 @@ TEST(BitBufferWriterTest, NonSymmetricReadsMatchesWrites) {
|
|||
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;
|
||||
|
|
Loading…
Reference in a new issue