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