aboutsummaryrefslogtreecommitdiff
path: root/src/utils/raw_bit_reader_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils/raw_bit_reader_test.cc')
-rw-r--r--src/utils/raw_bit_reader_test.cc580
1 files changed, 580 insertions, 0 deletions
diff --git a/src/utils/raw_bit_reader_test.cc b/src/utils/raw_bit_reader_test.cc
new file mode 100644
index 0000000..22a97a7
--- /dev/null
+++ b/src/utils/raw_bit_reader_test.cc
@@ -0,0 +1,580 @@
+// Copyright 2021 The libgav1 Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "src/utils/raw_bit_reader.h"
+
+#include <bitset>
+#include <cstddef>
+#include <cstdint>
+#include <memory>
+#include <new>
+#include <string>
+#include <tuple>
+#include <vector>
+
+#include "gtest/gtest.h"
+#include "src/utils/constants.h"
+#include "tests/third_party/libvpx/acm_random.h"
+
+namespace libgav1 {
+namespace {
+
+std::string IntegerToString(int x) { return std::bitset<8>(x).to_string(); }
+
+class RawBitReaderTest : public testing::TestWithParam<std::tuple<int, int>> {
+ protected:
+ RawBitReaderTest()
+ : literal_size_(std::get<0>(GetParam())),
+ test_data_size_(std::get<1>(GetParam())) {}
+
+ void CreateReader(const std::vector<uint8_t>& data) {
+ data_ = data;
+ raw_bit_reader_.reset(new (std::nothrow)
+ RawBitReader(data_.data(), data_.size()));
+ }
+
+ void CreateReader(int size) {
+ libvpx_test::ACMRandom rnd(libvpx_test::ACMRandom::DeterministicSeed());
+ data_.clear();
+ for (int i = 0; i < size; ++i) {
+ data_.push_back(rnd.Rand8());
+ }
+ raw_bit_reader_.reset(new (std::nothrow)
+ RawBitReader(data_.data(), data_.size()));
+ }
+
+ // Some tests don't depend on |literal_size_|. For those tests, return true if
+ // the |literal_size_| is greater than 1. If this function returns true, the
+ // test will abort.
+ bool RunOnlyOnce() const { return literal_size_ > 1; }
+
+ std::unique_ptr<RawBitReader> raw_bit_reader_;
+ std::vector<uint8_t> data_;
+ int literal_size_;
+ int test_data_size_;
+};
+
+TEST_P(RawBitReaderTest, ReadBit) {
+ if (RunOnlyOnce()) return;
+ CreateReader(test_data_size_);
+ for (const auto& value : data_) {
+ const std::string expected = IntegerToString(value);
+ for (int j = 0; j < 8; ++j) {
+ EXPECT_FALSE(raw_bit_reader_->Finished());
+ EXPECT_EQ(static_cast<int>(expected[j] == '1'),
+ raw_bit_reader_->ReadBit());
+ }
+ }
+ EXPECT_TRUE(raw_bit_reader_->Finished());
+ EXPECT_EQ(raw_bit_reader_->ReadBit(), -1);
+}
+
+TEST_P(RawBitReaderTest, ReadLiteral) {
+ const int size_bytes = literal_size_;
+ const int size_bits = 8 * size_bytes;
+ CreateReader(test_data_size_ * size_bytes);
+ for (size_t i = 0; i < data_.size(); i += size_bytes) {
+ uint32_t expected_literal = 0;
+ for (int j = 0; j < size_bytes; ++j) {
+ expected_literal |=
+ static_cast<uint32_t>(data_[i + j] << (8 * (size_bytes - j - 1)));
+ }
+ EXPECT_FALSE(raw_bit_reader_->Finished());
+ const int64_t actual_literal = raw_bit_reader_->ReadLiteral(size_bits);
+ EXPECT_EQ(static_cast<int64_t>(expected_literal), actual_literal);
+ EXPECT_GE(actual_literal, 0);
+ }
+ EXPECT_TRUE(raw_bit_reader_->Finished());
+ EXPECT_EQ(raw_bit_reader_->ReadLiteral(10), -1);
+}
+
+TEST_P(RawBitReaderTest, ReadLiteral32BitsWithMsbSet) {
+ if (RunOnlyOnce()) return;
+ // Three 32-bit values with MSB set.
+ CreateReader({0xff, 0xff, 0xff, 0xff, // 4294967295
+ 0x80, 0xff, 0xee, 0xdd, // 2164256477
+ 0xa0, 0xaa, 0xbb, 0xcc}); // 2695543756
+ static constexpr int64_t expected_literals[] = {4294967295, 2164256477,
+ 2695543756};
+ for (const int64_t expected_literal : expected_literals) {
+ EXPECT_FALSE(raw_bit_reader_->Finished());
+ const int64_t actual_literal = raw_bit_reader_->ReadLiteral(32);
+ EXPECT_EQ(expected_literal, actual_literal);
+ EXPECT_GE(actual_literal, 0);
+ }
+ EXPECT_TRUE(raw_bit_reader_->Finished());
+ EXPECT_EQ(raw_bit_reader_->ReadLiteral(10), -1);
+}
+
+TEST_P(RawBitReaderTest, ReadLiteralNotEnoughBits) {
+ if (RunOnlyOnce()) return;
+ CreateReader(4); // 32 bits.
+ EXPECT_GE(raw_bit_reader_->ReadLiteral(16), 0);
+ EXPECT_EQ(raw_bit_reader_->ReadLiteral(32), -1);
+}
+
+TEST_P(RawBitReaderTest, ReadLiteralMaxNumBits) {
+ if (RunOnlyOnce()) return;
+ CreateReader(4); // 32 bits.
+ EXPECT_NE(raw_bit_reader_->ReadLiteral(32), -1);
+}
+
+TEST_P(RawBitReaderTest, ReadInverseSignedLiteral) {
+ if (RunOnlyOnce()) return;
+ // This is the only usage for this function in the decoding process. So
+ // testing just that case.
+ const int size_bits = 6;
+ data_.clear();
+ // Negative value followed by a positive value.
+ data_.push_back(0xd2);
+ data_.push_back(0xa4);
+ raw_bit_reader_.reset(new (std::nothrow)
+ RawBitReader(data_.data(), data_.size()));
+ int value;
+ EXPECT_TRUE(raw_bit_reader_->ReadInverseSignedLiteral(size_bits, &value));
+ EXPECT_EQ(value, -23);
+ EXPECT_TRUE(raw_bit_reader_->ReadInverseSignedLiteral(size_bits, &value));
+ EXPECT_EQ(value, 41);
+ // We have only two bits left. Trying to read an inverse signed literal of 2
+ // bits actually needs 3 bits. So this should fail.
+ EXPECT_FALSE(raw_bit_reader_->ReadInverseSignedLiteral(2, &value));
+}
+
+TEST_P(RawBitReaderTest, ZeroSize) {
+ if (RunOnlyOnce()) return;
+ // Valid data, zero size.
+ data_.clear();
+ data_.push_back(0xf0);
+ raw_bit_reader_.reset(new (std::nothrow) RawBitReader(data_.data(), 0));
+ EXPECT_EQ(raw_bit_reader_->ReadBit(), -1);
+ EXPECT_EQ(raw_bit_reader_->ReadLiteral(2), -1);
+ // NULL data, zero size.
+ raw_bit_reader_.reset(new (std::nothrow) RawBitReader(nullptr, 0));
+ EXPECT_EQ(raw_bit_reader_->ReadBit(), -1);
+ EXPECT_EQ(raw_bit_reader_->ReadLiteral(2), -1);
+}
+
+TEST_P(RawBitReaderTest, AlignToNextByte) {
+ if (RunOnlyOnce()) return;
+ CreateReader({0x00, 0x00, 0x00, 0x0f});
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 0);
+ EXPECT_EQ(raw_bit_reader_->byte_offset(), 0);
+ EXPECT_TRUE(raw_bit_reader_->AlignToNextByte());
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 0);
+ EXPECT_EQ(raw_bit_reader_->byte_offset(), 0);
+ EXPECT_NE(raw_bit_reader_->ReadBit(), -1);
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 1);
+ EXPECT_EQ(raw_bit_reader_->byte_offset(), 1);
+ EXPECT_TRUE(raw_bit_reader_->AlignToNextByte());
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 8);
+ EXPECT_EQ(raw_bit_reader_->byte_offset(), 1);
+ EXPECT_NE(raw_bit_reader_->ReadLiteral(16), -1);
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 24);
+ EXPECT_EQ(raw_bit_reader_->byte_offset(), 3);
+ EXPECT_TRUE(raw_bit_reader_->AlignToNextByte());
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 24);
+ EXPECT_EQ(raw_bit_reader_->byte_offset(), 3);
+ EXPECT_NE(raw_bit_reader_->ReadBit(), -1);
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 25);
+ EXPECT_EQ(raw_bit_reader_->byte_offset(), 4);
+ // Some bits are non-zero.
+ EXPECT_FALSE(raw_bit_reader_->AlignToNextByte());
+}
+
+TEST_P(RawBitReaderTest, VerifyAndSkipTrailingBits) {
+ if (RunOnlyOnce()) return;
+ std::vector<uint8_t> data;
+
+ // 1 byte trailing byte.
+ data.push_back(0x80);
+ CreateReader(data);
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 0);
+ EXPECT_TRUE(raw_bit_reader_->VerifyAndSkipTrailingBits(8));
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 8);
+
+ // 2 byte trailing byte beginning at a byte-aligned offset.
+ data.clear();
+ data.push_back(0xf8);
+ data.push_back(0x80);
+ CreateReader(data);
+ EXPECT_NE(raw_bit_reader_->ReadLiteral(8), -1);
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 8);
+ EXPECT_TRUE(raw_bit_reader_->VerifyAndSkipTrailingBits(8));
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 16);
+
+ // 2 byte trailing byte beginning at a non-byte-aligned offset.
+ data.clear();
+ data.push_back(0xf8);
+ data.push_back(0x00);
+ CreateReader(data);
+ EXPECT_NE(raw_bit_reader_->ReadLiteral(4), -1);
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 4);
+ EXPECT_TRUE(raw_bit_reader_->VerifyAndSkipTrailingBits(4));
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 8);
+
+ // Invalid trailing byte at a byte-aligned offset.
+ data.clear();
+ data.push_back(0xf7);
+ data.push_back(0x70);
+ CreateReader(data);
+ EXPECT_NE(raw_bit_reader_->ReadLiteral(8), -1);
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 8);
+ EXPECT_FALSE(raw_bit_reader_->VerifyAndSkipTrailingBits(8));
+
+ // Invalid trailing byte at a non-byte-aligned offset.
+ CreateReader(data);
+ EXPECT_NE(raw_bit_reader_->ReadLiteral(4), -1);
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 4);
+ EXPECT_FALSE(raw_bit_reader_->VerifyAndSkipTrailingBits(12));
+
+ // No more data available.
+ CreateReader(data);
+ EXPECT_NE(raw_bit_reader_->ReadLiteral(16), -1);
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 16);
+ EXPECT_TRUE(raw_bit_reader_->Finished());
+ EXPECT_FALSE(raw_bit_reader_->VerifyAndSkipTrailingBits(8));
+}
+
+TEST_P(RawBitReaderTest, ReadLittleEndian) {
+ if (RunOnlyOnce()) return;
+ std::vector<uint8_t> data;
+ size_t actual;
+
+ // Invalid input.
+ data.push_back(0x00); // dummy.
+ CreateReader(data);
+ EXPECT_FALSE(raw_bit_reader_->ReadLittleEndian(1, nullptr));
+
+ // One byte value.
+ data.clear();
+ data.push_back(0x01);
+ CreateReader(data);
+ ASSERT_TRUE(raw_bit_reader_->ReadLittleEndian(1, &actual));
+ EXPECT_EQ(actual, 1);
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 8);
+ EXPECT_TRUE(raw_bit_reader_->Finished());
+
+ // One byte value with leading bytes.
+ data.clear();
+ data.push_back(0x01);
+ data.push_back(0x00);
+ data.push_back(0x00);
+ data.push_back(0x00);
+ CreateReader(data);
+ ASSERT_TRUE(raw_bit_reader_->ReadLittleEndian(4, &actual));
+ EXPECT_EQ(actual, 1);
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 32);
+ EXPECT_TRUE(raw_bit_reader_->Finished());
+
+ // Two byte value.
+ data.clear();
+ data.push_back(0xD9);
+ data.push_back(0x01);
+ CreateReader(data);
+ ASSERT_TRUE(raw_bit_reader_->ReadLittleEndian(2, &actual));
+ EXPECT_EQ(actual, 473);
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 16);
+ EXPECT_TRUE(raw_bit_reader_->Finished());
+
+ // Two byte value with leading bytes.
+ data.clear();
+ data.push_back(0xD9);
+ data.push_back(0x01);
+ data.push_back(0x00);
+ data.push_back(0x00);
+ CreateReader(data);
+ ASSERT_TRUE(raw_bit_reader_->ReadLittleEndian(4, &actual));
+ EXPECT_EQ(actual, 473);
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 32);
+ EXPECT_TRUE(raw_bit_reader_->Finished());
+
+ // Not enough bytes.
+ data.clear();
+ data.push_back(0x01);
+ CreateReader(data);
+ EXPECT_FALSE(raw_bit_reader_->ReadLittleEndian(2, &actual));
+}
+
+TEST_P(RawBitReaderTest, ReadUnsignedLeb128) {
+ if (RunOnlyOnce()) return;
+ std::vector<uint8_t> data;
+ size_t actual;
+
+ // Invalid input.
+ data.push_back(0x00); // dummy.
+ CreateReader(data);
+ EXPECT_FALSE(raw_bit_reader_->ReadUnsignedLeb128(nullptr));
+
+ // One byte value.
+ data.clear();
+ data.push_back(0x01);
+ CreateReader(data);
+ ASSERT_TRUE(raw_bit_reader_->ReadUnsignedLeb128(&actual));
+ EXPECT_EQ(actual, 1);
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 8);
+ EXPECT_TRUE(raw_bit_reader_->Finished());
+
+ // One byte value with trailing bytes.
+ data.clear();
+ data.push_back(0x81);
+ data.push_back(0x80);
+ data.push_back(0x80);
+ data.push_back(0x00);
+ CreateReader(data);
+ ASSERT_TRUE(raw_bit_reader_->ReadUnsignedLeb128(&actual));
+ EXPECT_EQ(actual, 1);
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 32);
+ EXPECT_TRUE(raw_bit_reader_->Finished());
+
+ // Two byte value.
+ data.clear();
+ data.push_back(0xD9);
+ data.push_back(0x01);
+ CreateReader(data);
+ ASSERT_TRUE(raw_bit_reader_->ReadUnsignedLeb128(&actual));
+ EXPECT_EQ(actual, 217);
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 16);
+ EXPECT_TRUE(raw_bit_reader_->Finished());
+
+ // Two byte value with trailing bytes.
+ data.clear();
+ data.push_back(0xD9);
+ data.push_back(0x81);
+ data.push_back(0x80);
+ data.push_back(0x80);
+ data.push_back(0x00);
+ CreateReader(data);
+ ASSERT_TRUE(raw_bit_reader_->ReadUnsignedLeb128(&actual));
+ EXPECT_EQ(actual, 217);
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 40);
+ EXPECT_TRUE(raw_bit_reader_->Finished());
+
+ // Value > 32 bits.
+ data.clear();
+ for (int i = 0; i < 5; ++i) data.push_back(0xD9);
+ data.push_back(0x00);
+ CreateReader(data);
+ EXPECT_FALSE(raw_bit_reader_->ReadUnsignedLeb128(&actual));
+
+ // Not enough bytes (truncated leb128 value).
+ data.clear();
+ data.push_back(0x81);
+ data.push_back(0x81);
+ data.push_back(0x81);
+ CreateReader(data);
+ EXPECT_FALSE(raw_bit_reader_->ReadUnsignedLeb128(&actual));
+
+ // Exceeds kMaximumLeb128Size.
+ data.clear();
+ for (int i = 0; i < 10; ++i) data.push_back(0x80);
+ CreateReader(data);
+ EXPECT_FALSE(raw_bit_reader_->ReadUnsignedLeb128(&actual));
+}
+
+TEST_P(RawBitReaderTest, ReadUvlc) {
+ if (RunOnlyOnce()) return;
+ std::vector<uint8_t> data;
+ uint32_t actual;
+
+ // Invalid input.
+ data.push_back(0x00); // dummy.
+ CreateReader(data);
+ EXPECT_FALSE(raw_bit_reader_->ReadUvlc(nullptr));
+
+ // Zero bit value.
+ data.clear();
+ data.push_back(0x80);
+ CreateReader(data);
+ ASSERT_TRUE(raw_bit_reader_->ReadUvlc(&actual));
+ EXPECT_EQ(actual, 0);
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 1);
+
+ // One bit value.
+ data.clear();
+ data.push_back(0x60); // 011...
+ CreateReader(data);
+ ASSERT_TRUE(raw_bit_reader_->ReadUvlc(&actual));
+ EXPECT_EQ(actual, 2);
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 3);
+
+ // Two bit value.
+ data.clear();
+ data.push_back(0x38); // 00111...
+ CreateReader(data);
+ ASSERT_TRUE(raw_bit_reader_->ReadUvlc(&actual));
+ EXPECT_EQ(actual, 6);
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 5);
+
+ // 31 bit value.
+ data.clear();
+ // (1 << 32) - 2 (= UINT32_MAX - 1) is the largest value that can be encoded
+ // as uvlc().
+ data.push_back(0x00);
+ data.push_back(0x00);
+ data.push_back(0x00);
+ data.push_back(0x01);
+ data.push_back(0xFF);
+ data.push_back(0xFF);
+ data.push_back(0xFF);
+ data.push_back(0xFE);
+ CreateReader(data);
+ ASSERT_TRUE(raw_bit_reader_->ReadUvlc(&actual));
+ EXPECT_EQ(actual, UINT32_MAX - 1);
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 63);
+
+ // Not enough bits (truncated uvlc value).
+ data.clear();
+ data.push_back(0x07);
+ CreateReader(data);
+ EXPECT_FALSE(raw_bit_reader_->ReadUvlc(&actual));
+
+ // 32 bits.
+ data.clear();
+ data.push_back(0x00);
+ data.push_back(0x00);
+ data.push_back(0x00);
+ data.push_back(0x00);
+ data.push_back(0xFF);
+ CreateReader(data);
+ EXPECT_FALSE(raw_bit_reader_->ReadUvlc(&actual));
+
+ // Exceeds 32 bits.
+ data.clear();
+ data.push_back(0x00);
+ data.push_back(0x00);
+ data.push_back(0x00);
+ data.push_back(0x00);
+ data.push_back(0x0F);
+ CreateReader(data);
+ EXPECT_FALSE(raw_bit_reader_->ReadUvlc(&actual));
+}
+
+TEST_P(RawBitReaderTest, DecodeSignedSubexpWithReference) {
+ if (RunOnlyOnce()) return;
+ std::vector<uint8_t> data;
+ int actual;
+
+ data.push_back(0xa0); // v = 5;
+ CreateReader(data);
+ EXPECT_TRUE(raw_bit_reader_->DecodeSignedSubexpWithReference(
+ 10, 20, 15, kGlobalMotionReadControl, &actual));
+ EXPECT_EQ(actual, 12);
+
+ data.clear();
+ data.push_back(0xd0); // v = 6; extra_bit = 1;
+ CreateReader(data);
+ EXPECT_TRUE(raw_bit_reader_->DecodeSignedSubexpWithReference(
+ 10, 20, 15, kGlobalMotionReadControl, &actual));
+ EXPECT_EQ(actual, 11);
+
+ data.clear();
+ data.push_back(0xc8); // subexp_more_bits = 1; v = 9;
+ CreateReader(data);
+ EXPECT_TRUE(raw_bit_reader_->DecodeSignedSubexpWithReference(
+ 10, 40, 15, kGlobalMotionReadControl, &actual));
+ EXPECT_EQ(actual, 27);
+
+ data.clear();
+ data.push_back(0x60); // subexp_more_bits = 0; subexp_bits = 6.
+ CreateReader(data);
+ EXPECT_TRUE(raw_bit_reader_->DecodeSignedSubexpWithReference(
+ 10, 40, 15, kGlobalMotionReadControl, &actual));
+ EXPECT_EQ(actual, 18);
+
+ data.clear();
+ data.push_back(0x60);
+ CreateReader(data);
+ // Control is greater than 32, which makes b >= 32 in DecodeSubexp() and
+ // should return false.
+ EXPECT_FALSE(raw_bit_reader_->DecodeSignedSubexpWithReference(10, 40, 15, 35,
+ &actual));
+}
+
+TEST_P(RawBitReaderTest, DecodeUniform) {
+ if (RunOnlyOnce()) return;
+ // Test the example from the AV1 spec, Section 4.10.7. ns(n).
+ // n = 5
+ // Value ns(n) encoding
+ // -------------------------------
+ // 0 00
+ // 1 01
+ // 2 10
+ // 3 110
+ // 4 111
+ //
+ // The five encoded values are concatenated into two bytes.
+ std::vector<uint8_t> data = {0x1b, 0x70};
+ CreateReader(data);
+ int actual;
+ for (int i = 0; i < 5; ++i) {
+ EXPECT_TRUE(raw_bit_reader_->DecodeUniform(5, &actual));
+ EXPECT_EQ(actual, i);
+ }
+
+ // If n is a power of 2, ns(n) is simply the log2(n)-bit representation of
+ // the unsigned number.
+ // Test n = 16.
+ // The 16 encoded values are concatenated into 8 bytes.
+ data = {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef};
+ CreateReader(data);
+ for (int i = 0; i < 16; ++i) {
+ EXPECT_TRUE(raw_bit_reader_->DecodeUniform(16, &actual));
+ EXPECT_EQ(actual, i);
+ }
+}
+
+TEST_P(RawBitReaderTest, SkipBytes) {
+ if (RunOnlyOnce()) return;
+ std::vector<uint8_t> data = {0x00, 0x00, 0x00, 0x00, 0x00};
+ CreateReader(data);
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 0);
+ EXPECT_TRUE(raw_bit_reader_->SkipBytes(1));
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 8);
+ EXPECT_GE(raw_bit_reader_->ReadBit(), 0);
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 9);
+ EXPECT_FALSE(raw_bit_reader_->SkipBytes(1)); // Not at a byte boundary.
+ EXPECT_TRUE(raw_bit_reader_->AlignToNextByte());
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 16);
+ EXPECT_FALSE(raw_bit_reader_->SkipBytes(10)); // Not enough bytes.
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 16);
+ EXPECT_TRUE(raw_bit_reader_->SkipBytes(3));
+ EXPECT_TRUE(raw_bit_reader_->Finished());
+ EXPECT_EQ(raw_bit_reader_->ReadBit(), -1);
+}
+
+TEST_P(RawBitReaderTest, SkipBits) {
+ if (RunOnlyOnce()) return;
+ std::vector<uint8_t> data = {0x00, 0x00, 0x00, 0x00, 0x00};
+ CreateReader(data);
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 0);
+ EXPECT_TRUE(raw_bit_reader_->SkipBits(8));
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 8);
+ EXPECT_GE(raw_bit_reader_->ReadBit(), 0);
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 9);
+ EXPECT_TRUE(raw_bit_reader_->SkipBits(10)); // Not at a byte boundary.
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 19);
+ EXPECT_FALSE(raw_bit_reader_->SkipBits(80)); // Not enough bytes.
+ EXPECT_EQ(raw_bit_reader_->bit_offset(), 19);
+ EXPECT_TRUE(raw_bit_reader_->SkipBits(21));
+ EXPECT_TRUE(raw_bit_reader_->Finished());
+ EXPECT_EQ(raw_bit_reader_->ReadBit(), -1);
+}
+
+INSTANTIATE_TEST_SUITE_P(
+ RawBitReaderTestInstance, RawBitReaderTest,
+ testing::Combine(testing::Range(1, 5), // literal size.
+ testing::Values(100))); // number of bits/literals.
+
+} // namespace
+} // namespace libgav1