bit_reader.c (2282B)
1 /* Copyright 2013 Google Inc. All Rights Reserved. 2 3 Distributed under MIT license. 4 See file LICENSE for detail or copy at https://opensource.org/licenses/MIT 5 */ 6 7 /* Bit reading helpers */ 8 9 #include "bit_reader.h" 10 11 #include "../common/platform.h" 12 13 #if defined(__cplusplus) || defined(c_plusplus) 14 extern "C" { 15 #endif 16 17 const BROTLI_MODEL("small") 18 brotli_reg_t kBrotliBitMask[33] = { 0x00000000, 19 0x00000001, 0x00000003, 0x00000007, 0x0000000F, 20 0x0000001F, 0x0000003F, 0x0000007F, 0x000000FF, 21 0x000001FF, 0x000003FF, 0x000007FF, 0x00000FFF, 22 0x00001FFF, 0x00003FFF, 0x00007FFF, 0x0000FFFF, 23 0x0001FFFF, 0x0003FFFF, 0x0007FFFF, 0x000FFFFF, 24 0x001FFFFF, 0x003FFFFF, 0x007FFFFF, 0x00FFFFFF, 25 0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF, 0x0FFFFFFF, 26 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF, 0xFFFFFFFF 27 }; 28 29 void BrotliInitBitReader(BrotliBitReader* const br) { 30 br->val_ = 0; 31 br->bit_pos_ = 0; 32 } 33 34 BROTLI_BOOL BrotliWarmupBitReader(BrotliBitReader* const br) { 35 size_t aligned_read_mask = (sizeof(br->val_) >> 1) - 1; 36 /* Fixing alignment after unaligned BrotliFillWindow would result accumulator 37 overflow. If unalignment is caused by BrotliSafeReadBits, then there is 38 enough space in accumulator to fix alignment. */ 39 if (BROTLI_UNALIGNED_READ_FAST) { 40 aligned_read_mask = 0; 41 } 42 if (BrotliGetAvailableBits(br) == 0) { 43 br->val_ = 0; 44 if (!BrotliPullByte(br)) { 45 return BROTLI_FALSE; 46 } 47 } 48 49 while ((((size_t)br->next_in) & aligned_read_mask) != 0) { 50 if (!BrotliPullByte(br)) { 51 /* If we consumed all the input, we don't care about the alignment. */ 52 return BROTLI_TRUE; 53 } 54 } 55 return BROTLI_TRUE; 56 } 57 58 BROTLI_BOOL BrotliSafeReadBits32Slow(BrotliBitReader* const br, 59 brotli_reg_t n_bits, brotli_reg_t* val) { 60 brotli_reg_t low_val; 61 brotli_reg_t high_val; 62 BrotliBitReaderState memento; 63 BROTLI_DCHECK(n_bits <= 32); 64 BROTLI_DCHECK(n_bits > 24); 65 BrotliBitReaderSaveState(br, &memento); 66 if (!BrotliSafeReadBits(br, 16, &low_val) || 67 !BrotliSafeReadBits(br, n_bits - 16, &high_val)) { 68 BrotliBitReaderRestoreState(br, &memento); 69 return BROTLI_FALSE; 70 } 71 *val = low_val | (high_val << 16); 72 return BROTLI_TRUE; 73 } 74 75 #if defined(__cplusplus) || defined(c_plusplus) 76 } /* extern "C" */ 77 #endif