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
781480011581d1bb40e2ed26566a95d060f2767b3Eugene Kliuchnikov#include <brotli/decode.h>
88f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka
994cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne#ifdef __ARM_NEON__
1094cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne#include <arm_neon.h>
1194cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne#endif
1294cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne
1392e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov#include <stdlib.h>  /* free, malloc */
1492e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov#include <string.h>  /* memcpy, memset */
1592e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov
16028291865dbc2f92bb114dd082f5ff78c907a875Eugene Kliuchnikov#include "../common/constants.h"
17028291865dbc2f92bb114dd082f5ff78c907a875Eugene Kliuchnikov#include "../common/dictionary.h"
18801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov#include "../common/version.h"
1992e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov#include "./bit_reader.h"
2092e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov#include "./context.h"
2192e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov#include "./huffman.h"
2292e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov#include "./port.h"
2392e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov#include "./prefix.h"
24e7e3849835e17ebb842ad02b51e1fb0c5e11b47cEugene Kliuchnikov#include "./state.h"
2592e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov#include "./transform.h"
2692e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov
278f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka#if defined(__cplusplus) || defined(c_plusplus)
288f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadkaextern "C" {
298f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka#endif
308f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka
31021f6fe37df1c1629dd6ae2ebc598ee78a1c591aEugene Kliuchnikov#define BROTLI_FAILURE(CODE) (BROTLI_DUMP(), CODE)
3292e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov
3323934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov#define BROTLI_LOG_UINT(name)                                       \
34e7e3849835e17ebb842ad02b51e1fb0c5e11b47cEugene Kliuchnikov  BROTLI_LOG(("[%s] %s = %lu\n", __func__, #name, (unsigned long)(name)))
3523934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov#define BROTLI_LOG_ARRAY_INDEX(array_name, idx)                     \
36e7e3849835e17ebb842ad02b51e1fb0c5e11b47cEugene Kliuchnikov  BROTLI_LOG(("[%s] %s[%lu] = %lu\n", __func__, #array_name,        \
37e7e3849835e17ebb842ad02b51e1fb0c5e11b47cEugene Kliuchnikov         (unsigned long)(idx), (unsigned long)array_name[idx]))
388f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka
3923934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov#define HUFFMAN_TABLE_BITS 8U
4023934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov#define HUFFMAN_TABLE_MASK 0xff
410454ab4ec0cfe0dee125269a5ee065f7774d6a9dZoltan Szabadka
42028291865dbc2f92bb114dd082f5ff78c907a875Eugene Kliuchnikovstatic const uint8_t kCodeLengthCodeOrder[BROTLI_CODE_LENGTH_CODES] = {
430454ab4ec0cfe0dee125269a5ee065f7774d6a9dZoltan Szabadka  1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15,
448f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka};
458f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka
460cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka/* Static prefix code for the complex code length code lengths. */
470cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadkastatic const uint8_t kCodeLengthPrefixLength[16] = {
480cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka  2, 2, 2, 3, 2, 2, 2, 4, 2, 2, 2, 3, 2, 2, 2, 4,
490cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka};
500cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka
510cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadkastatic const uint8_t kCodeLengthPrefixValue[16] = {
520cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka  0, 4, 3, 2, 0, 4, 3, 1, 0, 4, 3, 2, 0, 4, 3, 5,
530cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka};
540cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka
5543d4f45b6e8635406e1709fcc938c12f3d11d76fEugene KliuchnikovBrotliDecoderState* BrotliDecoderCreateInstance(
56b69381227199fceef25e564f68fec730d53b34c4Eugene Klyuchnikov    brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque) {
5743d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  BrotliDecoderState* state = 0;
58b69381227199fceef25e564f68fec730d53b34c4Eugene Klyuchnikov  if (!alloc_func && !free_func) {
5943d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    state = (BrotliDecoderState*)malloc(sizeof(BrotliDecoderState));
60b69381227199fceef25e564f68fec730d53b34c4Eugene Klyuchnikov  } else if (alloc_func && free_func) {
6143d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    state = (BrotliDecoderState*)alloc_func(opaque, sizeof(BrotliDecoderState));
62b69381227199fceef25e564f68fec730d53b34c4Eugene Klyuchnikov  }
63b69381227199fceef25e564f68fec730d53b34c4Eugene Klyuchnikov  if (state == 0) {
64e7e3849835e17ebb842ad02b51e1fb0c5e11b47cEugene Kliuchnikov    BROTLI_DUMP();
65b69381227199fceef25e564f68fec730d53b34c4Eugene Klyuchnikov    return 0;
66b69381227199fceef25e564f68fec730d53b34c4Eugene Klyuchnikov  }
6743d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  BrotliDecoderStateInitWithCustomAllocators(
6843d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      state, alloc_func, free_func, opaque);
6943d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  state->error_code = BROTLI_DECODER_NO_ERROR;
70b69381227199fceef25e564f68fec730d53b34c4Eugene Klyuchnikov  return state;
71b69381227199fceef25e564f68fec730d53b34c4Eugene Klyuchnikov}
72b69381227199fceef25e564f68fec730d53b34c4Eugene Klyuchnikov
7343d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov/* Deinitializes and frees BrotliDecoderState instance. */
7443d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovvoid BrotliDecoderDestroyInstance(BrotliDecoderState* state) {
75b69381227199fceef25e564f68fec730d53b34c4Eugene Klyuchnikov  if (!state) {
76b69381227199fceef25e564f68fec730d53b34c4Eugene Klyuchnikov    return;
77b69381227199fceef25e564f68fec730d53b34c4Eugene Klyuchnikov  } else {
78b69381227199fceef25e564f68fec730d53b34c4Eugene Klyuchnikov    brotli_free_func free_func = state->free_func;
79b69381227199fceef25e564f68fec730d53b34c4Eugene Klyuchnikov    void* opaque = state->memory_manager_opaque;
8043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    BrotliDecoderStateCleanup(state);
81b69381227199fceef25e564f68fec730d53b34c4Eugene Klyuchnikov    free_func(opaque, state);
82b69381227199fceef25e564f68fec730d53b34c4Eugene Klyuchnikov  }
83b69381227199fceef25e564f68fec730d53b34c4Eugene Klyuchnikov}
84b69381227199fceef25e564f68fec730d53b34c4Eugene Klyuchnikov
8543d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov/* Saves error code and converts it to BrotliDecoderResult */
8643d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BROTLI_NOINLINE BrotliDecoderResult SaveErrorCode(
8743d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    BrotliDecoderState* s, BrotliDecoderErrorCode e) {
88021f6fe37df1c1629dd6ae2ebc598ee78a1c591aEugene Kliuchnikov  s->error_code = (int)e;
89021f6fe37df1c1629dd6ae2ebc598ee78a1c591aEugene Kliuchnikov  switch (e) {
9043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    case BROTLI_DECODER_SUCCESS:
9143d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      return BROTLI_DECODER_RESULT_SUCCESS;
9243d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    case BROTLI_DECODER_NEEDS_MORE_INPUT:
9343d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      return BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT;
9443d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    case BROTLI_DECODER_NEEDS_MORE_OUTPUT:
9543d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      return BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT;
9643d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    default:
9743d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      return BROTLI_DECODER_RESULT_ERROR;
98021f6fe37df1c1629dd6ae2ebc598ee78a1c591aEugene Kliuchnikov  }
99021f6fe37df1c1629dd6ae2ebc598ee78a1c591aEugene Kliuchnikov}
100021f6fe37df1c1629dd6ae2ebc598ee78a1c591aEugene Kliuchnikov
101a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka/* Decodes a number in the range [9..24], by reading 1 - 7 bits.
102a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka   Precondition: bit-reader accumulator has at least 7 bits. */
10394cd7085f79a707f5ba3d93086796e695b495975Lode Vandevennestatic uint32_t DecodeWindowBits(BrotliBitReader* br) {
10494cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne  uint32_t n;
105a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka  BrotliTakeBits(br, 1, &n);
106a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka  if (n == 0) {
1078d7081f2d06ba8b2c48ce9ebeddce25258525bc0Zoltan Szabadka    return 16;
1088f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka  }
109a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka  BrotliTakeBits(br, 3, &n);
11094cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne  if (n != 0) {
11154f69c9ef7a2530e3524b264e2390f1446552fbdZoltan Szabadka    return 17 + n;
11254f69c9ef7a2530e3524b264e2390f1446552fbdZoltan Szabadka  }
113a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka  BrotliTakeBits(br, 3, &n);
11494cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne  if (n != 0) {
11554f69c9ef7a2530e3524b264e2390f1446552fbdZoltan Szabadka    return 8 + n;
11654f69c9ef7a2530e3524b264e2390f1446552fbdZoltan Szabadka  }
11754f69c9ef7a2530e3524b264e2390f1446552fbdZoltan Szabadka  return 17;
1188f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka}
1198f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka
12023934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikovstatic BROTLI_INLINE void memmove16(uint8_t* dst, uint8_t* src) {
12102c606d444600296ce107b6532f9e9e076f62dd5eustas#if defined(__ARM_NEON__)
12202c606d444600296ce107b6532f9e9e076f62dd5eustas  vst1q_u8(dst, vld1q_u8(src));
12302c606d444600296ce107b6532f9e9e076f62dd5eustas#else
1245919712922310cb8d1dbf86821b2e758597caba7Zoltan Szabadka  uint32_t buffer[4];
1255919712922310cb8d1dbf86821b2e758597caba7Zoltan Szabadka  memcpy(buffer, src, 16);
1265919712922310cb8d1dbf86821b2e758597caba7Zoltan Szabadka  memcpy(dst, buffer, 16);
12794cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne#endif
12894cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne}
12994cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne
130b8a100856942f8bf98d7b523a72bdaf8a929bfc7Zoltan Szabadka/* Decodes a number in the range [0..255], by reading 1 - 11 bits. */
13143d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BROTLI_NOINLINE BrotliDecoderErrorCode DecodeVarLenUint8(
13243d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    BrotliDecoderState* s, BrotliBitReader* br, uint32_t* value) {
1330cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka  uint32_t bits;
1340cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka  switch (s->substate_decode_uint8) {
1350cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka    case BROTLI_STATE_DECODE_UINT8_NONE:
13669982c25f155e6b5c72782f2c5590ead1b06aa61Eugene Kliuchnikov      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, 1, &bits))) {
13743d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov        return BROTLI_DECODER_NEEDS_MORE_INPUT;
1380cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka      }
1390cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka      if (bits == 0) {
1400cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka        *value = 0;
14143d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov        return BROTLI_DECODER_SUCCESS;
1420cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka      }
1430cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka      /* No break, transit to the next state. */
1440cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka
1450cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka    case BROTLI_STATE_DECODE_UINT8_SHORT:
14669982c25f155e6b5c72782f2c5590ead1b06aa61Eugene Kliuchnikov      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, 3, &bits))) {
1470cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_SHORT;
14843d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov        return BROTLI_DECODER_NEEDS_MORE_INPUT;
1490cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka      }
1500cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka      if (bits == 0) {
1510cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka        *value = 1;
1520cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_NONE;
15343d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov        return BROTLI_DECODER_SUCCESS;
1540cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka      }
1550cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka      /* Use output value as a temporary storage. It MUST be persisted. */
156bacc734997f12ffa7002366ea2dffd5ef7e6a136Zoltan Szabadka      *value = bits;
1570cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka      /* No break, transit to the next state. */
1580cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka
1590cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka    case BROTLI_STATE_DECODE_UINT8_LONG:
16069982c25f155e6b5c72782f2c5590ead1b06aa61Eugene Kliuchnikov      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, *value, &bits))) {
1610cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_LONG;
16243d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov        return BROTLI_DECODER_NEEDS_MORE_INPUT;
1630cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka      }
164bacc734997f12ffa7002366ea2dffd5ef7e6a136Zoltan Szabadka      *value = (1U << *value) + bits;
1650cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka      s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_NONE;
16643d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      return BROTLI_DECODER_SUCCESS;
1670cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka
1680cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka    default:
16943d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      return
17043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov          BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);
17160c24c0c2d226fb542b7b7641e3fbd8677f4caf4Zoltan Szabadka  }
17260c24c0c2d226fb542b7b7641e3fbd8677f4caf4Zoltan Szabadka}
17360c24c0c2d226fb542b7b7641e3fbd8677f4caf4Zoltan Szabadka
174a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka/* Decodes a metablock length and flags by reading 2 - 31 bits. */
17543d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BrotliDecoderErrorCode BROTLI_NOINLINE DecodeMetaBlockLength(
17643d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    BrotliDecoderState* s, BrotliBitReader* br) {
177a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka  uint32_t bits;
178354349d7aeccb4887aa924a844d97d1991a3a979Zoltan Szabadka  int i;
179a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka  for (;;) {
180a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka    switch (s->substate_metablock_header) {
181a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka      case BROTLI_STATE_METABLOCK_HEADER_NONE:
182a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        if (!BrotliSafeReadBits(br, 1, &bits)) {
18343d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov          return BROTLI_DECODER_NEEDS_MORE_INPUT;
184a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        }
185801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov        s->is_last_metablock = bits ? 1 : 0;
186a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        s->meta_block_remaining_len = 0;
187a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        s->is_uncompressed = 0;
188a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        s->is_metadata = 0;
189a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        if (!s->is_last_metablock) {
190a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NIBBLES;
191a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka          break;
192a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        }
193a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_EMPTY;
194a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        /* No break, transit to the next state. */
195a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka
196a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka      case BROTLI_STATE_METABLOCK_HEADER_EMPTY:
197a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        if (!BrotliSafeReadBits(br, 1, &bits)) {
19843d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov          return BROTLI_DECODER_NEEDS_MORE_INPUT;
199a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        }
200a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        if (bits) {
201a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
20243d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov          return BROTLI_DECODER_SUCCESS;
203a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        }
204a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NIBBLES;
205a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        /* No break, transit to the next state. */
206a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka
207a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka      case BROTLI_STATE_METABLOCK_HEADER_NIBBLES:
208a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        if (!BrotliSafeReadBits(br, 2, &bits)) {
20943d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov          return BROTLI_DECODER_NEEDS_MORE_INPUT;
210a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        }
211a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        s->size_nibbles = (uint8_t)(bits + 4);
212a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        s->loop_counter = 0;
213a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        if (bits == 3) {
214a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka          s->is_metadata = 1;
215a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_RESERVED;
216a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka          break;
217a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        }
218a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_SIZE;
219a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        /* No break, transit to the next state. */
220a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka
221a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka      case BROTLI_STATE_METABLOCK_HEADER_SIZE:
222a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        i = s->loop_counter;
223f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov        for (; i < (int)s->size_nibbles; ++i) {
224a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka          if (!BrotliSafeReadBits(br, 4, &bits)) {
225a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka            s->loop_counter = i;
22643d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov            return BROTLI_DECODER_NEEDS_MORE_INPUT;
227a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka          }
228a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka          if (i + 1 == s->size_nibbles && s->size_nibbles > 4 && bits == 0) {
22943d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov            return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE);
230a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka          }
231a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka          s->meta_block_remaining_len |= (int)(bits << (i * 4));
232a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        }
233a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        s->substate_metablock_header =
234a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka            BROTLI_STATE_METABLOCK_HEADER_UNCOMPRESSED;
235a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        /* No break, transit to the next state. */
236a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka
237a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka      case BROTLI_STATE_METABLOCK_HEADER_UNCOMPRESSED:
23892e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov        if (!s->is_last_metablock) {
239a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka          if (!BrotliSafeReadBits(br, 1, &bits)) {
24043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov            return BROTLI_DECODER_NEEDS_MORE_INPUT;
241a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka          }
242801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov          s->is_uncompressed = bits ? 1 : 0;
243a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        }
244a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        ++s->meta_block_remaining_len;
245a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
24643d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov        return BROTLI_DECODER_SUCCESS;
247a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka
248a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka      case BROTLI_STATE_METABLOCK_HEADER_RESERVED:
249a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        if (!BrotliSafeReadBits(br, 1, &bits)) {
25043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov          return BROTLI_DECODER_NEEDS_MORE_INPUT;
251a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        }
252a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        if (bits != 0) {
25343d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov          return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_RESERVED);
254a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        }
255a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_BYTES;
256a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        /* No break, transit to the next state. */
257a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka
258a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka      case BROTLI_STATE_METABLOCK_HEADER_BYTES:
259a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        if (!BrotliSafeReadBits(br, 2, &bits)) {
26043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov          return BROTLI_DECODER_NEEDS_MORE_INPUT;
261a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        }
262a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        if (bits == 0) {
263a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
26443d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov          return BROTLI_DECODER_SUCCESS;
265a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        }
266a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        s->size_nibbles = (uint8_t)bits;
267a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_METADATA;
268a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        /* No break, transit to the next state. */
269a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka
270a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka      case BROTLI_STATE_METABLOCK_HEADER_METADATA:
271a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        i = s->loop_counter;
272f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov        for (; i < (int)s->size_nibbles; ++i) {
273a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka          if (!BrotliSafeReadBits(br, 8, &bits)) {
274a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka            s->loop_counter = i;
27543d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov            return BROTLI_DECODER_NEEDS_MORE_INPUT;
276a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka          }
277a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka          if (i + 1 == s->size_nibbles && s->size_nibbles > 1 && bits == 0) {
27843d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov            return BROTLI_FAILURE(
27943d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov                BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE);
280a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka          }
281a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka          s->meta_block_remaining_len |= (int)(bits << (i * 8));
282a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        }
28392e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov        ++s->meta_block_remaining_len;
28492e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
28543d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov        return BROTLI_DECODER_SUCCESS;
286a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka
287a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka      default:
28843d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov        return
28943d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov            BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);
29028b1f7a6b1d26ac9d47f31caa05e11b76f1723e1Zoltan Szabadka    }
2918d7081f2d06ba8b2c48ce9ebeddce25258525bc0Zoltan Szabadka  }
2928f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka}
2938f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka
294c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov/* Decodes the Huffman code.
295c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov   This method doesn't read data from the bit reader, BUT drops the amount of
296c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov   bits that correspond to the decoded symbol.
297c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov   bits MUST contain at least 15 (BROTLI_HUFFMAN_MAX_CODE_LENGTH) valid bits. */
298c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikovstatic BROTLI_INLINE uint32_t DecodeSymbol(uint32_t bits,
299c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov                                           const HuffmanCode* table,
300c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov                                           BrotliBitReader* br) {
301c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  table += bits & HUFFMAN_TABLE_MASK;
302db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne  if (table->bits > HUFFMAN_TABLE_BITS) {
303bacc734997f12ffa7002366ea2dffd5ef7e6a136Zoltan Szabadka    uint32_t nbits = table->bits - HUFFMAN_TABLE_BITS;
30494cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne    BrotliDropBits(br, HUFFMAN_TABLE_BITS);
3050454ab4ec0cfe0dee125269a5ee065f7774d6a9dZoltan Szabadka    table += table->value;
306c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    table += (bits >> HUFFMAN_TABLE_BITS) & BitMask(nbits);
3070454ab4ec0cfe0dee125269a5ee065f7774d6a9dZoltan Szabadka  }
30894cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne  BrotliDropBits(br, table->bits);
3090454ab4ec0cfe0dee125269a5ee065f7774d6a9dZoltan Szabadka  return table->value;
3108f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka}
3118f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka
312c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov/* Reads and decodes the next Huffman code from bit-stream.
313c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov   This method peeks 16 bits of input and drops 0 - 15 of them. */
314c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikovstatic BROTLI_INLINE uint32_t ReadSymbol(const HuffmanCode* table,
315c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov                                         BrotliBitReader* br) {
316c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  return DecodeSymbol(BrotliGet16BitsUnmasked(br), table, br);
317c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov}
318c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
319c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov/* Same as DecodeSymbol, but it is known that there is less than 15 bits of
320c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov   input are currently available. */
32143d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BROTLI_NOINLINE BROTLI_BOOL SafeDecodeSymbol(
32243d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    const HuffmanCode* table, BrotliBitReader* br, uint32_t* result) {
323c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  uint32_t val;
324c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  uint32_t available_bits = BrotliGetAvailableBits(br);
325c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (available_bits == 0) {
326c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    if (table->bits == 0) {
327c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      *result = table->value;
32843d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      return BROTLI_TRUE;
329c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    }
33043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    return BROTLI_FALSE; /* No valid bits at all. */
331c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
332c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  val = (uint32_t)BrotliGetBitsUnmasked(br);
333c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  table += val & HUFFMAN_TABLE_MASK;
334c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (table->bits <= HUFFMAN_TABLE_BITS) {
335c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    if (table->bits <= available_bits) {
336c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      BrotliDropBits(br, table->bits);
337c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      *result = table->value;
33843d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      return BROTLI_TRUE;
339c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    } else {
34043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      return BROTLI_FALSE; /* Not enough bits for the first level. */
341c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    }
342c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
343c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (available_bits <= HUFFMAN_TABLE_BITS) {
34443d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    return BROTLI_FALSE; /* Not enough bits to move to the second level. */
345c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
346c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
347c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  /* Speculatively drop HUFFMAN_TABLE_BITS. */
348c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  val = (val & BitMask(table->bits)) >> HUFFMAN_TABLE_BITS;
349c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  available_bits -= HUFFMAN_TABLE_BITS;
350c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  table += table->value + val;
351c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (available_bits < table->bits) {
35243d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    return BROTLI_FALSE; /* Not enough bits for the second level. */
353c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
354c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
355c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  BrotliDropBits(br, HUFFMAN_TABLE_BITS + table->bits);
356c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  *result = table->value;
35743d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  return BROTLI_TRUE;
358c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov}
359c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
36043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BROTLI_INLINE BROTLI_BOOL SafeReadSymbol(
36143d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    const HuffmanCode* table, BrotliBitReader* br, uint32_t* result) {
362c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  uint32_t val;
36369982c25f155e6b5c72782f2c5590ead1b06aa61Eugene Kliuchnikov  if (BROTLI_PREDICT_TRUE(BrotliSafeGetBits(br, 15, &val))) {
364c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    *result = DecodeSymbol(val, table, br);
36543d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    return BROTLI_TRUE;
366c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
367c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  return SafeDecodeSymbol(table, br, result);
368c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov}
369c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
370a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka/* Makes a look-up in first level Huffman table. Peeks 8 bits. */
371c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikovstatic BROTLI_INLINE void PreloadSymbol(int safe,
372c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov                                        const HuffmanCode* table,
37394cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne                                        BrotliBitReader* br,
374bacc734997f12ffa7002366ea2dffd5ef7e6a136Zoltan Szabadka                                        uint32_t* bits,
375bacc734997f12ffa7002366ea2dffd5ef7e6a136Zoltan Szabadka                                        uint32_t* value) {
376c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (safe) {
377c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    return;
378c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
379db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne  table += BrotliGetBits(br, HUFFMAN_TABLE_BITS);
38094cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne  *bits = table->bits;
38194cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne  *value = table->value;
38294cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne}
38394cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne
384a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka/* Decodes the next Huffman code using data prepared by PreloadSymbol.
385a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka   Reads 0 - 15 bits. Also peeks 8 following bits. */
386bacc734997f12ffa7002366ea2dffd5ef7e6a136Zoltan Szabadkastatic BROTLI_INLINE uint32_t ReadPreloadedSymbol(const HuffmanCode* table,
38794cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne                                                  BrotliBitReader* br,
388bacc734997f12ffa7002366ea2dffd5ef7e6a136Zoltan Szabadka                                                  uint32_t* bits,
389bacc734997f12ffa7002366ea2dffd5ef7e6a136Zoltan Szabadka                                                  uint32_t* value) {
390bacc734997f12ffa7002366ea2dffd5ef7e6a136Zoltan Szabadka  uint32_t result = *value;
39169982c25f155e6b5c72782f2c5590ead1b06aa61Eugene Kliuchnikov  if (BROTLI_PREDICT_FALSE(*bits > HUFFMAN_TABLE_BITS)) {
392c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    uint32_t val = BrotliGet16BitsUnmasked(br);
39394cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne    const HuffmanCode* ext = table + (val & HUFFMAN_TABLE_MASK) + *value;
394bacc734997f12ffa7002366ea2dffd5ef7e6a136Zoltan Szabadka    uint32_t mask = BitMask((*bits - HUFFMAN_TABLE_BITS));
39594cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne    BrotliDropBits(br, HUFFMAN_TABLE_BITS);
396bacc734997f12ffa7002366ea2dffd5ef7e6a136Zoltan Szabadka    ext += (val >> HUFFMAN_TABLE_BITS) & mask;
39794cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne    BrotliDropBits(br, ext->bits);
39894cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne    result = ext->value;
39994cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne  } else {
400c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    BrotliDropBits(br, *bits);
40160c24c0c2d226fb542b7b7641e3fbd8677f4caf4Zoltan Szabadka  }
402c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  PreloadSymbol(0, table, br, bits, value);
40394cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne  return result;
4048f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka}
4058f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka
406bacc734997f12ffa7002366ea2dffd5ef7e6a136Zoltan Szabadkastatic BROTLI_INLINE uint32_t Log2Floor(uint32_t x) {
407bacc734997f12ffa7002366ea2dffd5ef7e6a136Zoltan Szabadka  uint32_t result = 0;
4080cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka  while (x) {
4090cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka    x >>= 1;
4100cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka    ++result;
4110cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka  }
4120cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka  return result;
4130cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka}
4140cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka
415c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov/* Reads (s->symbol + 1) symbols.
416c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov   Totally 1..4 symbols are read, 1..10 bits each.
417c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov   The list of symbols MUST NOT contain duplicates.
418c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov */
41943d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BrotliDecoderErrorCode ReadSimpleHuffmanSymbols(
42043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    uint32_t alphabet_size, BrotliDecoderState* s) {
421c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  /* max_bits == 1..10; symbol == 0..3; 1..40 bits will be read. */
422c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  BrotliBitReader* br = &s->br;
423c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  uint32_t max_bits = Log2Floor(alphabet_size - 1);
424c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  uint32_t i = s->sub_loop_counter;
425c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  uint32_t num_symbols = s->symbol;
426c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  while (i <= num_symbols) {
427c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    uint32_t v;
42869982c25f155e6b5c72782f2c5590ead1b06aa61Eugene Kliuchnikov    if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, max_bits, &v))) {
429c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      s->sub_loop_counter = i;
430c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      s->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_READ;
43143d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      return BROTLI_DECODER_NEEDS_MORE_INPUT;
432c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    }
433c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    if (v >= alphabet_size) {
43443d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      return
43543d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov          BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET);
436c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    }
437c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    s->symbols_lists_array[i] = (uint16_t)v;
438c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    BROTLI_LOG_UINT(s->symbols_lists_array[i]);
439c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    ++i;
440c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
441c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
442c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  for (i = 0; i < num_symbols; ++i) {
443c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    uint32_t k = i + 1;
444c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    for (; k <= num_symbols; ++k) {
445c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      if (s->symbols_lists_array[i] == s->symbols_lists_array[k]) {
44643d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME);
447c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      }
448c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    }
449c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
450c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
45143d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  return BROTLI_DECODER_SUCCESS;
452c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov}
453c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
454c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov/* Process single decoded symbol code length:
455c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    A) reset the repeat variable
456c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    B) remember code length (if it is not 0)
457e9b278ac6e097beb763e8a46eeafcaa3f6f63f18Eugene Kliuchnikov    C) extend corresponding index-chain
458e9b278ac6e097beb763e8a46eeafcaa3f6f63f18Eugene Kliuchnikov    D) reduce the Huffman space
459c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    E) update the histogram
460c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov */
461c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikovstatic BROTLI_INLINE void ProcessSingleCodeLength(uint32_t code_len,
462c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    uint32_t* symbol, uint32_t* repeat, uint32_t* space,
463c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    uint32_t* prev_code_len, uint16_t* symbol_lists,
464c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    uint16_t* code_length_histo, int* next_symbol) {
465c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  *repeat = 0;
466c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (code_len != 0) { /* code_len == 1..15 */
467c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    symbol_lists[next_symbol[code_len]] = (uint16_t)(*symbol);
468c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    next_symbol[code_len] = (int)(*symbol);
469c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    *prev_code_len = code_len;
470c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    *space -= 32768U >> code_len;
471c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    code_length_histo[code_len]++;
47223934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov    BROTLI_LOG(("[ReadHuffmanCode] code_length[%d] = %d\n", *symbol, code_len));
473c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
474c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  (*symbol)++;
475c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov}
476c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
477c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov/* Process repeated symbol code length.
478c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    A) Check if it is the extension of previous repeat sequence; if the decoded
479028291865dbc2f92bb114dd082f5ff78c907a875Eugene Kliuchnikov       value is not BROTLI_REPEAT_PREVIOUS_CODE_LENGTH, then it is a new
480028291865dbc2f92bb114dd082f5ff78c907a875Eugene Kliuchnikov       symbol-skip
481c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    B) Update repeat variable
482e9b278ac6e097beb763e8a46eeafcaa3f6f63f18Eugene Kliuchnikov    C) Check if operation is feasible (fits alphabet)
483c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    D) For each symbol do the same operations as in ProcessSingleCodeLength
484c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
485028291865dbc2f92bb114dd082f5ff78c907a875Eugene Kliuchnikov   PRECONDITION: code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH or
486028291865dbc2f92bb114dd082f5ff78c907a875Eugene Kliuchnikov                 code_len == BROTLI_REPEAT_ZERO_CODE_LENGTH
487c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov */
488c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikovstatic BROTLI_INLINE void ProcessRepeatedCodeLength(uint32_t code_len,
489c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    uint32_t repeat_delta, uint32_t alphabet_size, uint32_t* symbol,
490c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    uint32_t* repeat, uint32_t* space, uint32_t* prev_code_len,
491c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    uint32_t* repeat_code_len, uint16_t* symbol_lists,
492c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    uint16_t* code_length_histo, int* next_symbol) {
493c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  uint32_t old_repeat;
494028291865dbc2f92bb114dd082f5ff78c907a875Eugene Kliuchnikov  uint32_t extra_bits = 3;  /* for BROTLI_REPEAT_ZERO_CODE_LENGTH */
495028291865dbc2f92bb114dd082f5ff78c907a875Eugene Kliuchnikov  uint32_t new_len = 0;  /* for BROTLI_REPEAT_ZERO_CODE_LENGTH */
496028291865dbc2f92bb114dd082f5ff78c907a875Eugene Kliuchnikov  if (code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
497c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    new_len = *prev_code_len;
498028291865dbc2f92bb114dd082f5ff78c907a875Eugene Kliuchnikov    extra_bits = 2;
499c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
500c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (*repeat_code_len != new_len) {
501c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    *repeat = 0;
502c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    *repeat_code_len = new_len;
503c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
504c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  old_repeat = *repeat;
505c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (*repeat > 0) {
506c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    *repeat -= 2;
507028291865dbc2f92bb114dd082f5ff78c907a875Eugene Kliuchnikov    *repeat <<= extra_bits;
508c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
509c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  *repeat += repeat_delta + 3U;
510c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  repeat_delta = *repeat - old_repeat;
511c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (*symbol + repeat_delta > alphabet_size) {
512e7e3849835e17ebb842ad02b51e1fb0c5e11b47cEugene Kliuchnikov    BROTLI_DUMP();
513c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    *symbol = alphabet_size;
514c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    *space = 0xFFFFF;
515c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    return;
516c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
51792e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov  BROTLI_LOG(("[ReadHuffmanCode] code_length[%d..%d] = %d\n",
51892e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov              *symbol, *symbol + repeat_delta - 1, *repeat_code_len));
519c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (*repeat_code_len != 0) {
520c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    unsigned last = *symbol + repeat_delta;
521c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    int next = next_symbol[*repeat_code_len];
522c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    do {
523c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      symbol_lists[next] = (uint16_t)*symbol;
524c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      next = (int)*symbol;
525c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    } while (++(*symbol) != last);
526c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    next_symbol[*repeat_code_len] = next;
527c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    *space -= repeat_delta << (15 - *repeat_code_len);
52823934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov    code_length_histo[*repeat_code_len] =
52923934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov        (uint16_t)(code_length_histo[*repeat_code_len] + repeat_delta);
530c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  } else {
531c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    *symbol += repeat_delta;
532c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
533c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov}
534c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
535c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov/* Reads and decodes symbol codelengths. */
53643d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BrotliDecoderErrorCode ReadSymbolCodeLengths(
53743d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    uint32_t alphabet_size, BrotliDecoderState* s) {
538c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  BrotliBitReader* br = &s->br;
539c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  uint32_t symbol = s->symbol;
540c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  uint32_t repeat = s->repeat;
541c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  uint32_t space = s->space;
542c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  uint32_t prev_code_len = s->prev_code_len;
543c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  uint32_t repeat_code_len = s->repeat_code_len;
544c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  uint16_t* symbol_lists = s->symbol_lists;
545c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  uint16_t* code_length_histo = s->code_length_histo;
546c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  int* next_symbol = s->next_symbol;
547c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (!BrotliWarmupBitReader(br)) {
54843d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    return BROTLI_DECODER_NEEDS_MORE_INPUT;
549c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
550c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  while (symbol < alphabet_size && space > 0) {
551c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    const HuffmanCode* p = s->table;
552c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    uint32_t code_len;
553c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    if (!BrotliCheckInputAmount(br, BROTLI_SHORT_FILL_BIT_WINDOW_READ)) {
554c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      s->symbol = symbol;
555c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      s->repeat = repeat;
556c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      s->prev_code_len = prev_code_len;
557c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      s->repeat_code_len = repeat_code_len;
558c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      s->space = space;
55943d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      return BROTLI_DECODER_NEEDS_MORE_INPUT;
560c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    }
561c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    BrotliFillBitWindow16(br);
562c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    p += BrotliGetBitsUnmasked(br) &
563c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        BitMask(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH);
56423934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov    BrotliDropBits(br, p->bits);  /* Use 1..5 bits */
56523934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov    code_len = p->value;  /* code_len == 0..17 */
566028291865dbc2f92bb114dd082f5ff78c907a875Eugene Kliuchnikov    if (code_len < BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
567c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      ProcessSingleCodeLength(code_len, &symbol, &repeat, &space,
568c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          &prev_code_len, symbol_lists, code_length_histo, next_symbol);
569c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    } else { /* code_len == 16..17, extra_bits == 2..3 */
570028291865dbc2f92bb114dd082f5ff78c907a875Eugene Kliuchnikov      uint32_t extra_bits =
571028291865dbc2f92bb114dd082f5ff78c907a875Eugene Kliuchnikov          (code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) ? 2 : 3;
572c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      uint32_t repeat_delta =
573028291865dbc2f92bb114dd082f5ff78c907a875Eugene Kliuchnikov          (uint32_t)BrotliGetBitsUnmasked(br) & BitMask(extra_bits);
574028291865dbc2f92bb114dd082f5ff78c907a875Eugene Kliuchnikov      BrotliDropBits(br, extra_bits);
575c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      ProcessRepeatedCodeLength(code_len, repeat_delta, alphabet_size,
576c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          &symbol, &repeat, &space, &prev_code_len, &repeat_code_len,
577c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          symbol_lists, code_length_histo, next_symbol);
578c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    }
579c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
580c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  s->space = space;
58143d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  return BROTLI_DECODER_SUCCESS;
582c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov}
583c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
58443d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BrotliDecoderErrorCode SafeReadSymbolCodeLengths(
58543d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    uint32_t alphabet_size, BrotliDecoderState* s) {
586c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  BrotliBitReader* br = &s->br;
58721c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov  BROTLI_BOOL get_byte = BROTLI_FALSE;
588c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  while (s->symbol < alphabet_size && s->space > 0) {
589c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    const HuffmanCode* p = s->table;
590c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    uint32_t code_len;
59121c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov    uint32_t available_bits;
592c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    uint32_t bits = 0;
59321c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov    if (get_byte && !BrotliPullByte(br)) return BROTLI_DECODER_NEEDS_MORE_INPUT;
59421c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov    get_byte = BROTLI_FALSE;
59521c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov    available_bits = BrotliGetAvailableBits(br);
596c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    if (available_bits != 0) {
597c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      bits = (uint32_t)BrotliGetBitsUnmasked(br);
598c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    }
599c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    p += bits & BitMask(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH);
60021c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov    if (p->bits > available_bits) {
60121c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov      get_byte = BROTLI_TRUE;
60221c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov      continue;
60321c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov    }
604c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    code_len = p->value; /* code_len == 0..17 */
605028291865dbc2f92bb114dd082f5ff78c907a875Eugene Kliuchnikov    if (code_len < BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
606c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      BrotliDropBits(br, p->bits);
607c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      ProcessSingleCodeLength(code_len, &s->symbol, &s->repeat, &s->space,
608c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          &s->prev_code_len, s->symbol_lists, s->code_length_histo,
609c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          s->next_symbol);
610c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    } else { /* code_len == 16..17, extra_bits == 2..3 */
611c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      uint32_t extra_bits = code_len - 14U;
612c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      uint32_t repeat_delta = (bits >> p->bits) & BitMask(extra_bits);
61321c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov      if (available_bits < p->bits + extra_bits) {
61421c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        get_byte = BROTLI_TRUE;
61521c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        continue;
61621c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov      }
617c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      BrotliDropBits(br, p->bits + extra_bits);
618c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      ProcessRepeatedCodeLength(code_len, repeat_delta, alphabet_size,
619c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          &s->symbol, &s->repeat, &s->space, &s->prev_code_len,
620c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          &s->repeat_code_len, s->symbol_lists, s->code_length_histo,
621c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          s->next_symbol);
622c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    }
623c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
62443d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  return BROTLI_DECODER_SUCCESS;
625c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov}
626c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
627c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov/* Reads and decodes 15..18 codes using static prefix code.
628c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov   Each code is 2..4 bits long. In total 30..72 bits are used. */
62943d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BrotliDecoderErrorCode ReadCodeLengthCodeLengths(BrotliDecoderState* s) {
630c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  BrotliBitReader* br = &s->br;
631c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  uint32_t num_codes = s->repeat;
632c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  unsigned space = s->space;
633c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  uint32_t i = s->sub_loop_counter;
634028291865dbc2f92bb114dd082f5ff78c907a875Eugene Kliuchnikov  for (; i < BROTLI_CODE_LENGTH_CODES; ++i) {
635c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    const uint8_t code_len_idx = kCodeLengthCodeOrder[i];
636c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    uint32_t ix;
637c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    uint32_t v;
63869982c25f155e6b5c72782f2c5590ead1b06aa61Eugene Kliuchnikov    if (BROTLI_PREDICT_FALSE(!BrotliSafeGetBits(br, 4, &ix))) {
639c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      uint32_t available_bits = BrotliGetAvailableBits(br);
640c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      if (available_bits != 0) {
641c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        ix = BrotliGetBitsUnmasked(br) & 0xF;
642c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      } else {
643c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        ix = 0;
644c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      }
645c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      if (kCodeLengthPrefixLength[ix] > available_bits) {
646c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        s->sub_loop_counter = i;
647c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        s->repeat = num_codes;
648c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        s->space = space;
649c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        s->substate_huffman = BROTLI_STATE_HUFFMAN_COMPLEX;
65043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov        return BROTLI_DECODER_NEEDS_MORE_INPUT;
651c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      }
652c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    }
653c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    v = kCodeLengthPrefixValue[ix];
654c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    BrotliDropBits(br, kCodeLengthPrefixLength[ix]);
655c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    s->code_length_code_lengths[code_len_idx] = (uint8_t)v;
656c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    BROTLI_LOG_ARRAY_INDEX(s->code_length_code_lengths, code_len_idx);
657c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    if (v != 0) {
658c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      space = space - (32U >> v);
659c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      ++num_codes;
660c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      ++s->code_length_histo[v];
661c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      if (space - 1U >= 32U) {
662c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        /* space is 0 or wrapped around */
663c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        break;
664c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      }
665c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    }
666c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
667c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (!(num_codes == 1 || space == 0)) {
66843d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_CL_SPACE);
669c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
67043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  return BROTLI_DECODER_SUCCESS;
671c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov}
672c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
673a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka/* Decodes the Huffman tables.
674a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka   There are 2 scenarios:
6750cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka    A) Huffman code contains only few symbols (1..4). Those symbols are read
676a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka       directly; their code lengths are defined by the number of symbols.
6770cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka       For this scenario 4 - 45 bits will be read.
678a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka
679a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka    B) 2-phase decoding:
680a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka    B.1) Small Huffman table is decoded; it is specified with code lengths
6810cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka         encoded with predefined entropy code. 32 - 74 bits are used.
682a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka    B.2) Decoded table is used to decode code lengths of symbols in resulting
683a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka         Huffman table. In worst case 3520 bits are read.
684a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka*/
68543d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BrotliDecoderErrorCode ReadHuffmanCode(uint32_t alphabet_size,
68643d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov                                              HuffmanCode* table,
68743d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov                                              uint32_t* opt_table_size,
68843d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov                                              BrotliDecoderState* s) {
6898270250b40f9979f61d92542739b5a786914c922Lode Vandevenne  BrotliBitReader* br = &s->br;
6904b2fd00e2472e9a07de6e7cfe3c8353783fbe6bcZoltan Szabadka  /* Unnecessary masking, but might be good for safety. */
6914b2fd00e2472e9a07de6e7cfe3c8353783fbe6bcZoltan Szabadka  alphabet_size &= 0x3ff;
6928270250b40f9979f61d92542739b5a786914c922Lode Vandevenne  /* State machine */
69321c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov  for (;;) {
69421c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov    switch (s->substate_huffman) {
69521c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov      case BROTLI_STATE_HUFFMAN_NONE:
69621c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        if (!BrotliSafeReadBits(br, 2, &s->sub_loop_counter)) {
69721c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov          return BROTLI_DECODER_NEEDS_MORE_INPUT;
69821c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        }
69921c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        BROTLI_LOG_UINT(s->sub_loop_counter);
70021c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        /* The value is used as follows:
70121c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov           1 for simple code;
70221c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov           0 for no skipping, 2 skips 2 code lengths, 3 skips 3 code lengths */
70321c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        if (s->sub_loop_counter != 1) {
70421c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov          s->space = 32;
70521c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov          s->repeat = 0; /* num_codes */
70621c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov          memset(&s->code_length_histo[0], 0, sizeof(s->code_length_histo[0]) *
70721c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov              (BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH + 1));
70821c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov          memset(&s->code_length_code_lengths[0], 0,
70921c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov              sizeof(s->code_length_code_lengths));
71021c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov          s->substate_huffman = BROTLI_STATE_HUFFMAN_COMPLEX;
71121c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov          continue;
71221c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        }
71321c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        /* No break, transit to the next state. */
714c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
71521c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov      case BROTLI_STATE_HUFFMAN_SIMPLE_SIZE:
71621c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        /* Read symbols, codes & code lengths directly. */
71721c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        if (!BrotliSafeReadBits(br, 2, &s->symbol)) { /* num_symbols */
71821c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov          s->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_SIZE;
71943d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov          return BROTLI_DECODER_NEEDS_MORE_INPUT;
7200cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka        }
72121c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        s->sub_loop_counter = 0;
72221c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        /* No break, transit to the next state. */
72321c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov      case BROTLI_STATE_HUFFMAN_SIMPLE_READ: {
72421c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        BrotliDecoderErrorCode result =
72521c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov            ReadSimpleHuffmanSymbols(alphabet_size, s);
72621c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        if (result != BROTLI_DECODER_SUCCESS) {
72721c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov          return result;
72821c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        }
72921c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        /* No break, transit to the next state. */
730c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      }
73121c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov      case BROTLI_STATE_HUFFMAN_SIMPLE_BUILD: {
73221c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        uint32_t table_size;
73321c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        if (s->symbol == 3) {
73421c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov          uint32_t bits;
73521c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov          if (!BrotliSafeReadBits(br, 1, &bits)) {
73621c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov            s->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_BUILD;
73721c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov            return BROTLI_DECODER_NEEDS_MORE_INPUT;
73821c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov          }
73921c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov          s->symbol += bits;
74021c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        }
74121c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        BROTLI_LOG_UINT(s->symbol);
74221c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        table_size = BrotliBuildSimpleHuffmanTable(
74321c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov            table, HUFFMAN_TABLE_BITS, s->symbols_lists_array, s->symbol);
74421c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        if (opt_table_size) {
74521c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov          *opt_table_size = table_size;
74621c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        }
74721c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        s->substate_huffman = BROTLI_STATE_HUFFMAN_NONE;
74821c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        return BROTLI_DECODER_SUCCESS;
749c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      }
750c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
75121c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov      /* Decode Huffman-coded code lengths. */
75221c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov      case BROTLI_STATE_HUFFMAN_COMPLEX: {
75321c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        uint32_t i;
75421c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        BrotliDecoderErrorCode result = ReadCodeLengthCodeLengths(s);
75521c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        if (result != BROTLI_DECODER_SUCCESS) {
75621c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov          return result;
75721c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        }
75821c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        BrotliBuildCodeLengthsHuffmanTable(s->table,
75921c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov                                           s->code_length_code_lengths,
76021c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov                                           s->code_length_histo);
76121c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        memset(&s->code_length_histo[0], 0, sizeof(s->code_length_histo));
76221c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        for (i = 0; i <= BROTLI_HUFFMAN_MAX_CODE_LENGTH; ++i) {
76321c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov          s->next_symbol[i] = (int)i - (BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1);
76421c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov          s->symbol_lists[s->next_symbol[i]] = 0xFFFF;
76521c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        }
766db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne
76721c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        s->symbol = 0;
76821c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        s->prev_code_len = BROTLI_INITIAL_REPEATED_CODE_LENGTH;
76921c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        s->repeat = 0;
77021c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        s->repeat_code_len = 0;
77121c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        s->space = 32768;
77221c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        s->substate_huffman = BROTLI_STATE_HUFFMAN_LENGTH_SYMBOLS;
77321c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        /* No break, transit to the next state. */
7740cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka      }
77521c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov      case BROTLI_STATE_HUFFMAN_LENGTH_SYMBOLS: {
77621c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        uint32_t table_size;
77721c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        BrotliDecoderErrorCode result = ReadSymbolCodeLengths(alphabet_size, s);
77821c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
77921c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov          result = SafeReadSymbolCodeLengths(alphabet_size, s);
78021c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        }
78121c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        if (result != BROTLI_DECODER_SUCCESS) {
78221c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov          return result;
78321c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        }
784c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
78521c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        if (s->space != 0) {
78621c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov          BROTLI_LOG(("[ReadHuffmanCode] space = %d\n", s->space));
78721c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov          return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE);
78821c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        }
78921c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        table_size = BrotliBuildHuffmanTable(
79021c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov            table, HUFFMAN_TABLE_BITS, s->symbol_lists, s->code_length_histo);
79121c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        if (opt_table_size) {
79221c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov          *opt_table_size = table_size;
79321c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        }
79421c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        s->substate_huffman = BROTLI_STATE_HUFFMAN_NONE;
79521c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        return BROTLI_DECODER_SUCCESS;
796db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne      }
7970cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka
79821c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov      default:
79921c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        return
80021c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov            BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);
80121c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov    }
802db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne  }
8038f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka}
8048f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka
805a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka/* Decodes a block length by reading 3..39 bits. */
806c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikovstatic BROTLI_INLINE uint32_t ReadBlockLength(const HuffmanCode* table,
807c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov                                              BrotliBitReader* br) {
808bacc734997f12ffa7002366ea2dffd5ef7e6a136Zoltan Szabadka  uint32_t code;
809bacc734997f12ffa7002366ea2dffd5ef7e6a136Zoltan Szabadka  uint32_t nbits;
8100454ab4ec0cfe0dee125269a5ee065f7774d6a9dZoltan Szabadka  code = ReadSymbol(table, br);
811a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka  nbits = kBlockLengthPrefixCode[code].nbits; /* nbits == 2..24 */
812c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  return kBlockLengthPrefixCode[code].offset + BrotliReadBits(br, nbits);
813c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov}
814c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
815c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov/* WARNING: if state is not BROTLI_STATE_READ_BLOCK_LENGTH_NONE, then
816c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov   reading can't be continued with ReadBlockLength. */
81743d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BROTLI_INLINE BROTLI_BOOL SafeReadBlockLength(
81843d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    BrotliDecoderState* s, uint32_t* result, const HuffmanCode* table,
81943d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    BrotliBitReader* br) {
820c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  uint32_t index;
821c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (s->substate_read_block_length == BROTLI_STATE_READ_BLOCK_LENGTH_NONE) {
822c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    if (!SafeReadSymbol(table, br, &index)) {
82343d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      return BROTLI_FALSE;
824c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    }
825c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  } else {
826c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    index = s->block_length_index;
827c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
828c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  {
829c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    uint32_t bits;
830c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    uint32_t nbits = kBlockLengthPrefixCode[index].nbits; /* nbits == 2..24 */
831c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    if (!BrotliSafeReadBits(br, nbits, &bits)) {
832c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      s->block_length_index = index;
833c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_SUFFIX;
83443d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      return BROTLI_FALSE;
835c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    }
836c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    *result = kBlockLengthPrefixCode[index].offset + bits;
837c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_NONE;
83843d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    return BROTLI_TRUE;
839c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
8408f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka}
8418f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka
84294cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne/* Transform:
84394cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne    1) initialize list L with values 0, 1,... 255
84494cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne    2) For each input element X:
84594cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne    2.1) let Y = L[X]
84694cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne    2.2) remove X-th element from L
84794cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne    2.3) prepend Y to L
84894cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne    2.4) append Y to output
84994cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne
85094cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne   In most cases max(Y) <= 7, so most of L remains intact.
85194cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne   To reduce the cost of initialization, we reuse L, remember the upper bound
85294cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne   of Y values, and reinitialize only first elements in L.
85394cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne
85421ac39f7c8ca61c855be0bc38900abe7b5a0f67fMarcin Karpinski   Most of input values are 0 and 1. To reduce number of branches, we replace
85594cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne   inner for loop with do-while.
85694cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne */
85743d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BROTLI_NOINLINE void InverseMoveToFrontTransform(
85843d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    uint8_t* v, uint32_t v_len, BrotliDecoderState* state) {
85994cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne  /* Reinitialize elements that could have been changed. */
860b1db6f149a9779fe5182bfdfd555fa6d3ecc246dEugene Kliuchnikov  uint32_t i = 1;
861bacc734997f12ffa7002366ea2dffd5ef7e6a136Zoltan Szabadka  uint32_t upper_bound = state->mtf_upper_bound;
862b1db6f149a9779fe5182bfdfd555fa6d3ecc246dEugene Kliuchnikov  uint32_t* mtf = &state->mtf[1];  /* Make mtf[-1] addressable. */
863b1db6f149a9779fe5182bfdfd555fa6d3ecc246dEugene Kliuchnikov  uint8_t* mtf_u8 = (uint8_t*)mtf;
86494cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne  /* Load endian-aware constant. */
86594cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne  const uint8_t b0123[4] = {0, 1, 2, 3};
86694cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne  uint32_t pattern;
86794cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne  memcpy(&pattern, &b0123, 4);
86894cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne
86994cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne  /* Initialize list using 4 consequent values pattern. */
870b1db6f149a9779fe5182bfdfd555fa6d3ecc246dEugene Kliuchnikov  mtf[0] = pattern;
87194cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne  do {
87294cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne    pattern += 0x04040404; /* Advance all 4 values by 4. */
873b1db6f149a9779fe5182bfdfd555fa6d3ecc246dEugene Kliuchnikov    mtf[i] = pattern;
874b1db6f149a9779fe5182bfdfd555fa6d3ecc246dEugene Kliuchnikov    i++;
87594cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne  } while (i <= upper_bound);
87694cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne
87794cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne  /* Transform the input. */
87894cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne  upper_bound = 0;
8798f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka  for (i = 0; i < v_len; ++i) {
88094cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne    int index = v[i];
881b1db6f149a9779fe5182bfdfd555fa6d3ecc246dEugene Kliuchnikov    uint8_t value = mtf_u8[index];
882bacc734997f12ffa7002366ea2dffd5ef7e6a136Zoltan Szabadka    upper_bound |= v[i];
883a81f2ef4336d4cc39fdf0b00aedcf1b0fc9c19d3Zoltan Szabadka    v[i] = value;
884b1db6f149a9779fe5182bfdfd555fa6d3ecc246dEugene Kliuchnikov    mtf_u8[-1] = value;
88594cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne    do {
88694cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne      index--;
887b1db6f149a9779fe5182bfdfd555fa6d3ecc246dEugene Kliuchnikov      mtf_u8[index + 1] = mtf_u8[index];
888043a99e07e335d2b027369bd91ab593b40f08164Eugene Kliuchnikov    } while (index >= 0);
8898f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka  }
89094cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne  /* Remember amount of elements to be reinitialized. */
891b1db6f149a9779fe5182bfdfd555fa6d3ecc246dEugene Kliuchnikov  state->mtf_upper_bound = upper_bound >> 2;
89294cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne}
89394cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne
894a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka/* Decodes a series of Huffman table using ReadHuffmanCode function. */
89543d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BrotliDecoderErrorCode HuffmanTreeGroupDecode(
89643d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    HuffmanTreeGroup* group, BrotliDecoderState* s) {
897a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka  if (s->substate_tree_group != BROTLI_STATE_TREE_GROUP_LOOP) {
898db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne    s->next = group->codes;
899db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne    s->htree_index = 0;
900a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka    s->substate_tree_group = BROTLI_STATE_TREE_GROUP_LOOP;
9018f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka  }
902db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne  while (s->htree_index < group->num_htrees) {
903bacc734997f12ffa7002366ea2dffd5ef7e6a136Zoltan Szabadka    uint32_t table_size;
90443d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    BrotliDecoderErrorCode result =
905db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne        ReadHuffmanCode(group->alphabet_size, s->next, &table_size, s);
90643d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    if (result != BROTLI_DECODER_SUCCESS) return result;
907db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne    group->htrees[s->htree_index] = s->next;
908db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne    s->next += table_size;
909db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne    ++s->htree_index;
910db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne  }
911a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka  s->substate_tree_group = BROTLI_STATE_TREE_GROUP_NONE;
91243d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  return BROTLI_DECODER_SUCCESS;
9138f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka}
9148f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka
915a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka/* Decodes a context map.
916a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka   Decoding is done in 4 phases:
917a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka    1) Read auxiliary information (6..16 bits) and allocate memory.
918a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka       In case of trivial context map, decoding is finished at this phase.
919a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka    2) Decode Huffman table using ReadHuffmanCode function.
920a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka       This table will be used for reading context map items.
921a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka    3) Read context map items; "0" values could be run-length encoded.
922a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka    4) Optionally, apply InverseMoveToFront transform to the resulting map.
923a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka */
92443d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BrotliDecoderErrorCode DecodeContextMap(uint32_t context_map_size,
92543d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov                                               uint32_t* num_htrees,
92643d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov                                               uint8_t** context_map_arg,
927d2b17196f2dd9db25a84a626b59c14455f813dddEugene Kliuchnikov                                               BrotliDecoderState* s) {
9288270250b40f9979f61d92542739b5a786914c922Lode Vandevenne  BrotliBitReader* br = &s->br;
92943d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
9308f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka
93123934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov  switch ((int)s->substate_context_map) {
932a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka    case BROTLI_STATE_CONTEXT_MAP_NONE:
9330cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka      result = DecodeVarLenUint8(s, br, num_htrees);
93443d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      if (result != BROTLI_DECODER_SUCCESS) {
9350cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka        return result;
9368270250b40f9979f61d92542739b5a786914c922Lode Vandevenne      }
9370cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka      (*num_htrees)++;
9388270250b40f9979f61d92542739b5a786914c922Lode Vandevenne      s->context_index = 0;
9398270250b40f9979f61d92542739b5a786914c922Lode Vandevenne      BROTLI_LOG_UINT(context_map_size);
9408270250b40f9979f61d92542739b5a786914c922Lode Vandevenne      BROTLI_LOG_UINT(*num_htrees);
941b69381227199fceef25e564f68fec730d53b34c4Eugene Klyuchnikov      *context_map_arg = (uint8_t*)BROTLI_ALLOC(s, (size_t)context_map_size);
942db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne      if (*context_map_arg == 0) {
94343d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP);
9448270250b40f9979f61d92542739b5a786914c922Lode Vandevenne      }
9458270250b40f9979f61d92542739b5a786914c922Lode Vandevenne      if (*num_htrees <= 1) {
946db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne        memset(*context_map_arg, 0, (size_t)context_map_size);
94743d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov        return BROTLI_DECODER_SUCCESS;
9488270250b40f9979f61d92542739b5a786914c922Lode Vandevenne      }
9490cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka      s->substate_context_map = BROTLI_STATE_CONTEXT_MAP_READ_PREFIX;
9500cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka      /* No break, continue to next state. */
951c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    case BROTLI_STATE_CONTEXT_MAP_READ_PREFIX: {
952c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      uint32_t bits;
953c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      /* In next stage ReadHuffmanCode uses at least 4 bits, so it is safe
954c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov         to peek 4 bits ahead. */
955c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      if (!BrotliSafeGetBits(br, 5, &bits)) {
95643d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov        return BROTLI_DECODER_NEEDS_MORE_INPUT;
9570cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka      }
958e9b278ac6e097beb763e8a46eeafcaa3f6f63f18Eugene Kliuchnikov      if ((bits & 1) != 0) { /* Use RLE for zeros. */
959c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        s->max_run_length_prefix = (bits >> 1) + 1;
960c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        BrotliDropBits(br, 5);
961f9e5a2d9f26186c96d518a310b4378c169f1c0c2Lode Vandevenne      } else {
962f9e5a2d9f26186c96d518a310b4378c169f1c0c2Lode Vandevenne        s->max_run_length_prefix = 0;
963c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        BrotliDropBits(br, 1);
9648270250b40f9979f61d92542739b5a786914c922Lode Vandevenne      }
9650cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka      BROTLI_LOG_UINT(s->max_run_length_prefix);
966a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka      s->substate_context_map = BROTLI_STATE_CONTEXT_MAP_HUFFMAN;
9678270250b40f9979f61d92542739b5a786914c922Lode Vandevenne      /* No break, continue to next state. */
968c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    }
969a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka    case BROTLI_STATE_CONTEXT_MAP_HUFFMAN:
970f9e5a2d9f26186c96d518a310b4378c169f1c0c2Lode Vandevenne      result = ReadHuffmanCode(*num_htrees + s->max_run_length_prefix,
971f9e5a2d9f26186c96d518a310b4378c169f1c0c2Lode Vandevenne                               s->context_map_table, NULL, s);
97243d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      if (result != BROTLI_DECODER_SUCCESS) return result;
973c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      s->code = 0xFFFF;
974a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka      s->substate_context_map = BROTLI_STATE_CONTEXT_MAP_DECODE;
9758270250b40f9979f61d92542739b5a786914c922Lode Vandevenne      /* No break, continue to next state. */
976a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka    case BROTLI_STATE_CONTEXT_MAP_DECODE: {
977bacc734997f12ffa7002366ea2dffd5ef7e6a136Zoltan Szabadka      uint32_t context_index = s->context_index;
978bacc734997f12ffa7002366ea2dffd5ef7e6a136Zoltan Szabadka      uint32_t max_run_length_prefix = s->max_run_length_prefix;
979db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne      uint8_t* context_map = *context_map_arg;
980c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      uint32_t code = s->code;
98121c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov      BROTLI_BOOL skip_preamble = (code != 0xFFFF);
98221c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov      while (context_index < context_map_size || skip_preamble) {
98321c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        if (!skip_preamble) {
98421c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov          if (!SafeReadSymbol(s->context_map_table, br, &code)) {
98521c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov            s->code = 0xFFFF;
98621c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov            s->context_index = context_index;
98721c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov            return BROTLI_DECODER_NEEDS_MORE_INPUT;
98821c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov          }
98921c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov          BROTLI_LOG_UINT(code);
990c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
99121c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov          if (code == 0) {
99221c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov            context_map[context_index++] = 0;
99321c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov            continue;
99421c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov          }
99521c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov          if (code > max_run_length_prefix) {
99621c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov            context_map[context_index++] =
99721c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov                (uint8_t)(code - max_run_length_prefix);
99821c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov            continue;
99921c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov          }
100021c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        } else {
100121c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov          skip_preamble = BROTLI_FALSE;
1002c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        }
100321c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov        /* RLE sub-stage. */
1004c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        {
1005c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          uint32_t reps;
1006c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          if (!BrotliSafeReadBits(br, code, &reps)) {
1007c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov            s->code = code;
1008c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov            s->context_index = context_index;
100943d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov            return BROTLI_DECODER_NEEDS_MORE_INPUT;
1010c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          }
1011c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          reps += 1U << code;
10120cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka          BROTLI_LOG_UINT(reps);
1013db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne          if (context_index + reps > context_map_size) {
101443d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov            return
101543d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov                BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT);
10168270250b40f9979f61d92542739b5a786914c922Lode Vandevenne          }
1017db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne          do {
1018db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne            context_map[context_index++] = 0;
1019db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne          } while (--reps);
1020c6b9c7c5c82684a32931a14dc9785f6cdce8171fZoltan Szabadka        }
10218f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka      }
1022c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      /* No break, continue to next state. */
1023c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    }
1024c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    case BROTLI_STATE_CONTEXT_MAP_TRANSFORM: {
1025c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      uint32_t bits;
1026c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      if (!BrotliSafeReadBits(br, 1, &bits)) {
1027c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        s->substate_context_map = BROTLI_STATE_CONTEXT_MAP_TRANSFORM;
102843d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov        return BROTLI_DECODER_NEEDS_MORE_INPUT;
1029c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      }
1030c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      if (bits != 0) {
1031c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        InverseMoveToFrontTransform(*context_map_arg, context_map_size, s);
10328270250b40f9979f61d92542739b5a786914c922Lode Vandevenne      }
1033a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka      s->substate_context_map = BROTLI_STATE_CONTEXT_MAP_NONE;
103443d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      return BROTLI_DECODER_SUCCESS;
103594cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne    }
103692e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov    default:
103743d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      return
103843d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov          BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);
10398f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka  }
10408f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka}
10418f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka
1042e9b278ac6e097beb763e8a46eeafcaa3f6f63f18Eugene Kliuchnikov/* Decodes a command or literal and updates block type ring-buffer.
1043c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov   Reads 3..54 bits. */
104443d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BROTLI_INLINE BROTLI_BOOL DecodeBlockTypeAndLength(
104543d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    int safe, BrotliDecoderState* s, int tree_type) {
1046c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  uint32_t max_block_type = s->num_block_types[tree_type];
104792e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov  const HuffmanCode* type_tree = &s->block_type_trees[
104892e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov      tree_type * BROTLI_HUFFMAN_MAX_SIZE_258];
104992e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov  const HuffmanCode* len_tree = &s->block_len_trees[
105092e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov      tree_type * BROTLI_HUFFMAN_MAX_SIZE_26];
1051c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  BrotliBitReader* br = &s->br;
1052c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  uint32_t* ringbuffer = &s->block_type_rb[tree_type * 2];
1053c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  uint32_t block_type;
1054c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
1055c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  /* Read 0..15 + 3..39 bits */
1056c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (!safe) {
1057c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    block_type = ReadSymbol(type_tree, br);
1058c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    s->block_length[tree_type] = ReadBlockLength(len_tree, br);
1059c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  } else {
1060c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    BrotliBitReaderState memento;
1061c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    BrotliBitReaderSaveState(br, &memento);
106243d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    if (!SafeReadSymbol(type_tree, br, &block_type)) return BROTLI_FALSE;
1063c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    if (!SafeReadBlockLength(s, &s->block_length[tree_type], len_tree, br)) {
1064c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_NONE;
1065c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      BrotliBitReaderRestoreState(br, &memento);
106643d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      return BROTLI_FALSE;
1067c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    }
1068c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
1069c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
1070bacc734997f12ffa7002366ea2dffd5ef7e6a136Zoltan Szabadka  if (block_type == 1) {
107194cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne    block_type = ringbuffer[1] + 1;
1072bacc734997f12ffa7002366ea2dffd5ef7e6a136Zoltan Szabadka  } else if (block_type == 0) {
107394cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne    block_type = ringbuffer[0];
1074bacc734997f12ffa7002366ea2dffd5ef7e6a136Zoltan Szabadka  } else {
1075bacc734997f12ffa7002366ea2dffd5ef7e6a136Zoltan Szabadka    block_type -= 2;
10768f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka  }
1077d762bc6845dc1a34ece40a0e0ef673cf78112b0bZoltan Szabadka  if (block_type >= max_block_type) {
1078d762bc6845dc1a34ece40a0e0ef673cf78112b0bZoltan Szabadka    block_type -= max_block_type;
1079d762bc6845dc1a34ece40a0e0ef673cf78112b0bZoltan Szabadka  }
108094cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne  ringbuffer[0] = ringbuffer[1];
108194cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne  ringbuffer[1] = block_type;
108243d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  return BROTLI_TRUE;
10838f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka}
10848f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka
108543d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BROTLI_INLINE void DetectTrivialLiteralBlockTypes(
108643d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    BrotliDecoderState* s) {
1087755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov  size_t i;
1088755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov  for (i = 0; i < 8; ++i) s->trivial_literal_contexts[i] = 0;
1089755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov  for (i = 0; i < s->num_block_types[0]; i++) {
1090028291865dbc2f92bb114dd082f5ff78c907a875Eugene Kliuchnikov    size_t offset = i << BROTLI_LITERAL_CONTEXT_BITS;
1091755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov    size_t error = 0;
1092755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov    size_t sample = s->context_map[offset];
1093755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov    size_t j;
1094028291865dbc2f92bb114dd082f5ff78c907a875Eugene Kliuchnikov    for (j = 0; j < (1u << BROTLI_LITERAL_CONTEXT_BITS);) {
1095755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov      BROTLI_REPEAT(4, error |= s->context_map[offset + j++] ^ sample;)
1096755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov    }
1097755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov    if (error == 0) {
1098755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov      s->trivial_literal_contexts[i >> 5] |= 1u << (i & 31);
1099755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov    }
1100755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov  }
1101755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov}
1102755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov
110343d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BROTLI_INLINE void PrepareLiteralDecoding(BrotliDecoderState* s) {
1104755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov  uint8_t context_mode;
1105755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov  size_t trivial;
1106755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov  uint32_t block_type = s->block_type_rb[1];
1107028291865dbc2f92bb114dd082f5ff78c907a875Eugene Kliuchnikov  uint32_t context_offset = block_type << BROTLI_LITERAL_CONTEXT_BITS;
1108755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov  s->context_map_slice = s->context_map + context_offset;
1109755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov  trivial = s->trivial_literal_contexts[block_type >> 5];
1110755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov  s->trivial_literal_context = (trivial >> (block_type & 31)) & 1;
1111755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov  s->literal_htree = s->literal_hgroup.htrees[s->context_map_slice[0]];
1112755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov  context_mode = s->context_modes[block_type];
1113755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov  s->context_lookup1 = &kContextLookup[kContextLookupOffsets[context_mode]];
1114755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov  s->context_lookup2 = &kContextLookup[kContextLookupOffsets[context_mode + 1]];
1115755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov}
1116755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov
1117a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka/* Decodes the block type and updates the state for literal context.
1118c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov   Reads 3..54 bits. */
111943d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BROTLI_INLINE BROTLI_BOOL DecodeLiteralBlockSwitchInternal(
112043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    int safe, BrotliDecoderState* s) {
1121c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (!DecodeBlockTypeAndLength(safe, s, 0)) {
112243d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    return BROTLI_FALSE;
1123c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
1124755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov  PrepareLiteralDecoding(s);
112543d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  return BROTLI_TRUE;
1126fe6e5d1cd90a41f37430c18d06a623fffaa86487Zoltan Szabadka}
1127fe6e5d1cd90a41f37430c18d06a623fffaa86487Zoltan Szabadka
112843d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic void BROTLI_NOINLINE DecodeLiteralBlockSwitch(BrotliDecoderState* s) {
1129c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  DecodeLiteralBlockSwitchInternal(0, s);
1130c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov}
1131c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
113243d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BROTLI_BOOL BROTLI_NOINLINE SafeDecodeLiteralBlockSwitch(
113343d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    BrotliDecoderState* s) {
1134c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  return DecodeLiteralBlockSwitchInternal(1, s);
1135c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov}
1136c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
1137c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov/* Block switch for insert/copy length.
1138c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov   Reads 3..54 bits. */
113943d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BROTLI_INLINE BROTLI_BOOL DecodeCommandBlockSwitchInternal(
114043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    int safe, BrotliDecoderState* s) {
1141c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (!DecodeBlockTypeAndLength(safe, s, 1)) {
114243d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    return BROTLI_FALSE;
1143c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
1144c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  s->htree_command = s->insert_copy_hgroup.htrees[s->block_type_rb[3]];
114543d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  return BROTLI_TRUE;
1146c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov}
1147c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
114843d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic void BROTLI_NOINLINE DecodeCommandBlockSwitch(BrotliDecoderState* s) {
1149c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  DecodeCommandBlockSwitchInternal(0, s);
1150c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov}
115143d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BROTLI_BOOL BROTLI_NOINLINE SafeDecodeCommandBlockSwitch(
115243d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    BrotliDecoderState* s) {
1153c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  return DecodeCommandBlockSwitchInternal(1, s);
1154c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov}
1155c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
1156c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov/* Block switch for distance codes.
1157c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov   Reads 3..54 bits. */
115843d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BROTLI_INLINE BROTLI_BOOL DecodeDistanceBlockSwitchInternal(
115943d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    int safe, BrotliDecoderState* s) {
1160c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (!DecodeBlockTypeAndLength(safe, s, 2)) {
116143d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    return BROTLI_FALSE;
1162c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
1163028291865dbc2f92bb114dd082f5ff78c907a875Eugene Kliuchnikov  s->dist_context_map_slice = s->dist_context_map +
1164028291865dbc2f92bb114dd082f5ff78c907a875Eugene Kliuchnikov      (s->block_type_rb[5] << BROTLI_DISTANCE_CONTEXT_BITS);
1165c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  s->dist_htree_index = s->dist_context_map_slice[s->distance_context];
116643d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  return BROTLI_TRUE;
1167c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov}
1168c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
116943d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic void BROTLI_NOINLINE DecodeDistanceBlockSwitch(BrotliDecoderState* s) {
1170c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  DecodeDistanceBlockSwitchInternal(0, s);
1171c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov}
1172c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
117343d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BROTLI_BOOL BROTLI_NOINLINE SafeDecodeDistanceBlockSwitch(
117443d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    BrotliDecoderState* s) {
1175c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  return DecodeDistanceBlockSwitchInternal(1, s);
1176c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov}
1177c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
117843d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic size_t UnwrittenBytes(const BrotliDecoderState* s, BROTLI_BOOL wrap) {
117943d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  size_t pos = wrap && s->pos > s->ringbuffer_size ?
118043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      (size_t)s->ringbuffer_size : (size_t)(s->pos);
118143d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  size_t partial_pos_rb = (s->rb_roundtrips * (size_t)s->ringbuffer_size) + pos;
118243d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  return partial_pos_rb - s->partial_pos_out;
118343d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov}
118443d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov
1185f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov/* Dumps output.
1186f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov   Returns BROTLI_DECODER_NEEDS_MORE_OUTPUT only if there is more output to push
1187e9b278ac6e097beb763e8a46eeafcaa3f6f63f18Eugene Kliuchnikov   and either ring-buffer is as big as window size, or |force| is true.
1188f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov */
118943d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BrotliDecoderErrorCode BROTLI_NOINLINE WriteRingBuffer(
119043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    BrotliDecoderState* s, size_t* available_out, uint8_t** next_out,
1191f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov    size_t* total_out, BROTLI_BOOL force) {
119223934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov  uint8_t* start =
119323934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov      s->ringbuffer + (s->partial_pos_out & (size_t)s->ringbuffer_mask);
119443d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  size_t to_write = UnwrittenBytes(s, BROTLI_TRUE);
1195c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  size_t num_written = *available_out;
1196c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (num_written > to_write) {
1197c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    num_written = to_write;
1198c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
11990cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka  if (s->meta_block_remaining_len < 0) {
120043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1);
12010cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka  }
1202801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov  if (next_out && !*next_out) {
1203801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov    *next_out = start;
1204801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov  } else {
1205801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov    if (next_out) {
1206801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov      memcpy(*next_out, start, num_written);
1207801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov      *next_out += num_written;
1208801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov    }
1209801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov  }
1210c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  *available_out -= num_written;
1211c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  BROTLI_LOG_UINT(to_write);
12120cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka  BROTLI_LOG_UINT(num_written);
121392e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov  s->partial_pos_out += num_written;
1214f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov  if (total_out) *total_out = s->partial_pos_out - (size_t)s->custom_dict_size;
1215c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (num_written < to_write) {
1216f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov    if (s->ringbuffer_size == (1 << s->window_bits) || force) {
1217f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov      return BROTLI_DECODER_NEEDS_MORE_OUTPUT;
1218f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov    } else {
1219f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov      return BROTLI_DECODER_SUCCESS;
1220f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov    }
1221c6b9c7c5c82684a32931a14dc9785f6cdce8171fZoltan Szabadka  }
1222f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov  /* Wrap ring buffer only if it has reached its maximal size. */
1223f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov  if (s->ringbuffer_size == (1 << s->window_bits) &&
1224f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov      s->pos >= s->ringbuffer_size) {
1225021f6fe37df1c1629dd6ae2ebc598ee78a1c591aEugene Kliuchnikov    s->pos -= s->ringbuffer_size;
1226021f6fe37df1c1629dd6ae2ebc598ee78a1c591aEugene Kliuchnikov    s->rb_roundtrips++;
1227801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov    s->should_wrap_ringbuffer = (size_t)s->pos != 0 ? 1 : 0;
1228021f6fe37df1c1629dd6ae2ebc598ee78a1c591aEugene Kliuchnikov  }
122943d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  return BROTLI_DECODER_SUCCESS;
1230c6b9c7c5c82684a32931a14dc9785f6cdce8171fZoltan Szabadka}
1231c6b9c7c5c82684a32931a14dc9785f6cdce8171fZoltan Szabadka
1232801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikovstatic void BROTLI_NOINLINE WrapRingBuffer(BrotliDecoderState* s) {
1233801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov  if (s->should_wrap_ringbuffer) {
1234801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov    memcpy(s->ringbuffer, s->ringbuffer_end, (size_t)s->pos);
1235801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov    s->should_wrap_ringbuffer = 0;
1236801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov  }
1237801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov}
1238801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov
1239e9b278ac6e097beb763e8a46eeafcaa3f6f63f18Eugene Kliuchnikov/* Allocates ring-buffer.
124092e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov
1241e9b278ac6e097beb763e8a46eeafcaa3f6f63f18Eugene Kliuchnikov   s->ringbuffer_size MUST be updated by BrotliCalculateRingBufferSize before
1242e9b278ac6e097beb763e8a46eeafcaa3f6f63f18Eugene Kliuchnikov   this function is called.
124392e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov
1244e9b278ac6e097beb763e8a46eeafcaa3f6f63f18Eugene Kliuchnikov   Last two bytes of ring-buffer are initialized to 0, so context calculation
124592e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov   could be done uniformly for the first two and all other positions.
124692e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov
1247e9b278ac6e097beb763e8a46eeafcaa3f6f63f18Eugene Kliuchnikov   Custom dictionary, if any, is copied to the end of ring-buffer.
124892e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov*/
1249f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikovstatic BROTLI_BOOL BROTLI_NOINLINE BrotliEnsureRingBuffer(
125043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    BrotliDecoderState* s) {
125192e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov  /* We need the slack region for the following reasons:
125292e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov      - doing up to two 16-byte copies for fast backward copying
125392e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov      - inserting transformed dictionary word (5 prefix + 24 base + 8 suffix) */
125492e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov  static const int kRingBufferWriteAheadSlack = 42;
1255f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov  uint8_t* old_ringbuffer = s->ringbuffer;
1256f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov  if (s->ringbuffer_size == s->new_ringbuffer_size) {
1257f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov    return BROTLI_TRUE;
1258f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov  }
1259f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov
1260f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov  s->ringbuffer = (uint8_t*)BROTLI_ALLOC(s, (size_t)(s->new_ringbuffer_size +
126192e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov      kRingBufferWriteAheadSlack));
126292e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov  if (s->ringbuffer == 0) {
1263f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov    /* Restore previous value. */
1264f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov    s->ringbuffer = old_ringbuffer;
126543d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    return BROTLI_FALSE;
126692e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov  }
1267f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov  s->ringbuffer[s->new_ringbuffer_size - 2] = 0;
1268f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov  s->ringbuffer[s->new_ringbuffer_size - 1] = 0;
126992e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov
1270f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov  if (!old_ringbuffer) {
1271f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov    if (s->custom_dict) {
1272f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov      memcpy(s->ringbuffer, s->custom_dict, (size_t)s->custom_dict_size);
1273f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov      s->partial_pos_out = (size_t)s->custom_dict_size;
1274f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov      s->pos = s->custom_dict_size;
1275f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov    }
1276f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov  } else {
1277f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov    memcpy(s->ringbuffer, old_ringbuffer, (size_t)s->pos);
1278f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov    BROTLI_FREE(s, old_ringbuffer);
127992e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov  }
128092e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov
1281f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov  s->ringbuffer_size = s->new_ringbuffer_size;
1282f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov  s->ringbuffer_mask = s->new_ringbuffer_size - 1;
1283f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov  s->ringbuffer_end = s->ringbuffer + s->ringbuffer_size;
1284f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov
128543d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  return BROTLI_TRUE;
128692e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov}
128792e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov
128843d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BrotliDecoderErrorCode BROTLI_NOINLINE CopyUncompressedBlockToOutput(
1289c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    size_t* available_out, uint8_t** next_out, size_t* total_out,
129043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    BrotliDecoderState* s) {
129192e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov  /* TODO: avoid allocation for single uncompressed block. */
1292f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov  if (!BrotliEnsureRingBuffer(s)) {
129343d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1);
129492e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov  }
129592e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov
12968270250b40f9979f61d92542739b5a786914c922Lode Vandevenne  /* State machine */
12978270250b40f9979f61d92542739b5a786914c922Lode Vandevenne  for (;;) {
1298c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    switch (s->substate_uncompressed) {
1299c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      case BROTLI_STATE_UNCOMPRESSED_NONE: {
1300c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        int nbytes = (int)BrotliGetRemainingBytes(&s->br);
1301c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        if (nbytes > s->meta_block_remaining_len) {
1302c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          nbytes = s->meta_block_remaining_len;
1303c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        }
1304c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        if (s->pos + nbytes > s->ringbuffer_size) {
1305c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          nbytes = s->ringbuffer_size - s->pos;
13068270250b40f9979f61d92542739b5a786914c922Lode Vandevenne        }
1307e9b278ac6e097beb763e8a46eeafcaa3f6f63f18Eugene Kliuchnikov        /* Copy remaining bytes from s->br.buf_ to ring-buffer. */
1308c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        BrotliCopyBytes(&s->ringbuffer[s->pos], &s->br, (size_t)nbytes);
1309c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        s->pos += nbytes;
131003c4ab5967d978ca3f58e8d2a4199826dc563fceZoltan Szabadka        s->meta_block_remaining_len -= nbytes;
1311f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov        if (s->pos < 1 << s->window_bits) {
1312c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          if (s->meta_block_remaining_len == 0) {
131343d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov            return BROTLI_DECODER_SUCCESS;
13148270250b40f9979f61d92542739b5a786914c922Lode Vandevenne          }
131543d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov          return BROTLI_DECODER_NEEDS_MORE_INPUT;
131664c261113f3ac1036815426225dd19a229a56cb3Zoltan Szabadka        }
1317c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        s->substate_uncompressed = BROTLI_STATE_UNCOMPRESSED_WRITE;
1318c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        /* No break, continue to next state */
1319c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      }
1320c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      case BROTLI_STATE_UNCOMPRESSED_WRITE: {
1321f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov        BrotliDecoderErrorCode result;
1322f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov        result = WriteRingBuffer(
1323f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov            s, available_out, next_out, total_out, BROTLI_FALSE);
132443d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov        if (result != BROTLI_DECODER_SUCCESS) {
132594cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne          return result;
132694cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne        }
1327f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov        if (s->ringbuffer_size == 1 << s->window_bits) {
1328f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov          s->max_distance = s->max_backward_distance;
1329f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov        }
1330a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        s->substate_uncompressed = BROTLI_STATE_UNCOMPRESSED_NONE;
1331c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        break;
1332c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      }
13330454ab4ec0cfe0dee125269a5ee065f7774d6a9dZoltan Szabadka    }
13340454ab4ec0cfe0dee125269a5ee065f7774d6a9dZoltan Szabadka  }
1335e7e3849835e17ebb842ad02b51e1fb0c5e11b47cEugene Kliuchnikov  BROTLI_DCHECK(0);  /* Unreachable */
13360454ab4ec0cfe0dee125269a5ee065f7774d6a9dZoltan Szabadka}
13370454ab4ec0cfe0dee125269a5ee065f7774d6a9dZoltan Szabadka
133892e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov/* Calculates the smallest feasible ring buffer.
1339a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka
1340f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov   If we know the data size is small, do not allocate more ring buffer
1341a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka   size than needed to reduce memory usage.
1342a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka
134392e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov   When this method is called, metablock size and flags MUST be decoded.
1344a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka*/
134543d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic void BROTLI_NOINLINE BrotliCalculateRingBufferSize(
1346f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov    BrotliDecoderState* s) {
1347e7e3849835e17ebb842ad02b51e1fb0c5e11b47cEugene Kliuchnikov  int window_size = 1 << s->window_bits;
1348f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov  int new_ringbuffer_size = window_size;
1349a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka  /* We need at least 2 bytes of ring buffer size to get the last two
1350a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka     bytes for context from there */
1351f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov  int min_size = s->ringbuffer_size ? s->ringbuffer_size : 1024;
1352f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov  int output_size;
1353f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov
1354e9b278ac6e097beb763e8a46eeafcaa3f6f63f18Eugene Kliuchnikov  /* If maximum is already reached, no further extension is retired. */
1355f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov  if (s->ringbuffer_size == window_size) {
1356f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov    return;
1357f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov  }
1358f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov
1359f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov  /* Metadata blocks does not touch ring buffer. */
1360f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov  if (s->is_metadata) {
1361f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov    return;
1362c6b9c7c5c82684a32931a14dc9785f6cdce8171fZoltan Szabadka  }
1363a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka
1364f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov  if (!s->ringbuffer) {
1365e9b278ac6e097beb763e8a46eeafcaa3f6f63f18Eugene Kliuchnikov    /* Custom dictionary counts as a "virtual" output. */
1366f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov    output_size = s->custom_dict_size;
1367f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov  } else {
1368f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov    output_size = s->pos;
1369f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov  }
1370f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov  output_size += s->meta_block_remaining_len;
1371f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov  min_size = min_size < output_size ? output_size : min_size;
1372f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov
1373f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov  while ((new_ringbuffer_size >> 1) >= min_size) {
1374f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov    new_ringbuffer_size >>= 1;
1375f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov  }
1376f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov
1377f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov  s->new_ringbuffer_size = new_ringbuffer_size;
13788f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka}
13798f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka
1380c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov/* Reads 1..256 2-bit context modes. */
138143d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BrotliDecoderErrorCode ReadContextModes(BrotliDecoderState* s) {
1382c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  BrotliBitReader* br = &s->br;
1383c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  int i = s->loop_counter;
1384c6b9c7c5c82684a32931a14dc9785f6cdce8171fZoltan Szabadka
138565b4baf0b8ea098600377229a2892bbf7ad8958eeustas  while (i < (int)s->num_block_types[0]) {
1386c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    uint32_t bits;
1387c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    if (!BrotliSafeReadBits(br, 2, &bits)) {
1388c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      s->loop_counter = i;
138943d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      return BROTLI_DECODER_NEEDS_MORE_INPUT;
1390c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    }
1391c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    s->context_modes[i] = (uint8_t)(bits << 1);
1392c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    BROTLI_LOG_ARRAY_INDEX(s->context_modes, i);
1393c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    i++;
13948270250b40f9979f61d92542739b5a786914c922Lode Vandevenne  }
139543d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  return BROTLI_DECODER_SUCCESS;
13968270250b40f9979f61d92542739b5a786914c922Lode Vandevenne}
13978270250b40f9979f61d92542739b5a786914c922Lode Vandevenne
139843d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BROTLI_INLINE void TakeDistanceFromRingBuffer(BrotliDecoderState* s) {
1399c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (s->distance_code == 0) {
1400c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    --s->dist_rb_idx;
1401c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    s->distance_code = s->dist_rb[s->dist_rb_idx & 3];
14020749d9ca8b8ec139db57a804fceee474643a896cEugene Kliuchnikov    /* Compensate double distance-ring-buffer roll for dictionary items. */
14030749d9ca8b8ec139db57a804fceee474643a896cEugene Kliuchnikov    s->distance_context = 1;
1404c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  } else {
1405c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    int distance_code = s->distance_code << 1;
1406c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    /* kDistanceShortCodeIndexOffset has 2-bit values from LSB: */
1407c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    /* 3, 2, 1, 0, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2 */
1408c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    const uint32_t kDistanceShortCodeIndexOffset = 0xaaafff1b;
1409c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    /* kDistanceShortCodeValueOffset has 2-bit values from LSB: */
1410c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    /*-0, 0,-0, 0,-1, 1,-2, 2,-3, 3,-1, 1,-2, 2,-3, 3 */
1411c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    const uint32_t kDistanceShortCodeValueOffset = 0xfa5fa500;
1412c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    int v = (s->dist_rb_idx +
1413c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        (int)(kDistanceShortCodeIndexOffset >> distance_code)) & 0x3;
1414c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    s->distance_code = s->dist_rb[v];
1415c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    v = (int)(kDistanceShortCodeValueOffset >> distance_code) & 0x3;
1416c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    if ((distance_code & 0x3) != 0) {
1417c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      s->distance_code += v;
1418c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    } else {
1419c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      s->distance_code -= v;
1420c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      if (s->distance_code <= 0) {
1421c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        /* A huge distance will cause a BROTLI_FAILURE() soon. */
1422c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        /* This is a little faster than failing here. */
1423c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        s->distance_code = 0x0fffffff;
1424c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      }
1425c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    }
1426c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
1427c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov}
1428c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
142943d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BROTLI_INLINE BROTLI_BOOL SafeReadBits(
1430c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    BrotliBitReader* const br, uint32_t n_bits, uint32_t* val) {
1431c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (n_bits != 0) {
1432c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    return BrotliSafeReadBits(br, n_bits, val);
1433c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  } else {
1434c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    *val = 0;
143543d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    return BROTLI_TRUE;
1436c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
1437c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov}
1438c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
1439c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov/* Precondition: s->distance_code < 0 */
144043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BROTLI_INLINE BROTLI_BOOL ReadDistanceInternal(
144143d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    int safe, BrotliDecoderState* s, BrotliBitReader* br) {
1442c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  int distval;
1443c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  BrotliBitReaderState memento;
1444c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  HuffmanCode* distance_tree = s->distance_hgroup.htrees[s->dist_htree_index];
1445c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (!safe) {
1446c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    s->distance_code = (int)ReadSymbol(distance_tree, br);
1447c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  } else {
1448c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    uint32_t code;
1449c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    BrotliBitReaderSaveState(br, &memento);
1450c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    if (!SafeReadSymbol(distance_tree, br, &code)) {
145143d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      return BROTLI_FALSE;
1452c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    }
1453c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    s->distance_code = (int)code;
1454c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
1455c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  /* Convert the distance code to the actual distance by possibly */
1456c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  /* looking up past distances from the s->ringbuffer. */
14579fa1ad5a91d69158e37ccff1c770f84c972a940aEugene Kliuchnikov  s->distance_context = 0;
1458c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if ((s->distance_code & ~0xf) == 0) {
1459c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    TakeDistanceFromRingBuffer(s);
1460c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    --s->block_length[2];
146143d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    return BROTLI_TRUE;
1462c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
1463c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  distval = s->distance_code - (int)s->num_direct_distance_codes;
1464c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (distval >= 0) {
1465c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    uint32_t nbits;
1466c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    int postfix;
1467c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    int offset;
1468c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    if (!safe && (s->distance_postfix_bits == 0)) {
1469c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      nbits = ((uint32_t)distval >> 1) + 1;
1470c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      offset = ((2 + (distval & 1)) << nbits) - 4;
147123934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov      s->distance_code = (int)s->num_direct_distance_codes + offset +
147223934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov                         (int)BrotliReadBits(br, nbits);
1473c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    } else {
1474c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      /* This branch also works well when s->distance_postfix_bits == 0 */
1475c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      uint32_t bits;
1476c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      postfix = distval & s->distance_postfix_mask;
1477c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      distval >>= s->distance_postfix_bits;
1478c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      nbits = ((uint32_t)distval >> 1) + 1;
1479c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      if (safe) {
1480c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        if (!SafeReadBits(br, nbits, &bits)) {
1481c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          s->distance_code = -1; /* Restore precondition. */
1482c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          BrotliBitReaderRestoreState(br, &memento);
148343d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov          return BROTLI_FALSE;
1484c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        }
1485c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      } else {
1486c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        bits = BrotliReadBits(br, nbits);
1487c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      }
1488c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      offset = ((2 + (distval & 1)) << nbits) - 4;
1489c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      s->distance_code = (int)s->num_direct_distance_codes +
1490c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          ((offset + (int)bits) << s->distance_postfix_bits) + postfix;
1491c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    }
1492c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
1493028291865dbc2f92bb114dd082f5ff78c907a875Eugene Kliuchnikov  s->distance_code = s->distance_code - BROTLI_NUM_DISTANCE_SHORT_CODES + 1;
1494c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  --s->block_length[2];
149543d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  return BROTLI_TRUE;
1496c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov}
1497c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
149843d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BROTLI_INLINE void ReadDistance(
149943d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    BrotliDecoderState* s, BrotliBitReader* br) {
1500c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  ReadDistanceInternal(0, s, br);
1501c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov}
1502c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
150343d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BROTLI_INLINE BROTLI_BOOL SafeReadDistance(
150443d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    BrotliDecoderState* s, BrotliBitReader* br) {
1505c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  return ReadDistanceInternal(1, s, br);
1506c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov}
1507c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
150843d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BROTLI_INLINE BROTLI_BOOL ReadCommandInternal(
150943d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    int safe, BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
1510c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  uint32_t cmd_code;
1511c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  uint32_t insert_len_extra = 0;
1512c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  uint32_t copy_length;
1513c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  CmdLutElement v;
1514c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  BrotliBitReaderState memento;
1515c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (!safe) {
1516c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    cmd_code = ReadSymbol(s->htree_command, br);
1517c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  } else {
1518c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    BrotliBitReaderSaveState(br, &memento);
1519c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    if (!SafeReadSymbol(s->htree_command, br, &cmd_code)) {
152043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      return BROTLI_FALSE;
1521c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    }
1522c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
1523c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  v = kCmdLut[cmd_code];
1524c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  s->distance_code = v.distance_code;
1525c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  s->distance_context = v.context;
1526c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  s->dist_htree_index = s->dist_context_map_slice[s->distance_context];
1527c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  *insert_length = v.insert_len_offset;
1528c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (!safe) {
152969982c25f155e6b5c72782f2c5590ead1b06aa61Eugene Kliuchnikov    if (BROTLI_PREDICT_FALSE(v.insert_len_extra_bits != 0)) {
1530c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      insert_len_extra = BrotliReadBits(br, v.insert_len_extra_bits);
1531c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    }
1532c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    copy_length = BrotliReadBits(br, v.copy_len_extra_bits);
1533c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  } else {
1534c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    if (!SafeReadBits(br, v.insert_len_extra_bits, &insert_len_extra) ||
1535c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        !SafeReadBits(br, v.copy_len_extra_bits, &copy_length)) {
1536c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      BrotliBitReaderRestoreState(br, &memento);
153743d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      return BROTLI_FALSE;
1538c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    }
1539c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
1540c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  s->copy_length = (int)copy_length + v.copy_len_offset;
1541c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  --s->block_length[1];
1542c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  *insert_length += (int)insert_len_extra;
154343d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  return BROTLI_TRUE;
1544c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov}
1545c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
154643d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BROTLI_INLINE void ReadCommand(
154743d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
1548c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  ReadCommandInternal(0, s, br, insert_length);
1549c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov}
1550c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
155143d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BROTLI_INLINE BROTLI_BOOL SafeReadCommand(
155243d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
1553c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  return ReadCommandInternal(1, s, br, insert_length);
1554c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov}
1555c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
155643d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BROTLI_INLINE BROTLI_BOOL CheckInputAmount(
155743d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    int safe, BrotliBitReader* const br, size_t num) {
1558c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (safe) {
155943d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    return BROTLI_TRUE;
1560c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
1561c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  return BrotliCheckInputAmount(br, num);
1562c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov}
1563c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
156443d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov#define BROTLI_SAFE(METHOD)                       \
156543d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  {                                               \
156643d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    if (safe) {                                   \
156743d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      if (!Safe##METHOD) {                        \
156843d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov        result = BROTLI_DECODER_NEEDS_MORE_INPUT; \
156943d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov        goto saveStateAndReturn;                  \
157043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      }                                           \
157143d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    } else {                                      \
157243d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      METHOD;                                     \
157343d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    }                                             \
157423934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov  }
1575c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
157643d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BROTLI_INLINE BrotliDecoderErrorCode ProcessCommandsInternal(
157743d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    int safe, BrotliDecoderState* s) {
1578c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  int pos = s->pos;
1579c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  int i = s->loop_counter;
158043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
1581c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  BrotliBitReader* br = &s->br;
1582c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
158392e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov  if (!CheckInputAmount(safe, br, 28)) {
158443d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1585c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    goto saveStateAndReturn;
1586c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
158792e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov  if (!safe) {
158892e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov    BROTLI_UNUSED(BrotliWarmupBitReader(br));
158992e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov  }
1590c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
1591c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  /* Jump into state machine. */
1592c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (s->state == BROTLI_STATE_COMMAND_BEGIN) {
1593c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    goto CommandBegin;
1594c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  } else if (s->state == BROTLI_STATE_COMMAND_INNER) {
1595c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    goto CommandInner;
1596c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  } else if (s->state == BROTLI_STATE_COMMAND_POST_DECODE_LITERALS) {
1597c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    goto CommandPostDecodeLiterals;
1598c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  } else if (s->state == BROTLI_STATE_COMMAND_POST_WRAP_COPY) {
1599c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    goto CommandPostWrapCopy;
1600c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  } else {
160143d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);
1602c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
1603c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
1604c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene KlyuchnikovCommandBegin:
1605c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (safe) {
1606c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    s->state = BROTLI_STATE_COMMAND_BEGIN;
1607c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
1608c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (!CheckInputAmount(safe, br, 28)) { /* 156 bits + 7 bytes */
1609c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    s->state = BROTLI_STATE_COMMAND_BEGIN;
161043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1611c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    goto saveStateAndReturn;
1612c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
161369982c25f155e6b5c72782f2c5590ead1b06aa61Eugene Kliuchnikov  if (BROTLI_PREDICT_FALSE(s->block_length[1] == 0)) {
1614c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    BROTLI_SAFE(DecodeCommandBlockSwitch(s));
1615c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    goto CommandBegin;
1616c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
1617c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  /* Read the insert/copy length in the command */
1618c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  BROTLI_SAFE(ReadCommand(s, br, &i));
161992e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov  BROTLI_LOG(("[ProcessCommandsInternal] pos = %d insert = %d copy = %d\n",
162092e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov              pos, i, s->copy_length));
1621c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (i == 0) {
1622c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    goto CommandPostDecodeLiterals;
1623c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
1624c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  s->meta_block_remaining_len -= i;
1625c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
1626c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene KlyuchnikovCommandInner:
1627c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (safe) {
1628c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    s->state = BROTLI_STATE_COMMAND_INNER;
1629c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
1630c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  /* Read the literals in the command */
1631c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (s->trivial_literal_context) {
1632c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    uint32_t bits;
1633c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    uint32_t value;
1634c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    PreloadSymbol(safe, s->literal_htree, br, &bits, &value);
1635c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    do {
1636c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      if (!CheckInputAmount(safe, br, 28)) { /* 162 bits + 7 bytes */
1637c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        s->state = BROTLI_STATE_COMMAND_INNER;
163843d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov        result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1639c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        goto saveStateAndReturn;
1640c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      }
164169982c25f155e6b5c72782f2c5590ead1b06aa61Eugene Kliuchnikov      if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
1642c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        BROTLI_SAFE(DecodeLiteralBlockSwitch(s));
1643c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        PreloadSymbol(safe, s->literal_htree, br, &bits, &value);
1644755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov        if (!s->trivial_literal_context) goto CommandInner;
1645c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      }
1646c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      if (!safe) {
164723934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov        s->ringbuffer[pos] =
164823934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov            (uint8_t)ReadPreloadedSymbol(s->literal_htree, br, &bits, &value);
1649c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      } else {
1650c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        uint32_t literal;
1651c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        if (!SafeReadSymbol(s->literal_htree, br, &literal)) {
165243d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1653c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          goto saveStateAndReturn;
1654c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        }
1655c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        s->ringbuffer[pos] = (uint8_t)literal;
1656c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      }
1657c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      --s->block_length[0];
1658c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos);
1659c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      ++pos;
166069982c25f155e6b5c72782f2c5590ead1b06aa61Eugene Kliuchnikov      if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) {
1661c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        s->state = BROTLI_STATE_COMMAND_INNER_WRITE;
1662c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        --i;
1663c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        goto saveStateAndReturn;
1664c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      }
1665c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    } while (--i != 0);
1666c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  } else {
1667c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    uint8_t p1 = s->ringbuffer[(pos - 1) & s->ringbuffer_mask];
1668c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    uint8_t p2 = s->ringbuffer[(pos - 2) & s->ringbuffer_mask];
1669c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    do {
1670c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      const HuffmanCode* hc;
1671c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      uint8_t context;
1672c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      if (!CheckInputAmount(safe, br, 28)) { /* 162 bits + 7 bytes */
1673c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        s->state = BROTLI_STATE_COMMAND_INNER;
167443d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov        result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1675c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        goto saveStateAndReturn;
1676c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      }
167769982c25f155e6b5c72782f2c5590ead1b06aa61Eugene Kliuchnikov      if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
1678c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        BROTLI_SAFE(DecodeLiteralBlockSwitch(s));
1679755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov        if (s->trivial_literal_context) goto CommandInner;
1680c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      }
1681c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      context = s->context_lookup1[p1] | s->context_lookup2[p2];
1682c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      BROTLI_LOG_UINT(context);
1683c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      hc = s->literal_hgroup.htrees[s->context_map_slice[context]];
1684c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      p2 = p1;
1685c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      if (!safe) {
1686c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        p1 = (uint8_t)ReadSymbol(hc, br);
1687c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      } else {
1688c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        uint32_t literal;
1689c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        if (!SafeReadSymbol(hc, br, &literal)) {
169043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1691c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          goto saveStateAndReturn;
1692c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        }
1693c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        p1 = (uint8_t)literal;
1694c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      }
1695c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      s->ringbuffer[pos] = p1;
1696c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      --s->block_length[0];
1697c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      BROTLI_LOG_UINT(s->context_map_slice[context]);
1698c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos & s->ringbuffer_mask);
1699c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      ++pos;
170069982c25f155e6b5c72782f2c5590ead1b06aa61Eugene Kliuchnikov      if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) {
1701c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        s->state = BROTLI_STATE_COMMAND_INNER_WRITE;
1702c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        --i;
1703c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        goto saveStateAndReturn;
1704c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      }
1705c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    } while (--i != 0);
1706c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
170792e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov  BROTLI_LOG_UINT(s->meta_block_remaining_len);
170869982c25f155e6b5c72782f2c5590ead1b06aa61Eugene Kliuchnikov  if (BROTLI_PREDICT_FALSE(s->meta_block_remaining_len <= 0)) {
1709c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    s->state = BROTLI_STATE_METABLOCK_DONE;
1710c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    goto saveStateAndReturn;
1711c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
1712c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
1713c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene KlyuchnikovCommandPostDecodeLiterals:
1714c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (safe) {
1715c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    s->state = BROTLI_STATE_COMMAND_POST_DECODE_LITERALS;
1716c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
1717c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (s->distance_code >= 0) {
171821c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov    /* Implicit distance case. */
17199fa1ad5a91d69158e37ccff1c770f84c972a940aEugene Kliuchnikov    s->distance_context = s->distance_code ? 0 : 1;
1720c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    --s->dist_rb_idx;
1721c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    s->distance_code = s->dist_rb[s->dist_rb_idx & 3];
172221c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov  } else {
172321c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov    /* Read distance code in the command, unless it was implicitly zero. */
172421c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov    if (BROTLI_PREDICT_FALSE(s->block_length[2] == 0)) {
172521c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov      BROTLI_SAFE(DecodeDistanceBlockSwitch(s));
172621c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov    }
172721c118ba776a1e93a30397bdd66636a6f3c0b06bEugene Kliuchnikov    BROTLI_SAFE(ReadDistance(s, br));
1728c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
172992e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov  BROTLI_LOG(("[ProcessCommandsInternal] pos = %d distance = %d\n",
173092e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov              pos, s->distance_code));
1731c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (s->max_distance != s->max_backward_distance) {
1732f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov    s->max_distance =
1733f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov        (pos < s->max_backward_distance) ? pos : s->max_backward_distance;
1734c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
1735c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  i = s->copy_length;
1736c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  /* Apply copy of LZ77 back-reference, or static dictionary reference if
1737c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  the distance is larger than the max LZ77 distance */
1738c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (s->distance_code > s->max_distance) {
1739e9b278ac6e097beb763e8a46eeafcaa3f6f63f18Eugene Kliuchnikov    if (i >= BROTLI_MIN_DICTIONARY_WORD_LENGTH &&
1740e9b278ac6e097beb763e8a46eeafcaa3f6f63f18Eugene Kliuchnikov        i <= BROTLI_MAX_DICTIONARY_WORD_LENGTH) {
1741cdca91b6f59dd7632985667d2cd585ab68937b48Eugene Kliuchnikov      int offset = (int)s->dictionary->offsets_by_length[i];
1742c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      int word_id = s->distance_code - s->max_distance - 1;
1743cdca91b6f59dd7632985667d2cd585ab68937b48Eugene Kliuchnikov      uint32_t shift = s->dictionary->size_bits_by_length[i];
1744c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      int mask = (int)BitMask(shift);
1745c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      int word_idx = word_id & mask;
1746c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      int transform_idx = word_id >> shift;
17470749d9ca8b8ec139db57a804fceee474643a896cEugene Kliuchnikov      /* Compensate double distance-ring-buffer roll. */
17480749d9ca8b8ec139db57a804fceee474643a896cEugene Kliuchnikov      s->dist_rb_idx += s->distance_context;
1749c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      offset += word_idx * i;
1750c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      if (transform_idx < kNumTransforms) {
1751cdca91b6f59dd7632985667d2cd585ab68937b48Eugene Kliuchnikov        const uint8_t* word = &s->dictionary->data[offset];
1752c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        int len = i;
1753c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        if (transform_idx == 0) {
1754c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          memcpy(&s->ringbuffer[pos], word, (size_t)len);
1755ccabf811ffcef087d9f10cf417b05271c2067a82Eugene Kliuchnikov          BROTLI_LOG(("[ProcessCommandsInternal] dictionary word: [%.*s]\n",
1756ccabf811ffcef087d9f10cf417b05271c2067a82Eugene Kliuchnikov                      len, word));
1757c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        } else {
1758c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          len = TransformDictionaryWord(
1759c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov              &s->ringbuffer[pos], word, len, transform_idx);
1760ccabf811ffcef087d9f10cf417b05271c2067a82Eugene Kliuchnikov          BROTLI_LOG(("[ProcessCommandsInternal] dictionary word: [%.*s],"
1761ccabf811ffcef087d9f10cf417b05271c2067a82Eugene Kliuchnikov                      " transform_idx = %d, transformed: [%.*s]\n",
1762ccabf811ffcef087d9f10cf417b05271c2067a82Eugene Kliuchnikov                      i, word, transform_idx, len, &s->ringbuffer[pos]));
1763c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        }
1764c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        pos += len;
1765c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        s->meta_block_remaining_len -= len;
1766c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        if (pos >= s->ringbuffer_size) {
1767c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          /*s->partial_pos_rb += (size_t)s->ringbuffer_size;*/
1768c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          s->state = BROTLI_STATE_COMMAND_POST_WRITE_1;
1769c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          goto saveStateAndReturn;
1770c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        }
1771c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      } else {
1772c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
177323934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov            "len: %d bytes left: %d\n",
177423934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov            pos, s->distance_code, i, s->meta_block_remaining_len));
177543d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_TRANSFORM);
1776c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      }
1777c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    } else {
1778c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
177923934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov          "len: %d bytes left: %d\n",
178023934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov          pos, s->distance_code, i, s->meta_block_remaining_len));
178143d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_DICTIONARY);
1782c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    }
1783c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  } else {
178423934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov    int src_start = (pos - s->distance_code) & s->ringbuffer_mask;
178568f5bbda76f9b36717a4f9aa91a9d5d88ba584d3eustas    uint8_t* copy_dst = &s->ringbuffer[pos];
178623934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov    uint8_t* copy_src = &s->ringbuffer[src_start];
178723934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov    int dst_end = pos + i;
178823934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov    int src_end = src_start + i;
1789c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    /* update the recent distances cache */
1790c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    s->dist_rb[s->dist_rb_idx & 3] = s->distance_code;
1791c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    ++s->dist_rb_idx;
1792c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    s->meta_block_remaining_len -= i;
1793e9b278ac6e097beb763e8a46eeafcaa3f6f63f18Eugene Kliuchnikov    /* There are 32+ bytes of slack in the ring-buffer allocation.
1794c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov       Also, we have 16 short codes, that make these 16 bytes irrelevant
1795e9b278ac6e097beb763e8a46eeafcaa3f6f63f18Eugene Kliuchnikov       in the ring-buffer. Let's copy over them as a first guess.
1796c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov     */
1797c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    memmove16(copy_dst, copy_src);
179823934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov    if (src_end > pos && dst_end > src_start) {
179923934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov      /* Regions intersect. */
180023934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov      goto CommandPostWrapCopy;
180123934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov    }
180223934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov    if (dst_end >= s->ringbuffer_size || src_end >= s->ringbuffer_size) {
180323934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov      /* At least one region wraps. */
180423934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov      goto CommandPostWrapCopy;
1805c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    }
1806c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    pos += i;
1807c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    if (i > 16) {
1808c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      if (i > 32) {
1809c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        memcpy(copy_dst + 16, copy_src + 16, (size_t)(i - 16));
1810c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      } else {
1811c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        /* This branch covers about 45% cases.
1812c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov           Fixed size short copy allows more compiler optimizations. */
1813c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        memmove16(copy_dst + 16, copy_src + 16);
1814c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      }
1815c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    }
1816c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
181792e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov  BROTLI_LOG_UINT(s->meta_block_remaining_len);
1818c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (s->meta_block_remaining_len <= 0) {
1819c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    /* Next metablock, if any */
1820c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    s->state = BROTLI_STATE_METABLOCK_DONE;
1821c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    goto saveStateAndReturn;
1822c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  } else {
1823c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    goto CommandBegin;
1824c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
1825c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene KlyuchnikovCommandPostWrapCopy:
182623934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov  {
182723934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov    int wrap_guard = s->ringbuffer_size - pos;
182823934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov    while (--i >= 0) {
182923934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov      s->ringbuffer[pos] =
183023934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov          s->ringbuffer[(pos - s->distance_code) & s->ringbuffer_mask];
183123934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov      ++pos;
183269982c25f155e6b5c72782f2c5590ead1b06aa61Eugene Kliuchnikov      if (BROTLI_PREDICT_FALSE(--wrap_guard == 0)) {
183323934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov        s->state = BROTLI_STATE_COMMAND_POST_WRITE_2;
183423934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov        goto saveStateAndReturn;
183523934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov      }
1836c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    }
1837c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
1838c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (s->meta_block_remaining_len <= 0) {
1839c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    /* Next metablock, if any */
1840c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    s->state = BROTLI_STATE_METABLOCK_DONE;
1841c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    goto saveStateAndReturn;
1842c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  } else {
1843c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    goto CommandBegin;
1844c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
1845c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
1846c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene KlyuchnikovsaveStateAndReturn:
1847c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  s->pos = pos;
1848c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  s->loop_counter = i;
1849c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  return result;
1850c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov}
1851c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
1852c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov#undef BROTLI_SAFE
1853c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
185443d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BROTLI_NOINLINE BrotliDecoderErrorCode ProcessCommands(
185543d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    BrotliDecoderState* s) {
1856c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  return ProcessCommandsInternal(0, s);
1857c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov}
1858c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
185943d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovstatic BROTLI_NOINLINE BrotliDecoderErrorCode SafeProcessCommands(
186043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    BrotliDecoderState* s) {
1861c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  return ProcessCommandsInternal(1, s);
1862c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov}
1863c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
186443d4f45b6e8635406e1709fcc938c12f3d11d76fEugene KliuchnikovBrotliDecoderResult BrotliDecoderDecompress(
186543d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    size_t encoded_size, const uint8_t* encoded_buffer, size_t* decoded_size,
186643d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    uint8_t* decoded_buffer) {
186743d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  BrotliDecoderState s;
186843d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  BrotliDecoderResult result;
1869c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  size_t total_out = 0;
1870c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  size_t available_in = encoded_size;
1871c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  const uint8_t* next_in = encoded_buffer;
1872c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  size_t available_out = *decoded_size;
1873c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  uint8_t* next_out = decoded_buffer;
187443d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  BrotliDecoderStateInit(&s);
187543d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  result = BrotliDecoderDecompressStream(
187643d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      &s, &available_in, &next_in, &available_out, &next_out, &total_out);
1877c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  *decoded_size = total_out;
187843d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  BrotliDecoderStateCleanup(&s);
187943d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  if (result != BROTLI_DECODER_RESULT_SUCCESS) {
188043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    result = BROTLI_DECODER_RESULT_ERROR;
1881c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
1882c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  return result;
1883c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov}
1884c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
1885c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov/* Invariant: input stream is never overconsumed:
1886c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    * invalid input implies that the whole stream is invalid -> any amount of
1887c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      input could be read and discarded
1888e9b278ac6e097beb763e8a46eeafcaa3f6f63f18Eugene Kliuchnikov    * when result is "needs more input", then at least one more byte is REQUIRED
1889c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      to complete decoding; all input data MUST be consumed by decoder, so
1890c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      client could swap the input buffer
1891c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    * when result is "needs more output" decoder MUST ensure that it doesn't
1892c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      hold more than 7 bits in bit reader; this saves client from swapping input
1893c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      buffer ahead of time
1894c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    * when result is "success" decoder MUST return all unused data back to input
1895c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      buffer; this is possible because the invariant is hold on enter
1896c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov*/
189743d4f45b6e8635406e1709fcc938c12f3d11d76fEugene KliuchnikovBrotliDecoderResult BrotliDecoderDecompressStream(
189843d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    BrotliDecoderState* s, size_t* available_in, const uint8_t** next_in,
189943d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    size_t* available_out, uint8_t** next_out, size_t* total_out) {
190043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
19018270250b40f9979f61d92542739b5a786914c922Lode Vandevenne  BrotliBitReader* br = &s->br;
1902801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov  if (*available_out && (!next_out || !*next_out)) {
1903801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov    return SaveErrorCode(
1904801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov        s, BROTLI_FAILURE(BROTLI_DECODER_ERROR_INVALID_ARGUMENTS));
1905801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov  }
1906801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov  if (!*available_out) next_out = 0;
1907c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (s->buffer_length == 0) { /* Just connect bit reader to input stream. */
1908c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    br->avail_in = *available_in;
1909c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    br->next_in = *next_in;
1910c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  } else {
1911c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    /* At least one byte of input is required. More than one byte of input may
1912c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov       be required to complete the transaction -> reading more data must be
1913c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov       done in a loop -> do it in a main loop. */
191443d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1915c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    br->next_in = &s->buffer.u8[0];
1916c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
19178270250b40f9979f61d92542739b5a786914c922Lode Vandevenne  /* State machine */
19188270250b40f9979f61d92542739b5a786914c922Lode Vandevenne  for (;;) {
191943d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    if (result != BROTLI_DECODER_SUCCESS) { /* Error, needs more input/output */
192043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
1921e9b278ac6e097beb763e8a46eeafcaa3f6f63f18Eugene Kliuchnikov        if (s->ringbuffer != 0) { /* Pro-actively push output. */
1922f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov          WriteRingBuffer(s, available_out, next_out, total_out, BROTLI_TRUE);
1923c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        }
1924c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        if (s->buffer_length != 0) { /* Used with internal buffer. */
1925c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          if (br->avail_in == 0) { /* Successfully finished read transaction. */
1926e9b278ac6e097beb763e8a46eeafcaa3f6f63f18Eugene Kliuchnikov            /* Accumulator contains less than 8 bits, because internal buffer
1927c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov               is expanded byte-by-byte until it is enough to complete read. */
1928c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov            s->buffer_length = 0;
1929c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov            /* Switch to input stream and restart. */
193043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov            result = BROTLI_DECODER_SUCCESS;
1931c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov            br->avail_in = *available_in;
1932c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov            br->next_in = *next_in;
1933c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov            continue;
1934c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          } else if (*available_in != 0) {
1935c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov            /* Not enough data in buffer, but can take one more byte from
1936c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov               input stream. */
193743d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov            result = BROTLI_DECODER_SUCCESS;
1938c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov            s->buffer.u8[s->buffer_length] = **next_in;
1939c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov            s->buffer_length++;
1940c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov            br->avail_in = s->buffer_length;
1941c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov            (*next_in)++;
1942c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov            (*available_in)--;
1943c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov            /* Retry with more data in buffer. */
1944c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov            continue;
1945c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          }
1946c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          /* Can't finish reading and no more input.*/
1947c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          break;
1948c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        } else { /* Input stream doesn't contain enough input. */
1949c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          /* Copy tail to internal buffer and return. */
1950c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          *next_in = br->next_in;
1951c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          *available_in = br->avail_in;
1952c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          while (*available_in) {
1953c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov            s->buffer.u8[s->buffer_length] = **next_in;
1954c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov            s->buffer_length++;
1955c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov            (*next_in)++;
1956c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov            (*available_in)--;
1957c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          }
1958c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          break;
195994cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne        }
1960c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        /* Unreachable. */
1961c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      }
1962c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
1963c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      /* Fail or needs more output. */
1964c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
1965c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      if (s->buffer_length != 0) {
1966c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        /* Just consumed the buffered input and produced some output. Otherwise
1967c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov           it would result in "needs more input". Reset internal buffer.*/
1968c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        s->buffer_length = 0;
1969c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      } else {
1970c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        /* Using input stream in last iteration. When decoder switches to input
1971e9b278ac6e097beb763e8a46eeafcaa3f6f63f18Eugene Kliuchnikov           stream it has less than 8 bits in accumulator, so it is safe to
1972e9b278ac6e097beb763e8a46eeafcaa3f6f63f18Eugene Kliuchnikov           return unused accumulator bits there. */
1973c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        BrotliBitReaderUnload(br);
1974c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        *available_in = br->avail_in;
1975c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        *next_in = br->next_in;
1976b1422079172acd8bce398f688a7c6bc51b62f881Lode Vandevenne      }
1977c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      break;
1978c6b9c7c5c82684a32931a14dc9785f6cdce8171fZoltan Szabadka    }
19798270250b40f9979f61d92542739b5a786914c922Lode Vandevenne    switch (s->state) {
19808270250b40f9979f61d92542739b5a786914c922Lode Vandevenne      case BROTLI_STATE_UNINITED:
1981a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        /* Prepare to the first read. */
1982a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        if (!BrotliWarmupBitReader(br)) {
198343d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
19848270250b40f9979f61d92542739b5a786914c922Lode Vandevenne          break;
19858270250b40f9979f61d92542739b5a786914c922Lode Vandevenne        }
19868270250b40f9979f61d92542739b5a786914c922Lode Vandevenne        /* Decode window size. */
1987a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        s->window_bits = DecodeWindowBits(br); /* Reads 1..7 bits. */
19880cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka        BROTLI_LOG_UINT(s->window_bits);
198954f69c9ef7a2530e3524b264e2390f1446552fbdZoltan Szabadka        if (s->window_bits == 9) {
199054f69c9ef7a2530e3524b264e2390f1446552fbdZoltan Szabadka          /* Value 9 is reserved for future use. */
199143d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS);
199254f69c9ef7a2530e3524b264e2390f1446552fbdZoltan Szabadka          break;
199354f69c9ef7a2530e3524b264e2390f1446552fbdZoltan Szabadka        }
1994043a99e07e335d2b027369bd91ab593b40f08164Eugene Kliuchnikov        /* Maximum distance, see section 9.1. of the spec. */
19959521d968f312c14a3a30888575d14b5515f9cb40Eugene Kliuchnikov        s->max_backward_distance = (1 << s->window_bits) - BROTLI_WINDOW_GAP;
1996043a99e07e335d2b027369bd91ab593b40f08164Eugene Kliuchnikov        /* Limit custom dictionary size. */
1997043a99e07e335d2b027369bd91ab593b40f08164Eugene Kliuchnikov        if (s->custom_dict_size >= s->max_backward_distance) {
1998043a99e07e335d2b027369bd91ab593b40f08164Eugene Kliuchnikov          s->custom_dict += s->custom_dict_size - s->max_backward_distance;
1999043a99e07e335d2b027369bd91ab593b40f08164Eugene Kliuchnikov          s->custom_dict_size = s->max_backward_distance;
2000043a99e07e335d2b027369bd91ab593b40f08164Eugene Kliuchnikov        }
20018270250b40f9979f61d92542739b5a786914c922Lode Vandevenne
20024b2fd00e2472e9a07de6e7cfe3c8353783fbe6bcZoltan Szabadka        /* Allocate memory for both block_type_trees and block_len_trees. */
2003b69381227199fceef25e564f68fec730d53b34c4Eugene Klyuchnikov        s->block_type_trees = (HuffmanCode*)BROTLI_ALLOC(s,
200492e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov            sizeof(HuffmanCode) * 3 *
200592e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov                (BROTLI_HUFFMAN_MAX_SIZE_258 + BROTLI_HUFFMAN_MAX_SIZE_26));
2006d3eb6ecb9a9191a516ec83038c05f219e1012664Zoltan Szabadka        if (s->block_type_trees == 0) {
200743d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES);
2008b1422079172acd8bce398f688a7c6bc51b62f881Lode Vandevenne          break;
20098270250b40f9979f61d92542739b5a786914c922Lode Vandevenne        }
201023934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov        s->block_len_trees =
201123934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov            s->block_type_trees + 3 * BROTLI_HUFFMAN_MAX_SIZE_258;
20128f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka
20138270250b40f9979f61d92542739b5a786914c922Lode Vandevenne        s->state = BROTLI_STATE_METABLOCK_BEGIN;
2014b1422079172acd8bce398f688a7c6bc51b62f881Lode Vandevenne        /* No break, continue to next state */
20158270250b40f9979f61d92542739b5a786914c922Lode Vandevenne      case BROTLI_STATE_METABLOCK_BEGIN:
201643d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov        BrotliDecoderStateMetablockBegin(s);
2017c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        BROTLI_LOG_UINT(s->pos);
2018a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        s->state = BROTLI_STATE_METABLOCK_HEADER;
2019a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        /* No break, continue to next state */
2020a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka      case BROTLI_STATE_METABLOCK_HEADER:
2021a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        result = DecodeMetaBlockLength(s, br); /* Reads 2 - 31 bits. */
202243d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov        if (result != BROTLI_DECODER_SUCCESS) {
2023a81f2ef4336d4cc39fdf0b00aedcf1b0fc9c19d3Zoltan Szabadka          break;
2024a81f2ef4336d4cc39fdf0b00aedcf1b0fc9c19d3Zoltan Szabadka        }
20250cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka        BROTLI_LOG_UINT(s->is_last_metablock);
20268270250b40f9979f61d92542739b5a786914c922Lode Vandevenne        BROTLI_LOG_UINT(s->meta_block_remaining_len);
20270cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka        BROTLI_LOG_UINT(s->is_metadata);
20280cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka        BROTLI_LOG_UINT(s->is_uncompressed);
2029a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        if (s->is_metadata || s->is_uncompressed) {
2030127aa48a96f55241a03305f72b606a999384ee54Eugene Klyuchnikov          if (!BrotliJumpToByteBoundary(br)) {
203143d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov            result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_PADDING_1);
203228b1f7a6b1d26ac9d47f31caa05e11b76f1723e1Zoltan Szabadka            break;
203328b1f7a6b1d26ac9d47f31caa05e11b76f1723e1Zoltan Szabadka          }
2034a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        }
2035a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        if (s->is_metadata) {
2036a81f2ef4336d4cc39fdf0b00aedcf1b0fc9c19d3Zoltan Szabadka          s->state = BROTLI_STATE_METADATA;
2037a81f2ef4336d4cc39fdf0b00aedcf1b0fc9c19d3Zoltan Szabadka          break;
2038a81f2ef4336d4cc39fdf0b00aedcf1b0fc9c19d3Zoltan Szabadka        }
20398270250b40f9979f61d92542739b5a786914c922Lode Vandevenne        if (s->meta_block_remaining_len == 0) {
20408270250b40f9979f61d92542739b5a786914c922Lode Vandevenne          s->state = BROTLI_STATE_METABLOCK_DONE;
20418270250b40f9979f61d92542739b5a786914c922Lode Vandevenne          break;
20428270250b40f9979f61d92542739b5a786914c922Lode Vandevenne        }
2043f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov        BrotliCalculateRingBufferSize(s);
2044a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        if (s->is_uncompressed) {
20458270250b40f9979f61d92542739b5a786914c922Lode Vandevenne          s->state = BROTLI_STATE_UNCOMPRESSED;
20468270250b40f9979f61d92542739b5a786914c922Lode Vandevenne          break;
20478270250b40f9979f61d92542739b5a786914c922Lode Vandevenne        }
2048c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        s->loop_counter = 0;
20498270250b40f9979f61d92542739b5a786914c922Lode Vandevenne        s->state = BROTLI_STATE_HUFFMAN_CODE_0;
20508270250b40f9979f61d92542739b5a786914c922Lode Vandevenne        break;
2051c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      case BROTLI_STATE_UNCOMPRESSED: {
2052c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        result = CopyUncompressedBlockToOutput(
2053c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov            available_out, next_out, total_out, s);
205443d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov        if (result != BROTLI_DECODER_SUCCESS) {
205594cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne          break;
20562a7bbfc553e3d7051d36c0cba6dcc18f685f0962Zoltan Szabadka        }
20578270250b40f9979f61d92542739b5a786914c922Lode Vandevenne        s->state = BROTLI_STATE_METABLOCK_DONE;
20588270250b40f9979f61d92542739b5a786914c922Lode Vandevenne        break;
2059c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      }
2060a81f2ef4336d4cc39fdf0b00aedcf1b0fc9c19d3Zoltan Szabadka      case BROTLI_STATE_METADATA:
2061a81f2ef4336d4cc39fdf0b00aedcf1b0fc9c19d3Zoltan Szabadka        for (; s->meta_block_remaining_len > 0; --s->meta_block_remaining_len) {
2062a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka          uint32_t bits;
2063a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka          /* Read one byte and ignore it. */
2064a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka          if (!BrotliSafeReadBits(br, 8, &bits)) {
206543d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov            result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2066a81f2ef4336d4cc39fdf0b00aedcf1b0fc9c19d3Zoltan Szabadka            break;
2067a81f2ef4336d4cc39fdf0b00aedcf1b0fc9c19d3Zoltan Szabadka          }
2068a81f2ef4336d4cc39fdf0b00aedcf1b0fc9c19d3Zoltan Szabadka        }
206943d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov        if (result == BROTLI_DECODER_SUCCESS) {
207094cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne          s->state = BROTLI_STATE_METABLOCK_DONE;
207194cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne        }
2072a81f2ef4336d4cc39fdf0b00aedcf1b0fc9c19d3Zoltan Szabadka        break;
20738270250b40f9979f61d92542739b5a786914c922Lode Vandevenne      case BROTLI_STATE_HUFFMAN_CODE_0:
2074c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        if (s->loop_counter >= 3) {
2075c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          s->state = BROTLI_STATE_METABLOCK_HEADER_2;
20768270250b40f9979f61d92542739b5a786914c922Lode Vandevenne          break;
20778270250b40f9979f61d92542739b5a786914c922Lode Vandevenne        }
20780cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka        /* Reads 1..11 bits. */
2079c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        result = DecodeVarLenUint8(s, br, &s->num_block_types[s->loop_counter]);
208043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov        if (result != BROTLI_DECODER_SUCCESS) {
2081a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka          break;
2082a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        }
2083c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        s->num_block_types[s->loop_counter]++;
2084c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        BROTLI_LOG_UINT(s->num_block_types[s->loop_counter]);
2085c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        if (s->num_block_types[s->loop_counter] < 2) {
2086c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          s->loop_counter++;
2087b1422079172acd8bce398f688a7c6bc51b62f881Lode Vandevenne          break;
20888270250b40f9979f61d92542739b5a786914c922Lode Vandevenne        }
2089c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        s->state = BROTLI_STATE_HUFFMAN_CODE_1;
2090b1422079172acd8bce398f688a7c6bc51b62f881Lode Vandevenne        /* No break, continue to next state */
2091c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      case BROTLI_STATE_HUFFMAN_CODE_1: {
209292e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_258;
2093c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        result = ReadHuffmanCode(s->num_block_types[s->loop_counter] + 2,
2094c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov            &s->block_type_trees[tree_offset], NULL, s);
209543d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov        if (result != BROTLI_DECODER_SUCCESS) break;
2096c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        s->state = BROTLI_STATE_HUFFMAN_CODE_2;
2097c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        /* No break, continue to next state */
2098c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      }
2099c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      case BROTLI_STATE_HUFFMAN_CODE_2: {
210092e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_26;
2101028291865dbc2f92bb114dd082f5ff78c907a875Eugene Kliuchnikov        result = ReadHuffmanCode(BROTLI_NUM_BLOCK_LEN_SYMBOLS,
2102c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov            &s->block_len_trees[tree_offset], NULL, s);
210343d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov        if (result != BROTLI_DECODER_SUCCESS) break;
2104a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        s->state = BROTLI_STATE_HUFFMAN_CODE_3;
2105a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        /* No break, continue to next state */
2106c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      }
2107c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      case BROTLI_STATE_HUFFMAN_CODE_3: {
210892e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_26;
2109c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        if (!SafeReadBlockLength(s, &s->block_length[s->loop_counter],
2110c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov            &s->block_len_trees[tree_offset], br)) {
211143d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2112a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka          break;
2113a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        }
2114c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        BROTLI_LOG_UINT(s->block_length[s->loop_counter]);
2115c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        s->loop_counter++;
21168270250b40f9979f61d92542739b5a786914c922Lode Vandevenne        s->state = BROTLI_STATE_HUFFMAN_CODE_0;
21178270250b40f9979f61d92542739b5a786914c922Lode Vandevenne        break;
2118c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      }
2119c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      case BROTLI_STATE_METABLOCK_HEADER_2: {
2120c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        uint32_t bits;
2121c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        if (!BrotliSafeReadBits(br, 6, &bits)) {
212243d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
21238270250b40f9979f61d92542739b5a786914c922Lode Vandevenne          break;
21248270250b40f9979f61d92542739b5a786914c922Lode Vandevenne        }
2125c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        s->distance_postfix_bits = bits & BitMask(2);
2126c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        bits >>= 2;
2127028291865dbc2f92bb114dd082f5ff78c907a875Eugene Kliuchnikov        s->num_direct_distance_codes = BROTLI_NUM_DISTANCE_SHORT_CODES +
2128028291865dbc2f92bb114dd082f5ff78c907a875Eugene Kliuchnikov            (bits << s->distance_postfix_bits);
21290cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka        BROTLI_LOG_UINT(s->num_direct_distance_codes);
21300cf3a5442203b22415bc64003630182ed748d1fbZoltan Szabadka        BROTLI_LOG_UINT(s->distance_postfix_bits);
2131db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne        s->distance_postfix_mask = (int)BitMask(s->distance_postfix_bits);
2132b69381227199fceef25e564f68fec730d53b34c4Eugene Klyuchnikov        s->context_modes =
2133b69381227199fceef25e564f68fec730d53b34c4Eugene Klyuchnikov            (uint8_t*)BROTLI_ALLOC(s, (size_t)s->num_block_types[0]);
21348270250b40f9979f61d92542739b5a786914c922Lode Vandevenne        if (s->context_modes == 0) {
213543d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES);
21368270250b40f9979f61d92542739b5a786914c922Lode Vandevenne          break;
21378270250b40f9979f61d92542739b5a786914c922Lode Vandevenne        }
2138c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        s->loop_counter = 0;
2139c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        s->state = BROTLI_STATE_CONTEXT_MODES;
2140c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        /* No break, continue to next state */
2141c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      }
2142c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      case BROTLI_STATE_CONTEXT_MODES:
2143c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        result = ReadContextModes(s);
214443d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov        if (result != BROTLI_DECODER_SUCCESS) {
2145c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          break;
21468270250b40f9979f61d92542739b5a786914c922Lode Vandevenne        }
21478270250b40f9979f61d92542739b5a786914c922Lode Vandevenne        s->state = BROTLI_STATE_CONTEXT_MAP_1;
2148b1422079172acd8bce398f688a7c6bc51b62f881Lode Vandevenne        /* No break, continue to next state */
2149755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov      case BROTLI_STATE_CONTEXT_MAP_1:
2150755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov        result = DecodeContextMap(
2151028291865dbc2f92bb114dd082f5ff78c907a875Eugene Kliuchnikov            s->num_block_types[0] << BROTLI_LITERAL_CONTEXT_BITS,
2152755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov            &s->num_literal_htrees, &s->context_map, s);
215343d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov        if (result != BROTLI_DECODER_SUCCESS) {
2154db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne          break;
2155db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne        }
2156755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov        DetectTrivialLiteralBlockTypes(s);
21578270250b40f9979f61d92542739b5a786914c922Lode Vandevenne        s->state = BROTLI_STATE_CONTEXT_MAP_2;
2158b1422079172acd8bce398f688a7c6bc51b62f881Lode Vandevenne        /* No break, continue to next state */
21598270250b40f9979f61d92542739b5a786914c922Lode Vandevenne      case BROTLI_STATE_CONTEXT_MAP_2:
216094cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne        {
2161f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov          uint32_t num_distance_codes = s->num_direct_distance_codes +
2162f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov              ((2 * BROTLI_MAX_DISTANCE_BITS) << s->distance_postfix_bits);
2163b1db6f149a9779fe5182bfdfd555fa6d3ecc246dEugene Kliuchnikov          BROTLI_BOOL allocation_success = BROTLI_TRUE;
2164db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne          result = DecodeContextMap(
2165028291865dbc2f92bb114dd082f5ff78c907a875Eugene Kliuchnikov              s->num_block_types[2] << BROTLI_DISTANCE_CONTEXT_BITS,
2166a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka              &s->num_dist_htrees, &s->dist_context_map, s);
216743d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov          if (result != BROTLI_DECODER_SUCCESS) {
2168db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne            break;
2169db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne          }
2170b1db6f149a9779fe5182bfdfd555fa6d3ecc246dEugene Kliuchnikov          allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
217143d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov              s, &s->literal_hgroup, BROTLI_NUM_LITERAL_SYMBOLS,
217243d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov              s->num_literal_htrees);
2173b1db6f149a9779fe5182bfdfd555fa6d3ecc246dEugene Kliuchnikov          allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
217443d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov              s, &s->insert_copy_hgroup, BROTLI_NUM_COMMAND_SYMBOLS,
217543d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov              s->num_block_types[1]);
2176b1db6f149a9779fe5182bfdfd555fa6d3ecc246dEugene Kliuchnikov          allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
217743d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov              s, &s->distance_hgroup, num_distance_codes,
217843d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov              s->num_dist_htrees);
2179b1db6f149a9779fe5182bfdfd555fa6d3ecc246dEugene Kliuchnikov          if (!allocation_success) {
2180021f6fe37df1c1629dd6ae2ebc598ee78a1c591aEugene Kliuchnikov            return SaveErrorCode(s,
218143d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov                BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS));
2182d3eb6ecb9a9191a516ec83038c05f219e1012664Zoltan Szabadka          }
218394cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne        }
2184c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        s->loop_counter = 0;
21858270250b40f9979f61d92542739b5a786914c922Lode Vandevenne        s->state = BROTLI_STATE_TREE_GROUP;
2186b1422079172acd8bce398f688a7c6bc51b62f881Lode Vandevenne        /* No break, continue to next state */
21878270250b40f9979f61d92542739b5a786914c922Lode Vandevenne      case BROTLI_STATE_TREE_GROUP:
2188a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        {
2189a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka          HuffmanTreeGroup* hgroup = NULL;
2190c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          switch (s->loop_counter) {
2191a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka            case 0:
2192a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka              hgroup = &s->literal_hgroup;
2193a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka              break;
2194a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka            case 1:
2195a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka              hgroup = &s->insert_copy_hgroup;
2196a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka              break;
2197a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka            case 2:
2198a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka              hgroup = &s->distance_hgroup;
2199a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka              break;
220023934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov            default:
220143d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov              return SaveErrorCode(s, BROTLI_FAILURE(
220243d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov                  BROTLI_DECODER_ERROR_UNREACHABLE));
2203a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka          }
2204a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka          result = HuffmanTreeGroupDecode(hgroup, s);
220594cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne        }
220643d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov        if (result != BROTLI_DECODER_SUCCESS) break;
2207c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        s->loop_counter++;
2208c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        if (s->loop_counter >= 3) {
2209755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov          PrepareLiteralDecoding(s);
22108270250b40f9979f61d92542739b5a786914c922Lode Vandevenne          s->dist_context_map_slice = s->dist_context_map;
221194cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne          s->htree_command = s->insert_copy_hgroup.htrees[0];
2212f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov          if (!BrotliEnsureRingBuffer(s)) {
221343d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov            result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2);
221492e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov            break;
221592e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov          }
2216db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne          s->state = BROTLI_STATE_COMMAND_BEGIN;
22178270250b40f9979f61d92542739b5a786914c922Lode Vandevenne        }
22188270250b40f9979f61d92542739b5a786914c922Lode Vandevenne        break;
2219db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne      case BROTLI_STATE_COMMAND_BEGIN:
2220db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne      case BROTLI_STATE_COMMAND_INNER:
2221c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      case BROTLI_STATE_COMMAND_POST_DECODE_LITERALS:
2222db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne      case BROTLI_STATE_COMMAND_POST_WRAP_COPY:
2223c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        result = ProcessCommands(s);
222443d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov        if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
2225c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          result = SafeProcessCommands(s);
222694cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne        }
222794cd7085f79a707f5ba3d93086796e695b495975Lode Vandevenne        break;
2228db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne      case BROTLI_STATE_COMMAND_INNER_WRITE:
2229db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne      case BROTLI_STATE_COMMAND_POST_WRITE_1:
2230db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne      case BROTLI_STATE_COMMAND_POST_WRITE_2:
2231f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov        result = WriteRingBuffer(
2232f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov            s, available_out, next_out, total_out, BROTLI_FALSE);
223343d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov        if (result != BROTLI_DECODER_SUCCESS) {
223464c261113f3ac1036815426225dd19a229a56cb3Zoltan Szabadka          break;
223564c261113f3ac1036815426225dd19a229a56cb3Zoltan Szabadka        }
2236801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov        WrapRingBuffer(s);
2237f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov        if (s->ringbuffer_size == 1 << s->window_bits) {
2238f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov          s->max_distance = s->max_backward_distance;
2239f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov        }
2240db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne        if (s->state == BROTLI_STATE_COMMAND_POST_WRITE_1) {
224192e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov          if (s->meta_block_remaining_len == 0) {
2242db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne            /* Next metablock, if any */
2243db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne            s->state = BROTLI_STATE_METABLOCK_DONE;
2244db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne          } else {
2245c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov            s->state = BROTLI_STATE_COMMAND_BEGIN;
2246db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne          }
2247c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          break;
2248db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne        } else if (s->state == BROTLI_STATE_COMMAND_POST_WRITE_2) {
2249db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne          s->state = BROTLI_STATE_COMMAND_POST_WRAP_COPY;
2250db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne        } else {  /* BROTLI_STATE_COMMAND_INNER_WRITE */
2251c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          if (s->loop_counter == 0) {
225292e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov            if (s->meta_block_remaining_len == 0) {
2253db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne              s->state = BROTLI_STATE_METABLOCK_DONE;
2254c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov            } else {
2255c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov              s->state = BROTLI_STATE_COMMAND_POST_DECODE_LITERALS;
2256db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne            }
2257c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov            break;
2258db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne          }
2259db71549ac5008174ed4ada46476f0a74144bf2fcLode Vandevenne          s->state = BROTLI_STATE_COMMAND_INNER;
226064c261113f3ac1036815426225dd19a229a56cb3Zoltan Szabadka        }
226164c261113f3ac1036815426225dd19a229a56cb3Zoltan Szabadka        break;
22628270250b40f9979f61d92542739b5a786914c922Lode Vandevenne      case BROTLI_STATE_METABLOCK_DONE:
2263755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov        if (s->meta_block_remaining_len < 0) {
226443d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2);
2265755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov          break;
2266755b909424990732dffa482f883b2b5773e7355eEugene Kliuchnikov        }
226743d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov        BrotliDecoderStateCleanupAfterMetablock(s);
2268a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        if (!s->is_last_metablock) {
2269a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka          s->state = BROTLI_STATE_METABLOCK_BEGIN;
2270a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka          break;
2271a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        }
2272c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        if (!BrotliJumpToByteBoundary(br)) {
227343d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_PADDING_2);
2274021f6fe37df1c1629dd6ae2ebc598ee78a1c591aEugene Kliuchnikov          break;
2275c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        }
2276c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        if (s->buffer_length == 0) {
2277c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          BrotliBitReaderUnload(br);
2278c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          *available_in = br->avail_in;
2279c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov          *next_in = br->next_in;
2280c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov        }
2281a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        s->state = BROTLI_STATE_DONE;
2282a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka        /* No break, continue to next state */
22838270250b40f9979f61d92542739b5a786914c922Lode Vandevenne      case BROTLI_STATE_DONE:
22848270250b40f9979f61d92542739b5a786914c922Lode Vandevenne        if (s->ringbuffer != 0) {
2285f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov          result = WriteRingBuffer(
2286f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov              s, available_out, next_out, total_out, BROTLI_TRUE);
228743d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov          if (result != BROTLI_DECODER_SUCCESS) {
228864c261113f3ac1036815426225dd19a229a56cb3Zoltan Szabadka            break;
228964c261113f3ac1036815426225dd19a229a56cb3Zoltan Szabadka          }
22908270250b40f9979f61d92542739b5a786914c922Lode Vandevenne        }
2291021f6fe37df1c1629dd6ae2ebc598ee78a1c591aEugene Kliuchnikov        return SaveErrorCode(s, result);
22928f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka    }
22938f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka  }
2294021f6fe37df1c1629dd6ae2ebc598ee78a1c591aEugene Kliuchnikov  return SaveErrorCode(s, result);
22958f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka}
22968f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka
229743d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovvoid BrotliDecoderSetCustomDictionary(
229843d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    BrotliDecoderState* s, size_t size, const uint8_t* dict) {
2299ab858a9f1e1faed483a31610b7ebaa057259a734Eugene Kliuchnikov  if (size > (1u << 24)) {
2300ab858a9f1e1faed483a31610b7ebaa057259a734Eugene Kliuchnikov    return;
2301ab858a9f1e1faed483a31610b7ebaa057259a734Eugene Kliuchnikov  }
2302b43df8f699484501e0972703e7d453b817de702dZoltan Szabadka  s->custom_dict = dict;
230323934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov  s->custom_dict_size = (int)size;
2304b43df8f699484501e0972703e7d453b817de702dZoltan Szabadka}
2305b43df8f699484501e0972703e7d453b817de702dZoltan Szabadka
230643d4f45b6e8635406e1709fcc938c12f3d11d76fEugene KliuchnikovBROTLI_BOOL BrotliDecoderHasMoreOutput(const BrotliDecoderState* s) {
230743d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  return TO_BROTLI_BOOL(
230843d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      s->ringbuffer != 0 && UnwrittenBytes(s, BROTLI_FALSE) != 0);
230943d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov}
231043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov
2311801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikovconst uint8_t* BrotliDecoderTakeOutput(BrotliDecoderState* s, size_t* size) {
2312801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov  uint8_t* result = 0;
2313801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov  size_t available_out = *size ? *size : 1u << 24;
2314801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov  size_t requested_out = available_out;
2315801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov  BrotliDecoderErrorCode status;
2316801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov  if (s->ringbuffer == 0) {
2317801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov    *size = 0;
2318801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov    return 0;
2319801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov  }
2320801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov  WrapRingBuffer(s);
2321f20b3eeb2f401fc4b87488ca22ca32729a6dec20Eugene Kliuchnikov  status = WriteRingBuffer(s, &available_out, &result, 0, BROTLI_TRUE);
2322801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov  if (status == BROTLI_DECODER_SUCCESS ||
2323801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov      status == BROTLI_DECODER_NEEDS_MORE_OUTPUT) {
2324801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov    *size = requested_out - available_out;
2325801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov  } else {
2326801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov    /* This might happen if previous decoder error code was ignored. */
2327801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov    *size = 0;
2328801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov    result = 0;
2329801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov  }
2330801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov  return result;
2331801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov}
2332801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov
233343d4f45b6e8635406e1709fcc938c12f3d11d76fEugene KliuchnikovBROTLI_BOOL BrotliDecoderIsUsed(const BrotliDecoderState* s) {
233443d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  return TO_BROTLI_BOOL(s->state != BROTLI_STATE_UNINITED ||
233543d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      BrotliGetAvailableBits(&s->br) != 0);
233643d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov}
233743d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov
233843d4f45b6e8635406e1709fcc938c12f3d11d76fEugene KliuchnikovBROTLI_BOOL BrotliDecoderIsFinished(const BrotliDecoderState* s) {
2339801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov  return TO_BROTLI_BOOL(s->state == BROTLI_STATE_DONE) &&
2340801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov      !BrotliDecoderHasMoreOutput(s);
234143d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov}
234243d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov
234343d4f45b6e8635406e1709fcc938c12f3d11d76fEugene KliuchnikovBrotliDecoderErrorCode BrotliDecoderGetErrorCode(const BrotliDecoderState* s) {
234443d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  return (BrotliDecoderErrorCode)s->error_code;
2345021f6fe37df1c1629dd6ae2ebc598ee78a1c591aEugene Kliuchnikov}
2346a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka
234743d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikovconst char* BrotliDecoderErrorString(BrotliDecoderErrorCode c) {
2348639fdaf62dfe6f6ac465c76809c00c3389be4e40Eugene Kliuchnikov  switch (c) {
2349801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov#define BROTLI_ERROR_CODE_CASE_(PREFIX, NAME, CODE) \
235043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov    case BROTLI_DECODER ## PREFIX ## NAME: return #NAME;
2351801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov#define BROTLI_NOTHING_
2352801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov    BROTLI_DECODER_ERROR_CODES_LIST(BROTLI_ERROR_CODE_CASE_, BROTLI_NOTHING_)
2353801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov#undef BROTLI_ERROR_CODE_CASE_
2354801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov#undef BROTLI_NOTHING_
2355639fdaf62dfe6f6ac465c76809c00c3389be4e40Eugene Kliuchnikov    default: return "INVALID";
2356639fdaf62dfe6f6ac465c76809c00c3389be4e40Eugene Kliuchnikov  }
2357639fdaf62dfe6f6ac465c76809c00c3389be4e40Eugene Kliuchnikov}
2358639fdaf62dfe6f6ac465c76809c00c3389be4e40Eugene Kliuchnikov
2359801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikovuint32_t BrotliDecoderVersion() {
2360801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov  return BROTLI_VERSION;
2361801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov}
2362801f5f37ee73c558e1944235d2a2c6fa7d7a9719Eugene Kliuchnikov
23638f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka#if defined(__cplusplus) || defined(c_plusplus)
236423934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov}  /* extern "C" */
23658f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka#endif
2366