bit_reader.h 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. #ifndef MEDIA_BASE_BIT_READER_H_
  5. #define MEDIA_BASE_BIT_READER_H_
  6. #include <stdint.h>
  7. #include <string>
  8. #include "base/compiler_specific.h"
  9. #include "media/base/bit_reader_core.h"
  10. #include "media/base/media_export.h"
  11. namespace media {
  12. class MEDIA_EXPORT BitReader : private BitReaderCore::ByteStreamProvider {
  13. public:
  14. // Initialize the reader to start reading at |data|, |size| being size
  15. // of |data| in bytes.
  16. BitReader(const uint8_t* data, int size);
  17. BitReader(const BitReader&) = delete;
  18. BitReader& operator=(const BitReader&) = delete;
  19. ~BitReader() override;
  20. template<typename T> bool ReadBits(int num_bits, T* out) {
  21. return bit_reader_core_.ReadBits(num_bits, out);
  22. }
  23. bool ReadFlag(bool* flag) {
  24. return bit_reader_core_.ReadFlag(flag);
  25. }
  26. // Read |num_bits| of binary data into |str|. |num_bits| must be a positive
  27. // multiple of 8. This is not efficient for extracting large strings.
  28. // If false is returned, |str| may not be valid.
  29. bool ReadString(int num_bits, std::string* str);
  30. bool SkipBits(int num_bits) {
  31. return bit_reader_core_.SkipBits(num_bits);
  32. }
  33. int bits_available() const {
  34. return initial_size_ * 8 - bits_read();
  35. }
  36. int bits_read() const {
  37. return bit_reader_core_.bits_read();
  38. }
  39. private:
  40. // BitReaderCore::ByteStreamProvider implementation.
  41. int GetBytes(int max_n, const uint8_t** out) override;
  42. // Total number of bytes that was initially passed to BitReader.
  43. const int initial_size_;
  44. // Pointer to the next unread byte in the stream.
  45. const uint8_t* data_;
  46. // Bytes left in the stream.
  47. int bytes_left_;
  48. BitReaderCore bit_reader_core_;
  49. };
  50. } // namespace media
  51. #endif // MEDIA_BASE_BIT_READER_H_