author Jean-Yves Avenard <>
Wed, 14 Dec 2016 15:27:48 +1100
changeset 357952 4a0fa935cfc21c2d730d2a3a921c63bb410254c0
parent 357430 c58bfbe2800682c2c2c85716d3155e30a33997ad
permissions -rw-r--r--
Bug 1323081: P1. Add native BitReader class. r=gerald This is a rewrite from Stagefright's ABitReader. The major difference is that you give the original size in bits rather than in bytes. ABitReader always read all bits available. While under some circumstances we want to bound the buffer to a set number of bits. MozReview-Commit-ID: hdJ7CAwOea

/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at */

#ifndef BIT_READER_H_
#define BIT_READER_H_

#include "MediaData.h"

namespace mp4_demuxer

class BitReader
  explicit BitReader(const mozilla::MediaByteBuffer* aBuffer);
  BitReader(const mozilla::MediaByteBuffer* aBuffer, size_t aBits);
  BitReader(const uint8_t* aBuffer, size_t aBits);
  uint32_t ReadBits(size_t aNum);
  uint32_t ReadBit() { return ReadBits(1); }
  uint32_t ReadU32() { return ReadBits(32); }
  uint64_t ReadU64();

  // Read the UTF-8 sequence and convert it to its 64-bit UCS-4 encoded form.
  // Return 0xfffffffffffffff if sequence was invalid.
  uint64_t ReadUTF8();
  // Read unsigned integer Exp-Golomb-coded.
  uint32_t ReadUE();
  // Read signed integer Exp-Golomb-coded.
  int32_t ReadSE();

  // Return the number of bits parsed so far;
  size_t BitCount() const;
  // Return the number of bits left.
  size_t BitsLeft() const;

  void FillReservoir();
  const uint8_t* mData;
  const size_t mOriginalBitSize;
  size_t mTotalBitsLeft;
  size_t mSize;           // Size left in bytes
  uint32_t mReservoir;    // Left-aligned bits
  size_t mNumBitsLeft;    // Number of bits left in reservoir.

} // namespace mp4_demuxer

#endif // BIT_READER_H_