1 // Copyright 2016 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 #ifndef VP9_BOOL_DECODER_H_ 6 #define VP9_BOOL_DECODER_H_ 7 8 #include <stddef.h> 9 #include <stdint.h> 10 11 #include <memory> 12 13 #include "base/macros.h" 14 15 namespace media { 16 17 class BitReader; 18 19 class Vp9BoolDecoder { 20 public: 21 Vp9BoolDecoder(); 22 ~Vp9BoolDecoder(); 23 24 // |data| is the input buffer with |size| bytes. 25 // Returns true if read first marker bit successfully. 26 bool Initialize(const uint8_t* data, size_t size); 27 28 // Returns true if none of the reads since the last Initialize() call has 29 // gone beyond the end of available data. IsValid()30 bool IsValid() const { return valid_; } 31 32 // Reads one bit. B(p). 33 // If the read goes beyond the end of buffer, the return value is undefined. 34 bool ReadBool(int prob); 35 36 // Reads a literal. L(n). 37 // If the read goes beyond the end of buffer, the return value is undefined. 38 uint8_t ReadLiteral(int bits); 39 40 // Consumes padding bits up to end of data. Returns true if no 41 // padding bits or they are all zero. 42 bool ConsumePaddingBits(); 43 44 private: 45 // The highest 8 bits of BigBool is actual "bool value". The remain bits 46 // are optimization of prefill buffer. 47 using BigBool = size_t; 48 // The size of "bool value" used for boolean decoding defined in spec. 49 const int kBoolSize = 8; 50 const int kBigBoolBitSize = sizeof(BigBool) * 8; 51 52 bool Fill(); 53 54 std::unique_ptr<BitReader> reader_; 55 56 // Indicates if none of the reads since the last Initialize() call has gone 57 // beyond the end of available data. 58 bool valid_ = true; 59 60 BigBool bool_value_ = 0; 61 62 // Need to fill at least |count_to_fill_| bits. Negative value means extra 63 // bits pre-filled. 64 int count_to_fill_ = 0; 65 unsigned int bool_range_ = 0; 66 67 DISALLOW_COPY_AND_ASSIGN(Vp9BoolDecoder); 68 }; 69 70 } // namespace media 71 72 #endif // VP9_BOOL_DECODER_H_ 73