Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(790)

Side by Side Diff: third_party/brotli/dec/bit_reader.h

Issue 2537133002: Update brotli to v1.0.0-snapshot. (Closed)
Patch Set: Fixed typo Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/brotli/common/version.h ('k') | third_party/brotli/dec/bit_reader.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* Copyright 2013 Google Inc. All Rights Reserved. 1 /* Copyright 2013 Google Inc. All Rights Reserved.
2 2
3 Distributed under MIT license. 3 Distributed under MIT license.
4 See file LICENSE for detail or copy at https://opensource.org/licenses/MIT 4 See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
5 */ 5 */
6 6
7 /* Bit reading helpers */ 7 /* Bit reading helpers */
8 8
9 #ifndef BROTLI_DEC_BIT_READER_H_ 9 #ifndef BROTLI_DEC_BIT_READER_H_
10 #define BROTLI_DEC_BIT_READER_H_ 10 #define BROTLI_DEC_BIT_READER_H_
11 11
12 #include <string.h> /* memcpy */ 12 #include <string.h> /* memcpy */
13 13
14 #include <brotli/types.h>
14 #include "./port.h" 15 #include "./port.h"
15 #include "./types.h"
16 16
17 #if defined(__cplusplus) || defined(c_plusplus) 17 #if defined(__cplusplus) || defined(c_plusplus)
18 extern "C" { 18 extern "C" {
19 #endif 19 #endif
20 20
21 #if (BROTLI_64_BITS) 21 #define BROTLI_SHORT_FILL_BIT_WINDOW_READ (sizeof(reg_t) >> 1)
22 #define BROTLI_SHORT_FILL_BIT_WINDOW_READ 4
23 typedef uint64_t reg_t;
24 #else
25 #define BROTLI_SHORT_FILL_BIT_WINDOW_READ 2
26 typedef uint32_t reg_t;
27 #endif
28 22
29 static const uint32_t kBitMask[33] = { 0x0000, 23 static const uint32_t kBitMask[33] = { 0x0000,
30 0x00000001, 0x00000003, 0x00000007, 0x0000000F, 24 0x00000001, 0x00000003, 0x00000007, 0x0000000F,
31 0x0000001F, 0x0000003F, 0x0000007F, 0x000000FF, 25 0x0000001F, 0x0000003F, 0x0000007F, 0x000000FF,
32 0x000001FF, 0x000003FF, 0x000007FF, 0x00000FFF, 26 0x000001FF, 0x000003FF, 0x000007FF, 0x00000FFF,
33 0x00001FFF, 0x00003FFF, 0x00007FFF, 0x0000FFFF, 27 0x00001FFF, 0x00003FFF, 0x00007FFF, 0x0000FFFF,
34 0x0001FFFF, 0x0003FFFF, 0x0007FFFF, 0x000FFFFF, 28 0x0001FFFF, 0x0003FFFF, 0x0007FFFF, 0x000FFFFF,
35 0x001FFFFF, 0x003FFFFF, 0x007FFFFF, 0x00FFFFFF, 29 0x001FFFFF, 0x003FFFFF, 0x007FFFFF, 0x00FFFFFF,
36 0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF, 0x0FFFFFFF, 30 0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF, 0x0FFFFFFF,
37 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF, 0xFFFFFFFF 31 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF, 0xFFFFFFFF
(...skipping 16 matching lines...) Expand all
54 size_t avail_in; 48 size_t avail_in;
55 } BrotliBitReader; 49 } BrotliBitReader;
56 50
57 typedef struct { 51 typedef struct {
58 reg_t val_; 52 reg_t val_;
59 uint32_t bit_pos_; 53 uint32_t bit_pos_;
60 const uint8_t* next_in; 54 const uint8_t* next_in;
61 size_t avail_in; 55 size_t avail_in;
62 } BrotliBitReaderState; 56 } BrotliBitReaderState;
63 57
64 /* Initializes the bitreader fields. */ 58 /* Initializes the BrotliBitReader fields. */
65 BROTLI_INTERNAL void BrotliInitBitReader(BrotliBitReader* const br); 59 BROTLI_INTERNAL void BrotliInitBitReader(BrotliBitReader* const br);
66 60
67 /* Ensures that accumulator is not empty. May consume one byte of input. 61 /* Ensures that accumulator is not empty. May consume one byte of input.
68 Returns 0 if data is required but there is no input available. 62 Returns 0 if data is required but there is no input available.
69 For BROTLI_ALIGNED_READ this function also prepares bit reader for aligned 63 For BROTLI_ALIGNED_READ this function also prepares bit reader for aligned
70 reading. */ 64 reading. */
71 BROTLI_INTERNAL int BrotliWarmupBitReader(BrotliBitReader* const br); 65 BROTLI_INTERNAL BROTLI_BOOL BrotliWarmupBitReader(BrotliBitReader* const br);
72 66
73 static BROTLI_INLINE void BrotliBitReaderSaveState( 67 static BROTLI_INLINE void BrotliBitReaderSaveState(
74 BrotliBitReader* const from, BrotliBitReaderState* to) { 68 BrotliBitReader* const from, BrotliBitReaderState* to) {
75 to->val_ = from->val_; 69 to->val_ = from->val_;
76 to->bit_pos_ = from->bit_pos_; 70 to->bit_pos_ = from->bit_pos_;
77 to->next_in = from->next_in; 71 to->next_in = from->next_in;
78 to->avail_in = from->avail_in; 72 to->avail_in = from->avail_in;
79 } 73 }
80 74
81 static BROTLI_INLINE void BrotliBitReaderRestoreState( 75 static BROTLI_INLINE void BrotliBitReaderRestoreState(
82 BrotliBitReader* const to, BrotliBitReaderState* from) { 76 BrotliBitReader* const to, BrotliBitReaderState* from) {
83 to->val_ = from->val_; 77 to->val_ = from->val_;
84 to->bit_pos_ = from->bit_pos_; 78 to->bit_pos_ = from->bit_pos_;
85 to->next_in = from->next_in; 79 to->next_in = from->next_in;
86 to->avail_in = from->avail_in; 80 to->avail_in = from->avail_in;
87 } 81 }
88 82
89 static BROTLI_INLINE uint32_t BrotliGetAvailableBits( 83 static BROTLI_INLINE uint32_t BrotliGetAvailableBits(
90 const BrotliBitReader* br) { 84 const BrotliBitReader* br) {
91 return (BROTLI_64_BITS ? 64 : 32) - br->bit_pos_; 85 return (BROTLI_64_BITS ? 64 : 32) - br->bit_pos_;
92 } 86 }
93 87
94 /* Returns amount of unread bytes the bit reader still has buffered from the 88 /* Returns amount of unread bytes the bit reader still has buffered from the
95 BrotliInput, including whole bytes in br->val_. */ 89 BrotliInput, including whole bytes in br->val_. */
96 static BROTLI_INLINE size_t BrotliGetRemainingBytes(BrotliBitReader* br) { 90 static BROTLI_INLINE size_t BrotliGetRemainingBytes(BrotliBitReader* br) {
97 return br->avail_in + (BrotliGetAvailableBits(br) >> 3); 91 return br->avail_in + (BrotliGetAvailableBits(br) >> 3);
98 } 92 }
99 93
100 /* Checks if there is at least num bytes left in the input ringbuffer (excluding 94 /* Checks if there is at least |num| bytes left in the input ring-buffer
101 the bits remaining in br->val_). */ 95 (excluding the bits remaining in br->val_). */
102 static BROTLI_INLINE int BrotliCheckInputAmount( 96 static BROTLI_INLINE BROTLI_BOOL BrotliCheckInputAmount(
103 BrotliBitReader* const br, size_t num) { 97 BrotliBitReader* const br, size_t num) {
104 return br->avail_in >= num; 98 return TO_BROTLI_BOOL(br->avail_in >= num);
105 } 99 }
106 100
107 static BROTLI_INLINE uint16_t BrotliLoad16LE(const uint8_t* in) { 101 static BROTLI_INLINE uint16_t BrotliLoad16LE(const uint8_t* in) {
108 if (BROTLI_LITTLE_ENDIAN) { 102 if (BROTLI_LITTLE_ENDIAN) {
109 return *((const uint16_t*)in); 103 return *((const uint16_t*)in);
110 } else if (BROTLI_BIG_ENDIAN) { 104 } else if (BROTLI_BIG_ENDIAN) {
111 uint16_t value = *((const uint16_t*)in); 105 uint16_t value = *((const uint16_t*)in);
112 return (uint16_t)(((value & 0xFFU) << 8) | ((value & 0xFF00U) >> 8)); 106 return (uint16_t)(((value & 0xFFU) << 8) | ((value & 0xFF00U) >> 8));
113 } else { 107 } else {
114 return (uint16_t)(in[0] | (in[1] << 8)); 108 return (uint16_t)(in[0] | (in[1] << 8));
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
156 value |= (uint64_t)(*(in++)) << 48; 150 value |= (uint64_t)(*(in++)) << 48;
157 value |= (uint64_t)(*(in++)) << 56; 151 value |= (uint64_t)(*(in++)) << 56;
158 return value; 152 return value;
159 } 153 }
160 } 154 }
161 #endif 155 #endif
162 156
163 /* Guarantees that there are at least n_bits + 1 bits in accumulator. 157 /* Guarantees that there are at least n_bits + 1 bits in accumulator.
164 Precondition: accumulator contains at least 1 bit. 158 Precondition: accumulator contains at least 1 bit.
165 n_bits should be in the range [1..24] for regular build. For portable 159 n_bits should be in the range [1..24] for regular build. For portable
166 non-64-bit little endian build only 16 bits are safe to request. */ 160 non-64-bit little-endian build only 16 bits are safe to request. */
167 static BROTLI_INLINE void BrotliFillBitWindow( 161 static BROTLI_INLINE void BrotliFillBitWindow(
168 BrotliBitReader* const br, uint32_t n_bits) { 162 BrotliBitReader* const br, uint32_t n_bits) {
169 #if (BROTLI_64_BITS) 163 #if (BROTLI_64_BITS)
170 if (!BROTLI_ALIGNED_READ && IS_CONSTANT(n_bits) && (n_bits <= 8)) { 164 if (!BROTLI_ALIGNED_READ && IS_CONSTANT(n_bits) && (n_bits <= 8)) {
171 if (br->bit_pos_ >= 56) { 165 if (br->bit_pos_ >= 56) {
172 br->val_ >>= 56; 166 br->val_ >>= 56;
173 br->bit_pos_ ^= 56; /* here same as -= 56 because of the if condition */ 167 br->bit_pos_ ^= 56; /* here same as -= 56 because of the if condition */
174 br->val_ |= BrotliLoad64LE(br->next_in) << 8; 168 br->val_ |= BrotliLoad64LE(br->next_in) << 8;
175 br->avail_in -= 7; 169 br->avail_in -= 7;
176 br->next_in += 7; 170 br->next_in += 7;
(...skipping 29 matching lines...) Expand all
206 br->val_ >>= 16; 200 br->val_ >>= 16;
207 br->bit_pos_ ^= 16; /* here same as -= 16 because of the if condition */ 201 br->bit_pos_ ^= 16; /* here same as -= 16 because of the if condition */
208 br->val_ |= ((uint32_t)BrotliLoad16LE(br->next_in)) << 16; 202 br->val_ |= ((uint32_t)BrotliLoad16LE(br->next_in)) << 16;
209 br->avail_in -= BROTLI_SHORT_FILL_BIT_WINDOW_READ; 203 br->avail_in -= BROTLI_SHORT_FILL_BIT_WINDOW_READ;
210 br->next_in += BROTLI_SHORT_FILL_BIT_WINDOW_READ; 204 br->next_in += BROTLI_SHORT_FILL_BIT_WINDOW_READ;
211 } 205 }
212 } 206 }
213 #endif 207 #endif
214 } 208 }
215 209
216 /* Mosltly like BrotliFillBitWindow, but guarantees only 16 bits and reads no 210 /* Mostly like BrotliFillBitWindow, but guarantees only 16 bits and reads no
217 more than BROTLI_SHORT_FILL_BIT_WINDOW_READ bytes of input. */ 211 more than BROTLI_SHORT_FILL_BIT_WINDOW_READ bytes of input. */
218 static BROTLI_INLINE void BrotliFillBitWindow16(BrotliBitReader* const br) { 212 static BROTLI_INLINE void BrotliFillBitWindow16(BrotliBitReader* const br) {
219 BrotliFillBitWindow(br, 17); 213 BrotliFillBitWindow(br, 17);
220 } 214 }
221 215
222 /* Pulls one byte of input to accumulator. */ 216 /* Pulls one byte of input to accumulator. */
223 static BROTLI_INLINE int BrotliPullByte(BrotliBitReader* const br) { 217 static BROTLI_INLINE BROTLI_BOOL BrotliPullByte(BrotliBitReader* const br) {
224 if (br->avail_in == 0) { 218 if (br->avail_in == 0) {
225 return 0; 219 return BROTLI_FALSE;
226 } 220 }
227 br->val_ >>= 8; 221 br->val_ >>= 8;
228 #if (BROTLI_64_BITS) 222 #if (BROTLI_64_BITS)
229 br->val_ |= ((uint64_t)*br->next_in) << 56; 223 br->val_ |= ((uint64_t)*br->next_in) << 56;
230 #else 224 #else
231 br->val_ |= ((uint32_t)*br->next_in) << 24; 225 br->val_ |= ((uint32_t)*br->next_in) << 24;
232 #endif 226 #endif
233 br->bit_pos_ -= 8; 227 br->bit_pos_ -= 8;
234 --br->avail_in; 228 --br->avail_in;
235 ++br->next_in; 229 ++br->next_in;
236 return 1; 230 return BROTLI_TRUE;
237 } 231 }
238 232
239 /* Returns currently available bits. 233 /* Returns currently available bits.
240 The number of valid bits could be calclulated by BrotliGetAvailableBits. */ 234 The number of valid bits could be calculated by BrotliGetAvailableBits. */
241 static BROTLI_INLINE reg_t BrotliGetBitsUnmasked(BrotliBitReader* const br) { 235 static BROTLI_INLINE reg_t BrotliGetBitsUnmasked(BrotliBitReader* const br) {
242 return br->val_ >> br->bit_pos_; 236 return br->val_ >> br->bit_pos_;
243 } 237 }
244 238
245 /* Like BrotliGetBits, but does not mask the result. 239 /* Like BrotliGetBits, but does not mask the result.
246 The result contains at least 16 valid bits. */ 240 The result contains at least 16 valid bits. */
247 static BROTLI_INLINE uint32_t BrotliGet16BitsUnmasked( 241 static BROTLI_INLINE uint32_t BrotliGet16BitsUnmasked(
248 BrotliBitReader* const br) { 242 BrotliBitReader* const br) {
249 BrotliFillBitWindow(br, 16); 243 BrotliFillBitWindow(br, 16);
250 return (uint32_t)BrotliGetBitsUnmasked(br); 244 return (uint32_t)BrotliGetBitsUnmasked(br);
251 } 245 }
252 246
253 /* Returns the specified number of bits from br without advancing bit pos. */ 247 /* Returns the specified number of bits from |br| without advancing bit pos. */
254 static BROTLI_INLINE uint32_t BrotliGetBits( 248 static BROTLI_INLINE uint32_t BrotliGetBits(
255 BrotliBitReader* const br, uint32_t n_bits) { 249 BrotliBitReader* const br, uint32_t n_bits) {
256 BrotliFillBitWindow(br, n_bits); 250 BrotliFillBitWindow(br, n_bits);
257 return (uint32_t)BrotliGetBitsUnmasked(br) & BitMask(n_bits); 251 return (uint32_t)BrotliGetBitsUnmasked(br) & BitMask(n_bits);
258 } 252 }
259 253
260 /* Tries to peek the specified amount of bits. Returns 0, if there is not 254 /* Tries to peek the specified amount of bits. Returns 0, if there is not
261 enough input. */ 255 enough input. */
262 static BROTLI_INLINE int BrotliSafeGetBits( 256 static BROTLI_INLINE BROTLI_BOOL BrotliSafeGetBits(
263 BrotliBitReader* const br, uint32_t n_bits, uint32_t* val) { 257 BrotliBitReader* const br, uint32_t n_bits, uint32_t* val) {
264 while (BrotliGetAvailableBits(br) < n_bits) { 258 while (BrotliGetAvailableBits(br) < n_bits) {
265 if (!BrotliPullByte(br)) { 259 if (!BrotliPullByte(br)) {
266 return 0; 260 return BROTLI_FALSE;
267 } 261 }
268 } 262 }
269 *val = (uint32_t)BrotliGetBitsUnmasked(br) & BitMask(n_bits); 263 *val = (uint32_t)BrotliGetBitsUnmasked(br) & BitMask(n_bits);
270 return 1; 264 return BROTLI_TRUE;
271 } 265 }
272 266
273 /* Advances the bit pos by n_bits. */ 267 /* Advances the bit pos by n_bits. */
274 static BROTLI_INLINE void BrotliDropBits( 268 static BROTLI_INLINE void BrotliDropBits(
275 BrotliBitReader* const br, uint32_t n_bits) { 269 BrotliBitReader* const br, uint32_t n_bits) {
276 br->bit_pos_ += n_bits; 270 br->bit_pos_ += n_bits;
277 } 271 }
278 272
279 static BROTLI_INLINE void BrotliBitReaderUnload(BrotliBitReader* br) { 273 static BROTLI_INLINE void BrotliBitReaderUnload(BrotliBitReader* br) {
280 uint32_t unused_bytes = BrotliGetAvailableBits(br) >> 3; 274 uint32_t unused_bytes = BrotliGetAvailableBits(br) >> 3;
281 uint32_t unused_bits = unused_bytes << 3; 275 uint32_t unused_bits = unused_bytes << 3;
282 br->avail_in += unused_bytes; 276 br->avail_in += unused_bytes;
283 br->next_in -= unused_bytes; 277 br->next_in -= unused_bytes;
284 if (unused_bits == sizeof(br->val_) << 3) { 278 if (unused_bits == sizeof(br->val_) << 3) {
285 br->val_ = 0; 279 br->val_ = 0;
286 } else { 280 } else {
287 br->val_ <<= unused_bits; 281 br->val_ <<= unused_bits;
288 } 282 }
289 br->bit_pos_ += unused_bits; 283 br->bit_pos_ += unused_bits;
290 } 284 }
291 285
292 /* Reads the specified number of bits from br and advances the bit pos. 286 /* Reads the specified number of bits from |br| and advances the bit pos.
293 Precondition: accumulator MUST contain at least n_bits. */ 287 Precondition: accumulator MUST contain at least n_bits. */
294 static BROTLI_INLINE void BrotliTakeBits( 288 static BROTLI_INLINE void BrotliTakeBits(
295 BrotliBitReader* const br, uint32_t n_bits, uint32_t* val) { 289 BrotliBitReader* const br, uint32_t n_bits, uint32_t* val) {
296 *val = (uint32_t)BrotliGetBitsUnmasked(br) & BitMask(n_bits); 290 *val = (uint32_t)BrotliGetBitsUnmasked(br) & BitMask(n_bits);
297 BROTLI_LOG(("[BrotliReadBits] %d %d %d val: %6x\n", 291 BROTLI_LOG(("[BrotliReadBits] %d %d %d val: %6x\n",
298 (int)br->avail_in, (int)br->bit_pos_, n_bits, (int)*val)); 292 (int)br->avail_in, (int)br->bit_pos_, n_bits, (int)*val));
299 BrotliDropBits(br, n_bits); 293 BrotliDropBits(br, n_bits);
300 } 294 }
301 295
302 /* Reads the specified number of bits from br and advances the bit pos. 296 /* Reads the specified number of bits from |br| and advances the bit pos.
303 Assumes that there is enough input to perform BrotliFillBitWindow. */ 297 Assumes that there is enough input to perform BrotliFillBitWindow. */
304 static BROTLI_INLINE uint32_t BrotliReadBits( 298 static BROTLI_INLINE uint32_t BrotliReadBits(
305 BrotliBitReader* const br, uint32_t n_bits) { 299 BrotliBitReader* const br, uint32_t n_bits) {
306 if (BROTLI_64_BITS || (n_bits <= 16)) { 300 if (BROTLI_64_BITS || (n_bits <= 16)) {
307 uint32_t val; 301 uint32_t val;
308 BrotliFillBitWindow(br, n_bits); 302 BrotliFillBitWindow(br, n_bits);
309 BrotliTakeBits(br, n_bits, &val); 303 BrotliTakeBits(br, n_bits, &val);
310 return val; 304 return val;
311 } else { 305 } else {
312 uint32_t low_val; 306 uint32_t low_val;
313 uint32_t high_val; 307 uint32_t high_val;
314 BrotliFillBitWindow(br, 16); 308 BrotliFillBitWindow(br, 16);
315 BrotliTakeBits(br, 16, &low_val); 309 BrotliTakeBits(br, 16, &low_val);
316 BrotliFillBitWindow(br, 8); 310 BrotliFillBitWindow(br, 8);
317 BrotliTakeBits(br, n_bits - 16, &high_val); 311 BrotliTakeBits(br, n_bits - 16, &high_val);
318 return low_val | (high_val << 16); 312 return low_val | (high_val << 16);
319 } 313 }
320 } 314 }
321 315
322 /* Tries to read the specified amount of bits. Returns 0, if there is not 316 /* Tries to read the specified amount of bits. Returns 0, if there is not
323 enough input. n_bits MUST be positive. */ 317 enough input. n_bits MUST be positive. */
324 static BROTLI_INLINE int BrotliSafeReadBits( 318 static BROTLI_INLINE BROTLI_BOOL BrotliSafeReadBits(
325 BrotliBitReader* const br, uint32_t n_bits, uint32_t* val) { 319 BrotliBitReader* const br, uint32_t n_bits, uint32_t* val) {
326 while (BrotliGetAvailableBits(br) < n_bits) { 320 while (BrotliGetAvailableBits(br) < n_bits) {
327 if (!BrotliPullByte(br)) { 321 if (!BrotliPullByte(br)) {
328 return 0; 322 return BROTLI_FALSE;
329 } 323 }
330 } 324 }
331 BrotliTakeBits(br, n_bits, val); 325 BrotliTakeBits(br, n_bits, val);
332 return 1; 326 return BROTLI_TRUE;
333 } 327 }
334 328
335 /* Advances the bit reader position to the next byte boundary and verifies 329 /* Advances the bit reader position to the next byte boundary and verifies
336 that any skipped bits are set to zero. */ 330 that any skipped bits are set to zero. */
337 static BROTLI_INLINE int BrotliJumpToByteBoundary(BrotliBitReader* br) { 331 static BROTLI_INLINE BROTLI_BOOL BrotliJumpToByteBoundary(BrotliBitReader* br) {
338 uint32_t pad_bits_count = BrotliGetAvailableBits(br) & 0x7; 332 uint32_t pad_bits_count = BrotliGetAvailableBits(br) & 0x7;
339 uint32_t pad_bits = 0; 333 uint32_t pad_bits = 0;
340 if (pad_bits_count != 0) { 334 if (pad_bits_count != 0) {
341 BrotliTakeBits(br, pad_bits_count, &pad_bits); 335 BrotliTakeBits(br, pad_bits_count, &pad_bits);
342 } 336 }
343 return pad_bits == 0; 337 return TO_BROTLI_BOOL(pad_bits == 0);
344 }
345
346 /* Peeks a byte at specified offset.
347 Precondition: bit reader is parked to a byte boundary.
348 Returns -1 if operation is not feasible. */
349 static BROTLI_INLINE int BrotliPeekByte(BrotliBitReader* br, size_t offset) {
350 uint32_t available_bits = BrotliGetAvailableBits(br);
351 size_t bytes_left = available_bits >> 3;
352 BROTLI_DCHECK((available_bits & 7) == 0);
353 if (offset < bytes_left) {
354 return (BrotliGetBitsUnmasked(br) >> (unsigned)(offset << 3)) & 0xFF;
355 }
356 offset -= bytes_left;
357 if (offset < br->avail_in) {
358 return br->next_in[offset];
359 }
360 return -1;
361 } 338 }
362 339
363 /* Copies remaining input bytes stored in the bit reader to the output. Value 340 /* Copies remaining input bytes stored in the bit reader to the output. Value
364 num may not be larger than BrotliGetRemainingBytes. The bit reader must be 341 num may not be larger than BrotliGetRemainingBytes. The bit reader must be
365 warmed up again after this. */ 342 warmed up again after this. */
366 static BROTLI_INLINE void BrotliCopyBytes(uint8_t* dest, 343 static BROTLI_INLINE void BrotliCopyBytes(uint8_t* dest,
367 BrotliBitReader* br, size_t num) { 344 BrotliBitReader* br, size_t num) {
368 while (BrotliGetAvailableBits(br) >= 8 && num > 0) { 345 while (BrotliGetAvailableBits(br) >= 8 && num > 0) {
369 *dest = (uint8_t)BrotliGetBitsUnmasked(br); 346 *dest = (uint8_t)BrotliGetBitsUnmasked(br);
370 BrotliDropBits(br, 8); 347 BrotliDropBits(br, 8);
371 ++dest; 348 ++dest;
372 --num; 349 --num;
373 } 350 }
374 memcpy(dest, br->next_in, num); 351 memcpy(dest, br->next_in, num);
375 br->avail_in -= num; 352 br->avail_in -= num;
376 br->next_in += num; 353 br->next_in += num;
377 } 354 }
378 355
379 #if defined(__cplusplus) || defined(c_plusplus) 356 #if defined(__cplusplus) || defined(c_plusplus)
380 } /* extern "C" */ 357 } /* extern "C" */
381 #endif 358 #endif
382 359
383 #endif /* BROTLI_DEC_BIT_READER_H_ */ 360 #endif /* BROTLI_DEC_BIT_READER_H_ */
OLDNEW
« no previous file with comments | « third_party/brotli/common/version.h ('k') | third_party/brotli/dec/bit_reader.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698