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