Commit | Line | Data |
---|---|---|
f9995f31 MG |
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 <stdlib.h> | |
10 | ||
11 | #include "./bit_reader.h" | |
12 | #include "./port.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 | int 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 aligment. */ | |
28 | if (!BROTLI_ALIGNED_READ) { | |
29 | aligned_read_mask = 0; | |
30 | } | |
31 | if (BrotliGetAvailableBits(br) == 0) { | |
32 | if (!BrotliPullByte(br)) { | |
33 | return 0; | |
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 1; | |
41 | } | |
42 | } | |
43 | return 1; | |
44 | } | |
45 | ||
46 | #if defined(__cplusplus) || defined(c_plusplus) | |
47 | } /* extern "C" */ | |
48 | #endif |