| Index: third_party/libwebp/utils/bit_reader.h
|
| diff --git a/third_party/libwebp/utils/bit_reader.h b/third_party/libwebp/utils/bit_reader.h
|
| index f569734f5570a36fda28e8a955dcc42a59c4d766..ec3426cd11c892c1e4d7c3aaa503125902d2b4a0 100644
|
| --- a/third_party/libwebp/utils/bit_reader.h
|
| +++ b/third_party/libwebp/utils/bit_reader.h
|
| @@ -43,10 +43,12 @@ extern "C" {
|
| #define BITS 56
|
| #elif defined(__arm__) || defined(_M_ARM) // ARM
|
| #define BITS 24
|
| +#elif defined(__aarch64__) // ARM 64bit
|
| +#define BITS 56
|
| #elif defined(__mips__) // MIPS
|
| #define BITS 24
|
| #else // reasonable default
|
| -#define BITS 24 // TODO(skal): test aarch64 and find the proper BITS value.
|
| +#define BITS 24
|
| #endif
|
|
|
| //------------------------------------------------------------------------------
|
| @@ -74,12 +76,16 @@ struct VP8BitReader {
|
| // read buffer
|
| const uint8_t* buf_; // next byte to be read
|
| const uint8_t* buf_end_; // end of read buffer
|
| + const uint8_t* buf_max_; // max packed-read position on buffer
|
| int eof_; // true if input is exhausted
|
| };
|
|
|
| // Initialize the bit reader and the boolean decoder.
|
| void VP8InitBitReader(VP8BitReader* const br,
|
| - const uint8_t* const start, const uint8_t* const end);
|
| + const uint8_t* const start, size_t size);
|
| +// Sets the working read buffer.
|
| +void VP8BitReaderSetBuffer(VP8BitReader* const br,
|
| + const uint8_t* const start, size_t size);
|
|
|
| // Update internal pointers to displace the byte buffer by the
|
| // relative offset 'offset'.
|
| @@ -107,7 +113,7 @@ int32_t VP8GetSignedValue(VP8BitReader* const br, int num_bits);
|
| // maximum number of bits (inclusive) the bit-reader can handle:
|
| #define VP8L_MAX_NUM_BIT_READ 24
|
|
|
| -#define VP8L_LBITS 64 // Number of bits prefetched.
|
| +#define VP8L_LBITS 64 // Number of bits prefetched (= bit-size of vp8l_val_t).
|
| #define VP8L_WBITS 32 // Minimum number of bytes ready after VP8LFillBitWindow.
|
|
|
| typedef uint64_t vp8l_val_t; // right now, this bit-reader can only use 64bit.
|
| @@ -118,8 +124,7 @@ typedef struct {
|
| size_t len_; // buffer length
|
| size_t pos_; // byte position in buf_
|
| int bit_pos_; // current bit-reading position in val_
|
| - int eos_; // bitstream is finished
|
| - int error_; // an error occurred (buffer overflow attempt...)
|
| + int eos_; // true if a bit was read past the end of buffer
|
| } VP8LBitReader;
|
|
|
| void VP8LInitBitReader(VP8LBitReader* const br,
|
| @@ -138,14 +143,14 @@ uint32_t VP8LReadBits(VP8LBitReader* const br, int n_bits);
|
|
|
| // Return the prefetched bits, so they can be looked up.
|
| static WEBP_INLINE uint32_t VP8LPrefetchBits(VP8LBitReader* const br) {
|
| - return (uint32_t)(br->val_ >> br->bit_pos_);
|
| + return (uint32_t)(br->val_ >> (br->bit_pos_ & (VP8L_LBITS - 1)));
|
| }
|
|
|
| // Returns true if there was an attempt at reading bit past the end of
|
| // the buffer. Doesn't set br->eos_ flag.
|
| static WEBP_INLINE int VP8LIsEndOfStream(const VP8LBitReader* const br) {
|
| assert(br->pos_ <= br->len_);
|
| - return (br->pos_ == br->len_) && (br->bit_pos_ > VP8L_LBITS);
|
| + return br->eos_ || ((br->pos_ == br->len_) && (br->bit_pos_ > VP8L_LBITS));
|
| }
|
|
|
| // For jumping over a number of bits in the bit stream when accessed with
|
|
|