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#include <brotli/types.h> 13 14#if defined(__cplusplus) || defined(c_plusplus) 15extern "C" { 16#endif 17 18const uint32_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 29void BrotliInitBitReader(BrotliBitReader* const br) { 30 br->val_ = 0; 31 br->bit_pos_ = sizeof(br->val_) << 3; 32} 33 34BROTLI_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_ALIGNED_READ) { 40 aligned_read_mask = 0; 41 } 42 if (BrotliGetAvailableBits(br) == 0) { 43 if (!BrotliPullByte(br)) { 44 return BROTLI_FALSE; 45 } 46 } 47 48 while ((((size_t)br->next_in) & aligned_read_mask) != 0) { 49 if (!BrotliPullByte(br)) { 50 /* If we consumed all the input, we don't care about the alignment. */ 51 return BROTLI_TRUE; 52 } 53 } 54 return BROTLI_TRUE; 55} 56 57BROTLI_BOOL BrotliSafeReadBits32Slow(BrotliBitReader* const br, 58 uint32_t n_bits, uint32_t* val) { 59 uint32_t low_val; 60 uint32_t high_val; 61 BrotliBitReaderState memento; 62 BROTLI_DCHECK(n_bits <= 32); 63 BROTLI_DCHECK(n_bits > 24); 64 BrotliBitReaderSaveState(br, &memento); 65 if (!BrotliSafeReadBits(br, 16, &low_val) || 66 !BrotliSafeReadBits(br, n_bits - 16, &high_val)) { 67 BrotliBitReaderRestoreState(br, &memento); 68 return BROTLI_FALSE; 69 } 70 *val = low_val | (high_val << 16); 71 return BROTLI_TRUE; 72} 73 74#if defined(__cplusplus) || defined(c_plusplus) 75} /* extern "C" */ 76#endif 77