brotli 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/Gemfile +1 -0
- data/Rakefile +6 -1
- data/brotli.gemspec +1 -1
- data/docs/Brotli.html +485 -0
- data/docs/Brotli/Error.html +124 -0
- data/docs/_index.html +122 -0
- data/docs/class_list.html +51 -0
- data/docs/css/common.css +1 -0
- data/docs/css/full_list.css +58 -0
- data/docs/css/style.css +496 -0
- data/docs/file.README.html +127 -0
- data/docs/file_list.html +56 -0
- data/docs/frames.html +17 -0
- data/docs/index.html +127 -0
- data/docs/js/app.js +292 -0
- data/docs/js/full_list.js +216 -0
- data/docs/js/jquery.js +4 -0
- data/docs/method_list.html +67 -0
- data/docs/top-level-namespace.html +110 -0
- data/ext/brotli/brotli.c +20 -0
- data/lib/brotli/version.rb +1 -1
- data/vendor/brotli/c/common/constants.h +13 -6
- data/vendor/brotli/c/{dec → common}/context.h +182 -172
- data/vendor/brotli/c/common/dictionary.bin +0 -0
- data/vendor/brotli/c/common/dictionary.bin.br +0 -0
- data/vendor/brotli/c/common/dictionary.c +1 -1
- data/vendor/brotli/c/common/dictionary.h +4 -4
- data/vendor/brotli/c/common/platform.h +509 -0
- data/vendor/brotli/c/common/transform.c +235 -0
- data/vendor/brotli/c/common/transform.h +80 -0
- data/vendor/brotli/c/common/version.h +8 -1
- data/vendor/brotli/c/dec/bit_reader.c +1 -1
- data/vendor/brotli/c/dec/bit_reader.h +35 -86
- data/vendor/brotli/c/dec/decode.c +322 -205
- data/vendor/brotli/c/dec/huffman.c +35 -37
- data/vendor/brotli/c/dec/huffman.h +13 -9
- data/vendor/brotli/c/dec/prefix.h +3 -4
- data/vendor/brotli/c/dec/state.c +26 -34
- data/vendor/brotli/c/dec/state.h +34 -23
- data/vendor/brotli/c/enc/backward_references.c +25 -15
- data/vendor/brotli/c/enc/backward_references.h +5 -6
- data/vendor/brotli/c/enc/backward_references_hq.c +94 -68
- data/vendor/brotli/c/enc/backward_references_hq.h +22 -25
- data/vendor/brotli/c/enc/backward_references_inc.h +10 -10
- data/vendor/brotli/c/enc/bit_cost.c +1 -1
- data/vendor/brotli/c/enc/bit_cost.h +5 -5
- data/vendor/brotli/c/enc/block_encoder_inc.h +7 -6
- data/vendor/brotli/c/enc/block_splitter.c +2 -3
- data/vendor/brotli/c/enc/block_splitter.h +1 -1
- data/vendor/brotli/c/enc/block_splitter_inc.h +11 -11
- data/vendor/brotli/c/enc/brotli_bit_stream.c +102 -101
- data/vendor/brotli/c/enc/brotli_bit_stream.h +19 -38
- data/vendor/brotli/c/enc/cluster.c +1 -1
- data/vendor/brotli/c/enc/cluster.h +1 -1
- data/vendor/brotli/c/enc/command.h +40 -30
- data/vendor/brotli/c/enc/compress_fragment.c +21 -22
- data/vendor/brotli/c/enc/compress_fragment.h +1 -1
- data/vendor/brotli/c/enc/compress_fragment_two_pass.c +101 -68
- data/vendor/brotli/c/enc/compress_fragment_two_pass.h +1 -1
- data/vendor/brotli/c/enc/dictionary_hash.c +1 -1
- data/vendor/brotli/c/enc/encode.c +262 -162
- data/vendor/brotli/c/enc/encoder_dict.c +32 -0
- data/vendor/brotli/c/enc/encoder_dict.h +41 -0
- data/vendor/brotli/c/enc/entropy_encode.c +14 -14
- data/vendor/brotli/c/enc/entropy_encode.h +5 -5
- data/vendor/brotli/c/enc/entropy_encode_static.h +3 -3
- data/vendor/brotli/c/enc/fast_log.h +4 -2
- data/vendor/brotli/c/enc/find_match_length.h +3 -3
- data/vendor/brotli/c/enc/hash.h +75 -24
- data/vendor/brotli/c/enc/hash_composite_inc.h +133 -0
- data/vendor/brotli/c/enc/hash_forgetful_chain_inc.h +9 -8
- data/vendor/brotli/c/enc/hash_longest_match64_inc.h +8 -8
- data/vendor/brotli/c/enc/hash_longest_match_inc.h +8 -8
- data/vendor/brotli/c/enc/hash_longest_match_quickly_inc.h +10 -9
- data/vendor/brotli/c/enc/hash_rolling_inc.h +215 -0
- data/vendor/brotli/c/enc/hash_to_binary_tree_inc.h +9 -8
- data/vendor/brotli/c/enc/histogram.c +9 -6
- data/vendor/brotli/c/enc/histogram.h +6 -3
- data/vendor/brotli/c/enc/histogram_inc.h +1 -1
- data/vendor/brotli/c/enc/literal_cost.c +5 -5
- data/vendor/brotli/c/enc/literal_cost.h +2 -2
- data/vendor/brotli/c/enc/memory.c +5 -16
- data/vendor/brotli/c/enc/memory.h +40 -1
- data/vendor/brotli/c/enc/metablock.c +163 -25
- data/vendor/brotli/c/enc/metablock.h +13 -8
- data/vendor/brotli/c/enc/metablock_inc.h +1 -1
- data/vendor/brotli/c/enc/params.h +44 -0
- data/vendor/brotli/c/enc/prefix.h +3 -4
- data/vendor/brotli/c/enc/quality.h +29 -24
- data/vendor/brotli/c/enc/ringbuffer.h +15 -11
- data/vendor/brotli/c/enc/static_dict.c +49 -45
- data/vendor/brotli/c/enc/static_dict.h +4 -3
- data/vendor/brotli/c/enc/static_dict_lut.h +1 -1
- data/vendor/brotli/c/enc/utf8_util.c +20 -20
- data/vendor/brotli/c/enc/utf8_util.h +1 -1
- data/vendor/brotli/c/enc/write_bits.h +16 -21
- data/vendor/brotli/c/include/brotli/decode.h +13 -8
- data/vendor/brotli/c/include/brotli/encode.h +33 -8
- data/vendor/brotli/c/include/brotli/port.h +211 -83
- data/vendor/brotli/c/include/brotli/types.h +0 -7
- metadata +33 -12
- data/vendor/brotli/c/dec/port.h +0 -168
- data/vendor/brotli/c/dec/transform.h +0 -300
- data/vendor/brotli/c/enc/context.h +0 -184
- data/vendor/brotli/c/enc/port.h +0 -184
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
#include <string.h> /* memcpy, memset */
|
|
12
12
|
|
|
13
13
|
#include "../common/constants.h"
|
|
14
|
+
#include "../common/platform.h"
|
|
14
15
|
#include <brotli/types.h>
|
|
15
|
-
#include "./port.h"
|
|
16
16
|
|
|
17
17
|
#if defined(__cplusplus) || defined(c_plusplus)
|
|
18
18
|
extern "C" {
|
|
@@ -20,9 +20,9 @@ extern "C" {
|
|
|
20
20
|
|
|
21
21
|
#define BROTLI_REVERSE_BITS_MAX 8
|
|
22
22
|
|
|
23
|
-
#
|
|
23
|
+
#if defined(BROTLI_RBIT)
|
|
24
24
|
#define BROTLI_REVERSE_BITS_BASE \
|
|
25
|
-
((sizeof(
|
|
25
|
+
((sizeof(brotli_reg_t) << 3) - BROTLI_REVERSE_BITS_MAX)
|
|
26
26
|
#else
|
|
27
27
|
#define BROTLI_REVERSE_BITS_BASE 0
|
|
28
28
|
static uint8_t kReverseBits[1 << BROTLI_REVERSE_BITS_MAX] = {
|
|
@@ -62,13 +62,13 @@ static uint8_t kReverseBits[1 << BROTLI_REVERSE_BITS_MAX] = {
|
|
|
62
62
|
#endif /* BROTLI_RBIT */
|
|
63
63
|
|
|
64
64
|
#define BROTLI_REVERSE_BITS_LOWEST \
|
|
65
|
-
((
|
|
65
|
+
((brotli_reg_t)1 << (BROTLI_REVERSE_BITS_MAX - 1 + BROTLI_REVERSE_BITS_BASE))
|
|
66
66
|
|
|
67
67
|
/* Returns reverse(num >> BROTLI_REVERSE_BITS_BASE, BROTLI_REVERSE_BITS_MAX),
|
|
68
68
|
where reverse(value, len) is the bit-wise reversal of the len least
|
|
69
69
|
significant bits of value. */
|
|
70
|
-
static BROTLI_INLINE
|
|
71
|
-
#
|
|
70
|
+
static BROTLI_INLINE brotli_reg_t BrotliReverseBits(brotli_reg_t num) {
|
|
71
|
+
#if defined(BROTLI_RBIT)
|
|
72
72
|
return BROTLI_RBIT(num);
|
|
73
73
|
#else
|
|
74
74
|
return kReverseBits[num];
|
|
@@ -86,9 +86,9 @@ static BROTLI_INLINE void ReplicateValue(HuffmanCode* table,
|
|
|
86
86
|
} while (end > 0);
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
-
/* Returns the table width of the next 2nd level table. count is the histogram
|
|
90
|
-
of bit lengths for the remaining symbols, len is the code length of the
|
|
91
|
-
processed symbol */
|
|
89
|
+
/* Returns the table width of the next 2nd level table. |count| is the histogram
|
|
90
|
+
of bit lengths for the remaining symbols, |len| is the code length of the
|
|
91
|
+
next processed symbol. */
|
|
92
92
|
static BROTLI_INLINE int NextTableBitSize(const uint16_t* const count,
|
|
93
93
|
int len, int root_bits) {
|
|
94
94
|
int left = 1 << (len - root_bits);
|
|
@@ -104,12 +104,12 @@ static BROTLI_INLINE int NextTableBitSize(const uint16_t* const count,
|
|
|
104
104
|
void BrotliBuildCodeLengthsHuffmanTable(HuffmanCode* table,
|
|
105
105
|
const uint8_t* const code_lengths,
|
|
106
106
|
uint16_t* count) {
|
|
107
|
-
HuffmanCode code;
|
|
108
|
-
int symbol;
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
int step;
|
|
112
|
-
int table_size;
|
|
107
|
+
HuffmanCode code; /* current table entry */
|
|
108
|
+
int symbol; /* symbol index in original or sorted table */
|
|
109
|
+
brotli_reg_t key; /* prefix code */
|
|
110
|
+
brotli_reg_t key_step; /* prefix code addend */
|
|
111
|
+
int step; /* step size to replicate values in current table */
|
|
112
|
+
int table_size; /* size of current table */
|
|
113
113
|
int sorted[BROTLI_CODE_LENGTH_CODES]; /* symbols sorted by code length */
|
|
114
114
|
/* offsets in sorted table for each length */
|
|
115
115
|
int offset[BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH + 1];
|
|
@@ -118,7 +118,7 @@ void BrotliBuildCodeLengthsHuffmanTable(HuffmanCode* table,
|
|
|
118
118
|
BROTLI_DCHECK(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH <=
|
|
119
119
|
BROTLI_REVERSE_BITS_MAX);
|
|
120
120
|
|
|
121
|
-
/*
|
|
121
|
+
/* Generate offsets into sorted symbol table by code length. */
|
|
122
122
|
symbol = -1;
|
|
123
123
|
bits = 1;
|
|
124
124
|
BROTLI_REPEAT(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH, {
|
|
@@ -129,7 +129,7 @@ void BrotliBuildCodeLengthsHuffmanTable(HuffmanCode* table,
|
|
|
129
129
|
/* Symbols with code length 0 are placed after all other symbols. */
|
|
130
130
|
offset[0] = BROTLI_CODE_LENGTH_CODES - 1;
|
|
131
131
|
|
|
132
|
-
/*
|
|
132
|
+
/* Sort symbols by length, by symbol order within each length. */
|
|
133
133
|
symbol = BROTLI_CODE_LENGTH_CODES;
|
|
134
134
|
do {
|
|
135
135
|
BROTLI_REPEAT(6, {
|
|
@@ -144,13 +144,13 @@ void BrotliBuildCodeLengthsHuffmanTable(HuffmanCode* table,
|
|
|
144
144
|
if (offset[0] == 0) {
|
|
145
145
|
code.bits = 0;
|
|
146
146
|
code.value = (uint16_t)sorted[0];
|
|
147
|
-
for (key = 0; key < (
|
|
147
|
+
for (key = 0; key < (brotli_reg_t)table_size; ++key) {
|
|
148
148
|
table[key] = code;
|
|
149
149
|
}
|
|
150
150
|
return;
|
|
151
151
|
}
|
|
152
152
|
|
|
153
|
-
/*
|
|
153
|
+
/* Fill in table. */
|
|
154
154
|
key = 0;
|
|
155
155
|
key_step = BROTLI_REVERSE_BITS_LOWEST;
|
|
156
156
|
symbol = 0;
|
|
@@ -172,18 +172,18 @@ uint32_t BrotliBuildHuffmanTable(HuffmanCode* root_table,
|
|
|
172
172
|
int root_bits,
|
|
173
173
|
const uint16_t* const symbol_lists,
|
|
174
174
|
uint16_t* count) {
|
|
175
|
-
HuffmanCode code;
|
|
176
|
-
HuffmanCode* table;
|
|
177
|
-
int len;
|
|
178
|
-
int symbol;
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
int step;
|
|
184
|
-
int table_bits;
|
|
185
|
-
int table_size;
|
|
186
|
-
int total_size;
|
|
175
|
+
HuffmanCode code; /* current table entry */
|
|
176
|
+
HuffmanCode* table; /* next available space in table */
|
|
177
|
+
int len; /* current code length */
|
|
178
|
+
int symbol; /* symbol index in original or sorted table */
|
|
179
|
+
brotli_reg_t key; /* prefix code */
|
|
180
|
+
brotli_reg_t key_step; /* prefix code addend */
|
|
181
|
+
brotli_reg_t sub_key; /* 2nd level table prefix code */
|
|
182
|
+
brotli_reg_t sub_key_step; /* 2nd level table prefix code addend */
|
|
183
|
+
int step; /* step size to replicate values in current table */
|
|
184
|
+
int table_bits; /* key length of current table */
|
|
185
|
+
int table_size; /* size of current table */
|
|
186
|
+
int total_size; /* sum of root table size and 2nd level table sizes */
|
|
187
187
|
int max_length = -1;
|
|
188
188
|
int bits;
|
|
189
189
|
int bits_count;
|
|
@@ -200,9 +200,8 @@ uint32_t BrotliBuildHuffmanTable(HuffmanCode* root_table,
|
|
|
200
200
|
table_size = 1 << table_bits;
|
|
201
201
|
total_size = table_size;
|
|
202
202
|
|
|
203
|
-
/*
|
|
204
|
-
|
|
205
|
-
/* create the repetitions by memcpy if possible in the coming loop */
|
|
203
|
+
/* Fill in the root table. Reduce the table size to if possible,
|
|
204
|
+
and create the repetitions by memcpy. */
|
|
206
205
|
if (table_bits > max_length) {
|
|
207
206
|
table_bits = max_length;
|
|
208
207
|
table_size = 1 << table_bits;
|
|
@@ -224,15 +223,14 @@ uint32_t BrotliBuildHuffmanTable(HuffmanCode* root_table,
|
|
|
224
223
|
key_step >>= 1;
|
|
225
224
|
} while (++bits <= table_bits);
|
|
226
225
|
|
|
227
|
-
/*
|
|
228
|
-
/* table, and we need to replicate it now. */
|
|
226
|
+
/* If root_bits != table_bits then replicate to fill the remaining slots. */
|
|
229
227
|
while (total_size != table_size) {
|
|
230
228
|
memcpy(&table[table_size], &table[0],
|
|
231
229
|
(size_t)table_size * sizeof(table[0]));
|
|
232
230
|
table_size <<= 1;
|
|
233
231
|
}
|
|
234
232
|
|
|
235
|
-
/*
|
|
233
|
+
/* Fill in 2nd level tables and add pointers to root table. */
|
|
236
234
|
key_step = BROTLI_REVERSE_BITS_LOWEST >> (root_bits - 1);
|
|
237
235
|
sub_key = (BROTLI_REVERSE_BITS_LOWEST << 1);
|
|
238
236
|
sub_key_step = BROTLI_REVERSE_BITS_LOWEST;
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
#ifndef BROTLI_DEC_HUFFMAN_H_
|
|
10
10
|
#define BROTLI_DEC_HUFFMAN_H_
|
|
11
11
|
|
|
12
|
+
#include "../common/platform.h"
|
|
12
13
|
#include <brotli/types.h>
|
|
13
|
-
#include "./port.h"
|
|
14
14
|
|
|
15
15
|
#if defined(__cplusplus) || defined(c_plusplus)
|
|
16
16
|
extern "C" {
|
|
@@ -19,10 +19,11 @@ extern "C" {
|
|
|
19
19
|
#define BROTLI_HUFFMAN_MAX_CODE_LENGTH 15
|
|
20
20
|
|
|
21
21
|
/* Maximum possible Huffman table size for an alphabet size of (index * 32),
|
|
22
|
-
|
|
22
|
+
max code length 15 and root table bits 8. */
|
|
23
23
|
static const uint16_t kMaxHuffmanTableSize[] = {
|
|
24
24
|
256, 402, 436, 468, 500, 534, 566, 598, 630, 662, 694, 726, 758, 790, 822,
|
|
25
|
-
854, 886, 920, 952, 984, 1016, 1048, 1080
|
|
25
|
+
854, 886, 920, 952, 984, 1016, 1048, 1080, 1112, 1144, 1176, 1208, 1240, 1272,
|
|
26
|
+
1304, 1336, 1368, 1400, 1432, 1464, 1496, 1528};
|
|
26
27
|
/* BROTLI_NUM_BLOCK_LEN_SYMBOLS == 26 */
|
|
27
28
|
#define BROTLI_HUFFMAN_MAX_SIZE_26 396
|
|
28
29
|
/* BROTLI_MAX_BLOCK_TYPE_SYMBOLS == 258 */
|
|
@@ -41,23 +42,26 @@ typedef struct {
|
|
|
41
42
|
BROTLI_INTERNAL void BrotliBuildCodeLengthsHuffmanTable(HuffmanCode* root_table,
|
|
42
43
|
const uint8_t* const code_lengths, uint16_t* count);
|
|
43
44
|
|
|
44
|
-
/* Builds Huffman lookup table assuming code lengths are in symbol order.
|
|
45
|
-
|
|
45
|
+
/* Builds Huffman lookup table assuming code lengths are in symbol order.
|
|
46
|
+
Returns size of resulting table. */
|
|
46
47
|
BROTLI_INTERNAL uint32_t BrotliBuildHuffmanTable(HuffmanCode* root_table,
|
|
47
48
|
int root_bits, const uint16_t* const symbol_lists, uint16_t* count_arg);
|
|
48
49
|
|
|
49
|
-
/* Builds a simple Huffman table. The num_symbols parameter is to be
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
50
|
+
/* Builds a simple Huffman table. The |num_symbols| parameter is to be
|
|
51
|
+
interpreted as follows: 0 means 1 symbol, 1 means 2 symbols,
|
|
52
|
+
2 means 3 symbols, 3 means 4 symbols with lengths [2, 2, 2, 2],
|
|
53
|
+
4 means 4 symbols with lengths [1, 2, 3, 3]. */
|
|
53
54
|
BROTLI_INTERNAL uint32_t BrotliBuildSimpleHuffmanTable(HuffmanCode* table,
|
|
54
55
|
int root_bits, uint16_t* symbols, uint32_t num_symbols);
|
|
55
56
|
|
|
56
57
|
/* Contains a collection of Huffman trees with the same alphabet size. */
|
|
58
|
+
/* max_symbol is needed due to simple codes since log2(alphabet_size) could be
|
|
59
|
+
greater than log2(max_symbol). */
|
|
57
60
|
typedef struct {
|
|
58
61
|
HuffmanCode** htrees;
|
|
59
62
|
HuffmanCode* codes;
|
|
60
63
|
uint16_t alphabet_size;
|
|
64
|
+
uint16_t max_symbol;
|
|
61
65
|
uint16_t num_htrees;
|
|
62
66
|
} HuffmanTreeGroup;
|
|
63
67
|
|
|
@@ -5,8 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
/* Lookup tables to map prefix codes to value ranges. This is used during
|
|
8
|
-
decoding of the block lengths, literal insertion lengths and copy lengths.
|
|
9
|
-
*/
|
|
8
|
+
decoding of the block lengths, literal insertion lengths and copy lengths. */
|
|
10
9
|
|
|
11
10
|
#ifndef BROTLI_DEC_PREFIX_H_
|
|
12
11
|
#define BROTLI_DEC_PREFIX_H_
|
|
@@ -14,8 +13,8 @@
|
|
|
14
13
|
#include "../common/constants.h"
|
|
15
14
|
#include <brotli/types.h>
|
|
16
15
|
|
|
17
|
-
/* Represents the range of values belonging to a prefix code:
|
|
18
|
-
|
|
16
|
+
/* Represents the range of values belonging to a prefix code:
|
|
17
|
+
[offset, offset + 2^nbits) */
|
|
19
18
|
struct PrefixCodeRange {
|
|
20
19
|
uint16_t offset;
|
|
21
20
|
uint8_t nbits;
|
data/vendor/brotli/c/dec/state.c
CHANGED
|
@@ -15,25 +15,11 @@
|
|
|
15
15
|
extern "C" {
|
|
16
16
|
#endif
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
BROTLI_UNUSED(opaque);
|
|
20
|
-
return malloc(size);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
static void DefaultFreeFunc(void* opaque, void* address) {
|
|
24
|
-
BROTLI_UNUSED(opaque);
|
|
25
|
-
free(address);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
void BrotliDecoderStateInit(BrotliDecoderState* s) {
|
|
29
|
-
BrotliDecoderStateInitWithCustomAllocators(s, 0, 0, 0);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
void BrotliDecoderStateInitWithCustomAllocators(BrotliDecoderState* s,
|
|
18
|
+
BROTLI_BOOL BrotliDecoderStateInit(BrotliDecoderState* s,
|
|
33
19
|
brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque) {
|
|
34
20
|
if (!alloc_func) {
|
|
35
|
-
s->alloc_func =
|
|
36
|
-
s->free_func =
|
|
21
|
+
s->alloc_func = BrotliDefaultAllocFunc;
|
|
22
|
+
s->free_func = BrotliDefaultFreeFunc;
|
|
37
23
|
s->memory_manager_opaque = 0;
|
|
38
24
|
} else {
|
|
39
25
|
s->alloc_func = alloc_func;
|
|
@@ -45,6 +31,7 @@ void BrotliDecoderStateInitWithCustomAllocators(BrotliDecoderState* s,
|
|
|
45
31
|
|
|
46
32
|
BrotliInitBitReader(&s->br);
|
|
47
33
|
s->state = BROTLI_STATE_UNINITED;
|
|
34
|
+
s->large_window = 0;
|
|
48
35
|
s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
|
|
49
36
|
s->substate_tree_group = BROTLI_STATE_TREE_GROUP_NONE;
|
|
50
37
|
s->substate_context_map = BROTLI_STATE_CONTEXT_MAP_NONE;
|
|
@@ -53,8 +40,6 @@ void BrotliDecoderStateInitWithCustomAllocators(BrotliDecoderState* s,
|
|
|
53
40
|
s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_NONE;
|
|
54
41
|
s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_NONE;
|
|
55
42
|
|
|
56
|
-
s->dictionary = BrotliGetDictionary();
|
|
57
|
-
|
|
58
43
|
s->buffer_length = 0;
|
|
59
44
|
s->loop_counter = 0;
|
|
60
45
|
s->pos = 0;
|
|
@@ -103,13 +88,18 @@ void BrotliDecoderStateInitWithCustomAllocators(BrotliDecoderState* s,
|
|
|
103
88
|
s->symbol_lists = &s->symbols_lists_array[BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1];
|
|
104
89
|
|
|
105
90
|
s->mtf_upper_bound = 63;
|
|
91
|
+
|
|
92
|
+
s->dictionary = BrotliGetDictionary();
|
|
93
|
+
s->transforms = BrotliGetTransforms();
|
|
94
|
+
|
|
95
|
+
return BROTLI_TRUE;
|
|
106
96
|
}
|
|
107
97
|
|
|
108
98
|
void BrotliDecoderStateMetablockBegin(BrotliDecoderState* s) {
|
|
109
99
|
s->meta_block_remaining_len = 0;
|
|
110
|
-
s->block_length[0] = 1U <<
|
|
111
|
-
s->block_length[1] = 1U <<
|
|
112
|
-
s->block_length[2] = 1U <<
|
|
100
|
+
s->block_length[0] = 1U << 24;
|
|
101
|
+
s->block_length[1] = 1U << 24;
|
|
102
|
+
s->block_length[2] = 1U << 24;
|
|
113
103
|
s->num_block_types[0] = 1;
|
|
114
104
|
s->num_block_types[1] = 1;
|
|
115
105
|
s->num_block_types[2] = 1;
|
|
@@ -126,8 +116,7 @@ void BrotliDecoderStateMetablockBegin(BrotliDecoderState* s) {
|
|
|
126
116
|
s->literal_htree = NULL;
|
|
127
117
|
s->dist_context_map_slice = NULL;
|
|
128
118
|
s->dist_htree_index = 0;
|
|
129
|
-
s->
|
|
130
|
-
s->context_lookup2 = NULL;
|
|
119
|
+
s->context_lookup = NULL;
|
|
131
120
|
s->literal_hgroup.codes = NULL;
|
|
132
121
|
s->literal_hgroup.htrees = NULL;
|
|
133
122
|
s->insert_copy_hgroup.codes = NULL;
|
|
@@ -137,30 +126,33 @@ void BrotliDecoderStateMetablockBegin(BrotliDecoderState* s) {
|
|
|
137
126
|
}
|
|
138
127
|
|
|
139
128
|
void BrotliDecoderStateCleanupAfterMetablock(BrotliDecoderState* s) {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
129
|
+
BROTLI_DECODER_FREE(s, s->context_modes);
|
|
130
|
+
BROTLI_DECODER_FREE(s, s->context_map);
|
|
131
|
+
BROTLI_DECODER_FREE(s, s->dist_context_map);
|
|
132
|
+
BROTLI_DECODER_FREE(s, s->literal_hgroup.htrees);
|
|
133
|
+
BROTLI_DECODER_FREE(s, s->insert_copy_hgroup.htrees);
|
|
134
|
+
BROTLI_DECODER_FREE(s, s->distance_hgroup.htrees);
|
|
146
135
|
}
|
|
147
136
|
|
|
148
137
|
void BrotliDecoderStateCleanup(BrotliDecoderState* s) {
|
|
149
138
|
BrotliDecoderStateCleanupAfterMetablock(s);
|
|
150
139
|
|
|
151
|
-
|
|
152
|
-
|
|
140
|
+
BROTLI_DECODER_FREE(s, s->ringbuffer);
|
|
141
|
+
BROTLI_DECODER_FREE(s, s->block_type_trees);
|
|
153
142
|
}
|
|
154
143
|
|
|
155
144
|
BROTLI_BOOL BrotliDecoderHuffmanTreeGroupInit(BrotliDecoderState* s,
|
|
156
|
-
HuffmanTreeGroup* group, uint32_t alphabet_size, uint32_t
|
|
145
|
+
HuffmanTreeGroup* group, uint32_t alphabet_size, uint32_t max_symbol,
|
|
146
|
+
uint32_t ntrees) {
|
|
157
147
|
/* Pack two allocations into one */
|
|
158
148
|
const size_t max_table_size = kMaxHuffmanTableSize[(alphabet_size + 31) >> 5];
|
|
159
149
|
const size_t code_size = sizeof(HuffmanCode) * ntrees * max_table_size;
|
|
160
150
|
const size_t htree_size = sizeof(HuffmanCode*) * ntrees;
|
|
161
151
|
/* Pointer alignment is, hopefully, wider than sizeof(HuffmanCode). */
|
|
162
|
-
HuffmanCode** p = (HuffmanCode**)
|
|
152
|
+
HuffmanCode** p = (HuffmanCode**)BROTLI_DECODER_ALLOC(s,
|
|
153
|
+
code_size + htree_size);
|
|
163
154
|
group->alphabet_size = (uint16_t)alphabet_size;
|
|
155
|
+
group->max_symbol = (uint16_t)max_symbol;
|
|
164
156
|
group->num_htrees = (uint16_t)ntrees;
|
|
165
157
|
group->htrees = p;
|
|
166
158
|
group->codes = (HuffmanCode*)(&p[ntrees]);
|
data/vendor/brotli/c/dec/state.h
CHANGED
|
@@ -11,10 +11,11 @@
|
|
|
11
11
|
|
|
12
12
|
#include "../common/constants.h"
|
|
13
13
|
#include "../common/dictionary.h"
|
|
14
|
+
#include "../common/platform.h"
|
|
15
|
+
#include "../common/transform.h"
|
|
14
16
|
#include <brotli/types.h>
|
|
15
17
|
#include "./bit_reader.h"
|
|
16
18
|
#include "./huffman.h"
|
|
17
|
-
#include "./port.h"
|
|
18
19
|
|
|
19
20
|
#if defined(__cplusplus) || defined(c_plusplus)
|
|
20
21
|
extern "C" {
|
|
@@ -22,6 +23,8 @@ extern "C" {
|
|
|
22
23
|
|
|
23
24
|
typedef enum {
|
|
24
25
|
BROTLI_STATE_UNINITED,
|
|
26
|
+
BROTLI_STATE_LARGE_WINDOW_BITS,
|
|
27
|
+
BROTLI_STATE_INITIALIZE,
|
|
25
28
|
BROTLI_STATE_METABLOCK_BEGIN,
|
|
26
29
|
BROTLI_STATE_METABLOCK_HEADER,
|
|
27
30
|
BROTLI_STATE_METABLOCK_HEADER_2,
|
|
@@ -126,23 +129,22 @@ struct BrotliDecoderStateStruct {
|
|
|
126
129
|
uint8_t* ringbuffer;
|
|
127
130
|
uint8_t* ringbuffer_end;
|
|
128
131
|
HuffmanCode* htree_command;
|
|
129
|
-
const uint8_t*
|
|
130
|
-
const uint8_t* context_lookup2;
|
|
132
|
+
const uint8_t* context_lookup;
|
|
131
133
|
uint8_t* context_map_slice;
|
|
132
134
|
uint8_t* dist_context_map_slice;
|
|
133
135
|
|
|
134
|
-
/* This ring buffer holds a few past copy distances that will be used by
|
|
135
|
-
|
|
136
|
+
/* This ring buffer holds a few past copy distances that will be used by
|
|
137
|
+
some special distance codes. */
|
|
136
138
|
HuffmanTreeGroup literal_hgroup;
|
|
137
139
|
HuffmanTreeGroup insert_copy_hgroup;
|
|
138
140
|
HuffmanTreeGroup distance_hgroup;
|
|
139
141
|
HuffmanCode* block_type_trees;
|
|
140
142
|
HuffmanCode* block_len_trees;
|
|
141
143
|
/* This is true if the literal context map histogram type always matches the
|
|
142
|
-
|
|
144
|
+
block type. It is then not needed to keep the context (faster decoding). */
|
|
143
145
|
int trivial_literal_context;
|
|
144
|
-
/* Distance context is actual after command is decoded and before distance
|
|
145
|
-
|
|
146
|
+
/* Distance context is actual after command is decoded and before distance is
|
|
147
|
+
computed. After distance computation it is used as a temporary variable. */
|
|
146
148
|
int distance_context;
|
|
147
149
|
int meta_block_remaining_len;
|
|
148
150
|
uint32_t block_length_index;
|
|
@@ -162,11 +164,11 @@ struct BrotliDecoderStateStruct {
|
|
|
162
164
|
int copy_length;
|
|
163
165
|
int distance_code;
|
|
164
166
|
|
|
165
|
-
/* For partial write operations */
|
|
166
|
-
size_t rb_roundtrips; /*
|
|
167
|
-
size_t partial_pos_out; /*
|
|
167
|
+
/* For partial write operations. */
|
|
168
|
+
size_t rb_roundtrips; /* how many times we went around the ring-buffer */
|
|
169
|
+
size_t partial_pos_out; /* how much output to the user in total */
|
|
168
170
|
|
|
169
|
-
/* For ReadHuffmanCode */
|
|
171
|
+
/* For ReadHuffmanCode. */
|
|
170
172
|
uint32_t symbol;
|
|
171
173
|
uint32_t repeat;
|
|
172
174
|
uint32_t space;
|
|
@@ -180,25 +182,26 @@ struct BrotliDecoderStateStruct {
|
|
|
180
182
|
/* Tails of symbol chains. */
|
|
181
183
|
int next_symbol[32];
|
|
182
184
|
uint8_t code_length_code_lengths[BROTLI_CODE_LENGTH_CODES];
|
|
183
|
-
/* Population counts for the code lengths */
|
|
185
|
+
/* Population counts for the code lengths. */
|
|
184
186
|
uint16_t code_length_histo[16];
|
|
185
187
|
|
|
186
|
-
/* For HuffmanTreeGroupDecode */
|
|
188
|
+
/* For HuffmanTreeGroupDecode. */
|
|
187
189
|
int htree_index;
|
|
188
190
|
HuffmanCode* next;
|
|
189
191
|
|
|
190
|
-
/* For DecodeContextMap */
|
|
192
|
+
/* For DecodeContextMap. */
|
|
191
193
|
uint32_t context_index;
|
|
192
194
|
uint32_t max_run_length_prefix;
|
|
193
195
|
uint32_t code;
|
|
194
196
|
HuffmanCode context_map_table[BROTLI_HUFFMAN_MAX_SIZE_272];
|
|
195
197
|
|
|
196
|
-
/* For InverseMoveToFrontTransform */
|
|
198
|
+
/* For InverseMoveToFrontTransform. */
|
|
197
199
|
uint32_t mtf_upper_bound;
|
|
198
200
|
uint32_t mtf[64 + 1];
|
|
199
201
|
|
|
200
|
-
/*
|
|
201
|
-
|
|
202
|
+
/* Less used attributes are at the end of this struct. */
|
|
203
|
+
|
|
204
|
+
/* States inside function calls. */
|
|
202
205
|
BrotliRunningMetablockHeaderState substate_metablock_header;
|
|
203
206
|
BrotliRunningTreeGroupState substate_tree_group;
|
|
204
207
|
BrotliRunningContextMapState substate_context_map;
|
|
@@ -212,6 +215,7 @@ struct BrotliDecoderStateStruct {
|
|
|
212
215
|
unsigned int is_metadata : 1;
|
|
213
216
|
unsigned int should_wrap_ringbuffer : 1;
|
|
214
217
|
unsigned int canny_ringbuffer_allocation : 1;
|
|
218
|
+
unsigned int large_window : 1;
|
|
215
219
|
unsigned int size_nibbles : 8;
|
|
216
220
|
uint32_t window_bits;
|
|
217
221
|
|
|
@@ -220,7 +224,9 @@ struct BrotliDecoderStateStruct {
|
|
|
220
224
|
uint32_t num_literal_htrees;
|
|
221
225
|
uint8_t* context_map;
|
|
222
226
|
uint8_t* context_modes;
|
|
227
|
+
|
|
223
228
|
const BrotliDictionary* dictionary;
|
|
229
|
+
const BrotliTransforms* transforms;
|
|
224
230
|
|
|
225
231
|
uint32_t trivial_literal_contexts[8]; /* 256 bits */
|
|
226
232
|
};
|
|
@@ -228,17 +234,22 @@ struct BrotliDecoderStateStruct {
|
|
|
228
234
|
typedef struct BrotliDecoderStateStruct BrotliDecoderStateInternal;
|
|
229
235
|
#define BrotliDecoderState BrotliDecoderStateInternal
|
|
230
236
|
|
|
231
|
-
BROTLI_INTERNAL
|
|
232
|
-
|
|
233
|
-
BrotliDecoderState* s, brotli_alloc_func alloc_func,
|
|
234
|
-
brotli_free_func free_func, void* opaque);
|
|
237
|
+
BROTLI_INTERNAL BROTLI_BOOL BrotliDecoderStateInit(BrotliDecoderState* s,
|
|
238
|
+
brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque);
|
|
235
239
|
BROTLI_INTERNAL void BrotliDecoderStateCleanup(BrotliDecoderState* s);
|
|
236
240
|
BROTLI_INTERNAL void BrotliDecoderStateMetablockBegin(BrotliDecoderState* s);
|
|
237
241
|
BROTLI_INTERNAL void BrotliDecoderStateCleanupAfterMetablock(
|
|
238
242
|
BrotliDecoderState* s);
|
|
239
243
|
BROTLI_INTERNAL BROTLI_BOOL BrotliDecoderHuffmanTreeGroupInit(
|
|
240
244
|
BrotliDecoderState* s, HuffmanTreeGroup* group, uint32_t alphabet_size,
|
|
241
|
-
uint32_t ntrees);
|
|
245
|
+
uint32_t max_symbol, uint32_t ntrees);
|
|
246
|
+
|
|
247
|
+
#define BROTLI_DECODER_ALLOC(S, L) S->alloc_func(S->memory_manager_opaque, L)
|
|
248
|
+
|
|
249
|
+
#define BROTLI_DECODER_FREE(S, X) { \
|
|
250
|
+
S->free_func(S->memory_manager_opaque, X); \
|
|
251
|
+
X = NULL; \
|
|
252
|
+
}
|
|
242
253
|
|
|
243
254
|
#if defined(__cplusplus) || defined(c_plusplus)
|
|
244
255
|
} /* extern "C" */
|