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