1 // Copyright 2010 Google Inc. All Rights Reserved. 2 // 3 // Use of this source code is governed by a BSD-style license 4 // that can be found in the COPYING file in the root of the source 5 // tree. An additional intellectual property rights grant can be found 6 // in the file PATENTS. All contributing project authors may 7 // be found in the AUTHORS file in the root of the source tree. 8 // ----------------------------------------------------------------------------- 9 // 10 // Boolean decoder non-inlined methods 11 // 12 // Author: Skal (pascal.massimino (at) gmail.com) 13 14 #ifdef HAVE_CONFIG_H 15 #include "../webp/config.h" 16 #endif 17 18 #include "./bit_reader_inl.h" 19 20 //------------------------------------------------------------------------------ 21 // VP8BitReader 22 23 void VP8InitBitReader(VP8BitReader* const br, 24 const uint8_t* const start, const uint8_t* const end) { 25 assert(br != NULL); 26 assert(start != NULL); 27 assert(start <= end); 28 br->range_ = 255 - 1; 29 br->buf_ = start; 30 br->buf_end_ = end; 31 br->value_ = 0; 32 br->bits_ = -8; // to load the very first 8bits 33 br->eof_ = 0; 34 VP8LoadNewBytes(br); 35 } 36 37 void VP8RemapBitReader(VP8BitReader* const br, ptrdiff_t offset) { 38 if (br->buf_ != NULL) { 39 br->buf_ += offset; 40 br->buf_end_ += offset; 41 } 42 } 43 44 const uint8_t kVP8Log2Range[128] = { 45 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 46 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 47 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 48 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 49 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 50 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 51 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 52 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 53 0 54 }; 55 56 // range = ((range - 1) << kVP8Log2Range[range]) + 1 57 const range_t kVP8NewRange[128] = { 58 127, 127, 191, 127, 159, 191, 223, 127, 59 143, 159, 175, 191, 207, 223, 239, 127, 60 135, 143, 151, 159, 167, 175, 183, 191, 61 199, 207, 215, 223, 231, 239, 247, 127, 62 131, 135, 139, 143, 147, 151, 155, 159, 63 163, 167, 171, 175, 179, 183, 187, 191, 64 195, 199, 203, 207, 211, 215, 219, 223, 65 227, 231, 235, 239, 243, 247, 251, 127, 66 129, 131, 133, 135, 137, 139, 141, 143, 67 145, 147, 149, 151, 153, 155, 157, 159, 68 161, 163, 165, 167, 169, 171, 173, 175, 69 177, 179, 181, 183, 185, 187, 189, 191, 70 193, 195, 197, 199, 201, 203, 205, 207, 71 209, 211, 213, 215, 217, 219, 221, 223, 72 225, 227, 229, 231, 233, 235, 237, 239, 73 241, 243, 245, 247, 249, 251, 253, 127 74 }; 75 76 void VP8LoadFinalBytes(VP8BitReader* const br) { 77 assert(br != NULL && br->buf_ != NULL); 78 // Only read 8bits at a time 79 if (br->buf_ < br->buf_end_) { 80 br->bits_ += 8; 81 br->value_ = (bit_t)(*br->buf_++) | (br->value_ << 8); 82 } else if (!br->eof_) { 83 br->value_ <<= 8; 84 br->bits_ += 8; 85 br->eof_ = 1; 86 } 87 } 88 89 //------------------------------------------------------------------------------ 90 // Higher-level calls 91 92 uint32_t VP8GetValue(VP8BitReader* const br, int bits) { 93 uint32_t v = 0; 94 while (bits-- > 0) { 95 v |= VP8GetBit(br, 0x80) << bits; 96 } 97 return v; 98 } 99 100 int32_t VP8GetSignedValue(VP8BitReader* const br, int bits) { 101 const int value = VP8GetValue(br, bits); 102 return VP8Get(br) ? -value : value; 103 } 104 105 //------------------------------------------------------------------------------ 106 // VP8LBitReader 107 108 #define VP8L_LOG8_WBITS 4 // Number of bytes needed to store VP8L_WBITS bits. 109 110 #if !defined(WEBP_FORCE_ALIGNED) && \ 111 (defined(__arm__) || defined(_M_ARM) || defined(__aarch64__) || \ 112 defined(__i386__) || defined(_M_IX86) || \ 113 defined(__x86_64__) || defined(_M_X64)) 114 #define VP8L_USE_UNALIGNED_LOAD 115 #endif 116 117 static const uint32_t kBitMask[VP8L_MAX_NUM_BIT_READ + 1] = { 118 0, 119 0x000001, 0x000003, 0x000007, 0x00000f, 120 0x00001f, 0x00003f, 0x00007f, 0x0000ff, 121 0x0001ff, 0x0003ff, 0x0007ff, 0x000fff, 122 0x001fff, 0x003fff, 0x007fff, 0x00ffff, 123 0x01ffff, 0x03ffff, 0x07ffff, 0x0fffff, 124 0x1fffff, 0x3fffff, 0x7fffff, 0xffffff 125 }; 126 127 void VP8LInitBitReader(VP8LBitReader* const br, const uint8_t* const start, 128 size_t length) { 129 size_t i; 130 vp8l_val_t value = 0; 131 assert(br != NULL); 132 assert(start != NULL); 133 assert(length < 0xfffffff8u); // can't happen with a RIFF chunk. 134 135 br->len_ = length; 136 br->val_ = 0; 137 br->bit_pos_ = 0; 138 br->eos_ = 0; 139 br->error_ = 0; 140 141 if (length > sizeof(br->val_)) { 142 length = sizeof(br->val_); 143 } 144 for (i = 0; i < length; ++i) { 145 value |= (vp8l_val_t)start[i] << (8 * i); 146 } 147 br->val_ = value; 148 br->pos_ = length; 149 br->buf_ = start; 150 } 151 152 void VP8LBitReaderSetBuffer(VP8LBitReader* const br, 153 const uint8_t* const buf, size_t len) { 154 assert(br != NULL); 155 assert(buf != NULL); 156 assert(len < 0xfffffff8u); // can't happen with a RIFF chunk. 157 br->buf_ = buf; 158 br->len_ = len; 159 // pos_ > len_ should be considered a param error. 160 br->error_ = (br->pos_ > br->len_); 161 br->eos_ = br->error_ || VP8LIsEndOfStream(br); 162 } 163 164 // If not at EOS, reload up to VP8L_LBITS byte-by-byte 165 static void ShiftBytes(VP8LBitReader* const br) { 166 while (br->bit_pos_ >= 8 && br->pos_ < br->len_) { 167 br->val_ >>= 8; 168 br->val_ |= ((vp8l_val_t)br->buf_[br->pos_]) << (VP8L_LBITS - 8); 169 ++br->pos_; 170 br->bit_pos_ -= 8; 171 } 172 br->eos_ = VP8LIsEndOfStream(br); 173 } 174 175 void VP8LDoFillBitWindow(VP8LBitReader* const br) { 176 assert(br->bit_pos_ >= VP8L_WBITS); 177 // TODO(jzern): given the fixed read size it may be possible to force 178 // alignment in this block. 179 #if defined(VP8L_USE_UNALIGNED_LOAD) 180 if (br->pos_ + sizeof(br->val_) < br->len_) { 181 br->val_ >>= VP8L_WBITS; 182 br->bit_pos_ -= VP8L_WBITS; 183 // The expression below needs a little-endian arch to work correctly. 184 // This gives a large speedup for decoding speed. 185 br->val_ |= (vp8l_val_t)*(const uint32_t*)(br->buf_ + br->pos_) << 186 (VP8L_LBITS - VP8L_WBITS); 187 br->pos_ += VP8L_LOG8_WBITS; 188 return; 189 } 190 #endif 191 ShiftBytes(br); // Slow path. 192 } 193 194 uint32_t VP8LReadBits(VP8LBitReader* const br, int n_bits) { 195 assert(n_bits >= 0); 196 // Flag an error if end_of_stream or n_bits is more than allowed limit. 197 if (!br->eos_ && n_bits <= VP8L_MAX_NUM_BIT_READ) { 198 const uint32_t val = 199 (uint32_t)(br->val_ >> br->bit_pos_) & kBitMask[n_bits]; 200 const int new_bits = br->bit_pos_ + n_bits; 201 br->bit_pos_ = new_bits; 202 ShiftBytes(br); 203 return val; 204 } else { 205 br->error_ = 1; 206 return 0; 207 } 208 } 209 210 //------------------------------------------------------------------------------ 211