Line data Source code
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 "./port.h"
12 : #include "./types.h"
13 :
14 : #if defined(__cplusplus) || defined(c_plusplus)
15 : extern "C" {
16 : #endif
17 :
18 0 : void BrotliInitBitReader(BrotliBitReader* const br) {
19 0 : br->val_ = 0;
20 0 : br->bit_pos_ = sizeof(br->val_) << 3;
21 0 : }
22 :
23 0 : int BrotliWarmupBitReader(BrotliBitReader* const br) {
24 0 : 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 0 : if (BrotliGetAvailableBits(br) == 0) {
32 0 : if (!BrotliPullByte(br)) {
33 0 : return 0;
34 : }
35 : }
36 :
37 0 : while ((((size_t)br->next_in) & aligned_read_mask) != 0) {
38 0 : if (!BrotliPullByte(br)) {
39 : /* If we consumed all the input, we don't care about the alignment. */
40 0 : return 1;
41 : }
42 : }
43 0 : return 1;
44 : }
45 :
46 : #if defined(__cplusplus) || defined(c_plusplus)
47 : } /* extern "C" */
48 : #endif
|