bit_reader.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "media/base/bit_reader.h"
6
7namespace media {
8
9BitReader::BitReader(const uint8* data, off_t size)
10    : data_(data), bytes_left_(size), num_remaining_bits_in_curr_byte_(0) {
11  DCHECK(data_ != NULL && bytes_left_ > 0);
12
13  UpdateCurrByte();
14}
15
16BitReader::~BitReader() {}
17
18bool BitReader::ReadBitsInternal(int num_bits, uint64* out) {
19  DCHECK_LE(num_bits, 64);
20
21  *out = 0;
22
23  while (num_remaining_bits_in_curr_byte_ != 0 && num_bits != 0) {
24    int bits_to_take = std::min(num_remaining_bits_in_curr_byte_, num_bits);
25
26    *out <<= bits_to_take;
27    *out += curr_byte_ >> (num_remaining_bits_in_curr_byte_ - bits_to_take);
28    num_bits -= bits_to_take;
29    num_remaining_bits_in_curr_byte_ -= bits_to_take;
30    curr_byte_ &= (1 << num_remaining_bits_in_curr_byte_) - 1;
31
32    if (num_remaining_bits_in_curr_byte_ == 0)
33      UpdateCurrByte();
34  }
35
36  return num_bits == 0;
37}
38
39void BitReader::UpdateCurrByte() {
40  DCHECK_EQ(num_remaining_bits_in_curr_byte_, 0);
41
42  if (bytes_left_ == 0)
43    return;
44
45  // Load a new byte and advance pointers.
46  curr_byte_ = *data_;
47  ++data_;
48  --bytes_left_;
49  num_remaining_bits_in_curr_byte_ = 8;
50}
51
52}  // namespace media
53