| File: | out/../deps/brotli/c/dec/decode.c |
| Warning: | line 1314, column 5 Null pointer passed to 1st parameter expecting 'nonnull' |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
| 1 | /* Copyright 2013 Google Inc. All Rights Reserved. | ||||
| 2 | |||||
| 3 | Distributed under MIT license. | ||||
| 4 | See file LICENSE for detail or copy at https://opensource.org/licenses/MIT | ||||
| 5 | */ | ||||
| 6 | |||||
| 7 | #include <brotli/decode.h> | ||||
| 8 | |||||
| 9 | #include <stdlib.h> /* free, malloc */ | ||||
| 10 | #include <string.h> /* memcpy, memset */ | ||||
| 11 | |||||
| 12 | #include "../common/constants.h" | ||||
| 13 | #include "../common/context.h" | ||||
| 14 | #include "../common/dictionary.h" | ||||
| 15 | #include "../common/platform.h" | ||||
| 16 | #include "../common/transform.h" | ||||
| 17 | #include "../common/version.h" | ||||
| 18 | #include "./bit_reader.h" | ||||
| 19 | #include "./huffman.h" | ||||
| 20 | #include "./prefix.h" | ||||
| 21 | #include "./state.h" | ||||
| 22 | |||||
| 23 | #if defined(BROTLI_TARGET_NEON) | ||||
| 24 | #include <arm_neon.h> | ||||
| 25 | #endif | ||||
| 26 | |||||
| 27 | #if defined(__cplusplus) || defined(c_plusplus) | ||||
| 28 | extern "C" { | ||||
| 29 | #endif | ||||
| 30 | |||||
| 31 | #define BROTLI_FAILURE(CODE)((void)(0), CODE) (BROTLI_DUMP()(void)(0), CODE) | ||||
| 32 | |||||
| 33 | #define BROTLI_LOG_UINT(name) \ | ||||
| 34 | BROTLI_LOG(("[%s] %s = %lu\n", __func__, #name, (unsigned long)(name))) | ||||
| 35 | #define BROTLI_LOG_ARRAY_INDEX(array_name, idx) \ | ||||
| 36 | BROTLI_LOG(("[%s] %s[%lu] = %lu\n", __func__, #array_name, \ | ||||
| 37 | (unsigned long)(idx), (unsigned long)array_name[idx])) | ||||
| 38 | |||||
| 39 | #define HUFFMAN_TABLE_BITS8U 8U | ||||
| 40 | #define HUFFMAN_TABLE_MASK0xFF 0xFF | ||||
| 41 | |||||
| 42 | /* We need the slack region for the following reasons: | ||||
| 43 | - doing up to two 16-byte copies for fast backward copying | ||||
| 44 | - inserting transformed dictionary word: | ||||
| 45 | 5 prefix + 24 base + 8 suffix */ | ||||
| 46 | static const uint32_t kRingBufferWriteAheadSlack = 42; | ||||
| 47 | |||||
| 48 | static const uint8_t kCodeLengthCodeOrder[BROTLI_CODE_LENGTH_CODES(17 + 1)] = { | ||||
| 49 | 1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15, | ||||
| 50 | }; | ||||
| 51 | |||||
| 52 | /* Static prefix code for the complex code length code lengths. */ | ||||
| 53 | static const uint8_t kCodeLengthPrefixLength[16] = { | ||||
| 54 | 2, 2, 2, 3, 2, 2, 2, 4, 2, 2, 2, 3, 2, 2, 2, 4, | ||||
| 55 | }; | ||||
| 56 | |||||
| 57 | static const uint8_t kCodeLengthPrefixValue[16] = { | ||||
| 58 | 0, 4, 3, 2, 0, 4, 3, 1, 0, 4, 3, 2, 0, 4, 3, 5, | ||||
| 59 | }; | ||||
| 60 | |||||
| 61 | BROTLI_BOOLint BrotliDecoderSetParameter( | ||||
| 62 | BrotliDecoderStateBrotliDecoderStateInternal* state, BrotliDecoderParameter p, uint32_t value) { | ||||
| 63 | if (state->state != BROTLI_STATE_UNINITED) return BROTLI_FALSE0; | ||||
| 64 | switch (p) { | ||||
| 65 | case BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION: | ||||
| 66 | state->canny_ringbuffer_allocation = !!value ? 0 : 1; | ||||
| 67 | return BROTLI_TRUE1; | ||||
| 68 | |||||
| 69 | case BROTLI_DECODER_PARAM_LARGE_WINDOW: | ||||
| 70 | state->large_window = TO_BROTLI_BOOL(!!value)(!!(!!value) ? 1 : 0); | ||||
| 71 | return BROTLI_TRUE1; | ||||
| 72 | |||||
| 73 | default: return BROTLI_FALSE0; | ||||
| 74 | } | ||||
| 75 | } | ||||
| 76 | |||||
| 77 | BrotliDecoderStateBrotliDecoderStateInternal* BrotliDecoderCreateInstance( | ||||
| 78 | brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque) { | ||||
| 79 | BrotliDecoderStateBrotliDecoderStateInternal* state = 0; | ||||
| 80 | if (!alloc_func && !free_func) { | ||||
| 81 | state = (BrotliDecoderStateBrotliDecoderStateInternal*)malloc(sizeof(BrotliDecoderStateBrotliDecoderStateInternal)); | ||||
| 82 | } else if (alloc_func && free_func) { | ||||
| 83 | state = (BrotliDecoderStateBrotliDecoderStateInternal*)alloc_func(opaque, sizeof(BrotliDecoderStateBrotliDecoderStateInternal)); | ||||
| 84 | } | ||||
| 85 | if (state == 0) { | ||||
| 86 | BROTLI_DUMP()(void)(0); | ||||
| 87 | return 0; | ||||
| 88 | } | ||||
| 89 | if (!BrotliDecoderStateInit(state, alloc_func, free_func, opaque)) { | ||||
| 90 | BROTLI_DUMP()(void)(0); | ||||
| 91 | if (!alloc_func && !free_func) { | ||||
| 92 | free(state); | ||||
| 93 | } else if (alloc_func && free_func) { | ||||
| 94 | free_func(opaque, state); | ||||
| 95 | } | ||||
| 96 | return 0; | ||||
| 97 | } | ||||
| 98 | return state; | ||||
| 99 | } | ||||
| 100 | |||||
| 101 | /* Deinitializes and frees BrotliDecoderState instance. */ | ||||
| 102 | void BrotliDecoderDestroyInstance(BrotliDecoderStateBrotliDecoderStateInternal* state) { | ||||
| 103 | if (!state) { | ||||
| 104 | return; | ||||
| 105 | } else { | ||||
| 106 | brotli_free_func free_func = state->free_func; | ||||
| 107 | void* opaque = state->memory_manager_opaque; | ||||
| 108 | BrotliDecoderStateCleanup(state); | ||||
| 109 | free_func(opaque, state); | ||||
| 110 | } | ||||
| 111 | } | ||||
| 112 | |||||
| 113 | /* Saves error code and converts it to BrotliDecoderResult. */ | ||||
| 114 | static BROTLI_NOINLINE__attribute__((__noinline__)) BrotliDecoderResult SaveErrorCode( | ||||
| 115 | BrotliDecoderStateBrotliDecoderStateInternal* s, BrotliDecoderErrorCode e) { | ||||
| 116 | s->error_code = (int)e; | ||||
| 117 | switch (e) { | ||||
| 118 | case BROTLI_DECODER_SUCCESS: | ||||
| 119 | return BROTLI_DECODER_RESULT_SUCCESS; | ||||
| 120 | |||||
| 121 | case BROTLI_DECODER_NEEDS_MORE_INPUT: | ||||
| 122 | return BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT; | ||||
| 123 | |||||
| 124 | case BROTLI_DECODER_NEEDS_MORE_OUTPUT: | ||||
| 125 | return BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT; | ||||
| 126 | |||||
| 127 | default: | ||||
| 128 | return BROTLI_DECODER_RESULT_ERROR; | ||||
| 129 | } | ||||
| 130 | } | ||||
| 131 | |||||
| 132 | /* Decodes WBITS by reading 1 - 7 bits, or 0x11 for "Large Window Brotli". | ||||
| 133 | Precondition: bit-reader accumulator has at least 8 bits. */ | ||||
| 134 | static BrotliDecoderErrorCode DecodeWindowBits(BrotliDecoderStateBrotliDecoderStateInternal* s, | ||||
| 135 | BrotliBitReader* br) { | ||||
| 136 | uint32_t n; | ||||
| 137 | BROTLI_BOOLint large_window = s->large_window; | ||||
| 138 | s->large_window = BROTLI_FALSE0; | ||||
| 139 | BrotliTakeBits(br, 1, &n); | ||||
| 140 | if (n == 0) { | ||||
| 141 | s->window_bits = 16; | ||||
| 142 | return BROTLI_DECODER_SUCCESS; | ||||
| 143 | } | ||||
| 144 | BrotliTakeBits(br, 3, &n); | ||||
| 145 | if (n != 0) { | ||||
| 146 | s->window_bits = 17 + n; | ||||
| 147 | return BROTLI_DECODER_SUCCESS; | ||||
| 148 | } | ||||
| 149 | BrotliTakeBits(br, 3, &n); | ||||
| 150 | if (n == 1) { | ||||
| 151 | if (large_window) { | ||||
| 152 | BrotliTakeBits(br, 1, &n); | ||||
| 153 | if (n == 1) { | ||||
| 154 | return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS)((void)(0), BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS); | ||||
| 155 | } | ||||
| 156 | s->large_window = BROTLI_TRUE1; | ||||
| 157 | return BROTLI_DECODER_SUCCESS; | ||||
| 158 | } else { | ||||
| 159 | return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS)((void)(0), BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS); | ||||
| 160 | } | ||||
| 161 | } | ||||
| 162 | if (n != 0) { | ||||
| 163 | s->window_bits = 8 + n; | ||||
| 164 | return BROTLI_DECODER_SUCCESS; | ||||
| 165 | } | ||||
| 166 | s->window_bits = 17; | ||||
| 167 | return BROTLI_DECODER_SUCCESS; | ||||
| 168 | } | ||||
| 169 | |||||
| 170 | static BROTLI_INLINEinline __attribute__((__always_inline__)) void memmove16(uint8_t* dst, uint8_t* src) { | ||||
| 171 | #if defined(BROTLI_TARGET_NEON) | ||||
| 172 | vst1q_u8(dst, vld1q_u8(src)); | ||||
| 173 | #else | ||||
| 174 | uint32_t buffer[4]; | ||||
| 175 | memcpy(buffer, src, 16); | ||||
| 176 | memcpy(dst, buffer, 16); | ||||
| 177 | #endif | ||||
| 178 | } | ||||
| 179 | |||||
| 180 | /* Decodes a number in the range [0..255], by reading 1 - 11 bits. */ | ||||
| 181 | static BROTLI_NOINLINE__attribute__((__noinline__)) BrotliDecoderErrorCode DecodeVarLenUint8( | ||||
| 182 | BrotliDecoderStateBrotliDecoderStateInternal* s, BrotliBitReader* br, uint32_t* value) { | ||||
| 183 | uint32_t bits; | ||||
| 184 | switch (s->substate_decode_uint8) { | ||||
| 185 | case BROTLI_STATE_DECODE_UINT8_NONE: | ||||
| 186 | if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, 1, &bits))(__builtin_expect(!BrotliSafeReadBits(br, 1, &bits), 0))) { | ||||
| 187 | return BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 188 | } | ||||
| 189 | if (bits == 0) { | ||||
| 190 | *value = 0; | ||||
| 191 | return BROTLI_DECODER_SUCCESS; | ||||
| 192 | } | ||||
| 193 | /* Fall through. */ | ||||
| 194 | |||||
| 195 | case BROTLI_STATE_DECODE_UINT8_SHORT: | ||||
| 196 | if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, 3, &bits))(__builtin_expect(!BrotliSafeReadBits(br, 3, &bits), 0))) { | ||||
| 197 | s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_SHORT; | ||||
| 198 | return BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 199 | } | ||||
| 200 | if (bits == 0) { | ||||
| 201 | *value = 1; | ||||
| 202 | s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_NONE; | ||||
| 203 | return BROTLI_DECODER_SUCCESS; | ||||
| 204 | } | ||||
| 205 | /* Use output value as a temporary storage. It MUST be persisted. */ | ||||
| 206 | *value = bits; | ||||
| 207 | /* Fall through. */ | ||||
| 208 | |||||
| 209 | case BROTLI_STATE_DECODE_UINT8_LONG: | ||||
| 210 | if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, *value, &bits))(__builtin_expect(!BrotliSafeReadBits(br, *value, &bits), 0))) { | ||||
| 211 | s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_LONG; | ||||
| 212 | return BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 213 | } | ||||
| 214 | *value = (1U << *value) + bits; | ||||
| 215 | s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_NONE; | ||||
| 216 | return BROTLI_DECODER_SUCCESS; | ||||
| 217 | |||||
| 218 | default: | ||||
| 219 | return | ||||
| 220 | BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE)((void)(0), BROTLI_DECODER_ERROR_UNREACHABLE); | ||||
| 221 | } | ||||
| 222 | } | ||||
| 223 | |||||
| 224 | /* Decodes a metablock length and flags by reading 2 - 31 bits. */ | ||||
| 225 | static BrotliDecoderErrorCode BROTLI_NOINLINE__attribute__((__noinline__)) DecodeMetaBlockLength( | ||||
| 226 | BrotliDecoderStateBrotliDecoderStateInternal* s, BrotliBitReader* br) { | ||||
| 227 | uint32_t bits; | ||||
| 228 | int i; | ||||
| 229 | for (;;) { | ||||
| 230 | switch (s->substate_metablock_header) { | ||||
| 231 | case BROTLI_STATE_METABLOCK_HEADER_NONE: | ||||
| 232 | if (!BrotliSafeReadBits(br, 1, &bits)) { | ||||
| 233 | return BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 234 | } | ||||
| 235 | s->is_last_metablock = bits ? 1 : 0; | ||||
| 236 | s->meta_block_remaining_len = 0; | ||||
| 237 | s->is_uncompressed = 0; | ||||
| 238 | s->is_metadata = 0; | ||||
| 239 | if (!s->is_last_metablock) { | ||||
| 240 | s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NIBBLES; | ||||
| 241 | break; | ||||
| 242 | } | ||||
| 243 | s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_EMPTY; | ||||
| 244 | /* Fall through. */ | ||||
| 245 | |||||
| 246 | case BROTLI_STATE_METABLOCK_HEADER_EMPTY: | ||||
| 247 | if (!BrotliSafeReadBits(br, 1, &bits)) { | ||||
| 248 | return BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 249 | } | ||||
| 250 | if (bits) { | ||||
| 251 | s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE; | ||||
| 252 | return BROTLI_DECODER_SUCCESS; | ||||
| 253 | } | ||||
| 254 | s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NIBBLES; | ||||
| 255 | /* Fall through. */ | ||||
| 256 | |||||
| 257 | case BROTLI_STATE_METABLOCK_HEADER_NIBBLES: | ||||
| 258 | if (!BrotliSafeReadBits(br, 2, &bits)) { | ||||
| 259 | return BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 260 | } | ||||
| 261 | s->size_nibbles = (uint8_t)(bits + 4); | ||||
| 262 | s->loop_counter = 0; | ||||
| 263 | if (bits == 3) { | ||||
| 264 | s->is_metadata = 1; | ||||
| 265 | s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_RESERVED; | ||||
| 266 | break; | ||||
| 267 | } | ||||
| 268 | s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_SIZE; | ||||
| 269 | /* Fall through. */ | ||||
| 270 | |||||
| 271 | case BROTLI_STATE_METABLOCK_HEADER_SIZE: | ||||
| 272 | i = s->loop_counter; | ||||
| 273 | for (; i < (int)s->size_nibbles; ++i) { | ||||
| 274 | if (!BrotliSafeReadBits(br, 4, &bits)) { | ||||
| 275 | s->loop_counter = i; | ||||
| 276 | return BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 277 | } | ||||
| 278 | if (i + 1 == (int)s->size_nibbles && s->size_nibbles > 4 && | ||||
| 279 | bits == 0) { | ||||
| 280 | return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE)((void)(0), BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE); | ||||
| 281 | } | ||||
| 282 | s->meta_block_remaining_len |= (int)(bits << (i * 4)); | ||||
| 283 | } | ||||
| 284 | s->substate_metablock_header = | ||||
| 285 | BROTLI_STATE_METABLOCK_HEADER_UNCOMPRESSED; | ||||
| 286 | /* Fall through. */ | ||||
| 287 | |||||
| 288 | case BROTLI_STATE_METABLOCK_HEADER_UNCOMPRESSED: | ||||
| 289 | if (!s->is_last_metablock) { | ||||
| 290 | if (!BrotliSafeReadBits(br, 1, &bits)) { | ||||
| 291 | return BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 292 | } | ||||
| 293 | s->is_uncompressed = bits ? 1 : 0; | ||||
| 294 | } | ||||
| 295 | ++s->meta_block_remaining_len; | ||||
| 296 | s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE; | ||||
| 297 | return BROTLI_DECODER_SUCCESS; | ||||
| 298 | |||||
| 299 | case BROTLI_STATE_METABLOCK_HEADER_RESERVED: | ||||
| 300 | if (!BrotliSafeReadBits(br, 1, &bits)) { | ||||
| 301 | return BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 302 | } | ||||
| 303 | if (bits != 0) { | ||||
| 304 | return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_RESERVED)((void)(0), BROTLI_DECODER_ERROR_FORMAT_RESERVED); | ||||
| 305 | } | ||||
| 306 | s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_BYTES; | ||||
| 307 | /* Fall through. */ | ||||
| 308 | |||||
| 309 | case BROTLI_STATE_METABLOCK_HEADER_BYTES: | ||||
| 310 | if (!BrotliSafeReadBits(br, 2, &bits)) { | ||||
| 311 | return BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 312 | } | ||||
| 313 | if (bits == 0) { | ||||
| 314 | s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE; | ||||
| 315 | return BROTLI_DECODER_SUCCESS; | ||||
| 316 | } | ||||
| 317 | s->size_nibbles = (uint8_t)bits; | ||||
| 318 | s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_METADATA; | ||||
| 319 | /* Fall through. */ | ||||
| 320 | |||||
| 321 | case BROTLI_STATE_METABLOCK_HEADER_METADATA: | ||||
| 322 | i = s->loop_counter; | ||||
| 323 | for (; i < (int)s->size_nibbles; ++i) { | ||||
| 324 | if (!BrotliSafeReadBits(br, 8, &bits)) { | ||||
| 325 | s->loop_counter = i; | ||||
| 326 | return BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 327 | } | ||||
| 328 | if (i + 1 == (int)s->size_nibbles && s->size_nibbles > 1 && | ||||
| 329 | bits == 0) { | ||||
| 330 | return BROTLI_FAILURE(((void)(0), BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE ) | ||||
| 331 | BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE)((void)(0), BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE ); | ||||
| 332 | } | ||||
| 333 | s->meta_block_remaining_len |= (int)(bits << (i * 8)); | ||||
| 334 | } | ||||
| 335 | ++s->meta_block_remaining_len; | ||||
| 336 | s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE; | ||||
| 337 | return BROTLI_DECODER_SUCCESS; | ||||
| 338 | |||||
| 339 | default: | ||||
| 340 | return | ||||
| 341 | BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE)((void)(0), BROTLI_DECODER_ERROR_UNREACHABLE); | ||||
| 342 | } | ||||
| 343 | } | ||||
| 344 | } | ||||
| 345 | |||||
| 346 | /* Decodes the Huffman code. | ||||
| 347 | This method doesn't read data from the bit reader, BUT drops the amount of | ||||
| 348 | bits that correspond to the decoded symbol. | ||||
| 349 | bits MUST contain at least 15 (BROTLI_HUFFMAN_MAX_CODE_LENGTH) valid bits. */ | ||||
| 350 | static BROTLI_INLINEinline __attribute__((__always_inline__)) uint32_t DecodeSymbol(uint32_t bits, | ||||
| 351 | const HuffmanCode* table, | ||||
| 352 | BrotliBitReader* br) { | ||||
| 353 | BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table); | ||||
| 354 | BROTLI_HC_ADJUST_TABLE_INDEX(table, bits & HUFFMAN_TABLE_MASK)table += (bits & 0xFF); | ||||
| 355 | if (BROTLI_HC_FAST_LOAD_BITS(table)(table->bits) > HUFFMAN_TABLE_BITS8U) { | ||||
| 356 | uint32_t nbits = BROTLI_HC_FAST_LOAD_BITS(table)(table->bits) - HUFFMAN_TABLE_BITS8U; | ||||
| 357 | BrotliDropBits(br, HUFFMAN_TABLE_BITS8U); | ||||
| 358 | BROTLI_HC_ADJUST_TABLE_INDEX(table,table += ((table->value) + ((bits >> 8U) & BitMask (nbits))) | ||||
| 359 | BROTLI_HC_FAST_LOAD_VALUE(table) +table += ((table->value) + ((bits >> 8U) & BitMask (nbits))) | ||||
| 360 | ((bits >> HUFFMAN_TABLE_BITS) & BitMask(nbits)))table += ((table->value) + ((bits >> 8U) & BitMask (nbits))); | ||||
| 361 | } | ||||
| 362 | BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(table)(table->bits)); | ||||
| 363 | return BROTLI_HC_FAST_LOAD_VALUE(table)(table->value); | ||||
| 364 | } | ||||
| 365 | |||||
| 366 | /* Reads and decodes the next Huffman code from bit-stream. | ||||
| 367 | This method peeks 16 bits of input and drops 0 - 15 of them. */ | ||||
| 368 | static BROTLI_INLINEinline __attribute__((__always_inline__)) uint32_t ReadSymbol(const HuffmanCode* table, | ||||
| 369 | BrotliBitReader* br) { | ||||
| 370 | return DecodeSymbol(BrotliGet16BitsUnmasked(br), table, br); | ||||
| 371 | } | ||||
| 372 | |||||
| 373 | /* Same as DecodeSymbol, but it is known that there is less than 15 bits of | ||||
| 374 | input are currently available. */ | ||||
| 375 | static BROTLI_NOINLINE__attribute__((__noinline__)) BROTLI_BOOLint SafeDecodeSymbol( | ||||
| 376 | const HuffmanCode* table, BrotliBitReader* br, uint32_t* result) { | ||||
| 377 | uint32_t val; | ||||
| 378 | uint32_t available_bits = BrotliGetAvailableBits(br); | ||||
| 379 | BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table); | ||||
| 380 | if (available_bits == 0) { | ||||
| 381 | if (BROTLI_HC_FAST_LOAD_BITS(table)(table->bits) == 0) { | ||||
| 382 | *result = BROTLI_HC_FAST_LOAD_VALUE(table)(table->value); | ||||
| 383 | return BROTLI_TRUE1; | ||||
| 384 | } | ||||
| 385 | return BROTLI_FALSE0; /* No valid bits at all. */ | ||||
| 386 | } | ||||
| 387 | val = (uint32_t)BrotliGetBitsUnmasked(br); | ||||
| 388 | BROTLI_HC_ADJUST_TABLE_INDEX(table, val & HUFFMAN_TABLE_MASK)table += (val & 0xFF); | ||||
| 389 | if (BROTLI_HC_FAST_LOAD_BITS(table)(table->bits) <= HUFFMAN_TABLE_BITS8U) { | ||||
| 390 | if (BROTLI_HC_FAST_LOAD_BITS(table)(table->bits) <= available_bits) { | ||||
| 391 | BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(table)(table->bits)); | ||||
| 392 | *result = BROTLI_HC_FAST_LOAD_VALUE(table)(table->value); | ||||
| 393 | return BROTLI_TRUE1; | ||||
| 394 | } else { | ||||
| 395 | return BROTLI_FALSE0; /* Not enough bits for the first level. */ | ||||
| 396 | } | ||||
| 397 | } | ||||
| 398 | if (available_bits <= HUFFMAN_TABLE_BITS8U) { | ||||
| 399 | return BROTLI_FALSE0; /* Not enough bits to move to the second level. */ | ||||
| 400 | } | ||||
| 401 | |||||
| 402 | /* Speculatively drop HUFFMAN_TABLE_BITS. */ | ||||
| 403 | val = (val & BitMask(BROTLI_HC_FAST_LOAD_BITS(table)(table->bits))) >> HUFFMAN_TABLE_BITS8U; | ||||
| 404 | available_bits -= HUFFMAN_TABLE_BITS8U; | ||||
| 405 | BROTLI_HC_ADJUST_TABLE_INDEX(table, BROTLI_HC_FAST_LOAD_VALUE(table) + val)table += ((table->value) + val); | ||||
| 406 | if (available_bits < BROTLI_HC_FAST_LOAD_BITS(table)(table->bits)) { | ||||
| 407 | return BROTLI_FALSE0; /* Not enough bits for the second level. */ | ||||
| 408 | } | ||||
| 409 | |||||
| 410 | BrotliDropBits(br, HUFFMAN_TABLE_BITS8U + BROTLI_HC_FAST_LOAD_BITS(table)(table->bits)); | ||||
| 411 | *result = BROTLI_HC_FAST_LOAD_VALUE(table)(table->value); | ||||
| 412 | return BROTLI_TRUE1; | ||||
| 413 | } | ||||
| 414 | |||||
| 415 | static BROTLI_INLINEinline __attribute__((__always_inline__)) BROTLI_BOOLint SafeReadSymbol( | ||||
| 416 | const HuffmanCode* table, BrotliBitReader* br, uint32_t* result) { | ||||
| 417 | uint32_t val; | ||||
| 418 | if (BROTLI_PREDICT_TRUE(BrotliSafeGetBits(br, 15, &val))(__builtin_expect(!!(BrotliSafeGetBits(br, 15, &val)), 1) )) { | ||||
| 419 | *result = DecodeSymbol(val, table, br); | ||||
| 420 | return BROTLI_TRUE1; | ||||
| 421 | } | ||||
| 422 | return SafeDecodeSymbol(table, br, result); | ||||
| 423 | } | ||||
| 424 | |||||
| 425 | /* Makes a look-up in first level Huffman table. Peeks 8 bits. */ | ||||
| 426 | static BROTLI_INLINEinline __attribute__((__always_inline__)) void PreloadSymbol(int safe, | ||||
| 427 | const HuffmanCode* table, | ||||
| 428 | BrotliBitReader* br, | ||||
| 429 | uint32_t* bits, | ||||
| 430 | uint32_t* value) { | ||||
| 431 | if (safe) { | ||||
| 432 | return; | ||||
| 433 | } | ||||
| 434 | BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table); | ||||
| 435 | BROTLI_HC_ADJUST_TABLE_INDEX(table, BrotliGetBits(br, HUFFMAN_TABLE_BITS))table += (BrotliGetBits(br, 8U)); | ||||
| 436 | *bits = BROTLI_HC_FAST_LOAD_BITS(table)(table->bits); | ||||
| 437 | *value = BROTLI_HC_FAST_LOAD_VALUE(table)(table->value); | ||||
| 438 | } | ||||
| 439 | |||||
| 440 | /* Decodes the next Huffman code using data prepared by PreloadSymbol. | ||||
| 441 | Reads 0 - 15 bits. Also peeks 8 following bits. */ | ||||
| 442 | static BROTLI_INLINEinline __attribute__((__always_inline__)) uint32_t ReadPreloadedSymbol(const HuffmanCode* table, | ||||
| 443 | BrotliBitReader* br, | ||||
| 444 | uint32_t* bits, | ||||
| 445 | uint32_t* value) { | ||||
| 446 | uint32_t result = *value; | ||||
| 447 | if (BROTLI_PREDICT_FALSE(*bits > HUFFMAN_TABLE_BITS)(__builtin_expect(*bits > 8U, 0))) { | ||||
| 448 | uint32_t val = BrotliGet16BitsUnmasked(br); | ||||
| 449 | const HuffmanCode* ext = table + (val & HUFFMAN_TABLE_MASK0xFF) + *value; | ||||
| 450 | uint32_t mask = BitMask((*bits - HUFFMAN_TABLE_BITS8U)); | ||||
| 451 | BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(ext); | ||||
| 452 | BrotliDropBits(br, HUFFMAN_TABLE_BITS8U); | ||||
| 453 | BROTLI_HC_ADJUST_TABLE_INDEX(ext, (val >> HUFFMAN_TABLE_BITS) & mask)ext += ((val >> 8U) & mask); | ||||
| 454 | BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(ext)(ext->bits)); | ||||
| 455 | result = BROTLI_HC_FAST_LOAD_VALUE(ext)(ext->value); | ||||
| 456 | } else { | ||||
| 457 | BrotliDropBits(br, *bits); | ||||
| 458 | } | ||||
| 459 | PreloadSymbol(0, table, br, bits, value); | ||||
| 460 | return result; | ||||
| 461 | } | ||||
| 462 | |||||
| 463 | static BROTLI_INLINEinline __attribute__((__always_inline__)) uint32_t Log2Floor(uint32_t x) { | ||||
| 464 | uint32_t result = 0; | ||||
| 465 | while (x) { | ||||
| 466 | x >>= 1; | ||||
| 467 | ++result; | ||||
| 468 | } | ||||
| 469 | return result; | ||||
| 470 | } | ||||
| 471 | |||||
| 472 | /* Reads (s->symbol + 1) symbols. | ||||
| 473 | Totally 1..4 symbols are read, 1..11 bits each. | ||||
| 474 | The list of symbols MUST NOT contain duplicates. */ | ||||
| 475 | static BrotliDecoderErrorCode ReadSimpleHuffmanSymbols( | ||||
| 476 | uint32_t alphabet_size_max, uint32_t alphabet_size_limit, | ||||
| 477 | BrotliDecoderStateBrotliDecoderStateInternal* s) { | ||||
| 478 | /* max_bits == 1..11; symbol == 0..3; 1..44 bits will be read. */ | ||||
| 479 | BrotliBitReader* br = &s->br; | ||||
| 480 | BrotliMetablockHeaderArena* h = &s->arena.header; | ||||
| 481 | uint32_t max_bits = Log2Floor(alphabet_size_max - 1); | ||||
| 482 | uint32_t i = h->sub_loop_counter; | ||||
| 483 | uint32_t num_symbols = h->symbol; | ||||
| 484 | while (i <= num_symbols) { | ||||
| 485 | uint32_t v; | ||||
| 486 | if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, max_bits, &v))(__builtin_expect(!BrotliSafeReadBits(br, max_bits, &v), 0 ))) { | ||||
| 487 | h->sub_loop_counter = i; | ||||
| 488 | h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_READ; | ||||
| 489 | return BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 490 | } | ||||
| 491 | if (v >= alphabet_size_limit) { | ||||
| 492 | return | ||||
| 493 | BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET)((void)(0), BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET ); | ||||
| 494 | } | ||||
| 495 | h->symbols_lists_array[i] = (uint16_t)v; | ||||
| 496 | BROTLI_LOG_UINT(h->symbols_lists_array[i]); | ||||
| 497 | ++i; | ||||
| 498 | } | ||||
| 499 | |||||
| 500 | for (i = 0; i < num_symbols; ++i) { | ||||
| 501 | uint32_t k = i + 1; | ||||
| 502 | for (; k <= num_symbols; ++k) { | ||||
| 503 | if (h->symbols_lists_array[i] == h->symbols_lists_array[k]) { | ||||
| 504 | return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME)((void)(0), BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME); | ||||
| 505 | } | ||||
| 506 | } | ||||
| 507 | } | ||||
| 508 | |||||
| 509 | return BROTLI_DECODER_SUCCESS; | ||||
| 510 | } | ||||
| 511 | |||||
| 512 | /* Process single decoded symbol code length: | ||||
| 513 | A) reset the repeat variable | ||||
| 514 | B) remember code length (if it is not 0) | ||||
| 515 | C) extend corresponding index-chain | ||||
| 516 | D) reduce the Huffman space | ||||
| 517 | E) update the histogram */ | ||||
| 518 | static BROTLI_INLINEinline __attribute__((__always_inline__)) void ProcessSingleCodeLength(uint32_t code_len, | ||||
| 519 | uint32_t* symbol, uint32_t* repeat, uint32_t* space, | ||||
| 520 | uint32_t* prev_code_len, uint16_t* symbol_lists, | ||||
| 521 | uint16_t* code_length_histo, int* next_symbol) { | ||||
| 522 | *repeat = 0; | ||||
| 523 | if (code_len != 0) { /* code_len == 1..15 */ | ||||
| 524 | symbol_lists[next_symbol[code_len]] = (uint16_t)(*symbol); | ||||
| 525 | next_symbol[code_len] = (int)(*symbol); | ||||
| 526 | *prev_code_len = code_len; | ||||
| 527 | *space -= 32768U >> code_len; | ||||
| 528 | code_length_histo[code_len]++; | ||||
| 529 | BROTLI_LOG(("[ReadHuffmanCode] code_length[%d] = %d\n", | ||||
| 530 | (int)*symbol, (int)code_len)); | ||||
| 531 | } | ||||
| 532 | (*symbol)++; | ||||
| 533 | } | ||||
| 534 | |||||
| 535 | /* Process repeated symbol code length. | ||||
| 536 | A) Check if it is the extension of previous repeat sequence; if the decoded | ||||
| 537 | value is not BROTLI_REPEAT_PREVIOUS_CODE_LENGTH, then it is a new | ||||
| 538 | symbol-skip | ||||
| 539 | B) Update repeat variable | ||||
| 540 | C) Check if operation is feasible (fits alphabet) | ||||
| 541 | D) For each symbol do the same operations as in ProcessSingleCodeLength | ||||
| 542 | |||||
| 543 | PRECONDITION: code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH or | ||||
| 544 | code_len == BROTLI_REPEAT_ZERO_CODE_LENGTH */ | ||||
| 545 | static BROTLI_INLINEinline __attribute__((__always_inline__)) void ProcessRepeatedCodeLength(uint32_t code_len, | ||||
| 546 | uint32_t repeat_delta, uint32_t alphabet_size, uint32_t* symbol, | ||||
| 547 | uint32_t* repeat, uint32_t* space, uint32_t* prev_code_len, | ||||
| 548 | uint32_t* repeat_code_len, uint16_t* symbol_lists, | ||||
| 549 | uint16_t* code_length_histo, int* next_symbol) { | ||||
| 550 | uint32_t old_repeat; | ||||
| 551 | uint32_t extra_bits = 3; /* for BROTLI_REPEAT_ZERO_CODE_LENGTH */ | ||||
| 552 | uint32_t new_len = 0; /* for BROTLI_REPEAT_ZERO_CODE_LENGTH */ | ||||
| 553 | if (code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH16) { | ||||
| 554 | new_len = *prev_code_len; | ||||
| 555 | extra_bits = 2; | ||||
| 556 | } | ||||
| 557 | if (*repeat_code_len != new_len) { | ||||
| 558 | *repeat = 0; | ||||
| 559 | *repeat_code_len = new_len; | ||||
| 560 | } | ||||
| 561 | old_repeat = *repeat; | ||||
| 562 | if (*repeat > 0) { | ||||
| 563 | *repeat -= 2; | ||||
| 564 | *repeat <<= extra_bits; | ||||
| 565 | } | ||||
| 566 | *repeat += repeat_delta + 3U; | ||||
| 567 | repeat_delta = *repeat - old_repeat; | ||||
| 568 | if (*symbol + repeat_delta > alphabet_size) { | ||||
| 569 | BROTLI_DUMP()(void)(0); | ||||
| 570 | *symbol = alphabet_size; | ||||
| 571 | *space = 0xFFFFF; | ||||
| 572 | return; | ||||
| 573 | } | ||||
| 574 | BROTLI_LOG(("[ReadHuffmanCode] code_length[%d..%d] = %d\n", | ||||
| 575 | (int)*symbol, (int)(*symbol + repeat_delta - 1), (int)*repeat_code_len)); | ||||
| 576 | if (*repeat_code_len != 0) { | ||||
| 577 | unsigned last = *symbol + repeat_delta; | ||||
| 578 | int next = next_symbol[*repeat_code_len]; | ||||
| 579 | do { | ||||
| 580 | symbol_lists[next] = (uint16_t)*symbol; | ||||
| 581 | next = (int)*symbol; | ||||
| 582 | } while (++(*symbol) != last); | ||||
| 583 | next_symbol[*repeat_code_len] = next; | ||||
| 584 | *space -= repeat_delta << (15 - *repeat_code_len); | ||||
| 585 | code_length_histo[*repeat_code_len] = | ||||
| 586 | (uint16_t)(code_length_histo[*repeat_code_len] + repeat_delta); | ||||
| 587 | } else { | ||||
| 588 | *symbol += repeat_delta; | ||||
| 589 | } | ||||
| 590 | } | ||||
| 591 | |||||
| 592 | /* Reads and decodes symbol codelengths. */ | ||||
| 593 | static BrotliDecoderErrorCode ReadSymbolCodeLengths( | ||||
| 594 | uint32_t alphabet_size, BrotliDecoderStateBrotliDecoderStateInternal* s) { | ||||
| 595 | BrotliBitReader* br = &s->br; | ||||
| 596 | BrotliMetablockHeaderArena* h = &s->arena.header; | ||||
| 597 | uint32_t symbol = h->symbol; | ||||
| 598 | uint32_t repeat = h->repeat; | ||||
| 599 | uint32_t space = h->space; | ||||
| 600 | uint32_t prev_code_len = h->prev_code_len; | ||||
| 601 | uint32_t repeat_code_len = h->repeat_code_len; | ||||
| 602 | uint16_t* symbol_lists = h->symbol_lists; | ||||
| 603 | uint16_t* code_length_histo = h->code_length_histo; | ||||
| 604 | int* next_symbol = h->next_symbol; | ||||
| 605 | if (!BrotliWarmupBitReader(br)) { | ||||
| 606 | return BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 607 | } | ||||
| 608 | while (symbol < alphabet_size && space > 0) { | ||||
| 609 | const HuffmanCode* p = h->table; | ||||
| 610 | uint32_t code_len; | ||||
| 611 | BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(p); | ||||
| 612 | if (!BrotliCheckInputAmount(br, BROTLI_SHORT_FILL_BIT_WINDOW_READ(sizeof(uint64_t) >> 1))) { | ||||
| 613 | h->symbol = symbol; | ||||
| 614 | h->repeat = repeat; | ||||
| 615 | h->prev_code_len = prev_code_len; | ||||
| 616 | h->repeat_code_len = repeat_code_len; | ||||
| 617 | h->space = space; | ||||
| 618 | return BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 619 | } | ||||
| 620 | BrotliFillBitWindow16(br); | ||||
| 621 | BROTLI_HC_ADJUST_TABLE_INDEX(p, BrotliGetBitsUnmasked(br) &p += (BrotliGetBitsUnmasked(br) & BitMask(5)) | ||||
| 622 | BitMask(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH))p += (BrotliGetBitsUnmasked(br) & BitMask(5)); | ||||
| 623 | BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p)(p->bits)); /* Use 1..5 bits. */ | ||||
| 624 | code_len = BROTLI_HC_FAST_LOAD_VALUE(p)(p->value); /* code_len == 0..17 */ | ||||
| 625 | if (code_len < BROTLI_REPEAT_PREVIOUS_CODE_LENGTH16) { | ||||
| 626 | ProcessSingleCodeLength(code_len, &symbol, &repeat, &space, | ||||
| 627 | &prev_code_len, symbol_lists, code_length_histo, next_symbol); | ||||
| 628 | } else { /* code_len == 16..17, extra_bits == 2..3 */ | ||||
| 629 | uint32_t extra_bits = | ||||
| 630 | (code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH16) ? 2 : 3; | ||||
| 631 | uint32_t repeat_delta = | ||||
| 632 | (uint32_t)BrotliGetBitsUnmasked(br) & BitMask(extra_bits); | ||||
| 633 | BrotliDropBits(br, extra_bits); | ||||
| 634 | ProcessRepeatedCodeLength(code_len, repeat_delta, alphabet_size, | ||||
| 635 | &symbol, &repeat, &space, &prev_code_len, &repeat_code_len, | ||||
| 636 | symbol_lists, code_length_histo, next_symbol); | ||||
| 637 | } | ||||
| 638 | } | ||||
| 639 | h->space = space; | ||||
| 640 | return BROTLI_DECODER_SUCCESS; | ||||
| 641 | } | ||||
| 642 | |||||
| 643 | static BrotliDecoderErrorCode SafeReadSymbolCodeLengths( | ||||
| 644 | uint32_t alphabet_size, BrotliDecoderStateBrotliDecoderStateInternal* s) { | ||||
| 645 | BrotliBitReader* br = &s->br; | ||||
| 646 | BrotliMetablockHeaderArena* h = &s->arena.header; | ||||
| 647 | BROTLI_BOOLint get_byte = BROTLI_FALSE0; | ||||
| 648 | while (h->symbol < alphabet_size && h->space > 0) { | ||||
| 649 | const HuffmanCode* p = h->table; | ||||
| 650 | uint32_t code_len; | ||||
| 651 | uint32_t available_bits; | ||||
| 652 | uint32_t bits = 0; | ||||
| 653 | BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(p); | ||||
| 654 | if (get_byte && !BrotliPullByte(br)) return BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 655 | get_byte = BROTLI_FALSE0; | ||||
| 656 | available_bits = BrotliGetAvailableBits(br); | ||||
| 657 | if (available_bits != 0) { | ||||
| 658 | bits = (uint32_t)BrotliGetBitsUnmasked(br); | ||||
| 659 | } | ||||
| 660 | BROTLI_HC_ADJUST_TABLE_INDEX(p,p += (bits & BitMask(5)) | ||||
| 661 | bits & BitMask(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH))p += (bits & BitMask(5)); | ||||
| 662 | if (BROTLI_HC_FAST_LOAD_BITS(p)(p->bits) > available_bits) { | ||||
| 663 | get_byte = BROTLI_TRUE1; | ||||
| 664 | continue; | ||||
| 665 | } | ||||
| 666 | code_len = BROTLI_HC_FAST_LOAD_VALUE(p)(p->value); /* code_len == 0..17 */ | ||||
| 667 | if (code_len < BROTLI_REPEAT_PREVIOUS_CODE_LENGTH16) { | ||||
| 668 | BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p)(p->bits)); | ||||
| 669 | ProcessSingleCodeLength(code_len, &h->symbol, &h->repeat, &h->space, | ||||
| 670 | &h->prev_code_len, h->symbol_lists, h->code_length_histo, | ||||
| 671 | h->next_symbol); | ||||
| 672 | } else { /* code_len == 16..17, extra_bits == 2..3 */ | ||||
| 673 | uint32_t extra_bits = code_len - 14U; | ||||
| 674 | uint32_t repeat_delta = (bits >> BROTLI_HC_FAST_LOAD_BITS(p)(p->bits)) & | ||||
| 675 | BitMask(extra_bits); | ||||
| 676 | if (available_bits < BROTLI_HC_FAST_LOAD_BITS(p)(p->bits) + extra_bits) { | ||||
| 677 | get_byte = BROTLI_TRUE1; | ||||
| 678 | continue; | ||||
| 679 | } | ||||
| 680 | BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p)(p->bits) + extra_bits); | ||||
| 681 | ProcessRepeatedCodeLength(code_len, repeat_delta, alphabet_size, | ||||
| 682 | &h->symbol, &h->repeat, &h->space, &h->prev_code_len, | ||||
| 683 | &h->repeat_code_len, h->symbol_lists, h->code_length_histo, | ||||
| 684 | h->next_symbol); | ||||
| 685 | } | ||||
| 686 | } | ||||
| 687 | return BROTLI_DECODER_SUCCESS; | ||||
| 688 | } | ||||
| 689 | |||||
| 690 | /* Reads and decodes 15..18 codes using static prefix code. | ||||
| 691 | Each code is 2..4 bits long. In total 30..72 bits are used. */ | ||||
| 692 | static BrotliDecoderErrorCode ReadCodeLengthCodeLengths(BrotliDecoderStateBrotliDecoderStateInternal* s) { | ||||
| 693 | BrotliBitReader* br = &s->br; | ||||
| 694 | BrotliMetablockHeaderArena* h = &s->arena.header; | ||||
| 695 | uint32_t num_codes = h->repeat; | ||||
| 696 | unsigned space = h->space; | ||||
| 697 | uint32_t i = h->sub_loop_counter; | ||||
| 698 | for (; i < BROTLI_CODE_LENGTH_CODES(17 + 1); ++i) { | ||||
| 699 | const uint8_t code_len_idx = kCodeLengthCodeOrder[i]; | ||||
| 700 | uint32_t ix; | ||||
| 701 | uint32_t v; | ||||
| 702 | if (BROTLI_PREDICT_FALSE(!BrotliSafeGetBits(br, 4, &ix))(__builtin_expect(!BrotliSafeGetBits(br, 4, &ix), 0))) { | ||||
| 703 | uint32_t available_bits = BrotliGetAvailableBits(br); | ||||
| 704 | if (available_bits != 0) { | ||||
| 705 | ix = BrotliGetBitsUnmasked(br) & 0xF; | ||||
| 706 | } else { | ||||
| 707 | ix = 0; | ||||
| 708 | } | ||||
| 709 | if (kCodeLengthPrefixLength[ix] > available_bits) { | ||||
| 710 | h->sub_loop_counter = i; | ||||
| 711 | h->repeat = num_codes; | ||||
| 712 | h->space = space; | ||||
| 713 | h->substate_huffman = BROTLI_STATE_HUFFMAN_COMPLEX; | ||||
| 714 | return BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 715 | } | ||||
| 716 | } | ||||
| 717 | v = kCodeLengthPrefixValue[ix]; | ||||
| 718 | BrotliDropBits(br, kCodeLengthPrefixLength[ix]); | ||||
| 719 | h->code_length_code_lengths[code_len_idx] = (uint8_t)v; | ||||
| 720 | BROTLI_LOG_ARRAY_INDEX(h->code_length_code_lengths, code_len_idx); | ||||
| 721 | if (v != 0) { | ||||
| 722 | space = space - (32U >> v); | ||||
| 723 | ++num_codes; | ||||
| 724 | ++h->code_length_histo[v]; | ||||
| 725 | if (space - 1U >= 32U) { | ||||
| 726 | /* space is 0 or wrapped around. */ | ||||
| 727 | break; | ||||
| 728 | } | ||||
| 729 | } | ||||
| 730 | } | ||||
| 731 | if (!(num_codes == 1 || space == 0)) { | ||||
| 732 | return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_CL_SPACE)((void)(0), BROTLI_DECODER_ERROR_FORMAT_CL_SPACE); | ||||
| 733 | } | ||||
| 734 | return BROTLI_DECODER_SUCCESS; | ||||
| 735 | } | ||||
| 736 | |||||
| 737 | /* Decodes the Huffman tables. | ||||
| 738 | There are 2 scenarios: | ||||
| 739 | A) Huffman code contains only few symbols (1..4). Those symbols are read | ||||
| 740 | directly; their code lengths are defined by the number of symbols. | ||||
| 741 | For this scenario 4 - 49 bits will be read. | ||||
| 742 | |||||
| 743 | B) 2-phase decoding: | ||||
| 744 | B.1) Small Huffman table is decoded; it is specified with code lengths | ||||
| 745 | encoded with predefined entropy code. 32 - 74 bits are used. | ||||
| 746 | B.2) Decoded table is used to decode code lengths of symbols in resulting | ||||
| 747 | Huffman table. In worst case 3520 bits are read. */ | ||||
| 748 | static BrotliDecoderErrorCode ReadHuffmanCode(uint32_t alphabet_size_max, | ||||
| 749 | uint32_t alphabet_size_limit, | ||||
| 750 | HuffmanCode* table, | ||||
| 751 | uint32_t* opt_table_size, | ||||
| 752 | BrotliDecoderStateBrotliDecoderStateInternal* s) { | ||||
| 753 | BrotliBitReader* br = &s->br; | ||||
| 754 | BrotliMetablockHeaderArena* h = &s->arena.header; | ||||
| 755 | /* State machine. */ | ||||
| 756 | for (;;) { | ||||
| 757 | switch (h->substate_huffman) { | ||||
| 758 | case BROTLI_STATE_HUFFMAN_NONE: | ||||
| 759 | if (!BrotliSafeReadBits(br, 2, &h->sub_loop_counter)) { | ||||
| 760 | return BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 761 | } | ||||
| 762 | BROTLI_LOG_UINT(h->sub_loop_counter); | ||||
| 763 | /* The value is used as follows: | ||||
| 764 | 1 for simple code; | ||||
| 765 | 0 for no skipping, 2 skips 2 code lengths, 3 skips 3 code lengths */ | ||||
| 766 | if (h->sub_loop_counter != 1) { | ||||
| 767 | h->space = 32; | ||||
| 768 | h->repeat = 0; /* num_codes */ | ||||
| 769 | memset(&h->code_length_histo[0], 0, sizeof(h->code_length_histo[0]) * | ||||
| 770 | (BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH5 + 1)); | ||||
| 771 | memset(&h->code_length_code_lengths[0], 0, | ||||
| 772 | sizeof(h->code_length_code_lengths)); | ||||
| 773 | h->substate_huffman = BROTLI_STATE_HUFFMAN_COMPLEX; | ||||
| 774 | continue; | ||||
| 775 | } | ||||
| 776 | /* Fall through. */ | ||||
| 777 | |||||
| 778 | case BROTLI_STATE_HUFFMAN_SIMPLE_SIZE: | ||||
| 779 | /* Read symbols, codes & code lengths directly. */ | ||||
| 780 | if (!BrotliSafeReadBits(br, 2, &h->symbol)) { /* num_symbols */ | ||||
| 781 | h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_SIZE; | ||||
| 782 | return BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 783 | } | ||||
| 784 | h->sub_loop_counter = 0; | ||||
| 785 | /* Fall through. */ | ||||
| 786 | |||||
| 787 | case BROTLI_STATE_HUFFMAN_SIMPLE_READ: { | ||||
| 788 | BrotliDecoderErrorCode result = | ||||
| 789 | ReadSimpleHuffmanSymbols(alphabet_size_max, alphabet_size_limit, s); | ||||
| 790 | if (result != BROTLI_DECODER_SUCCESS) { | ||||
| 791 | return result; | ||||
| 792 | } | ||||
| 793 | } | ||||
| 794 | /* Fall through. */ | ||||
| 795 | |||||
| 796 | case BROTLI_STATE_HUFFMAN_SIMPLE_BUILD: { | ||||
| 797 | uint32_t table_size; | ||||
| 798 | if (h->symbol == 3) { | ||||
| 799 | uint32_t bits; | ||||
| 800 | if (!BrotliSafeReadBits(br, 1, &bits)) { | ||||
| 801 | h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_BUILD; | ||||
| 802 | return BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 803 | } | ||||
| 804 | h->symbol += bits; | ||||
| 805 | } | ||||
| 806 | BROTLI_LOG_UINT(h->symbol); | ||||
| 807 | table_size = BrotliBuildSimpleHuffmanTable( | ||||
| 808 | table, HUFFMAN_TABLE_BITS8U, h->symbols_lists_array, h->symbol); | ||||
| 809 | if (opt_table_size) { | ||||
| 810 | *opt_table_size = table_size; | ||||
| 811 | } | ||||
| 812 | h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE; | ||||
| 813 | return BROTLI_DECODER_SUCCESS; | ||||
| 814 | } | ||||
| 815 | |||||
| 816 | /* Decode Huffman-coded code lengths. */ | ||||
| 817 | case BROTLI_STATE_HUFFMAN_COMPLEX: { | ||||
| 818 | uint32_t i; | ||||
| 819 | BrotliDecoderErrorCode result = ReadCodeLengthCodeLengths(s); | ||||
| 820 | if (result != BROTLI_DECODER_SUCCESS) { | ||||
| 821 | return result; | ||||
| 822 | } | ||||
| 823 | BrotliBuildCodeLengthsHuffmanTable(h->table, | ||||
| 824 | h->code_length_code_lengths, | ||||
| 825 | h->code_length_histo); | ||||
| 826 | memset(&h->code_length_histo[0], 0, sizeof(h->code_length_histo)); | ||||
| 827 | for (i = 0; i <= BROTLI_HUFFMAN_MAX_CODE_LENGTH15; ++i) { | ||||
| 828 | h->next_symbol[i] = (int)i - (BROTLI_HUFFMAN_MAX_CODE_LENGTH15 + 1); | ||||
| 829 | h->symbol_lists[h->next_symbol[i]] = 0xFFFF; | ||||
| 830 | } | ||||
| 831 | |||||
| 832 | h->symbol = 0; | ||||
| 833 | h->prev_code_len = BROTLI_INITIAL_REPEATED_CODE_LENGTH8; | ||||
| 834 | h->repeat = 0; | ||||
| 835 | h->repeat_code_len = 0; | ||||
| 836 | h->space = 32768; | ||||
| 837 | h->substate_huffman = BROTLI_STATE_HUFFMAN_LENGTH_SYMBOLS; | ||||
| 838 | } | ||||
| 839 | /* Fall through. */ | ||||
| 840 | |||||
| 841 | case BROTLI_STATE_HUFFMAN_LENGTH_SYMBOLS: { | ||||
| 842 | uint32_t table_size; | ||||
| 843 | BrotliDecoderErrorCode result = ReadSymbolCodeLengths( | ||||
| 844 | alphabet_size_limit, s); | ||||
| 845 | if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) { | ||||
| 846 | result = SafeReadSymbolCodeLengths(alphabet_size_limit, s); | ||||
| 847 | } | ||||
| 848 | if (result != BROTLI_DECODER_SUCCESS) { | ||||
| 849 | return result; | ||||
| 850 | } | ||||
| 851 | |||||
| 852 | if (h->space != 0) { | ||||
| 853 | BROTLI_LOG(("[ReadHuffmanCode] space = %d\n", (int)h->space)); | ||||
| 854 | return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE)((void)(0), BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE); | ||||
| 855 | } | ||||
| 856 | table_size = BrotliBuildHuffmanTable( | ||||
| 857 | table, HUFFMAN_TABLE_BITS8U, h->symbol_lists, h->code_length_histo); | ||||
| 858 | if (opt_table_size) { | ||||
| 859 | *opt_table_size = table_size; | ||||
| 860 | } | ||||
| 861 | h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE; | ||||
| 862 | return BROTLI_DECODER_SUCCESS; | ||||
| 863 | } | ||||
| 864 | |||||
| 865 | default: | ||||
| 866 | return | ||||
| 867 | BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE)((void)(0), BROTLI_DECODER_ERROR_UNREACHABLE); | ||||
| 868 | } | ||||
| 869 | } | ||||
| 870 | } | ||||
| 871 | |||||
| 872 | /* Decodes a block length by reading 3..39 bits. */ | ||||
| 873 | static BROTLI_INLINEinline __attribute__((__always_inline__)) uint32_t ReadBlockLength(const HuffmanCode* table, | ||||
| 874 | BrotliBitReader* br) { | ||||
| 875 | uint32_t code; | ||||
| 876 | uint32_t nbits; | ||||
| 877 | code = ReadSymbol(table, br); | ||||
| 878 | nbits = _kBrotliPrefixCodeRanges[code].nbits; /* nbits == 2..24 */ | ||||
| 879 | return _kBrotliPrefixCodeRanges[code].offset + BrotliReadBits24(br, nbits); | ||||
| 880 | } | ||||
| 881 | |||||
| 882 | /* WARNING: if state is not BROTLI_STATE_READ_BLOCK_LENGTH_NONE, then | ||||
| 883 | reading can't be continued with ReadBlockLength. */ | ||||
| 884 | static BROTLI_INLINEinline __attribute__((__always_inline__)) BROTLI_BOOLint SafeReadBlockLength( | ||||
| 885 | BrotliDecoderStateBrotliDecoderStateInternal* s, uint32_t* result, const HuffmanCode* table, | ||||
| 886 | BrotliBitReader* br) { | ||||
| 887 | uint32_t index; | ||||
| 888 | if (s->substate_read_block_length == BROTLI_STATE_READ_BLOCK_LENGTH_NONE) { | ||||
| 889 | if (!SafeReadSymbol(table, br, &index)) { | ||||
| 890 | return BROTLI_FALSE0; | ||||
| 891 | } | ||||
| 892 | } else { | ||||
| 893 | index = s->block_length_index; | ||||
| 894 | } | ||||
| 895 | { | ||||
| 896 | uint32_t bits; | ||||
| 897 | uint32_t nbits = _kBrotliPrefixCodeRanges[index].nbits; | ||||
| 898 | uint32_t offset = _kBrotliPrefixCodeRanges[index].offset; | ||||
| 899 | if (!BrotliSafeReadBits(br, nbits, &bits)) { | ||||
| 900 | s->block_length_index = index; | ||||
| 901 | s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_SUFFIX; | ||||
| 902 | return BROTLI_FALSE0; | ||||
| 903 | } | ||||
| 904 | *result = offset + bits; | ||||
| 905 | s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_NONE; | ||||
| 906 | return BROTLI_TRUE1; | ||||
| 907 | } | ||||
| 908 | } | ||||
| 909 | |||||
| 910 | /* Transform: | ||||
| 911 | 1) initialize list L with values 0, 1,... 255 | ||||
| 912 | 2) For each input element X: | ||||
| 913 | 2.1) let Y = L[X] | ||||
| 914 | 2.2) remove X-th element from L | ||||
| 915 | 2.3) prepend Y to L | ||||
| 916 | 2.4) append Y to output | ||||
| 917 | |||||
| 918 | In most cases max(Y) <= 7, so most of L remains intact. | ||||
| 919 | To reduce the cost of initialization, we reuse L, remember the upper bound | ||||
| 920 | of Y values, and reinitialize only first elements in L. | ||||
| 921 | |||||
| 922 | Most of input values are 0 and 1. To reduce number of branches, we replace | ||||
| 923 | inner for loop with do-while. */ | ||||
| 924 | static BROTLI_NOINLINE__attribute__((__noinline__)) void InverseMoveToFrontTransform( | ||||
| 925 | uint8_t* v, uint32_t v_len, BrotliDecoderStateBrotliDecoderStateInternal* state) { | ||||
| 926 | /* Reinitialize elements that could have been changed. */ | ||||
| 927 | uint32_t i = 1; | ||||
| 928 | uint32_t upper_bound = state->mtf_upper_bound; | ||||
| 929 | uint32_t* mtf = &state->mtf[1]; /* Make mtf[-1] addressable. */ | ||||
| 930 | uint8_t* mtf_u8 = (uint8_t*)mtf; | ||||
| 931 | /* Load endian-aware constant. */ | ||||
| 932 | const uint8_t b0123[4] = {0, 1, 2, 3}; | ||||
| 933 | uint32_t pattern; | ||||
| 934 | memcpy(&pattern, &b0123, 4); | ||||
| 935 | |||||
| 936 | /* Initialize list using 4 consequent values pattern. */ | ||||
| 937 | mtf[0] = pattern; | ||||
| 938 | do { | ||||
| 939 | pattern += 0x04040404; /* Advance all 4 values by 4. */ | ||||
| 940 | mtf[i] = pattern; | ||||
| 941 | i++; | ||||
| 942 | } while (i <= upper_bound); | ||||
| 943 | |||||
| 944 | /* Transform the input. */ | ||||
| 945 | upper_bound = 0; | ||||
| 946 | for (i = 0; i < v_len; ++i) { | ||||
| 947 | int index = v[i]; | ||||
| 948 | uint8_t value = mtf_u8[index]; | ||||
| 949 | upper_bound |= v[i]; | ||||
| 950 | v[i] = value; | ||||
| 951 | mtf_u8[-1] = value; | ||||
| 952 | do { | ||||
| 953 | index--; | ||||
| 954 | mtf_u8[index + 1] = mtf_u8[index]; | ||||
| 955 | } while (index >= 0); | ||||
| 956 | } | ||||
| 957 | /* Remember amount of elements to be reinitialized. */ | ||||
| 958 | state->mtf_upper_bound = upper_bound >> 2; | ||||
| 959 | } | ||||
| 960 | |||||
| 961 | /* Decodes a series of Huffman table using ReadHuffmanCode function. */ | ||||
| 962 | static BrotliDecoderErrorCode HuffmanTreeGroupDecode( | ||||
| 963 | HuffmanTreeGroup* group, BrotliDecoderStateBrotliDecoderStateInternal* s) { | ||||
| 964 | BrotliMetablockHeaderArena* h = &s->arena.header; | ||||
| 965 | if (h->substate_tree_group != BROTLI_STATE_TREE_GROUP_LOOP) { | ||||
| 966 | h->next = group->codes; | ||||
| 967 | h->htree_index = 0; | ||||
| 968 | h->substate_tree_group = BROTLI_STATE_TREE_GROUP_LOOP; | ||||
| 969 | } | ||||
| 970 | while (h->htree_index < group->num_htrees) { | ||||
| 971 | uint32_t table_size; | ||||
| 972 | BrotliDecoderErrorCode result = ReadHuffmanCode(group->alphabet_size_max, | ||||
| 973 | group->alphabet_size_limit, h->next, &table_size, s); | ||||
| 974 | if (result != BROTLI_DECODER_SUCCESS) return result; | ||||
| 975 | group->htrees[h->htree_index] = h->next; | ||||
| 976 | h->next += table_size; | ||||
| 977 | ++h->htree_index; | ||||
| 978 | } | ||||
| 979 | h->substate_tree_group = BROTLI_STATE_TREE_GROUP_NONE; | ||||
| 980 | return BROTLI_DECODER_SUCCESS; | ||||
| 981 | } | ||||
| 982 | |||||
| 983 | /* Decodes a context map. | ||||
| 984 | Decoding is done in 4 phases: | ||||
| 985 | 1) Read auxiliary information (6..16 bits) and allocate memory. | ||||
| 986 | In case of trivial context map, decoding is finished at this phase. | ||||
| 987 | 2) Decode Huffman table using ReadHuffmanCode function. | ||||
| 988 | This table will be used for reading context map items. | ||||
| 989 | 3) Read context map items; "0" values could be run-length encoded. | ||||
| 990 | 4) Optionally, apply InverseMoveToFront transform to the resulting map. */ | ||||
| 991 | static BrotliDecoderErrorCode DecodeContextMap(uint32_t context_map_size, | ||||
| 992 | uint32_t* num_htrees, | ||||
| 993 | uint8_t** context_map_arg, | ||||
| 994 | BrotliDecoderStateBrotliDecoderStateInternal* s) { | ||||
| 995 | BrotliBitReader* br = &s->br; | ||||
| 996 | BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS; | ||||
| 997 | BrotliMetablockHeaderArena* h = &s->arena.header; | ||||
| 998 | |||||
| 999 | switch ((int)h->substate_context_map) { | ||||
| 1000 | case BROTLI_STATE_CONTEXT_MAP_NONE: | ||||
| 1001 | result = DecodeVarLenUint8(s, br, num_htrees); | ||||
| 1002 | if (result != BROTLI_DECODER_SUCCESS) { | ||||
| 1003 | return result; | ||||
| 1004 | } | ||||
| 1005 | (*num_htrees)++; | ||||
| 1006 | h->context_index = 0; | ||||
| 1007 | BROTLI_LOG_UINT(context_map_size); | ||||
| 1008 | BROTLI_LOG_UINT(*num_htrees); | ||||
| 1009 | *context_map_arg = | ||||
| 1010 | (uint8_t*)BROTLI_DECODER_ALLOC(s, (size_t)context_map_size)s->alloc_func(s->memory_manager_opaque, (size_t)context_map_size ); | ||||
| 1011 | if (*context_map_arg == 0) { | ||||
| 1012 | return BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP)((void)(0), BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP); | ||||
| 1013 | } | ||||
| 1014 | if (*num_htrees <= 1) { | ||||
| 1015 | memset(*context_map_arg, 0, (size_t)context_map_size); | ||||
| 1016 | return BROTLI_DECODER_SUCCESS; | ||||
| 1017 | } | ||||
| 1018 | h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_READ_PREFIX; | ||||
| 1019 | /* Fall through. */ | ||||
| 1020 | |||||
| 1021 | case BROTLI_STATE_CONTEXT_MAP_READ_PREFIX: { | ||||
| 1022 | uint32_t bits; | ||||
| 1023 | /* In next stage ReadHuffmanCode uses at least 4 bits, so it is safe | ||||
| 1024 | to peek 4 bits ahead. */ | ||||
| 1025 | if (!BrotliSafeGetBits(br, 5, &bits)) { | ||||
| 1026 | return BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 1027 | } | ||||
| 1028 | if ((bits & 1) != 0) { /* Use RLE for zeros. */ | ||||
| 1029 | h->max_run_length_prefix = (bits >> 1) + 1; | ||||
| 1030 | BrotliDropBits(br, 5); | ||||
| 1031 | } else { | ||||
| 1032 | h->max_run_length_prefix = 0; | ||||
| 1033 | BrotliDropBits(br, 1); | ||||
| 1034 | } | ||||
| 1035 | BROTLI_LOG_UINT(h->max_run_length_prefix); | ||||
| 1036 | h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_HUFFMAN; | ||||
| 1037 | } | ||||
| 1038 | /* Fall through. */ | ||||
| 1039 | |||||
| 1040 | case BROTLI_STATE_CONTEXT_MAP_HUFFMAN: { | ||||
| 1041 | uint32_t alphabet_size = *num_htrees + h->max_run_length_prefix; | ||||
| 1042 | result = ReadHuffmanCode(alphabet_size, alphabet_size, | ||||
| 1043 | h->context_map_table, NULL((void*)0), s); | ||||
| 1044 | if (result != BROTLI_DECODER_SUCCESS) return result; | ||||
| 1045 | h->code = 0xFFFF; | ||||
| 1046 | h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_DECODE; | ||||
| 1047 | } | ||||
| 1048 | /* Fall through. */ | ||||
| 1049 | |||||
| 1050 | case BROTLI_STATE_CONTEXT_MAP_DECODE: { | ||||
| 1051 | uint32_t context_index = h->context_index; | ||||
| 1052 | uint32_t max_run_length_prefix = h->max_run_length_prefix; | ||||
| 1053 | uint8_t* context_map = *context_map_arg; | ||||
| 1054 | uint32_t code = h->code; | ||||
| 1055 | BROTLI_BOOLint skip_preamble = (code != 0xFFFF); | ||||
| 1056 | while (context_index < context_map_size || skip_preamble) { | ||||
| 1057 | if (!skip_preamble) { | ||||
| 1058 | if (!SafeReadSymbol(h->context_map_table, br, &code)) { | ||||
| 1059 | h->code = 0xFFFF; | ||||
| 1060 | h->context_index = context_index; | ||||
| 1061 | return BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 1062 | } | ||||
| 1063 | BROTLI_LOG_UINT(code); | ||||
| 1064 | |||||
| 1065 | if (code == 0) { | ||||
| 1066 | context_map[context_index++] = 0; | ||||
| 1067 | continue; | ||||
| 1068 | } | ||||
| 1069 | if (code > max_run_length_prefix) { | ||||
| 1070 | context_map[context_index++] = | ||||
| 1071 | (uint8_t)(code - max_run_length_prefix); | ||||
| 1072 | continue; | ||||
| 1073 | } | ||||
| 1074 | } else { | ||||
| 1075 | skip_preamble = BROTLI_FALSE0; | ||||
| 1076 | } | ||||
| 1077 | /* RLE sub-stage. */ | ||||
| 1078 | { | ||||
| 1079 | uint32_t reps; | ||||
| 1080 | if (!BrotliSafeReadBits(br, code, &reps)) { | ||||
| 1081 | h->code = code; | ||||
| 1082 | h->context_index = context_index; | ||||
| 1083 | return BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 1084 | } | ||||
| 1085 | reps += 1U << code; | ||||
| 1086 | BROTLI_LOG_UINT(reps); | ||||
| 1087 | if (context_index + reps > context_map_size) { | ||||
| 1088 | return | ||||
| 1089 | BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT)((void)(0), BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT); | ||||
| 1090 | } | ||||
| 1091 | do { | ||||
| 1092 | context_map[context_index++] = 0; | ||||
| 1093 | } while (--reps); | ||||
| 1094 | } | ||||
| 1095 | } | ||||
| 1096 | } | ||||
| 1097 | /* Fall through. */ | ||||
| 1098 | |||||
| 1099 | case BROTLI_STATE_CONTEXT_MAP_TRANSFORM: { | ||||
| 1100 | uint32_t bits; | ||||
| 1101 | if (!BrotliSafeReadBits(br, 1, &bits)) { | ||||
| 1102 | h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_TRANSFORM; | ||||
| 1103 | return BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 1104 | } | ||||
| 1105 | if (bits != 0) { | ||||
| 1106 | InverseMoveToFrontTransform(*context_map_arg, context_map_size, s); | ||||
| 1107 | } | ||||
| 1108 | h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_NONE; | ||||
| 1109 | return BROTLI_DECODER_SUCCESS; | ||||
| 1110 | } | ||||
| 1111 | |||||
| 1112 | default: | ||||
| 1113 | return | ||||
| 1114 | BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE)((void)(0), BROTLI_DECODER_ERROR_UNREACHABLE); | ||||
| 1115 | } | ||||
| 1116 | } | ||||
| 1117 | |||||
| 1118 | /* Decodes a command or literal and updates block type ring-buffer. | ||||
| 1119 | Reads 3..54 bits. */ | ||||
| 1120 | static BROTLI_INLINEinline __attribute__((__always_inline__)) BROTLI_BOOLint DecodeBlockTypeAndLength( | ||||
| 1121 | int safe, BrotliDecoderStateBrotliDecoderStateInternal* s, int tree_type) { | ||||
| 1122 | uint32_t max_block_type = s->num_block_types[tree_type]; | ||||
| 1123 | const HuffmanCode* type_tree = &s->block_type_trees[ | ||||
| 1124 | tree_type * BROTLI_HUFFMAN_MAX_SIZE_258632]; | ||||
| 1125 | const HuffmanCode* len_tree = &s->block_len_trees[ | ||||
| 1126 | tree_type * BROTLI_HUFFMAN_MAX_SIZE_26396]; | ||||
| 1127 | BrotliBitReader* br = &s->br; | ||||
| 1128 | uint32_t* ringbuffer = &s->block_type_rb[tree_type * 2]; | ||||
| 1129 | uint32_t block_type; | ||||
| 1130 | if (max_block_type <= 1) { | ||||
| 1131 | return BROTLI_FALSE0; | ||||
| 1132 | } | ||||
| 1133 | |||||
| 1134 | /* Read 0..15 + 3..39 bits. */ | ||||
| 1135 | if (!safe) { | ||||
| 1136 | block_type = ReadSymbol(type_tree, br); | ||||
| 1137 | s->block_length[tree_type] = ReadBlockLength(len_tree, br); | ||||
| 1138 | } else { | ||||
| 1139 | BrotliBitReaderState memento; | ||||
| 1140 | BrotliBitReaderSaveState(br, &memento); | ||||
| 1141 | if (!SafeReadSymbol(type_tree, br, &block_type)) return BROTLI_FALSE0; | ||||
| 1142 | if (!SafeReadBlockLength(s, &s->block_length[tree_type], len_tree, br)) { | ||||
| 1143 | s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_NONE; | ||||
| 1144 | BrotliBitReaderRestoreState(br, &memento); | ||||
| 1145 | return BROTLI_FALSE0; | ||||
| 1146 | } | ||||
| 1147 | } | ||||
| 1148 | |||||
| 1149 | if (block_type == 1) { | ||||
| 1150 | block_type = ringbuffer[1] + 1; | ||||
| 1151 | } else if (block_type == 0) { | ||||
| 1152 | block_type = ringbuffer[0]; | ||||
| 1153 | } else { | ||||
| 1154 | block_type -= 2; | ||||
| 1155 | } | ||||
| 1156 | if (block_type >= max_block_type) { | ||||
| 1157 | block_type -= max_block_type; | ||||
| 1158 | } | ||||
| 1159 | ringbuffer[0] = ringbuffer[1]; | ||||
| 1160 | ringbuffer[1] = block_type; | ||||
| 1161 | return BROTLI_TRUE1; | ||||
| 1162 | } | ||||
| 1163 | |||||
| 1164 | static BROTLI_INLINEinline __attribute__((__always_inline__)) void DetectTrivialLiteralBlockTypes( | ||||
| 1165 | BrotliDecoderStateBrotliDecoderStateInternal* s) { | ||||
| 1166 | size_t i; | ||||
| 1167 | for (i = 0; i < 8; ++i) s->trivial_literal_contexts[i] = 0; | ||||
| 1168 | for (i = 0; i < s->num_block_types[0]; i++) { | ||||
| 1169 | size_t offset = i << BROTLI_LITERAL_CONTEXT_BITS6; | ||||
| 1170 | size_t error = 0; | ||||
| 1171 | size_t sample = s->context_map[offset]; | ||||
| 1172 | size_t j; | ||||
| 1173 | for (j = 0; j < (1u << BROTLI_LITERAL_CONTEXT_BITS6);) { | ||||
| 1174 | BROTLI_REPEAT(4, error |= s->context_map[offset + j++] ^ sample;){ if ((4 & 1) != 0) {error |= s->context_map[offset + j ++] ^ sample;;} if ((4 & 2) != 0) {error |= s->context_map [offset + j++] ^ sample;; error |= s->context_map[offset + j++] ^ sample;;} if ((4 & 4) != 0) {error |= s->context_map [offset + j++] ^ sample;; error |= s->context_map[offset + j++] ^ sample;; error |= s->context_map[offset + j++] ^ sample ;; error |= s->context_map[offset + j++] ^ sample;;} } | ||||
| 1175 | } | ||||
| 1176 | if (error == 0) { | ||||
| 1177 | s->trivial_literal_contexts[i >> 5] |= 1u << (i & 31); | ||||
| 1178 | } | ||||
| 1179 | } | ||||
| 1180 | } | ||||
| 1181 | |||||
| 1182 | static BROTLI_INLINEinline __attribute__((__always_inline__)) void PrepareLiteralDecoding(BrotliDecoderStateBrotliDecoderStateInternal* s) { | ||||
| 1183 | uint8_t context_mode; | ||||
| 1184 | size_t trivial; | ||||
| 1185 | uint32_t block_type = s->block_type_rb[1]; | ||||
| 1186 | uint32_t context_offset = block_type << BROTLI_LITERAL_CONTEXT_BITS6; | ||||
| 1187 | s->context_map_slice = s->context_map + context_offset; | ||||
| 1188 | trivial = s->trivial_literal_contexts[block_type >> 5]; | ||||
| 1189 | s->trivial_literal_context = (trivial >> (block_type & 31)) & 1; | ||||
| 1190 | s->literal_htree = s->literal_hgroup.htrees[s->context_map_slice[0]]; | ||||
| 1191 | context_mode = s->context_modes[block_type] & 3; | ||||
| 1192 | s->context_lookup = BROTLI_CONTEXT_LUT(context_mode)(&_kBrotliContextLookupTable[(context_mode) << 9]); | ||||
| 1193 | } | ||||
| 1194 | |||||
| 1195 | /* Decodes the block type and updates the state for literal context. | ||||
| 1196 | Reads 3..54 bits. */ | ||||
| 1197 | static BROTLI_INLINEinline __attribute__((__always_inline__)) BROTLI_BOOLint DecodeLiteralBlockSwitchInternal( | ||||
| 1198 | int safe, BrotliDecoderStateBrotliDecoderStateInternal* s) { | ||||
| 1199 | if (!DecodeBlockTypeAndLength(safe, s, 0)) { | ||||
| 1200 | return BROTLI_FALSE0; | ||||
| 1201 | } | ||||
| 1202 | PrepareLiteralDecoding(s); | ||||
| 1203 | return BROTLI_TRUE1; | ||||
| 1204 | } | ||||
| 1205 | |||||
| 1206 | static void BROTLI_NOINLINE__attribute__((__noinline__)) DecodeLiteralBlockSwitch(BrotliDecoderStateBrotliDecoderStateInternal* s) { | ||||
| 1207 | DecodeLiteralBlockSwitchInternal(0, s); | ||||
| 1208 | } | ||||
| 1209 | |||||
| 1210 | static BROTLI_BOOLint BROTLI_NOINLINE__attribute__((__noinline__)) SafeDecodeLiteralBlockSwitch( | ||||
| 1211 | BrotliDecoderStateBrotliDecoderStateInternal* s) { | ||||
| 1212 | return DecodeLiteralBlockSwitchInternal(1, s); | ||||
| 1213 | } | ||||
| 1214 | |||||
| 1215 | /* Block switch for insert/copy length. | ||||
| 1216 | Reads 3..54 bits. */ | ||||
| 1217 | static BROTLI_INLINEinline __attribute__((__always_inline__)) BROTLI_BOOLint DecodeCommandBlockSwitchInternal( | ||||
| 1218 | int safe, BrotliDecoderStateBrotliDecoderStateInternal* s) { | ||||
| 1219 | if (!DecodeBlockTypeAndLength(safe, s, 1)) { | ||||
| 1220 | return BROTLI_FALSE0; | ||||
| 1221 | } | ||||
| 1222 | s->htree_command = s->insert_copy_hgroup.htrees[s->block_type_rb[3]]; | ||||
| 1223 | return BROTLI_TRUE1; | ||||
| 1224 | } | ||||
| 1225 | |||||
| 1226 | static void BROTLI_NOINLINE__attribute__((__noinline__)) DecodeCommandBlockSwitch(BrotliDecoderStateBrotliDecoderStateInternal* s) { | ||||
| 1227 | DecodeCommandBlockSwitchInternal(0, s); | ||||
| 1228 | } | ||||
| 1229 | |||||
| 1230 | static BROTLI_BOOLint BROTLI_NOINLINE__attribute__((__noinline__)) SafeDecodeCommandBlockSwitch( | ||||
| 1231 | BrotliDecoderStateBrotliDecoderStateInternal* s) { | ||||
| 1232 | return DecodeCommandBlockSwitchInternal(1, s); | ||||
| 1233 | } | ||||
| 1234 | |||||
| 1235 | /* Block switch for distance codes. | ||||
| 1236 | Reads 3..54 bits. */ | ||||
| 1237 | static BROTLI_INLINEinline __attribute__((__always_inline__)) BROTLI_BOOLint DecodeDistanceBlockSwitchInternal( | ||||
| 1238 | int safe, BrotliDecoderStateBrotliDecoderStateInternal* s) { | ||||
| 1239 | if (!DecodeBlockTypeAndLength(safe, s, 2)) { | ||||
| 1240 | return BROTLI_FALSE0; | ||||
| 1241 | } | ||||
| 1242 | s->dist_context_map_slice = s->dist_context_map + | ||||
| 1243 | (s->block_type_rb[5] << BROTLI_DISTANCE_CONTEXT_BITS2); | ||||
| 1244 | s->dist_htree_index = s->dist_context_map_slice[s->distance_context]; | ||||
| 1245 | return BROTLI_TRUE1; | ||||
| 1246 | } | ||||
| 1247 | |||||
| 1248 | static void BROTLI_NOINLINE__attribute__((__noinline__)) DecodeDistanceBlockSwitch(BrotliDecoderStateBrotliDecoderStateInternal* s) { | ||||
| 1249 | DecodeDistanceBlockSwitchInternal(0, s); | ||||
| 1250 | } | ||||
| 1251 | |||||
| 1252 | static BROTLI_BOOLint BROTLI_NOINLINE__attribute__((__noinline__)) SafeDecodeDistanceBlockSwitch( | ||||
| 1253 | BrotliDecoderStateBrotliDecoderStateInternal* s) { | ||||
| 1254 | return DecodeDistanceBlockSwitchInternal(1, s); | ||||
| 1255 | } | ||||
| 1256 | |||||
| 1257 | static size_t UnwrittenBytes(const BrotliDecoderStateBrotliDecoderStateInternal* s, BROTLI_BOOLint wrap) { | ||||
| 1258 | size_t pos = wrap && s->pos > s->ringbuffer_size ? | ||||
| 1259 | (size_t)s->ringbuffer_size : (size_t)(s->pos); | ||||
| 1260 | size_t partial_pos_rb = (s->rb_roundtrips * (size_t)s->ringbuffer_size) + pos; | ||||
| 1261 | return partial_pos_rb - s->partial_pos_out; | ||||
| 1262 | } | ||||
| 1263 | |||||
| 1264 | /* Dumps output. | ||||
| 1265 | Returns BROTLI_DECODER_NEEDS_MORE_OUTPUT only if there is more output to push | ||||
| 1266 | and either ring-buffer is as big as window size, or |force| is true. */ | ||||
| 1267 | static BrotliDecoderErrorCode BROTLI_NOINLINE__attribute__((__noinline__)) WriteRingBuffer( | ||||
| 1268 | BrotliDecoderStateBrotliDecoderStateInternal* s, size_t* available_out, uint8_t** next_out, | ||||
| 1269 | size_t* total_out, BROTLI_BOOLint force) { | ||||
| 1270 | uint8_t* start = | ||||
| 1271 | s->ringbuffer + (s->partial_pos_out & (size_t)s->ringbuffer_mask); | ||||
| 1272 | size_t to_write = UnwrittenBytes(s, BROTLI_TRUE1); | ||||
| 1273 | size_t num_written = *available_out; | ||||
| 1274 | if (num_written > to_write) { | ||||
| 1275 | num_written = to_write; | ||||
| 1276 | } | ||||
| 1277 | if (s->meta_block_remaining_len < 0) { | ||||
| 1278 | return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1)((void)(0), BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1); | ||||
| 1279 | } | ||||
| 1280 | if (next_out
| ||||
| 1281 | *next_out = start; | ||||
| 1282 | } else { | ||||
| 1283 | if (next_out
| ||||
| 1284 | memcpy(*next_out, start, num_written); | ||||
| 1285 | *next_out += num_written; | ||||
| 1286 | } | ||||
| 1287 | } | ||||
| 1288 | *available_out -= num_written; | ||||
| 1289 | BROTLI_LOG_UINT(to_write); | ||||
| 1290 | BROTLI_LOG_UINT(num_written); | ||||
| 1291 | s->partial_pos_out += num_written; | ||||
| 1292 | if (total_out
| ||||
| 1293 | *total_out = s->partial_pos_out; | ||||
| 1294 | } | ||||
| 1295 | if (num_written < to_write) { | ||||
| 1296 | if (s->ringbuffer_size == (1 << s->window_bits) || force) { | ||||
| 1297 | return BROTLI_DECODER_NEEDS_MORE_OUTPUT; | ||||
| 1298 | } else { | ||||
| 1299 | return BROTLI_DECODER_SUCCESS; | ||||
| 1300 | } | ||||
| 1301 | } | ||||
| 1302 | /* Wrap ring buffer only if it has reached its maximal size. */ | ||||
| 1303 | if (s->ringbuffer_size == (1 << s->window_bits) && | ||||
| 1304 | s->pos >= s->ringbuffer_size) { | ||||
| 1305 | s->pos -= s->ringbuffer_size; | ||||
| 1306 | s->rb_roundtrips++; | ||||
| 1307 | s->should_wrap_ringbuffer = (size_t)s->pos != 0 ? 1 : 0; | ||||
| 1308 | } | ||||
| 1309 | return BROTLI_DECODER_SUCCESS; | ||||
| 1310 | } | ||||
| 1311 | |||||
| 1312 | static void BROTLI_NOINLINE__attribute__((__noinline__)) WrapRingBuffer(BrotliDecoderStateBrotliDecoderStateInternal* s) { | ||||
| 1313 | if (s->should_wrap_ringbuffer) { | ||||
| 1314 | memcpy(s->ringbuffer, s->ringbuffer_end, (size_t)s->pos); | ||||
| |||||
| 1315 | s->should_wrap_ringbuffer = 0; | ||||
| 1316 | } | ||||
| 1317 | } | ||||
| 1318 | |||||
| 1319 | /* Allocates ring-buffer. | ||||
| 1320 | |||||
| 1321 | s->ringbuffer_size MUST be updated by BrotliCalculateRingBufferSize before | ||||
| 1322 | this function is called. | ||||
| 1323 | |||||
| 1324 | Last two bytes of ring-buffer are initialized to 0, so context calculation | ||||
| 1325 | could be done uniformly for the first two and all other positions. */ | ||||
| 1326 | static BROTLI_BOOLint BROTLI_NOINLINE__attribute__((__noinline__)) BrotliEnsureRingBuffer( | ||||
| 1327 | BrotliDecoderStateBrotliDecoderStateInternal* s) { | ||||
| 1328 | uint8_t* old_ringbuffer = s->ringbuffer; | ||||
| 1329 | if (s->ringbuffer_size == s->new_ringbuffer_size) { | ||||
| 1330 | return BROTLI_TRUE1; | ||||
| 1331 | } | ||||
| 1332 | |||||
| 1333 | s->ringbuffer = (uint8_t*)BROTLI_DECODER_ALLOC(s,s->alloc_func(s->memory_manager_opaque, (size_t)(s-> new_ringbuffer_size) + kRingBufferWriteAheadSlack) | ||||
| 1334 | (size_t)(s->new_ringbuffer_size) + kRingBufferWriteAheadSlack)s->alloc_func(s->memory_manager_opaque, (size_t)(s-> new_ringbuffer_size) + kRingBufferWriteAheadSlack); | ||||
| 1335 | if (s->ringbuffer == 0) { | ||||
| 1336 | /* Restore previous value. */ | ||||
| 1337 | s->ringbuffer = old_ringbuffer; | ||||
| 1338 | return BROTLI_FALSE0; | ||||
| 1339 | } | ||||
| 1340 | s->ringbuffer[s->new_ringbuffer_size - 2] = 0; | ||||
| 1341 | s->ringbuffer[s->new_ringbuffer_size - 1] = 0; | ||||
| 1342 | |||||
| 1343 | if (!!old_ringbuffer) { | ||||
| 1344 | memcpy(s->ringbuffer, old_ringbuffer, (size_t)s->pos); | ||||
| 1345 | BROTLI_DECODER_FREE(s, old_ringbuffer){ s->free_func(s->memory_manager_opaque, old_ringbuffer ); old_ringbuffer = ((void*)0); }; | ||||
| 1346 | } | ||||
| 1347 | |||||
| 1348 | s->ringbuffer_size = s->new_ringbuffer_size; | ||||
| 1349 | s->ringbuffer_mask = s->new_ringbuffer_size - 1; | ||||
| 1350 | s->ringbuffer_end = s->ringbuffer + s->ringbuffer_size; | ||||
| 1351 | |||||
| 1352 | return BROTLI_TRUE1; | ||||
| 1353 | } | ||||
| 1354 | |||||
| 1355 | static BrotliDecoderErrorCode BROTLI_NOINLINE__attribute__((__noinline__)) CopyUncompressedBlockToOutput( | ||||
| 1356 | size_t* available_out, uint8_t** next_out, size_t* total_out, | ||||
| 1357 | BrotliDecoderStateBrotliDecoderStateInternal* s) { | ||||
| 1358 | /* TODO: avoid allocation for single uncompressed block. */ | ||||
| 1359 | if (!BrotliEnsureRingBuffer(s)) { | ||||
| 1360 | return BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1)((void)(0), BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1); | ||||
| 1361 | } | ||||
| 1362 | |||||
| 1363 | /* State machine */ | ||||
| 1364 | for (;;) { | ||||
| 1365 | switch (s->substate_uncompressed) { | ||||
| 1366 | case BROTLI_STATE_UNCOMPRESSED_NONE: { | ||||
| 1367 | int nbytes = (int)BrotliGetRemainingBytes(&s->br); | ||||
| 1368 | if (nbytes > s->meta_block_remaining_len) { | ||||
| 1369 | nbytes = s->meta_block_remaining_len; | ||||
| 1370 | } | ||||
| 1371 | if (s->pos + nbytes > s->ringbuffer_size) { | ||||
| 1372 | nbytes = s->ringbuffer_size - s->pos; | ||||
| 1373 | } | ||||
| 1374 | /* Copy remaining bytes from s->br.buf_ to ring-buffer. */ | ||||
| 1375 | BrotliCopyBytes(&s->ringbuffer[s->pos], &s->br, (size_t)nbytes); | ||||
| 1376 | s->pos += nbytes; | ||||
| 1377 | s->meta_block_remaining_len -= nbytes; | ||||
| 1378 | if (s->pos < 1 << s->window_bits) { | ||||
| 1379 | if (s->meta_block_remaining_len == 0) { | ||||
| 1380 | return BROTLI_DECODER_SUCCESS; | ||||
| 1381 | } | ||||
| 1382 | return BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 1383 | } | ||||
| 1384 | s->substate_uncompressed = BROTLI_STATE_UNCOMPRESSED_WRITE; | ||||
| 1385 | } | ||||
| 1386 | /* Fall through. */ | ||||
| 1387 | |||||
| 1388 | case BROTLI_STATE_UNCOMPRESSED_WRITE: { | ||||
| 1389 | BrotliDecoderErrorCode result; | ||||
| 1390 | result = WriteRingBuffer( | ||||
| 1391 | s, available_out, next_out, total_out, BROTLI_FALSE0); | ||||
| 1392 | if (result != BROTLI_DECODER_SUCCESS) { | ||||
| 1393 | return result; | ||||
| 1394 | } | ||||
| 1395 | if (s->ringbuffer_size == 1 << s->window_bits) { | ||||
| 1396 | s->max_distance = s->max_backward_distance; | ||||
| 1397 | } | ||||
| 1398 | s->substate_uncompressed = BROTLI_STATE_UNCOMPRESSED_NONE; | ||||
| 1399 | break; | ||||
| 1400 | } | ||||
| 1401 | } | ||||
| 1402 | } | ||||
| 1403 | BROTLI_DCHECK(0); /* Unreachable */ | ||||
| 1404 | } | ||||
| 1405 | |||||
| 1406 | /* Calculates the smallest feasible ring buffer. | ||||
| 1407 | |||||
| 1408 | If we know the data size is small, do not allocate more ring buffer | ||||
| 1409 | size than needed to reduce memory usage. | ||||
| 1410 | |||||
| 1411 | When this method is called, metablock size and flags MUST be decoded. */ | ||||
| 1412 | static void BROTLI_NOINLINE__attribute__((__noinline__)) BrotliCalculateRingBufferSize( | ||||
| 1413 | BrotliDecoderStateBrotliDecoderStateInternal* s) { | ||||
| 1414 | int window_size = 1 << s->window_bits; | ||||
| 1415 | int new_ringbuffer_size = window_size; | ||||
| 1416 | /* We need at least 2 bytes of ring buffer size to get the last two | ||||
| 1417 | bytes for context from there */ | ||||
| 1418 | int min_size = s->ringbuffer_size ? s->ringbuffer_size : 1024; | ||||
| 1419 | int output_size; | ||||
| 1420 | |||||
| 1421 | /* If maximum is already reached, no further extension is retired. */ | ||||
| 1422 | if (s->ringbuffer_size == window_size) { | ||||
| 1423 | return; | ||||
| 1424 | } | ||||
| 1425 | |||||
| 1426 | /* Metadata blocks does not touch ring buffer. */ | ||||
| 1427 | if (s->is_metadata) { | ||||
| 1428 | return; | ||||
| 1429 | } | ||||
| 1430 | |||||
| 1431 | if (!s->ringbuffer) { | ||||
| 1432 | output_size = 0; | ||||
| 1433 | } else { | ||||
| 1434 | output_size = s->pos; | ||||
| 1435 | } | ||||
| 1436 | output_size += s->meta_block_remaining_len; | ||||
| 1437 | min_size = min_size < output_size ? output_size : min_size; | ||||
| 1438 | |||||
| 1439 | if (!!s->canny_ringbuffer_allocation) { | ||||
| 1440 | /* Reduce ring buffer size to save memory when server is unscrupulous. | ||||
| 1441 | In worst case memory usage might be 1.5x bigger for a short period of | ||||
| 1442 | ring buffer reallocation. */ | ||||
| 1443 | while ((new_ringbuffer_size >> 1) >= min_size) { | ||||
| 1444 | new_ringbuffer_size >>= 1; | ||||
| 1445 | } | ||||
| 1446 | } | ||||
| 1447 | |||||
| 1448 | s->new_ringbuffer_size = new_ringbuffer_size; | ||||
| 1449 | } | ||||
| 1450 | |||||
| 1451 | /* Reads 1..256 2-bit context modes. */ | ||||
| 1452 | static BrotliDecoderErrorCode ReadContextModes(BrotliDecoderStateBrotliDecoderStateInternal* s) { | ||||
| 1453 | BrotliBitReader* br = &s->br; | ||||
| 1454 | int i = s->loop_counter; | ||||
| 1455 | |||||
| 1456 | while (i < (int)s->num_block_types[0]) { | ||||
| 1457 | uint32_t bits; | ||||
| 1458 | if (!BrotliSafeReadBits(br, 2, &bits)) { | ||||
| 1459 | s->loop_counter = i; | ||||
| 1460 | return BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 1461 | } | ||||
| 1462 | s->context_modes[i] = (uint8_t)bits; | ||||
| 1463 | BROTLI_LOG_ARRAY_INDEX(s->context_modes, i); | ||||
| 1464 | i++; | ||||
| 1465 | } | ||||
| 1466 | return BROTLI_DECODER_SUCCESS; | ||||
| 1467 | } | ||||
| 1468 | |||||
| 1469 | static BROTLI_INLINEinline __attribute__((__always_inline__)) void TakeDistanceFromRingBuffer(BrotliDecoderStateBrotliDecoderStateInternal* s) { | ||||
| 1470 | int offset = s->distance_code - 3; | ||||
| 1471 | if (s->distance_code <= 3) { | ||||
| 1472 | /* Compensate double distance-ring-buffer roll for dictionary items. */ | ||||
| 1473 | s->distance_context = 1 >> s->distance_code; | ||||
| 1474 | s->distance_code = s->dist_rb[(s->dist_rb_idx - offset) & 3]; | ||||
| 1475 | s->dist_rb_idx -= s->distance_context; | ||||
| 1476 | } else { | ||||
| 1477 | int index_delta = 3; | ||||
| 1478 | int delta; | ||||
| 1479 | int base = s->distance_code - 10; | ||||
| 1480 | if (s->distance_code < 10) { | ||||
| 1481 | base = s->distance_code - 4; | ||||
| 1482 | } else { | ||||
| 1483 | index_delta = 2; | ||||
| 1484 | } | ||||
| 1485 | /* Unpack one of six 4-bit values. */ | ||||
| 1486 | delta = ((0x605142 >> (4 * base)) & 0xF) - 3; | ||||
| 1487 | s->distance_code = s->dist_rb[(s->dist_rb_idx + index_delta) & 0x3] + delta; | ||||
| 1488 | if (s->distance_code <= 0) { | ||||
| 1489 | /* A huge distance will cause a BROTLI_FAILURE() soon. | ||||
| 1490 | This is a little faster than failing here. */ | ||||
| 1491 | s->distance_code = 0x7FFFFFFF; | ||||
| 1492 | } | ||||
| 1493 | } | ||||
| 1494 | } | ||||
| 1495 | |||||
| 1496 | static BROTLI_INLINEinline __attribute__((__always_inline__)) BROTLI_BOOLint SafeReadBits( | ||||
| 1497 | BrotliBitReader* const br, uint32_t n_bits, uint32_t* val) { | ||||
| 1498 | if (n_bits != 0) { | ||||
| 1499 | return BrotliSafeReadBits(br, n_bits, val); | ||||
| 1500 | } else { | ||||
| 1501 | *val = 0; | ||||
| 1502 | return BROTLI_TRUE1; | ||||
| 1503 | } | ||||
| 1504 | } | ||||
| 1505 | |||||
| 1506 | static BROTLI_INLINEinline __attribute__((__always_inline__)) BROTLI_BOOLint SafeReadBits32( | ||||
| 1507 | BrotliBitReader* const br, uint32_t n_bits, uint32_t* val) { | ||||
| 1508 | if (n_bits != 0) { | ||||
| 1509 | return BrotliSafeReadBits32(br, n_bits, val); | ||||
| 1510 | } else { | ||||
| 1511 | *val = 0; | ||||
| 1512 | return BROTLI_TRUE1; | ||||
| 1513 | } | ||||
| 1514 | } | ||||
| 1515 | |||||
| 1516 | /* | ||||
| 1517 | RFC 7932 Section 4 with "..." shortenings and "[]" emendations. | ||||
| 1518 | |||||
| 1519 | Each distance ... is represented with a pair <distance code, extra bits>... | ||||
| 1520 | The distance code is encoded using a prefix code... The number of extra bits | ||||
| 1521 | can be 0..24... Two additional parameters: NPOSTFIX (0..3), and ... | ||||
| 1522 | NDIRECT (0..120) ... are encoded in the meta-block header... | ||||
| 1523 | |||||
| 1524 | The first 16 distance symbols ... reference past distances... ring buffer ... | ||||
| 1525 | Next NDIRECT distance symbols ... represent distances from 1 to NDIRECT... | ||||
| 1526 | [For] distance symbols 16 + NDIRECT and greater ... the number of extra bits | ||||
| 1527 | ... is given by the following formula: | ||||
| 1528 | |||||
| 1529 | [ xcode = dcode - NDIRECT - 16 ] | ||||
| 1530 | ndistbits = 1 + [ xcode ] >> (NPOSTFIX + 1) | ||||
| 1531 | |||||
| 1532 | ... | ||||
| 1533 | */ | ||||
| 1534 | |||||
| 1535 | /* | ||||
| 1536 | RFC 7932 Section 9.2 with "..." shortenings and "[]" emendations. | ||||
| 1537 | |||||
| 1538 | ... to get the actual value of the parameter NDIRECT, left-shift this | ||||
| 1539 | four-bit number by NPOSTFIX bits ... | ||||
| 1540 | */ | ||||
| 1541 | |||||
| 1542 | /* Remaining formulas from RFC 7932 Section 4 could be rewritten as following: | ||||
| 1543 | |||||
| 1544 | alphabet_size = 16 + NDIRECT + (max_distbits << (NPOSTFIX + 1)) | ||||
| 1545 | |||||
| 1546 | half = ((xcode >> NPOSTFIX) & 1) << ndistbits | ||||
| 1547 | postfix = xcode & ((1 << NPOSTFIX) - 1) | ||||
| 1548 | range_start = 2 * (1 << ndistbits - 1 - 1) | ||||
| 1549 | |||||
| 1550 | distance = (range_start + half + extra) << NPOSTFIX + postfix + NDIRECT + 1 | ||||
| 1551 | |||||
| 1552 | NB: ndistbits >= 1 -> range_start >= 0 | ||||
| 1553 | NB: range_start has factor 2, as the range is covered by 2 "halves" | ||||
| 1554 | NB: extra -1 offset in range_start formula covers the absence of | ||||
| 1555 | ndistbits = 0 case | ||||
| 1556 | NB: when NPOSTFIX = 0, NDIRECT is not greater than 15 | ||||
| 1557 | |||||
| 1558 | In other words, xcode has the following binary structure - XXXHPPP: | ||||
| 1559 | - XXX represent the number of extra distance bits | ||||
| 1560 | - H selects upper / lower range of distances | ||||
| 1561 | - PPP represent "postfix" | ||||
| 1562 | |||||
| 1563 | "Regular" distance encoding has NPOSTFIX = 0; omitting the postfix part | ||||
| 1564 | simplifies distance calculation. | ||||
| 1565 | |||||
| 1566 | Using NPOSTFIX > 0 allows cheaper encoding of regular structures, e.g. where | ||||
| 1567 | most of distances have the same reminder of division by 2/4/8. For example, | ||||
| 1568 | the table of int32_t values that come from different sources; if it is likely | ||||
| 1569 | that 3 highest bytes of values from the same source are the same, then | ||||
| 1570 | copy distance often looks like 4x + y. | ||||
| 1571 | |||||
| 1572 | Distance calculation could be rewritten to: | ||||
| 1573 | |||||
| 1574 | ndistbits = NDISTBITS(NDIRECT, NPOSTFIX)[dcode] | ||||
| 1575 | distance = OFFSET(NDIRECT, NPOSTFIX)[dcode] + extra << NPOSTFIX | ||||
| 1576 | |||||
| 1577 | NDISTBITS and OFFSET could be pre-calculated, as NDIRECT and NPOSTFIX could | ||||
| 1578 | change only once per meta-block. | ||||
| 1579 | */ | ||||
| 1580 | |||||
| 1581 | /* Calculates distance lookup table. | ||||
| 1582 | NB: it is possible to have all 64 tables precalculated. */ | ||||
| 1583 | static void CalculateDistanceLut(BrotliDecoderStateBrotliDecoderStateInternal* s) { | ||||
| 1584 | BrotliMetablockBodyArena* b = &s->arena.body; | ||||
| 1585 | uint32_t npostfix = s->distance_postfix_bits; | ||||
| 1586 | uint32_t ndirect = s->num_direct_distance_codes; | ||||
| 1587 | uint32_t alphabet_size_limit = s->distance_hgroup.alphabet_size_limit; | ||||
| 1588 | uint32_t postfix = 1u << npostfix; | ||||
| 1589 | uint32_t j; | ||||
| 1590 | uint32_t bits = 1; | ||||
| 1591 | uint32_t half = 0; | ||||
| 1592 | |||||
| 1593 | /* Skip short codes. */ | ||||
| 1594 | uint32_t i = BROTLI_NUM_DISTANCE_SHORT_CODES16; | ||||
| 1595 | |||||
| 1596 | /* Fill direct codes. */ | ||||
| 1597 | for (j = 0; j < ndirect; ++j) { | ||||
| 1598 | b->dist_extra_bits[i] = 0; | ||||
| 1599 | b->dist_offset[i] = j + 1; | ||||
| 1600 | ++i; | ||||
| 1601 | } | ||||
| 1602 | |||||
| 1603 | /* Fill regular distance codes. */ | ||||
| 1604 | while (i < alphabet_size_limit) { | ||||
| 1605 | uint32_t base = ndirect + ((((2 + half) << bits) - 4) << npostfix) + 1; | ||||
| 1606 | /* Always fill the complete group. */ | ||||
| 1607 | for (j = 0; j < postfix; ++j) { | ||||
| 1608 | b->dist_extra_bits[i] = (uint8_t)bits; | ||||
| 1609 | b->dist_offset[i] = base + j; | ||||
| 1610 | ++i; | ||||
| 1611 | } | ||||
| 1612 | bits = bits + half; | ||||
| 1613 | half = half ^ 1; | ||||
| 1614 | } | ||||
| 1615 | } | ||||
| 1616 | |||||
| 1617 | /* Precondition: s->distance_code < 0. */ | ||||
| 1618 | static BROTLI_INLINEinline __attribute__((__always_inline__)) BROTLI_BOOLint ReadDistanceInternal( | ||||
| 1619 | int safe, BrotliDecoderStateBrotliDecoderStateInternal* s, BrotliBitReader* br) { | ||||
| 1620 | BrotliMetablockBodyArena* b = &s->arena.body; | ||||
| 1621 | uint32_t code; | ||||
| 1622 | uint32_t bits; | ||||
| 1623 | BrotliBitReaderState memento; | ||||
| 1624 | HuffmanCode* distance_tree = s->distance_hgroup.htrees[s->dist_htree_index]; | ||||
| 1625 | if (!safe) { | ||||
| 1626 | code = ReadSymbol(distance_tree, br); | ||||
| 1627 | } else { | ||||
| 1628 | BrotliBitReaderSaveState(br, &memento); | ||||
| 1629 | if (!SafeReadSymbol(distance_tree, br, &code)) { | ||||
| 1630 | return BROTLI_FALSE0; | ||||
| 1631 | } | ||||
| 1632 | } | ||||
| 1633 | --s->block_length[2]; | ||||
| 1634 | /* Convert the distance code to the actual distance by possibly | ||||
| 1635 | looking up past distances from the s->dist_rb. */ | ||||
| 1636 | s->distance_context = 0; | ||||
| 1637 | if ((code & ~0xFu) == 0) { | ||||
| 1638 | s->distance_code = (int)code; | ||||
| 1639 | TakeDistanceFromRingBuffer(s); | ||||
| 1640 | return BROTLI_TRUE1; | ||||
| 1641 | } | ||||
| 1642 | if (!safe) { | ||||
| 1643 | bits = BrotliReadBits32(br, b->dist_extra_bits[code]); | ||||
| 1644 | } else { | ||||
| 1645 | if (!SafeReadBits32(br, b->dist_extra_bits[code], &bits)) { | ||||
| 1646 | ++s->block_length[2]; | ||||
| 1647 | BrotliBitReaderRestoreState(br, &memento); | ||||
| 1648 | return BROTLI_FALSE0; | ||||
| 1649 | } | ||||
| 1650 | } | ||||
| 1651 | s->distance_code = | ||||
| 1652 | (int)(b->dist_offset[code] + (bits << s->distance_postfix_bits)); | ||||
| 1653 | return BROTLI_TRUE1; | ||||
| 1654 | } | ||||
| 1655 | |||||
| 1656 | static BROTLI_INLINEinline __attribute__((__always_inline__)) void ReadDistance( | ||||
| 1657 | BrotliDecoderStateBrotliDecoderStateInternal* s, BrotliBitReader* br) { | ||||
| 1658 | ReadDistanceInternal(0, s, br); | ||||
| 1659 | } | ||||
| 1660 | |||||
| 1661 | static BROTLI_INLINEinline __attribute__((__always_inline__)) BROTLI_BOOLint SafeReadDistance( | ||||
| 1662 | BrotliDecoderStateBrotliDecoderStateInternal* s, BrotliBitReader* br) { | ||||
| 1663 | return ReadDistanceInternal(1, s, br); | ||||
| 1664 | } | ||||
| 1665 | |||||
| 1666 | static BROTLI_INLINEinline __attribute__((__always_inline__)) BROTLI_BOOLint ReadCommandInternal( | ||||
| 1667 | int safe, BrotliDecoderStateBrotliDecoderStateInternal* s, BrotliBitReader* br, int* insert_length) { | ||||
| 1668 | uint32_t cmd_code; | ||||
| 1669 | uint32_t insert_len_extra = 0; | ||||
| 1670 | uint32_t copy_length; | ||||
| 1671 | CmdLutElement v; | ||||
| 1672 | BrotliBitReaderState memento; | ||||
| 1673 | if (!safe) { | ||||
| 1674 | cmd_code = ReadSymbol(s->htree_command, br); | ||||
| 1675 | } else { | ||||
| 1676 | BrotliBitReaderSaveState(br, &memento); | ||||
| 1677 | if (!SafeReadSymbol(s->htree_command, br, &cmd_code)) { | ||||
| 1678 | return BROTLI_FALSE0; | ||||
| 1679 | } | ||||
| 1680 | } | ||||
| 1681 | v = kCmdLut[cmd_code]; | ||||
| 1682 | s->distance_code = v.distance_code; | ||||
| 1683 | s->distance_context = v.context; | ||||
| 1684 | s->dist_htree_index = s->dist_context_map_slice[s->distance_context]; | ||||
| 1685 | *insert_length = v.insert_len_offset; | ||||
| 1686 | if (!safe) { | ||||
| 1687 | if (BROTLI_PREDICT_FALSE(v.insert_len_extra_bits != 0)(__builtin_expect(v.insert_len_extra_bits != 0, 0))) { | ||||
| 1688 | insert_len_extra = BrotliReadBits24(br, v.insert_len_extra_bits); | ||||
| 1689 | } | ||||
| 1690 | copy_length = BrotliReadBits24(br, v.copy_len_extra_bits); | ||||
| 1691 | } else { | ||||
| 1692 | if (!SafeReadBits(br, v.insert_len_extra_bits, &insert_len_extra) || | ||||
| 1693 | !SafeReadBits(br, v.copy_len_extra_bits, ©_length)) { | ||||
| 1694 | BrotliBitReaderRestoreState(br, &memento); | ||||
| 1695 | return BROTLI_FALSE0; | ||||
| 1696 | } | ||||
| 1697 | } | ||||
| 1698 | s->copy_length = (int)copy_length + v.copy_len_offset; | ||||
| 1699 | --s->block_length[1]; | ||||
| 1700 | *insert_length += (int)insert_len_extra; | ||||
| 1701 | return BROTLI_TRUE1; | ||||
| 1702 | } | ||||
| 1703 | |||||
| 1704 | static BROTLI_INLINEinline __attribute__((__always_inline__)) void ReadCommand( | ||||
| 1705 | BrotliDecoderStateBrotliDecoderStateInternal* s, BrotliBitReader* br, int* insert_length) { | ||||
| 1706 | ReadCommandInternal(0, s, br, insert_length); | ||||
| 1707 | } | ||||
| 1708 | |||||
| 1709 | static BROTLI_INLINEinline __attribute__((__always_inline__)) BROTLI_BOOLint SafeReadCommand( | ||||
| 1710 | BrotliDecoderStateBrotliDecoderStateInternal* s, BrotliBitReader* br, int* insert_length) { | ||||
| 1711 | return ReadCommandInternal(1, s, br, insert_length); | ||||
| 1712 | } | ||||
| 1713 | |||||
| 1714 | static BROTLI_INLINEinline __attribute__((__always_inline__)) BROTLI_BOOLint CheckInputAmount( | ||||
| 1715 | int safe, BrotliBitReader* const br, size_t num) { | ||||
| 1716 | if (safe) { | ||||
| 1717 | return BROTLI_TRUE1; | ||||
| 1718 | } | ||||
| 1719 | return BrotliCheckInputAmount(br, num); | ||||
| 1720 | } | ||||
| 1721 | |||||
| 1722 | #define BROTLI_SAFE(METHOD) \ | ||||
| 1723 | { \ | ||||
| 1724 | if (safe) { \ | ||||
| 1725 | if (!Safe##METHOD) { \ | ||||
| 1726 | result = BROTLI_DECODER_NEEDS_MORE_INPUT; \ | ||||
| 1727 | goto saveStateAndReturn; \ | ||||
| 1728 | } \ | ||||
| 1729 | } else { \ | ||||
| 1730 | METHOD; \ | ||||
| 1731 | } \ | ||||
| 1732 | } | ||||
| 1733 | |||||
| 1734 | static BROTLI_INLINEinline __attribute__((__always_inline__)) BrotliDecoderErrorCode ProcessCommandsInternal( | ||||
| 1735 | int safe, BrotliDecoderStateBrotliDecoderStateInternal* s) { | ||||
| 1736 | int pos = s->pos; | ||||
| 1737 | int i = s->loop_counter; | ||||
| 1738 | BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS; | ||||
| 1739 | BrotliBitReader* br = &s->br; | ||||
| 1740 | |||||
| 1741 | if (!CheckInputAmount(safe, br, 28)) { | ||||
| 1742 | result = BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 1743 | goto saveStateAndReturn; | ||||
| 1744 | } | ||||
| 1745 | if (!safe) { | ||||
| 1746 | BROTLI_UNUSED(BrotliWarmupBitReader(br))(void)(BrotliWarmupBitReader(br)); | ||||
| 1747 | } | ||||
| 1748 | |||||
| 1749 | /* Jump into state machine. */ | ||||
| 1750 | if (s->state == BROTLI_STATE_COMMAND_BEGIN) { | ||||
| 1751 | goto CommandBegin; | ||||
| 1752 | } else if (s->state == BROTLI_STATE_COMMAND_INNER) { | ||||
| 1753 | goto CommandInner; | ||||
| 1754 | } else if (s->state == BROTLI_STATE_COMMAND_POST_DECODE_LITERALS) { | ||||
| 1755 | goto CommandPostDecodeLiterals; | ||||
| 1756 | } else if (s->state == BROTLI_STATE_COMMAND_POST_WRAP_COPY) { | ||||
| 1757 | goto CommandPostWrapCopy; | ||||
| 1758 | } else { | ||||
| 1759 | return BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE)((void)(0), BROTLI_DECODER_ERROR_UNREACHABLE); | ||||
| 1760 | } | ||||
| 1761 | |||||
| 1762 | CommandBegin: | ||||
| 1763 | if (safe) { | ||||
| 1764 | s->state = BROTLI_STATE_COMMAND_BEGIN; | ||||
| 1765 | } | ||||
| 1766 | if (!CheckInputAmount(safe, br, 28)) { /* 156 bits + 7 bytes */ | ||||
| 1767 | s->state = BROTLI_STATE_COMMAND_BEGIN; | ||||
| 1768 | result = BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 1769 | goto saveStateAndReturn; | ||||
| 1770 | } | ||||
| 1771 | if (BROTLI_PREDICT_FALSE(s->block_length[1] == 0)(__builtin_expect(s->block_length[1] == 0, 0))) { | ||||
| 1772 | BROTLI_SAFE(DecodeCommandBlockSwitch(s)); | ||||
| 1773 | goto CommandBegin; | ||||
| 1774 | } | ||||
| 1775 | /* Read the insert/copy length in the command. */ | ||||
| 1776 | BROTLI_SAFE(ReadCommand(s, br, &i)); | ||||
| 1777 | BROTLI_LOG(("[ProcessCommandsInternal] pos = %d insert = %d copy = %d\n", | ||||
| 1778 | pos, i, s->copy_length)); | ||||
| 1779 | if (i == 0) { | ||||
| 1780 | goto CommandPostDecodeLiterals; | ||||
| 1781 | } | ||||
| 1782 | s->meta_block_remaining_len -= i; | ||||
| 1783 | |||||
| 1784 | CommandInner: | ||||
| 1785 | if (safe) { | ||||
| 1786 | s->state = BROTLI_STATE_COMMAND_INNER; | ||||
| 1787 | } | ||||
| 1788 | /* Read the literals in the command. */ | ||||
| 1789 | if (s->trivial_literal_context) { | ||||
| 1790 | uint32_t bits; | ||||
| 1791 | uint32_t value; | ||||
| 1792 | PreloadSymbol(safe, s->literal_htree, br, &bits, &value); | ||||
| 1793 | do { | ||||
| 1794 | if (!CheckInputAmount(safe, br, 28)) { /* 162 bits + 7 bytes */ | ||||
| 1795 | s->state = BROTLI_STATE_COMMAND_INNER; | ||||
| 1796 | result = BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 1797 | goto saveStateAndReturn; | ||||
| 1798 | } | ||||
| 1799 | if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)(__builtin_expect(s->block_length[0] == 0, 0))) { | ||||
| 1800 | BROTLI_SAFE(DecodeLiteralBlockSwitch(s)); | ||||
| 1801 | PreloadSymbol(safe, s->literal_htree, br, &bits, &value); | ||||
| 1802 | if (!s->trivial_literal_context) goto CommandInner; | ||||
| 1803 | } | ||||
| 1804 | if (!safe) { | ||||
| 1805 | s->ringbuffer[pos] = | ||||
| 1806 | (uint8_t)ReadPreloadedSymbol(s->literal_htree, br, &bits, &value); | ||||
| 1807 | } else { | ||||
| 1808 | uint32_t literal; | ||||
| 1809 | if (!SafeReadSymbol(s->literal_htree, br, &literal)) { | ||||
| 1810 | result = BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 1811 | goto saveStateAndReturn; | ||||
| 1812 | } | ||||
| 1813 | s->ringbuffer[pos] = (uint8_t)literal; | ||||
| 1814 | } | ||||
| 1815 | --s->block_length[0]; | ||||
| 1816 | BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos); | ||||
| 1817 | ++pos; | ||||
| 1818 | if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)(__builtin_expect(pos == s->ringbuffer_size, 0))) { | ||||
| 1819 | s->state = BROTLI_STATE_COMMAND_INNER_WRITE; | ||||
| 1820 | --i; | ||||
| 1821 | goto saveStateAndReturn; | ||||
| 1822 | } | ||||
| 1823 | } while (--i != 0); | ||||
| 1824 | } else { | ||||
| 1825 | uint8_t p1 = s->ringbuffer[(pos - 1) & s->ringbuffer_mask]; | ||||
| 1826 | uint8_t p2 = s->ringbuffer[(pos - 2) & s->ringbuffer_mask]; | ||||
| 1827 | do { | ||||
| 1828 | const HuffmanCode* hc; | ||||
| 1829 | uint8_t context; | ||||
| 1830 | if (!CheckInputAmount(safe, br, 28)) { /* 162 bits + 7 bytes */ | ||||
| 1831 | s->state = BROTLI_STATE_COMMAND_INNER; | ||||
| 1832 | result = BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 1833 | goto saveStateAndReturn; | ||||
| 1834 | } | ||||
| 1835 | if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)(__builtin_expect(s->block_length[0] == 0, 0))) { | ||||
| 1836 | BROTLI_SAFE(DecodeLiteralBlockSwitch(s)); | ||||
| 1837 | if (s->trivial_literal_context) goto CommandInner; | ||||
| 1838 | } | ||||
| 1839 | context = BROTLI_CONTEXT(p1, p2, s->context_lookup)((s->context_lookup)[p1] | ((s->context_lookup) + 256)[ p2]); | ||||
| 1840 | BROTLI_LOG_UINT(context); | ||||
| 1841 | hc = s->literal_hgroup.htrees[s->context_map_slice[context]]; | ||||
| 1842 | p2 = p1; | ||||
| 1843 | if (!safe) { | ||||
| 1844 | p1 = (uint8_t)ReadSymbol(hc, br); | ||||
| 1845 | } else { | ||||
| 1846 | uint32_t literal; | ||||
| 1847 | if (!SafeReadSymbol(hc, br, &literal)) { | ||||
| 1848 | result = BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 1849 | goto saveStateAndReturn; | ||||
| 1850 | } | ||||
| 1851 | p1 = (uint8_t)literal; | ||||
| 1852 | } | ||||
| 1853 | s->ringbuffer[pos] = p1; | ||||
| 1854 | --s->block_length[0]; | ||||
| 1855 | BROTLI_LOG_UINT(s->context_map_slice[context]); | ||||
| 1856 | BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos & s->ringbuffer_mask); | ||||
| 1857 | ++pos; | ||||
| 1858 | if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)(__builtin_expect(pos == s->ringbuffer_size, 0))) { | ||||
| 1859 | s->state = BROTLI_STATE_COMMAND_INNER_WRITE; | ||||
| 1860 | --i; | ||||
| 1861 | goto saveStateAndReturn; | ||||
| 1862 | } | ||||
| 1863 | } while (--i != 0); | ||||
| 1864 | } | ||||
| 1865 | BROTLI_LOG_UINT(s->meta_block_remaining_len); | ||||
| 1866 | if (BROTLI_PREDICT_FALSE(s->meta_block_remaining_len <= 0)(__builtin_expect(s->meta_block_remaining_len <= 0, 0))) { | ||||
| 1867 | s->state = BROTLI_STATE_METABLOCK_DONE; | ||||
| 1868 | goto saveStateAndReturn; | ||||
| 1869 | } | ||||
| 1870 | |||||
| 1871 | CommandPostDecodeLiterals: | ||||
| 1872 | if (safe) { | ||||
| 1873 | s->state = BROTLI_STATE_COMMAND_POST_DECODE_LITERALS; | ||||
| 1874 | } | ||||
| 1875 | if (s->distance_code >= 0) { | ||||
| 1876 | /* Implicit distance case. */ | ||||
| 1877 | s->distance_context = s->distance_code ? 0 : 1; | ||||
| 1878 | --s->dist_rb_idx; | ||||
| 1879 | s->distance_code = s->dist_rb[s->dist_rb_idx & 3]; | ||||
| 1880 | } else { | ||||
| 1881 | /* Read distance code in the command, unless it was implicitly zero. */ | ||||
| 1882 | if (BROTLI_PREDICT_FALSE(s->block_length[2] == 0)(__builtin_expect(s->block_length[2] == 0, 0))) { | ||||
| 1883 | BROTLI_SAFE(DecodeDistanceBlockSwitch(s)); | ||||
| 1884 | } | ||||
| 1885 | BROTLI_SAFE(ReadDistance(s, br)); | ||||
| 1886 | } | ||||
| 1887 | BROTLI_LOG(("[ProcessCommandsInternal] pos = %d distance = %d\n", | ||||
| 1888 | pos, s->distance_code)); | ||||
| 1889 | if (s->max_distance != s->max_backward_distance) { | ||||
| 1890 | s->max_distance = | ||||
| 1891 | (pos < s->max_backward_distance) ? pos : s->max_backward_distance; | ||||
| 1892 | } | ||||
| 1893 | i = s->copy_length; | ||||
| 1894 | /* Apply copy of LZ77 back-reference, or static dictionary reference if | ||||
| 1895 | the distance is larger than the max LZ77 distance */ | ||||
| 1896 | if (s->distance_code > s->max_distance) { | ||||
| 1897 | /* The maximum allowed distance is BROTLI_MAX_ALLOWED_DISTANCE = 0x7FFFFFFC. | ||||
| 1898 | With this choice, no signed overflow can occur after decoding | ||||
| 1899 | a special distance code (e.g., after adding 3 to the last distance). */ | ||||
| 1900 | if (s->distance_code > BROTLI_MAX_ALLOWED_DISTANCE0x7FFFFFFC) { | ||||
| 1901 | BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d " | ||||
| 1902 | "len: %d bytes left: %d\n", | ||||
| 1903 | pos, s->distance_code, i, s->meta_block_remaining_len)); | ||||
| 1904 | return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_DISTANCE)((void)(0), BROTLI_DECODER_ERROR_FORMAT_DISTANCE); | ||||
| 1905 | } | ||||
| 1906 | if (i >= BROTLI_MIN_DICTIONARY_WORD_LENGTH4 && | ||||
| 1907 | i <= BROTLI_MAX_DICTIONARY_WORD_LENGTH24) { | ||||
| 1908 | int address = s->distance_code - s->max_distance - 1; | ||||
| 1909 | const BrotliDictionary* words = s->dictionary; | ||||
| 1910 | const BrotliTransforms* transforms = s->transforms; | ||||
| 1911 | int offset = (int)s->dictionary->offsets_by_length[i]; | ||||
| 1912 | uint32_t shift = s->dictionary->size_bits_by_length[i]; | ||||
| 1913 | |||||
| 1914 | int mask = (int)BitMask(shift); | ||||
| 1915 | int word_idx = address & mask; | ||||
| 1916 | int transform_idx = address >> shift; | ||||
| 1917 | /* Compensate double distance-ring-buffer roll. */ | ||||
| 1918 | s->dist_rb_idx += s->distance_context; | ||||
| 1919 | offset += word_idx * i; | ||||
| 1920 | if (BROTLI_PREDICT_FALSE(!words->data)(__builtin_expect(!words->data, 0))) { | ||||
| 1921 | return BROTLI_FAILURE(BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET)((void)(0), BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET); | ||||
| 1922 | } | ||||
| 1923 | if (transform_idx < (int)transforms->num_transforms) { | ||||
| 1924 | const uint8_t* word = &words->data[offset]; | ||||
| 1925 | int len = i; | ||||
| 1926 | if (transform_idx == transforms->cutOffTransforms[0]) { | ||||
| 1927 | memcpy(&s->ringbuffer[pos], word, (size_t)len); | ||||
| 1928 | BROTLI_LOG(("[ProcessCommandsInternal] dictionary word: [%.*s]\n", | ||||
| 1929 | len, word)); | ||||
| 1930 | } else { | ||||
| 1931 | len = BrotliTransformDictionaryWord(&s->ringbuffer[pos], word, len, | ||||
| 1932 | transforms, transform_idx); | ||||
| 1933 | BROTLI_LOG(("[ProcessCommandsInternal] dictionary word: [%.*s]," | ||||
| 1934 | " transform_idx = %d, transformed: [%.*s]\n", | ||||
| 1935 | i, word, transform_idx, len, &s->ringbuffer[pos])); | ||||
| 1936 | } | ||||
| 1937 | pos += len; | ||||
| 1938 | s->meta_block_remaining_len -= len; | ||||
| 1939 | if (pos >= s->ringbuffer_size) { | ||||
| 1940 | s->state = BROTLI_STATE_COMMAND_POST_WRITE_1; | ||||
| 1941 | goto saveStateAndReturn; | ||||
| 1942 | } | ||||
| 1943 | } else { | ||||
| 1944 | BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d " | ||||
| 1945 | "len: %d bytes left: %d\n", | ||||
| 1946 | pos, s->distance_code, i, s->meta_block_remaining_len)); | ||||
| 1947 | return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_TRANSFORM)((void)(0), BROTLI_DECODER_ERROR_FORMAT_TRANSFORM); | ||||
| 1948 | } | ||||
| 1949 | } else { | ||||
| 1950 | BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d " | ||||
| 1951 | "len: %d bytes left: %d\n", | ||||
| 1952 | pos, s->distance_code, i, s->meta_block_remaining_len)); | ||||
| 1953 | return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_DICTIONARY)((void)(0), BROTLI_DECODER_ERROR_FORMAT_DICTIONARY); | ||||
| 1954 | } | ||||
| 1955 | } else { | ||||
| 1956 | int src_start = (pos - s->distance_code) & s->ringbuffer_mask; | ||||
| 1957 | uint8_t* copy_dst = &s->ringbuffer[pos]; | ||||
| 1958 | uint8_t* copy_src = &s->ringbuffer[src_start]; | ||||
| 1959 | int dst_end = pos + i; | ||||
| 1960 | int src_end = src_start + i; | ||||
| 1961 | /* Update the recent distances cache. */ | ||||
| 1962 | s->dist_rb[s->dist_rb_idx & 3] = s->distance_code; | ||||
| 1963 | ++s->dist_rb_idx; | ||||
| 1964 | s->meta_block_remaining_len -= i; | ||||
| 1965 | /* There are 32+ bytes of slack in the ring-buffer allocation. | ||||
| 1966 | Also, we have 16 short codes, that make these 16 bytes irrelevant | ||||
| 1967 | in the ring-buffer. Let's copy over them as a first guess. */ | ||||
| 1968 | memmove16(copy_dst, copy_src); | ||||
| 1969 | if (src_end > pos && dst_end > src_start) { | ||||
| 1970 | /* Regions intersect. */ | ||||
| 1971 | goto CommandPostWrapCopy; | ||||
| 1972 | } | ||||
| 1973 | if (dst_end >= s->ringbuffer_size || src_end >= s->ringbuffer_size) { | ||||
| 1974 | /* At least one region wraps. */ | ||||
| 1975 | goto CommandPostWrapCopy; | ||||
| 1976 | } | ||||
| 1977 | pos += i; | ||||
| 1978 | if (i > 16) { | ||||
| 1979 | if (i > 32) { | ||||
| 1980 | memcpy(copy_dst + 16, copy_src + 16, (size_t)(i - 16)); | ||||
| 1981 | } else { | ||||
| 1982 | /* This branch covers about 45% cases. | ||||
| 1983 | Fixed size short copy allows more compiler optimizations. */ | ||||
| 1984 | memmove16(copy_dst + 16, copy_src + 16); | ||||
| 1985 | } | ||||
| 1986 | } | ||||
| 1987 | } | ||||
| 1988 | BROTLI_LOG_UINT(s->meta_block_remaining_len); | ||||
| 1989 | if (s->meta_block_remaining_len <= 0) { | ||||
| 1990 | /* Next metablock, if any. */ | ||||
| 1991 | s->state = BROTLI_STATE_METABLOCK_DONE; | ||||
| 1992 | goto saveStateAndReturn; | ||||
| 1993 | } else { | ||||
| 1994 | goto CommandBegin; | ||||
| 1995 | } | ||||
| 1996 | CommandPostWrapCopy: | ||||
| 1997 | { | ||||
| 1998 | int wrap_guard = s->ringbuffer_size - pos; | ||||
| 1999 | while (--i >= 0) { | ||||
| 2000 | s->ringbuffer[pos] = | ||||
| 2001 | s->ringbuffer[(pos - s->distance_code) & s->ringbuffer_mask]; | ||||
| 2002 | ++pos; | ||||
| 2003 | if (BROTLI_PREDICT_FALSE(--wrap_guard == 0)(__builtin_expect(--wrap_guard == 0, 0))) { | ||||
| 2004 | s->state = BROTLI_STATE_COMMAND_POST_WRITE_2; | ||||
| 2005 | goto saveStateAndReturn; | ||||
| 2006 | } | ||||
| 2007 | } | ||||
| 2008 | } | ||||
| 2009 | if (s->meta_block_remaining_len <= 0) { | ||||
| 2010 | /* Next metablock, if any. */ | ||||
| 2011 | s->state = BROTLI_STATE_METABLOCK_DONE; | ||||
| 2012 | goto saveStateAndReturn; | ||||
| 2013 | } else { | ||||
| 2014 | goto CommandBegin; | ||||
| 2015 | } | ||||
| 2016 | |||||
| 2017 | saveStateAndReturn: | ||||
| 2018 | s->pos = pos; | ||||
| 2019 | s->loop_counter = i; | ||||
| 2020 | return result; | ||||
| 2021 | } | ||||
| 2022 | |||||
| 2023 | #undef BROTLI_SAFE | ||||
| 2024 | |||||
| 2025 | static BROTLI_NOINLINE__attribute__((__noinline__)) BrotliDecoderErrorCode ProcessCommands( | ||||
| 2026 | BrotliDecoderStateBrotliDecoderStateInternal* s) { | ||||
| 2027 | return ProcessCommandsInternal(0, s); | ||||
| 2028 | } | ||||
| 2029 | |||||
| 2030 | static BROTLI_NOINLINE__attribute__((__noinline__)) BrotliDecoderErrorCode SafeProcessCommands( | ||||
| 2031 | BrotliDecoderStateBrotliDecoderStateInternal* s) { | ||||
| 2032 | return ProcessCommandsInternal(1, s); | ||||
| 2033 | } | ||||
| 2034 | |||||
| 2035 | BrotliDecoderResult BrotliDecoderDecompress( | ||||
| 2036 | size_t encoded_size, const uint8_t* encoded_buffer, size_t* decoded_size, | ||||
| 2037 | uint8_t* decoded_buffer) { | ||||
| 2038 | BrotliDecoderStateBrotliDecoderStateInternal s; | ||||
| 2039 | BrotliDecoderResult result; | ||||
| 2040 | size_t total_out = 0; | ||||
| 2041 | size_t available_in = encoded_size; | ||||
| 2042 | const uint8_t* next_in = encoded_buffer; | ||||
| 2043 | size_t available_out = *decoded_size; | ||||
| 2044 | uint8_t* next_out = decoded_buffer; | ||||
| 2045 | if (!BrotliDecoderStateInit(&s, 0, 0, 0)) { | ||||
| 2046 | return BROTLI_DECODER_RESULT_ERROR; | ||||
| 2047 | } | ||||
| 2048 | result = BrotliDecoderDecompressStream( | ||||
| 2049 | &s, &available_in, &next_in, &available_out, &next_out, &total_out); | ||||
| 2050 | *decoded_size = total_out; | ||||
| 2051 | BrotliDecoderStateCleanup(&s); | ||||
| 2052 | if (result != BROTLI_DECODER_RESULT_SUCCESS) { | ||||
| 2053 | result = BROTLI_DECODER_RESULT_ERROR; | ||||
| 2054 | } | ||||
| 2055 | return result; | ||||
| 2056 | } | ||||
| 2057 | |||||
| 2058 | /* Invariant: input stream is never overconsumed: | ||||
| 2059 | - invalid input implies that the whole stream is invalid -> any amount of | ||||
| 2060 | input could be read and discarded | ||||
| 2061 | - when result is "needs more input", then at least one more byte is REQUIRED | ||||
| 2062 | to complete decoding; all input data MUST be consumed by decoder, so | ||||
| 2063 | client could swap the input buffer | ||||
| 2064 | - when result is "needs more output" decoder MUST ensure that it doesn't | ||||
| 2065 | hold more than 7 bits in bit reader; this saves client from swapping input | ||||
| 2066 | buffer ahead of time | ||||
| 2067 | - when result is "success" decoder MUST return all unused data back to input | ||||
| 2068 | buffer; this is possible because the invariant is held on enter */ | ||||
| 2069 | BrotliDecoderResult BrotliDecoderDecompressStream( | ||||
| 2070 | BrotliDecoderStateBrotliDecoderStateInternal* s, size_t* available_in, const uint8_t** next_in, | ||||
| 2071 | size_t* available_out, uint8_t** next_out, size_t* total_out) { | ||||
| 2072 | BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS; | ||||
| 2073 | BrotliBitReader* br = &s->br; | ||||
| 2074 | /* Ensure that |total_out| is set, even if no data will ever be pushed out. */ | ||||
| 2075 | if (total_out) { | ||||
| |||||
| 2076 | *total_out = s->partial_pos_out; | ||||
| 2077 | } | ||||
| 2078 | /* Do not try to process further in a case of unrecoverable error. */ | ||||
| 2079 | if ((int)s->error_code < 0) { | ||||
| 2080 | return BROTLI_DECODER_RESULT_ERROR; | ||||
| 2081 | } | ||||
| 2082 | if (*available_out && (!next_out || !*next_out)) { | ||||
| 2083 | return SaveErrorCode( | ||||
| 2084 | s, BROTLI_FAILURE(BROTLI_DECODER_ERROR_INVALID_ARGUMENTS)((void)(0), BROTLI_DECODER_ERROR_INVALID_ARGUMENTS)); | ||||
| 2085 | } | ||||
| 2086 | if (!*available_out) next_out = 0; | ||||
| 2087 | if (s->buffer_length == 0) { /* Just connect bit reader to input stream. */ | ||||
| 2088 | br->avail_in = *available_in; | ||||
| 2089 | br->next_in = *next_in; | ||||
| 2090 | } else { | ||||
| 2091 | /* At least one byte of input is required. More than one byte of input may | ||||
| 2092 | be required to complete the transaction -> reading more data must be | ||||
| 2093 | done in a loop -> do it in a main loop. */ | ||||
| 2094 | result = BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 2095 | br->next_in = &s->buffer.u8[0]; | ||||
| 2096 | } | ||||
| 2097 | /* State machine */ | ||||
| 2098 | for (;;) { | ||||
| 2099 | if (result
| ||||
| 2100 | /* Error, needs more input/output. */ | ||||
| 2101 | if (result
| ||||
| 2102 | if (s->ringbuffer != 0) { /* Pro-actively push output. */ | ||||
| 2103 | BrotliDecoderErrorCode intermediate_result = WriteRingBuffer(s, | ||||
| 2104 | available_out, next_out, total_out, BROTLI_TRUE1); | ||||
| 2105 | /* WriteRingBuffer checks s->meta_block_remaining_len validity. */ | ||||
| 2106 | if ((int)intermediate_result < 0) { | ||||
| 2107 | result = intermediate_result; | ||||
| 2108 | break; | ||||
| 2109 | } | ||||
| 2110 | } | ||||
| 2111 | if (s->buffer_length
| ||||
| 2112 | if (br->avail_in == 0) { | ||||
| 2113 | /* Successfully finished read transaction. | ||||
| 2114 | Accumulator contains less than 8 bits, because internal buffer | ||||
| 2115 | is expanded byte-by-byte until it is enough to complete read. */ | ||||
| 2116 | s->buffer_length = 0; | ||||
| 2117 | /* Switch to input stream and restart. */ | ||||
| 2118 | result = BROTLI_DECODER_SUCCESS; | ||||
| 2119 | br->avail_in = *available_in; | ||||
| 2120 | br->next_in = *next_in; | ||||
| 2121 | continue; | ||||
| 2122 | } else if (*available_in != 0) { | ||||
| 2123 | /* Not enough data in buffer, but can take one more byte from | ||||
| 2124 | input stream. */ | ||||
| 2125 | result = BROTLI_DECODER_SUCCESS; | ||||
| 2126 | s->buffer.u8[s->buffer_length] = **next_in; | ||||
| 2127 | s->buffer_length++; | ||||
| 2128 | br->avail_in = s->buffer_length; | ||||
| 2129 | (*next_in)++; | ||||
| 2130 | (*available_in)--; | ||||
| 2131 | /* Retry with more data in buffer. */ | ||||
| 2132 | continue; | ||||
| 2133 | } | ||||
| 2134 | /* Can't finish reading and no more input. */ | ||||
| 2135 | break; | ||||
| 2136 | } else { /* Input stream doesn't contain enough input. */ | ||||
| 2137 | /* Copy tail to internal buffer and return. */ | ||||
| 2138 | *next_in = br->next_in; | ||||
| 2139 | *available_in = br->avail_in; | ||||
| 2140 | while (*available_in) { | ||||
| 2141 | s->buffer.u8[s->buffer_length] = **next_in; | ||||
| 2142 | s->buffer_length++; | ||||
| 2143 | (*next_in)++; | ||||
| 2144 | (*available_in)--; | ||||
| 2145 | } | ||||
| 2146 | break; | ||||
| 2147 | } | ||||
| 2148 | /* Unreachable. */ | ||||
| 2149 | } | ||||
| 2150 | |||||
| 2151 | /* Fail or needs more output. */ | ||||
| 2152 | |||||
| 2153 | if (s->buffer_length != 0) { | ||||
| 2154 | /* Just consumed the buffered input and produced some output. Otherwise | ||||
| 2155 | it would result in "needs more input". Reset internal buffer. */ | ||||
| 2156 | s->buffer_length = 0; | ||||
| 2157 | } else { | ||||
| 2158 | /* Using input stream in last iteration. When decoder switches to input | ||||
| 2159 | stream it has less than 8 bits in accumulator, so it is safe to | ||||
| 2160 | return unused accumulator bits there. */ | ||||
| 2161 | BrotliBitReaderUnload(br); | ||||
| 2162 | *available_in = br->avail_in; | ||||
| 2163 | *next_in = br->next_in; | ||||
| 2164 | } | ||||
| 2165 | break; | ||||
| 2166 | } | ||||
| 2167 | switch (s->state) { | ||||
| 2168 | case BROTLI_STATE_UNINITED: | ||||
| 2169 | /* Prepare to the first read. */ | ||||
| 2170 | if (!BrotliWarmupBitReader(br)) { | ||||
| 2171 | result = BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 2172 | break; | ||||
| 2173 | } | ||||
| 2174 | /* Decode window size. */ | ||||
| 2175 | result = DecodeWindowBits(s, br); /* Reads 1..8 bits. */ | ||||
| 2176 | if (result != BROTLI_DECODER_SUCCESS) { | ||||
| 2177 | break; | ||||
| 2178 | } | ||||
| 2179 | if (s->large_window) { | ||||
| 2180 | s->state = BROTLI_STATE_LARGE_WINDOW_BITS; | ||||
| 2181 | break; | ||||
| 2182 | } | ||||
| 2183 | s->state = BROTLI_STATE_INITIALIZE; | ||||
| 2184 | break; | ||||
| 2185 | |||||
| 2186 | case BROTLI_STATE_LARGE_WINDOW_BITS: | ||||
| 2187 | if (!BrotliSafeReadBits(br, 6, &s->window_bits)) { | ||||
| 2188 | result = BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 2189 | break; | ||||
| 2190 | } | ||||
| 2191 | if (s->window_bits < BROTLI_LARGE_MIN_WBITS10 || | ||||
| 2192 | s->window_bits > BROTLI_LARGE_MAX_WBITS30) { | ||||
| 2193 | result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS)((void)(0), BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS); | ||||
| 2194 | break; | ||||
| 2195 | } | ||||
| 2196 | s->state = BROTLI_STATE_INITIALIZE; | ||||
| 2197 | /* Fall through. */ | ||||
| 2198 | |||||
| 2199 | case BROTLI_STATE_INITIALIZE: | ||||
| 2200 | BROTLI_LOG_UINT(s->window_bits); | ||||
| 2201 | /* Maximum distance, see section 9.1. of the spec. */ | ||||
| 2202 | s->max_backward_distance = (1 << s->window_bits) - BROTLI_WINDOW_GAP16; | ||||
| 2203 | |||||
| 2204 | /* Allocate memory for both block_type_trees and block_len_trees. */ | ||||
| 2205 | s->block_type_trees = (HuffmanCode*)BROTLI_DECODER_ALLOC(s,s->alloc_func(s->memory_manager_opaque, sizeof(HuffmanCode ) * 3 * (632 + 396)) | ||||
| 2206 | sizeof(HuffmanCode) * 3 *s->alloc_func(s->memory_manager_opaque, sizeof(HuffmanCode ) * 3 * (632 + 396)) | ||||
| 2207 | (BROTLI_HUFFMAN_MAX_SIZE_258 + BROTLI_HUFFMAN_MAX_SIZE_26))s->alloc_func(s->memory_manager_opaque, sizeof(HuffmanCode ) * 3 * (632 + 396)); | ||||
| 2208 | if (s->block_type_trees == 0) { | ||||
| 2209 | result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES)((void)(0), BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES); | ||||
| 2210 | break; | ||||
| 2211 | } | ||||
| 2212 | s->block_len_trees = | ||||
| 2213 | s->block_type_trees + 3 * BROTLI_HUFFMAN_MAX_SIZE_258632; | ||||
| 2214 | |||||
| 2215 | s->state = BROTLI_STATE_METABLOCK_BEGIN; | ||||
| 2216 | /* Fall through. */ | ||||
| 2217 | |||||
| 2218 | case BROTLI_STATE_METABLOCK_BEGIN: | ||||
| 2219 | BrotliDecoderStateMetablockBegin(s); | ||||
| 2220 | BROTLI_LOG_UINT(s->pos); | ||||
| 2221 | s->state = BROTLI_STATE_METABLOCK_HEADER; | ||||
| 2222 | /* Fall through. */ | ||||
| 2223 | |||||
| 2224 | case BROTLI_STATE_METABLOCK_HEADER: | ||||
| 2225 | result = DecodeMetaBlockLength(s, br); /* Reads 2 - 31 bits. */ | ||||
| 2226 | if (result != BROTLI_DECODER_SUCCESS) { | ||||
| 2227 | break; | ||||
| 2228 | } | ||||
| 2229 | BROTLI_LOG_UINT(s->is_last_metablock); | ||||
| 2230 | BROTLI_LOG_UINT(s->meta_block_remaining_len); | ||||
| 2231 | BROTLI_LOG_UINT(s->is_metadata); | ||||
| 2232 | BROTLI_LOG_UINT(s->is_uncompressed); | ||||
| 2233 | if (s->is_metadata || s->is_uncompressed) { | ||||
| 2234 | if (!BrotliJumpToByteBoundary(br)) { | ||||
| 2235 | result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_PADDING_1)((void)(0), BROTLI_DECODER_ERROR_FORMAT_PADDING_1); | ||||
| 2236 | break; | ||||
| 2237 | } | ||||
| 2238 | } | ||||
| 2239 | if (s->is_metadata) { | ||||
| 2240 | s->state = BROTLI_STATE_METADATA; | ||||
| 2241 | break; | ||||
| 2242 | } | ||||
| 2243 | if (s->meta_block_remaining_len == 0) { | ||||
| 2244 | s->state = BROTLI_STATE_METABLOCK_DONE; | ||||
| 2245 | break; | ||||
| 2246 | } | ||||
| 2247 | BrotliCalculateRingBufferSize(s); | ||||
| 2248 | if (s->is_uncompressed) { | ||||
| 2249 | s->state = BROTLI_STATE_UNCOMPRESSED; | ||||
| 2250 | break; | ||||
| 2251 | } | ||||
| 2252 | s->state = BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_HEADER; | ||||
| 2253 | /* Fall through. */ | ||||
| 2254 | |||||
| 2255 | case BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_HEADER: { | ||||
| 2256 | BrotliMetablockHeaderArena* h = &s->arena.header; | ||||
| 2257 | s->loop_counter = 0; | ||||
| 2258 | /* Initialize compressed metablock header arena. */ | ||||
| 2259 | h->sub_loop_counter = 0; | ||||
| 2260 | /* Make small negative indexes addressable. */ | ||||
| 2261 | h->symbol_lists = | ||||
| 2262 | &h->symbols_lists_array[BROTLI_HUFFMAN_MAX_CODE_LENGTH15 + 1]; | ||||
| 2263 | h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE; | ||||
| 2264 | h->substate_tree_group = BROTLI_STATE_TREE_GROUP_NONE; | ||||
| 2265 | h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_NONE; | ||||
| 2266 | s->state = BROTLI_STATE_HUFFMAN_CODE_0; | ||||
| 2267 | } | ||||
| 2268 | /* Fall through. */ | ||||
| 2269 | |||||
| 2270 | case BROTLI_STATE_HUFFMAN_CODE_0: | ||||
| 2271 | if (s->loop_counter >= 3) { | ||||
| 2272 | s->state = BROTLI_STATE_METABLOCK_HEADER_2; | ||||
| 2273 | break; | ||||
| 2274 | } | ||||
| 2275 | /* Reads 1..11 bits. */ | ||||
| 2276 | result = DecodeVarLenUint8(s, br, &s->num_block_types[s->loop_counter]); | ||||
| 2277 | if (result != BROTLI_DECODER_SUCCESS) { | ||||
| 2278 | break; | ||||
| 2279 | } | ||||
| 2280 | s->num_block_types[s->loop_counter]++; | ||||
| 2281 | BROTLI_LOG_UINT(s->num_block_types[s->loop_counter]); | ||||
| 2282 | if (s->num_block_types[s->loop_counter] < 2) { | ||||
| 2283 | s->loop_counter++; | ||||
| 2284 | break; | ||||
| 2285 | } | ||||
| 2286 | s->state = BROTLI_STATE_HUFFMAN_CODE_1; | ||||
| 2287 | /* Fall through. */ | ||||
| 2288 | |||||
| 2289 | case BROTLI_STATE_HUFFMAN_CODE_1: { | ||||
| 2290 | uint32_t alphabet_size = s->num_block_types[s->loop_counter] + 2; | ||||
| 2291 | int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_258632; | ||||
| 2292 | result = ReadHuffmanCode(alphabet_size, alphabet_size, | ||||
| 2293 | &s->block_type_trees[tree_offset], NULL((void*)0), s); | ||||
| 2294 | if (result != BROTLI_DECODER_SUCCESS) break; | ||||
| 2295 | s->state = BROTLI_STATE_HUFFMAN_CODE_2; | ||||
| 2296 | } | ||||
| 2297 | /* Fall through. */ | ||||
| 2298 | |||||
| 2299 | case BROTLI_STATE_HUFFMAN_CODE_2: { | ||||
| 2300 | uint32_t alphabet_size = BROTLI_NUM_BLOCK_LEN_SYMBOLS26; | ||||
| 2301 | int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_26396; | ||||
| 2302 | result = ReadHuffmanCode(alphabet_size, alphabet_size, | ||||
| 2303 | &s->block_len_trees[tree_offset], NULL((void*)0), s); | ||||
| 2304 | if (result != BROTLI_DECODER_SUCCESS) break; | ||||
| 2305 | s->state = BROTLI_STATE_HUFFMAN_CODE_3; | ||||
| 2306 | } | ||||
| 2307 | /* Fall through. */ | ||||
| 2308 | |||||
| 2309 | case BROTLI_STATE_HUFFMAN_CODE_3: { | ||||
| 2310 | int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_26396; | ||||
| 2311 | if (!SafeReadBlockLength(s, &s->block_length[s->loop_counter], | ||||
| 2312 | &s->block_len_trees[tree_offset], br)) { | ||||
| 2313 | result = BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 2314 | break; | ||||
| 2315 | } | ||||
| 2316 | BROTLI_LOG_UINT(s->block_length[s->loop_counter]); | ||||
| 2317 | s->loop_counter++; | ||||
| 2318 | s->state = BROTLI_STATE_HUFFMAN_CODE_0; | ||||
| 2319 | break; | ||||
| 2320 | } | ||||
| 2321 | |||||
| 2322 | case BROTLI_STATE_UNCOMPRESSED: { | ||||
| 2323 | result = CopyUncompressedBlockToOutput( | ||||
| 2324 | available_out, next_out, total_out, s); | ||||
| 2325 | if (result != BROTLI_DECODER_SUCCESS) { | ||||
| 2326 | break; | ||||
| 2327 | } | ||||
| 2328 | s->state = BROTLI_STATE_METABLOCK_DONE; | ||||
| 2329 | break; | ||||
| 2330 | } | ||||
| 2331 | |||||
| 2332 | case BROTLI_STATE_METADATA: | ||||
| 2333 | for (; s->meta_block_remaining_len > 0; --s->meta_block_remaining_len) { | ||||
| 2334 | uint32_t bits; | ||||
| 2335 | /* Read one byte and ignore it. */ | ||||
| 2336 | if (!BrotliSafeReadBits(br, 8, &bits)) { | ||||
| 2337 | result = BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 2338 | break; | ||||
| 2339 | } | ||||
| 2340 | } | ||||
| 2341 | if (result == BROTLI_DECODER_SUCCESS) { | ||||
| 2342 | s->state = BROTLI_STATE_METABLOCK_DONE; | ||||
| 2343 | } | ||||
| 2344 | break; | ||||
| 2345 | |||||
| 2346 | case BROTLI_STATE_METABLOCK_HEADER_2: { | ||||
| 2347 | uint32_t bits; | ||||
| 2348 | if (!BrotliSafeReadBits(br, 6, &bits)) { | ||||
| 2349 | result = BROTLI_DECODER_NEEDS_MORE_INPUT; | ||||
| 2350 | break; | ||||
| 2351 | } | ||||
| 2352 | s->distance_postfix_bits = bits & BitMask(2); | ||||
| 2353 | bits >>= 2; | ||||
| 2354 | s->num_direct_distance_codes = bits << s->distance_postfix_bits; | ||||
| 2355 | BROTLI_LOG_UINT(s->num_direct_distance_codes); | ||||
| 2356 | BROTLI_LOG_UINT(s->distance_postfix_bits); | ||||
| 2357 | s->context_modes = | ||||
| 2358 | (uint8_t*)BROTLI_DECODER_ALLOC(s, (size_t)s->num_block_types[0])s->alloc_func(s->memory_manager_opaque, (size_t)s->num_block_types [0]); | ||||
| 2359 | if (s->context_modes == 0) { | ||||
| 2360 | result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES)((void)(0), BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES); | ||||
| 2361 | break; | ||||
| 2362 | } | ||||
| 2363 | s->loop_counter = 0; | ||||
| 2364 | s->state = BROTLI_STATE_CONTEXT_MODES; | ||||
| 2365 | } | ||||
| 2366 | /* Fall through. */ | ||||
| 2367 | |||||
| 2368 | case BROTLI_STATE_CONTEXT_MODES: | ||||
| 2369 | result = ReadContextModes(s); | ||||
| 2370 | if (result != BROTLI_DECODER_SUCCESS) { | ||||
| 2371 | break; | ||||
| 2372 | } | ||||
| 2373 | s->state = BROTLI_STATE_CONTEXT_MAP_1; | ||||
| 2374 | /* Fall through. */ | ||||
| 2375 | |||||
| 2376 | case BROTLI_STATE_CONTEXT_MAP_1: | ||||
| 2377 | result = DecodeContextMap( | ||||
| 2378 | s->num_block_types[0] << BROTLI_LITERAL_CONTEXT_BITS6, | ||||
| 2379 | &s->num_literal_htrees, &s->context_map, s); | ||||
| 2380 | if (result != BROTLI_DECODER_SUCCESS) { | ||||
| 2381 | break; | ||||
| 2382 | } | ||||
| 2383 | DetectTrivialLiteralBlockTypes(s); | ||||
| 2384 | s->state = BROTLI_STATE_CONTEXT_MAP_2; | ||||
| 2385 | /* Fall through. */ | ||||
| 2386 | |||||
| 2387 | case BROTLI_STATE_CONTEXT_MAP_2: { | ||||
| 2388 | uint32_t npostfix = s->distance_postfix_bits; | ||||
| 2389 | uint32_t ndirect = s->num_direct_distance_codes; | ||||
| 2390 | uint32_t distance_alphabet_size_max = BROTLI_DISTANCE_ALPHABET_SIZE(( 16 + (ndirect) + ((24U) << ((npostfix) + 1))) | ||||
| 2391 | npostfix, ndirect, BROTLI_MAX_DISTANCE_BITS)( 16 + (ndirect) + ((24U) << ((npostfix) + 1))); | ||||
| 2392 | uint32_t distance_alphabet_size_limit = distance_alphabet_size_max; | ||||
| 2393 | BROTLI_BOOLint allocation_success = BROTLI_TRUE1; | ||||
| 2394 | if (s->large_window) { | ||||
| 2395 | BrotliDistanceCodeLimit limit = BrotliCalculateDistanceCodeLimit( | ||||
| 2396 | BROTLI_MAX_ALLOWED_DISTANCE0x7FFFFFFC, npostfix, ndirect); | ||||
| 2397 | distance_alphabet_size_max = BROTLI_DISTANCE_ALPHABET_SIZE(( 16 + (ndirect) + ((62U) << ((npostfix) + 1))) | ||||
| 2398 | npostfix, ndirect, BROTLI_LARGE_MAX_DISTANCE_BITS)( 16 + (ndirect) + ((62U) << ((npostfix) + 1))); | ||||
| 2399 | distance_alphabet_size_limit = limit.max_alphabet_size; | ||||
| 2400 | } | ||||
| 2401 | result = DecodeContextMap( | ||||
| 2402 | s->num_block_types[2] << BROTLI_DISTANCE_CONTEXT_BITS2, | ||||
| 2403 | &s->num_dist_htrees, &s->dist_context_map, s); | ||||
| 2404 | if (result != BROTLI_DECODER_SUCCESS) { | ||||
| 2405 | break; | ||||
| 2406 | } | ||||
| 2407 | allocation_success &= BrotliDecoderHuffmanTreeGroupInit( | ||||
| 2408 | s, &s->literal_hgroup, BROTLI_NUM_LITERAL_SYMBOLS256, | ||||
| 2409 | BROTLI_NUM_LITERAL_SYMBOLS256, s->num_literal_htrees); | ||||
| 2410 | allocation_success &= BrotliDecoderHuffmanTreeGroupInit( | ||||
| 2411 | s, &s->insert_copy_hgroup, BROTLI_NUM_COMMAND_SYMBOLS704, | ||||
| 2412 | BROTLI_NUM_COMMAND_SYMBOLS704, s->num_block_types[1]); | ||||
| 2413 | allocation_success &= BrotliDecoderHuffmanTreeGroupInit( | ||||
| 2414 | s, &s->distance_hgroup, distance_alphabet_size_max, | ||||
| 2415 | distance_alphabet_size_limit, s->num_dist_htrees); | ||||
| 2416 | if (!allocation_success) { | ||||
| 2417 | return SaveErrorCode(s, | ||||
| 2418 | BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS)((void)(0), BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS)); | ||||
| 2419 | } | ||||
| 2420 | s->loop_counter = 0; | ||||
| 2421 | s->state = BROTLI_STATE_TREE_GROUP; | ||||
| 2422 | } | ||||
| 2423 | /* Fall through. */ | ||||
| 2424 | |||||
| 2425 | case BROTLI_STATE_TREE_GROUP: { | ||||
| 2426 | HuffmanTreeGroup* hgroup = NULL((void*)0); | ||||
| 2427 | switch (s->loop_counter) { | ||||
| 2428 | case 0: hgroup = &s->literal_hgroup; break; | ||||
| 2429 | case 1: hgroup = &s->insert_copy_hgroup; break; | ||||
| 2430 | case 2: hgroup = &s->distance_hgroup; break; | ||||
| 2431 | default: return SaveErrorCode(s, BROTLI_FAILURE(((void)(0), BROTLI_DECODER_ERROR_UNREACHABLE) | ||||
| 2432 | BROTLI_DECODER_ERROR_UNREACHABLE)((void)(0), BROTLI_DECODER_ERROR_UNREACHABLE)); | ||||
| 2433 | } | ||||
| 2434 | result = HuffmanTreeGroupDecode(hgroup, s); | ||||
| 2435 | if (result != BROTLI_DECODER_SUCCESS) break; | ||||
| 2436 | s->loop_counter++; | ||||
| 2437 | if (s->loop_counter < 3) { | ||||
| 2438 | break; | ||||
| 2439 | } | ||||
| 2440 | s->state = BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_BODY; | ||||
| 2441 | } | ||||
| 2442 | /* Fall through. */ | ||||
| 2443 | |||||
| 2444 | case BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_BODY: | ||||
| 2445 | PrepareLiteralDecoding(s); | ||||
| 2446 | s->dist_context_map_slice = s->dist_context_map; | ||||
| 2447 | s->htree_command = s->insert_copy_hgroup.htrees[0]; | ||||
| 2448 | if (!BrotliEnsureRingBuffer(s)) { | ||||
| 2449 | result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2)((void)(0), BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2); | ||||
| 2450 | break; | ||||
| 2451 | } | ||||
| 2452 | CalculateDistanceLut(s); | ||||
| 2453 | s->state = BROTLI_STATE_COMMAND_BEGIN; | ||||
| 2454 | /* Fall through. */ | ||||
| 2455 | |||||
| 2456 | case BROTLI_STATE_COMMAND_BEGIN: | ||||
| 2457 | /* Fall through. */ | ||||
| 2458 | case BROTLI_STATE_COMMAND_INNER: | ||||
| 2459 | /* Fall through. */ | ||||
| 2460 | case BROTLI_STATE_COMMAND_POST_DECODE_LITERALS: | ||||
| 2461 | /* Fall through. */ | ||||
| 2462 | case BROTLI_STATE_COMMAND_POST_WRAP_COPY: | ||||
| 2463 | result = ProcessCommands(s); | ||||
| 2464 | if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) { | ||||
| 2465 | result = SafeProcessCommands(s); | ||||
| 2466 | } | ||||
| 2467 | break; | ||||
| 2468 | |||||
| 2469 | case BROTLI_STATE_COMMAND_INNER_WRITE: | ||||
| 2470 | /* Fall through. */ | ||||
| 2471 | case BROTLI_STATE_COMMAND_POST_WRITE_1: | ||||
| 2472 | /* Fall through. */ | ||||
| 2473 | case BROTLI_STATE_COMMAND_POST_WRITE_2: | ||||
| 2474 | result = WriteRingBuffer( | ||||
| 2475 | s, available_out, next_out, total_out, BROTLI_FALSE0); | ||||
| 2476 | if (result
| ||||
| 2477 | break; | ||||
| 2478 | } | ||||
| 2479 | WrapRingBuffer(s); | ||||
| 2480 | if (s->ringbuffer_size == 1 << s->window_bits) { | ||||
| 2481 | s->max_distance = s->max_backward_distance; | ||||
| 2482 | } | ||||
| 2483 | if (s->state == BROTLI_STATE_COMMAND_POST_WRITE_1) { | ||||
| 2484 | if (s->meta_block_remaining_len == 0) { | ||||
| 2485 | /* Next metablock, if any. */ | ||||
| 2486 | s->state = BROTLI_STATE_METABLOCK_DONE; | ||||
| 2487 | } else { | ||||
| 2488 | s->state = BROTLI_STATE_COMMAND_BEGIN; | ||||
| 2489 | } | ||||
| 2490 | break; | ||||
| 2491 | } else if (s->state == BROTLI_STATE_COMMAND_POST_WRITE_2) { | ||||
| 2492 | s->state = BROTLI_STATE_COMMAND_POST_WRAP_COPY; | ||||
| 2493 | } else { /* BROTLI_STATE_COMMAND_INNER_WRITE */ | ||||
| 2494 | if (s->loop_counter == 0) { | ||||
| 2495 | if (s->meta_block_remaining_len == 0) { | ||||
| 2496 | s->state = BROTLI_STATE_METABLOCK_DONE; | ||||
| 2497 | } else { | ||||
| 2498 | s->state = BROTLI_STATE_COMMAND_POST_DECODE_LITERALS; | ||||
| 2499 | } | ||||
| 2500 | break; | ||||
| 2501 | } | ||||
| 2502 | s->state = BROTLI_STATE_COMMAND_INNER; | ||||
| 2503 | } | ||||
| 2504 | break; | ||||
| 2505 | |||||
| 2506 | case BROTLI_STATE_METABLOCK_DONE: | ||||
| 2507 | if (s->meta_block_remaining_len < 0) { | ||||
| 2508 | result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2)((void)(0), BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2); | ||||
| 2509 | break; | ||||
| 2510 | } | ||||
| 2511 | BrotliDecoderStateCleanupAfterMetablock(s); | ||||
| 2512 | if (!s->is_last_metablock) { | ||||
| 2513 | s->state = BROTLI_STATE_METABLOCK_BEGIN; | ||||
| 2514 | break; | ||||
| 2515 | } | ||||
| 2516 | if (!BrotliJumpToByteBoundary(br)) { | ||||
| 2517 | result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_PADDING_2)((void)(0), BROTLI_DECODER_ERROR_FORMAT_PADDING_2); | ||||
| 2518 | break; | ||||
| 2519 | } | ||||
| 2520 | if (s->buffer_length == 0) { | ||||
| 2521 | BrotliBitReaderUnload(br); | ||||
| 2522 | *available_in = br->avail_in; | ||||
| 2523 | *next_in = br->next_in; | ||||
| 2524 | } | ||||
| 2525 | s->state = BROTLI_STATE_DONE; | ||||
| 2526 | /* Fall through. */ | ||||
| 2527 | |||||
| 2528 | case BROTLI_STATE_DONE: | ||||
| 2529 | if (s->ringbuffer != 0) { | ||||
| 2530 | result = WriteRingBuffer( | ||||
| 2531 | s, available_out, next_out, total_out, BROTLI_TRUE1); | ||||
| 2532 | if (result != BROTLI_DECODER_SUCCESS) { | ||||
| 2533 | break; | ||||
| 2534 | } | ||||
| 2535 | } | ||||
| 2536 | return SaveErrorCode(s, result); | ||||
| 2537 | } | ||||
| 2538 | } | ||||
| 2539 | return SaveErrorCode(s, result); | ||||
| 2540 | } | ||||
| 2541 | |||||
| 2542 | BROTLI_BOOLint BrotliDecoderHasMoreOutput(const BrotliDecoderStateBrotliDecoderStateInternal* s) { | ||||
| 2543 | /* After unrecoverable error remaining output is considered nonsensical. */ | ||||
| 2544 | if ((int)s->error_code < 0) { | ||||
| 2545 | return BROTLI_FALSE0; | ||||
| 2546 | } | ||||
| 2547 | return TO_BROTLI_BOOL((!!(s->ringbuffer != 0 && UnwrittenBytes(s, 0) != 0 ) ? 1 : 0) | ||||
| 2548 | s->ringbuffer != 0 && UnwrittenBytes(s, BROTLI_FALSE) != 0)(!!(s->ringbuffer != 0 && UnwrittenBytes(s, 0) != 0 ) ? 1 : 0); | ||||
| 2549 | } | ||||
| 2550 | |||||
| 2551 | const uint8_t* BrotliDecoderTakeOutput(BrotliDecoderStateBrotliDecoderStateInternal* s, size_t* size) { | ||||
| 2552 | uint8_t* result = 0; | ||||
| 2553 | size_t available_out = *size ? *size : 1u << 24; | ||||
| 2554 | size_t requested_out = available_out; | ||||
| 2555 | BrotliDecoderErrorCode status; | ||||
| 2556 | if ((s->ringbuffer == 0) || ((int)s->error_code < 0)) { | ||||
| 2557 | *size = 0; | ||||
| 2558 | return 0; | ||||
| 2559 | } | ||||
| 2560 | WrapRingBuffer(s); | ||||
| 2561 | status = WriteRingBuffer(s, &available_out, &result, 0, BROTLI_TRUE1); | ||||
| 2562 | /* Either WriteRingBuffer returns those "success" codes... */ | ||||
| 2563 | if (status == BROTLI_DECODER_SUCCESS || | ||||
| 2564 | status == BROTLI_DECODER_NEEDS_MORE_OUTPUT) { | ||||
| 2565 | *size = requested_out - available_out; | ||||
| 2566 | } else { | ||||
| 2567 | /* ... or stream is broken. Normally this should be caught by | ||||
| 2568 | BrotliDecoderDecompressStream, this is just a safeguard. */ | ||||
| 2569 | if ((int)status < 0) SaveErrorCode(s, status); | ||||
| 2570 | *size = 0; | ||||
| 2571 | result = 0; | ||||
| 2572 | } | ||||
| 2573 | return result; | ||||
| 2574 | } | ||||
| 2575 | |||||
| 2576 | BROTLI_BOOLint BrotliDecoderIsUsed(const BrotliDecoderStateBrotliDecoderStateInternal* s) { | ||||
| 2577 | return TO_BROTLI_BOOL(s->state != BROTLI_STATE_UNINITED ||(!!(s->state != BROTLI_STATE_UNINITED || BrotliGetAvailableBits (&s->br) != 0) ? 1 : 0) | ||||
| 2578 | BrotliGetAvailableBits(&s->br) != 0)(!!(s->state != BROTLI_STATE_UNINITED || BrotliGetAvailableBits (&s->br) != 0) ? 1 : 0); | ||||
| 2579 | } | ||||
| 2580 | |||||
| 2581 | BROTLI_BOOLint BrotliDecoderIsFinished(const BrotliDecoderStateBrotliDecoderStateInternal* s) { | ||||
| 2582 | return TO_BROTLI_BOOL(s->state == BROTLI_STATE_DONE)(!!(s->state == BROTLI_STATE_DONE) ? 1 : 0) && | ||||
| 2583 | !BrotliDecoderHasMoreOutput(s); | ||||
| 2584 | } | ||||
| 2585 | |||||
| 2586 | BrotliDecoderErrorCode BrotliDecoderGetErrorCode(const BrotliDecoderStateBrotliDecoderStateInternal* s) { | ||||
| 2587 | return (BrotliDecoderErrorCode)s->error_code; | ||||
| 2588 | } | ||||
| 2589 | |||||
| 2590 | const char* BrotliDecoderErrorString(BrotliDecoderErrorCode c) { | ||||
| 2591 | switch (c) { | ||||
| 2592 | #define BROTLI_ERROR_CODE_CASE_(PREFIX, NAME, CODE) \ | ||||
| 2593 | case BROTLI_DECODER ## PREFIX ## NAME: return #NAME; | ||||
| 2594 | #define BROTLI_NOTHING_ | ||||
| 2595 | BROTLI_DECODER_ERROR_CODES_LIST(BROTLI_ERROR_CODE_CASE_, BROTLI_NOTHING_)BROTLI_ERROR_CODE_CASE_(_, NO_ERROR, 0) BROTLI_NOTHING_ BROTLI_ERROR_CODE_CASE_ (_, SUCCESS, 1) BROTLI_NOTHING_ BROTLI_ERROR_CODE_CASE_(_, NEEDS_MORE_INPUT , 2) BROTLI_NOTHING_ BROTLI_ERROR_CODE_CASE_(_, NEEDS_MORE_OUTPUT , 3) BROTLI_NOTHING_ BROTLI_ERROR_CODE_CASE_(_ERROR_FORMAT_, EXUBERANT_NIBBLE , -1) BROTLI_NOTHING_ BROTLI_ERROR_CODE_CASE_(_ERROR_FORMAT_, RESERVED, -2) BROTLI_NOTHING_ BROTLI_ERROR_CODE_CASE_(_ERROR_FORMAT_ , EXUBERANT_META_NIBBLE, -3) BROTLI_NOTHING_ BROTLI_ERROR_CODE_CASE_ (_ERROR_FORMAT_, SIMPLE_HUFFMAN_ALPHABET, -4) BROTLI_NOTHING_ BROTLI_ERROR_CODE_CASE_(_ERROR_FORMAT_, SIMPLE_HUFFMAN_SAME, -5) BROTLI_NOTHING_ BROTLI_ERROR_CODE_CASE_(_ERROR_FORMAT_, CL_SPACE , -6) BROTLI_NOTHING_ BROTLI_ERROR_CODE_CASE_(_ERROR_FORMAT_, HUFFMAN_SPACE, -7) BROTLI_NOTHING_ BROTLI_ERROR_CODE_CASE_(_ERROR_FORMAT_ , CONTEXT_MAP_REPEAT, -8) BROTLI_NOTHING_ BROTLI_ERROR_CODE_CASE_ (_ERROR_FORMAT_, BLOCK_LENGTH_1, -9) BROTLI_NOTHING_ BROTLI_ERROR_CODE_CASE_ (_ERROR_FORMAT_, BLOCK_LENGTH_2, -10) BROTLI_NOTHING_ BROTLI_ERROR_CODE_CASE_ (_ERROR_FORMAT_, TRANSFORM, -11) BROTLI_NOTHING_ BROTLI_ERROR_CODE_CASE_ (_ERROR_FORMAT_, DICTIONARY, -12) BROTLI_NOTHING_ BROTLI_ERROR_CODE_CASE_ (_ERROR_FORMAT_, WINDOW_BITS, -13) BROTLI_NOTHING_ BROTLI_ERROR_CODE_CASE_ (_ERROR_FORMAT_, PADDING_1, -14) BROTLI_NOTHING_ BROTLI_ERROR_CODE_CASE_ (_ERROR_FORMAT_, PADDING_2, -15) BROTLI_NOTHING_ BROTLI_ERROR_CODE_CASE_ (_ERROR_FORMAT_, DISTANCE, -16) BROTLI_NOTHING_ BROTLI_ERROR_CODE_CASE_ (_ERROR_, DICTIONARY_NOT_SET, -19) BROTLI_NOTHING_ BROTLI_ERROR_CODE_CASE_ (_ERROR_, INVALID_ARGUMENTS, -20) BROTLI_NOTHING_ BROTLI_ERROR_CODE_CASE_ (_ERROR_ALLOC_, CONTEXT_MODES, -21) BROTLI_NOTHING_ BROTLI_ERROR_CODE_CASE_ (_ERROR_ALLOC_, TREE_GROUPS, -22) BROTLI_NOTHING_ BROTLI_ERROR_CODE_CASE_ (_ERROR_ALLOC_, CONTEXT_MAP, -25) BROTLI_NOTHING_ BROTLI_ERROR_CODE_CASE_ (_ERROR_ALLOC_, RING_BUFFER_1, -26) BROTLI_NOTHING_ BROTLI_ERROR_CODE_CASE_ (_ERROR_ALLOC_, RING_BUFFER_2, -27) BROTLI_NOTHING_ BROTLI_ERROR_CODE_CASE_ (_ERROR_ALLOC_, BLOCK_TYPE_TREES, -30) BROTLI_NOTHING_ BROTLI_ERROR_CODE_CASE_ (_ERROR_, UNREACHABLE, -31) | ||||
| 2596 | #undef BROTLI_ERROR_CODE_CASE_ | ||||
| 2597 | #undef BROTLI_NOTHING_ | ||||
| 2598 | default: return "INVALID"; | ||||
| 2599 | } | ||||
| 2600 | } | ||||
| 2601 | |||||
| 2602 | uint32_t BrotliDecoderVersion() { | ||||
| 2603 | return BROTLI_VERSION0x1000009; | ||||
| 2604 | } | ||||
| 2605 | |||||
| 2606 | #if defined(__cplusplus) || defined(c_plusplus) | ||||
| 2607 | } /* extern "C" */ | ||||
| 2608 | #endif |