5#include <packager/media/codecs/h26x_bit_reader.h>
14#include <absl/log/check.h>
21bool CheckAnyBitsSet(
int byte,
int valid_bits) {
22 return (
byte & ((1 << valid_bits) - 1)) != 0;
27H26xBitReader::H26xBitReader()
31 num_remaining_bits_in_curr_byte_(0),
33 emulation_prevention_bytes_(0) {}
35H26xBitReader::~H26xBitReader() {}
37bool H26xBitReader::Initialize(
const uint8_t* data, off_t size) {
45 num_remaining_bits_in_curr_byte_ = 0;
47 prev_two_bytes_ = 0xffff;
48 emulation_prevention_bytes_ = 0;
53bool H26xBitReader::UpdateCurrByte() {
59 if (*data_ == 0x03 && (prev_two_bytes_ & 0xffff) == 0) {
63 ++emulation_prevention_bytes_;
65 prev_two_bytes_ = 0xffff;
72 curr_byte_ = *data_++ & 0xff;
74 num_remaining_bits_in_curr_byte_ = 8;
76 prev_two_bytes_ = (prev_two_bytes_ << 8) | curr_byte_;
84bool H26xBitReader::ReadBits(
int num_bits,
int* out) {
85 int bits_left = num_bits;
87 DCHECK(num_bits <= 31);
89 while (num_remaining_bits_in_curr_byte_ < bits_left) {
91 *out |= (curr_byte_ << (bits_left - num_remaining_bits_in_curr_byte_));
92 bits_left -= num_remaining_bits_in_curr_byte_;
94 if (!UpdateCurrByte())
98 *out |= (curr_byte_ >> (num_remaining_bits_in_curr_byte_ - bits_left));
99 *out &= ((1 << num_bits) - 1);
100 num_remaining_bits_in_curr_byte_ -= bits_left;
105bool H26xBitReader::SkipBits(
int num_bits) {
106 int bits_left = num_bits;
107 while (num_remaining_bits_in_curr_byte_ < bits_left) {
108 bits_left -= num_remaining_bits_in_curr_byte_;
109 if (!UpdateCurrByte())
113 num_remaining_bits_in_curr_byte_ -= bits_left;
117bool H26xBitReader::ReadUE(
int* val) {
124 if (!ReadBits(1, &bit))
133 *val = (1 << num_bits) - 1;
136 if (!ReadBits(num_bits, &rest))
144bool H26xBitReader::ReadSE(
int* val) {
159off_t H26xBitReader::NumBitsLeft() {
160 return (num_remaining_bits_in_curr_byte_ + bytes_left_ * 8);
163bool H26xBitReader::HasMoreRBSPData() {
166 if (num_remaining_bits_in_curr_byte_ == 0 && !UpdateCurrByte())
173 if (CheckAnyBitsSet(curr_byte_, num_remaining_bits_in_curr_byte_ - 1))
180 for (off_t i = 0; i < bytes_left_; i++) {
189size_t H26xBitReader::NumEmulationPreventionBytesRead() {
190 return emulation_prevention_bytes_;
All the methods that are virtual are virtual for mocking.