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) |
15 | extern "C"{ |
16 | #endif |
17 | |
18 | void BrotliInitBitReader(BrotliBitReader* const br) { |
19 | br->val_ = 0; |
20 | br->bit_pos_ = sizeof(br->val_) << 3; |
21 | } |
22 | |
23 | BROTLI_BOOL BrotliWarmupBitReader(BrotliBitReader* const br) { |
24 | size_t aligned_read_mask = (sizeof(br->val_) >> 1) - 1; |
25 | /* Fixing alignment after unaligned BrotliFillWindow would result accumulator |
26 | overflow. If unalignment is caused by BrotliSafeReadBits, then there is |
27 | enough space in accumulator to fix alignment. */ |
28 | if (!BROTLI_ALIGNED_READ) { |
29 | aligned_read_mask = 0; |
30 | } |
31 | if (BrotliGetAvailableBits(br) == 0) { |
32 | if (!BrotliPullByte(br)) { |
33 | return BROTLI_FALSE; |
34 | } |
35 | } |
36 | |
37 | while ((((size_t)br->next_in) & aligned_read_mask) != 0) { |
38 | if (!BrotliPullByte(br)) { |
39 | /* If we consumed all the input, we don't care about the alignment. */ |
40 | return BROTLI_TRUE; |
41 | } |
42 | } |
43 | return BROTLI_TRUE; |
44 | } |
45 | |
46 | #if defined(__cplusplus) || defined(c_plusplus) |
47 | } /* extern "C" */ |
48 | #endif |
49 |