1b8a100856942f8bf98d7b523a72bdaf8a929bfc7Zoltan Szabadka/* Copyright 2013 Google Inc. All Rights Reserved. 2b8a100856942f8bf98d7b523a72bdaf8a929bfc7Zoltan Szabadka 324ffa78414663b545b66be392caff7eb5574a62cEugene Klyuchnikov Distributed under MIT license. 4771eb107985566d2e458e3f06f2c7bd1b21c2dcaEugene Klyuchnikov See file LICENSE for detail or copy at https://opensource.org/licenses/MIT 5b8a100856942f8bf98d7b523a72bdaf8a929bfc7Zoltan Szabadka*/ 68f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka 781cb09f1b3c35c3b37dc013196a9bfb02a474276Lode Vandevenne/* Bit reading helpers */ 881cb09f1b3c35c3b37dc013196a9bfb02a474276Lode Vandevenne 98f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka#include "./bit_reader.h" 1092e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov 1181480011581d1bb40e2ed26566a95d060f2767b3Eugene Kliuchnikov#include <brotli/types.h> 1283aa24dc8686b62177d776a3baab5f69badc1a78Zoltan Szabadka#include "./port.h" 138f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka 148f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka#if defined(__cplusplus) || defined(c_plusplus) 158f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadkaextern "C" { 168f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka#endif 178f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka 18c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikovvoid BrotliInitBitReader(BrotliBitReader* const br) { 198f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka br->val_ = 0; 20a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka br->bit_pos_ = sizeof(br->val_) << 3; 218270250b40f9979f61d92542739b5a786914c922Lode Vandevenne} 228270250b40f9979f61d92542739b5a786914c922Lode Vandevenne 2343d4f45b6e8635406e1709fcc938c12f3d11d76fEugene KliuchnikovBROTLI_BOOL BrotliWarmupBitReader(BrotliBitReader* const br) { 24e44caf98355b9ac27023d5590d2636ef67a9a1f5Zoltan Szabadka size_t aligned_read_mask = (sizeof(br->val_) >> 1) - 1; 25e44caf98355b9ac27023d5590d2636ef67a9a1f5Zoltan Szabadka /* Fixing alignment after unaligned BrotliFillWindow would result accumulator 26e44caf98355b9ac27023d5590d2636ef67a9a1f5Zoltan Szabadka overflow. If unalignment is caused by BrotliSafeReadBits, then there is 27e9b278ac6e097beb763e8a46eeafcaa3f6f63f18Eugene Kliuchnikov enough space in accumulator to fix alignment. */ 28e44caf98355b9ac27023d5590d2636ef67a9a1f5Zoltan Szabadka if (!BROTLI_ALIGNED_READ) { 29e44caf98355b9ac27023d5590d2636ef67a9a1f5Zoltan Szabadka aligned_read_mask = 0; 30e44caf98355b9ac27023d5590d2636ef67a9a1f5Zoltan Szabadka } 31c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov if (BrotliGetAvailableBits(br) == 0) { 32c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov if (!BrotliPullByte(br)) { 3343d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov return BROTLI_FALSE; 34a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka } 35c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov } 36c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov 37c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov while ((((size_t)br->next_in) & aligned_read_mask) != 0) { 38c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov if (!BrotliPullByte(br)) { 39c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov /* If we consumed all the input, we don't care about the alignment. */ 4043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov return BROTLI_TRUE; 41c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov } 428f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka } 4343d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov return BROTLI_TRUE; 448f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka} 458f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka 468f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka#if defined(__cplusplus) || defined(c_plusplus) 4723934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov} /* extern "C" */ 488f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka#endif 49