brotli 0.1.1 → 0.1.2
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 +4 -4
- data/ext/brotli/brotli.cc +114 -24
- data/ext/brotli/brotli.h +0 -1
- data/ext/brotli/extconf.rb +30 -23
- data/lib/brotli/version.rb +1 -1
- data/vendor/brotli/LICENSE +1 -1
- data/vendor/brotli/dec/Makefile +1 -1
- data/vendor/brotli/dec/bit_reader.c +3 -3
- data/vendor/brotli/dec/bit_reader.h +25 -27
- data/vendor/brotli/dec/context.h +4 -4
- data/vendor/brotli/dec/decode.c +410 -486
- data/vendor/brotli/dec/decode.h +101 -105
- data/vendor/brotli/dec/dictionary.c +1 -1
- data/vendor/brotli/dec/dictionary.h +7 -8
- data/vendor/brotli/dec/huffman.c +103 -105
- data/vendor/brotli/dec/huffman.h +18 -18
- data/vendor/brotli/dec/port.h +52 -40
- data/vendor/brotli/dec/prefix.h +2 -0
- data/vendor/brotli/dec/state.c +13 -19
- data/vendor/brotli/dec/state.h +25 -39
- data/vendor/brotli/dec/transform.h +38 -44
- data/vendor/brotli/dec/types.h +2 -2
- data/vendor/brotli/enc/Makefile +1 -1
- data/vendor/brotli/enc/backward_references.cc +455 -359
- data/vendor/brotli/enc/backward_references.h +79 -3
- data/vendor/brotli/enc/bit_cost.h +54 -32
- data/vendor/brotli/enc/block_splitter.cc +285 -193
- data/vendor/brotli/enc/block_splitter.h +4 -12
- data/vendor/brotli/enc/brotli_bit_stream.cc +623 -324
- data/vendor/brotli/enc/brotli_bit_stream.h +76 -37
- data/vendor/brotli/enc/cluster.h +161 -120
- data/vendor/brotli/enc/command.h +60 -37
- data/vendor/brotli/enc/compress_fragment.cc +701 -0
- data/vendor/brotli/enc/compress_fragment.h +47 -0
- data/vendor/brotli/enc/compress_fragment_two_pass.cc +524 -0
- data/vendor/brotli/enc/compress_fragment_two_pass.h +40 -0
- data/vendor/brotli/enc/compressor.h +15 -0
- data/vendor/brotli/enc/context.h +1 -1
- data/vendor/brotli/enc/dictionary.h +2 -2
- data/vendor/brotli/enc/encode.cc +819 -286
- data/vendor/brotli/enc/encode.h +38 -15
- data/vendor/brotli/enc/encode_parallel.cc +40 -42
- data/vendor/brotli/enc/entropy_encode.cc +144 -147
- data/vendor/brotli/enc/entropy_encode.h +32 -8
- data/vendor/brotli/enc/entropy_encode_static.h +572 -0
- data/vendor/brotli/enc/fast_log.h +7 -40
- data/vendor/brotli/enc/find_match_length.h +9 -9
- data/vendor/brotli/enc/hash.h +462 -154
- data/vendor/brotli/enc/histogram.cc +6 -6
- data/vendor/brotli/enc/histogram.h +13 -13
- data/vendor/brotli/enc/literal_cost.cc +45 -45
- data/vendor/brotli/enc/metablock.cc +92 -89
- data/vendor/brotli/enc/metablock.h +12 -12
- data/vendor/brotli/enc/port.h +7 -16
- data/vendor/brotli/enc/prefix.h +23 -22
- data/vendor/brotli/enc/ringbuffer.h +75 -29
- data/vendor/brotli/enc/static_dict.cc +56 -48
- data/vendor/brotli/enc/static_dict.h +5 -5
- data/vendor/brotli/enc/streams.cc +1 -1
- data/vendor/brotli/enc/streams.h +5 -5
- data/vendor/brotli/enc/transform.h +40 -35
- data/vendor/brotli/enc/types.h +2 -0
- data/vendor/brotli/enc/utf8_util.cc +3 -2
- data/vendor/brotli/enc/write_bits.h +6 -6
- metadata +9 -5
- data/vendor/brotli/dec/streams.c +0 -102
- data/vendor/brotli/dec/streams.h +0 -95
data/vendor/brotli/dec/decode.h
CHANGED
@@ -9,135 +9,117 @@
|
|
9
9
|
#ifndef BROTLI_DEC_DECODE_H_
|
10
10
|
#define BROTLI_DEC_DECODE_H_
|
11
11
|
|
12
|
-
#include "./state.h"
|
13
|
-
#include "./streams.h"
|
14
12
|
#include "./types.h"
|
15
13
|
|
16
14
|
#if defined(__cplusplus) || defined(c_plusplus)
|
17
15
|
extern "C" {
|
18
16
|
#endif
|
19
17
|
|
18
|
+
typedef struct BrotliStateStruct BrotliState;
|
19
|
+
|
20
20
|
typedef enum {
|
21
|
-
/* Decoding error, e.g. corrupt input or
|
21
|
+
/* Decoding error, e.g. corrupt input or memory allocation problem */
|
22
22
|
BROTLI_RESULT_ERROR = 0,
|
23
|
-
/*
|
23
|
+
/* Decoding successfully completed */
|
24
24
|
BROTLI_RESULT_SUCCESS = 1,
|
25
|
-
/* Partially done
|
25
|
+
/* Partially done; should be called again with more input */
|
26
26
|
BROTLI_RESULT_NEEDS_MORE_INPUT = 2,
|
27
|
-
/* Partially done
|
27
|
+
/* Partially done; should be called again with more output */
|
28
28
|
BROTLI_RESULT_NEEDS_MORE_OUTPUT = 3
|
29
29
|
} BrotliResult;
|
30
30
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
31
|
+
#define BROTLI_ERROR_CODES_LIST(BROTLI_ERROR_CODE, SEPARATOR) \
|
32
|
+
BROTLI_ERROR_CODE(_, NO_ERROR, 0) SEPARATOR \
|
33
|
+
/* Same as BrotliResult values */ \
|
34
|
+
BROTLI_ERROR_CODE(_, SUCCESS, 1) SEPARATOR \
|
35
|
+
BROTLI_ERROR_CODE(_, NEEDS_MORE_INPUT, 2) SEPARATOR \
|
36
|
+
BROTLI_ERROR_CODE(_, NEEDS_MORE_OUTPUT, 3) SEPARATOR \
|
37
|
+
\
|
38
|
+
/* Errors caused by invalid input */ \
|
39
|
+
BROTLI_ERROR_CODE(_ERROR_FORMAT_, EXUBERANT_NIBBLE, -1) SEPARATOR \
|
40
|
+
BROTLI_ERROR_CODE(_ERROR_FORMAT_, RESERVED, -2) SEPARATOR \
|
41
|
+
BROTLI_ERROR_CODE(_ERROR_FORMAT_, EXUBERANT_META_NIBBLE, -3) SEPARATOR \
|
42
|
+
BROTLI_ERROR_CODE(_ERROR_FORMAT_, SIMPLE_HUFFMAN_ALPHABET, -4) SEPARATOR \
|
43
|
+
BROTLI_ERROR_CODE(_ERROR_FORMAT_, SIMPLE_HUFFMAN_SAME, -5) SEPARATOR \
|
44
|
+
BROTLI_ERROR_CODE(_ERROR_FORMAT_, CL_SPACE, -6) SEPARATOR \
|
45
|
+
BROTLI_ERROR_CODE(_ERROR_FORMAT_, HUFFMAN_SPACE, -7) SEPARATOR \
|
46
|
+
BROTLI_ERROR_CODE(_ERROR_FORMAT_, CONTEXT_MAP_REPEAT, -8) SEPARATOR \
|
47
|
+
BROTLI_ERROR_CODE(_ERROR_FORMAT_, BLOCK_LENGTH_1, -9) SEPARATOR \
|
48
|
+
BROTLI_ERROR_CODE(_ERROR_FORMAT_, BLOCK_LENGTH_2, -10) SEPARATOR \
|
49
|
+
BROTLI_ERROR_CODE(_ERROR_FORMAT_, TRANSFORM, -11) SEPARATOR \
|
50
|
+
BROTLI_ERROR_CODE(_ERROR_FORMAT_, DICTIONARY, -12) SEPARATOR \
|
51
|
+
BROTLI_ERROR_CODE(_ERROR_FORMAT_, WINDOW_BITS, -13) SEPARATOR \
|
52
|
+
BROTLI_ERROR_CODE(_ERROR_FORMAT_, PADDING_1, -14) SEPARATOR \
|
53
|
+
BROTLI_ERROR_CODE(_ERROR_FORMAT_, PADDING_2, -15) SEPARATOR \
|
54
|
+
\
|
55
|
+
/* -16..-20 codes are reserved */ \
|
56
|
+
\
|
57
|
+
/* Memory allocation problems */ \
|
58
|
+
BROTLI_ERROR_CODE(_ERROR_ALLOC_, CONTEXT_MODES, -21) SEPARATOR \
|
59
|
+
/* Literal, insert and distance trees together */ \
|
60
|
+
BROTLI_ERROR_CODE(_ERROR_ALLOC_, TREE_GROUPS, -22) SEPARATOR \
|
61
|
+
/* -23..-24 codes are reserved for distinct tree groups */ \
|
62
|
+
BROTLI_ERROR_CODE(_ERROR_ALLOC_, CONTEXT_MAP, -25) SEPARATOR \
|
63
|
+
BROTLI_ERROR_CODE(_ERROR_ALLOC_, RING_BUFFER_1, -26) SEPARATOR \
|
64
|
+
BROTLI_ERROR_CODE(_ERROR_ALLOC_, RING_BUFFER_2, -27) SEPARATOR \
|
65
|
+
/* -28..-29 codes are reserved for dynamic ringbuffer allocation */ \
|
66
|
+
BROTLI_ERROR_CODE(_ERROR_ALLOC_, BLOCK_TYPE_TREES, -30) SEPARATOR \
|
67
|
+
\
|
68
|
+
/* "Impossible" states */ \
|
69
|
+
BROTLI_ERROR_CODE(_ERROR_, UNREACHABLE, -31)
|
44
70
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
71
|
+
typedef enum {
|
72
|
+
#define _BROTLI_COMMA ,
|
73
|
+
#define _BROTLI_ERROR_CODE_ENUM_ITEM(PREFIX, NAME, CODE) \
|
74
|
+
BROTLI ## PREFIX ## NAME = CODE
|
75
|
+
BROTLI_ERROR_CODES_LIST(_BROTLI_ERROR_CODE_ENUM_ITEM, _BROTLI_COMMA)
|
76
|
+
#undef _BROTLI_ERROR_CODE_ENUM_ITEM
|
77
|
+
#undef _BROTLI_COMMA
|
78
|
+
} BrotliErrorCode;
|
79
|
+
|
80
|
+
#define BROTLI_LAST_ERROR_CODE BROTLI_ERROR_UNREACHABLE
|
81
|
+
|
82
|
+
/* Creates the instance of BrotliState and initializes it. |alloc_func| and
|
83
|
+
|free_func| MUST be both zero or both non-zero. In the case they are both
|
84
|
+
zero, default memory allocators are used. |opaque| is passed to |alloc_func|
|
85
|
+
and |free_func| when they are called. */
|
49
86
|
BrotliState* BrotliCreateState(
|
50
87
|
brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque);
|
51
88
|
|
52
89
|
/* Deinitializes and frees BrotliState instance. */
|
53
90
|
void BrotliDestroyState(BrotliState* state);
|
54
91
|
|
55
|
-
/* Sets
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
92
|
+
/* Sets |*decoded_size| to the decompressed size of the given encoded stream.
|
93
|
+
This function only works if the encoded buffer has a single meta block,
|
94
|
+
or if it has two meta-blocks, where the first is uncompressed and the
|
95
|
+
second is empty.
|
96
|
+
Returns 1 on success, 0 on failure. */
|
60
97
|
int BrotliDecompressedSize(size_t encoded_size,
|
61
98
|
const uint8_t* encoded_buffer,
|
62
99
|
size_t* decoded_size);
|
63
100
|
|
64
|
-
/* Decompresses the data in encoded_buffer into decoded_buffer
|
65
|
-
|
101
|
+
/* Decompresses the data in |encoded_buffer| into |decoded_buffer|, and sets
|
102
|
+
|*decoded_size| to the decompressed length. */
|
66
103
|
BrotliResult BrotliDecompressBuffer(size_t encoded_size,
|
67
104
|
const uint8_t* encoded_buffer,
|
68
105
|
size_t* decoded_size,
|
69
106
|
uint8_t* decoded_buffer);
|
70
107
|
|
71
|
-
/*
|
72
|
-
/* of reading from and writing to pre-allocated memory buffers. */
|
73
|
-
/* DEPRECATED */
|
74
|
-
BrotliResult BrotliDecompress(BrotliInput input, BrotliOutput output);
|
75
|
-
|
76
|
-
/* Same as above, but supports the caller to call the decoder repeatedly with
|
77
|
-
partial data to support streaming. The state must be initialized with
|
78
|
-
BrotliStateInit and reused with every call for the same stream.
|
79
|
-
Return values:
|
80
|
-
0: failure.
|
81
|
-
1: success, and done.
|
82
|
-
2: success so far, end not reached so should call again with more input.
|
83
|
-
The finish parameter is used as follows, for a series of calls with the
|
84
|
-
same state:
|
85
|
-
0: Every call except the last one must be called with finish set to 0. The
|
86
|
-
last call may have finish set to either 0 or 1. Only if finish is 0, can
|
87
|
-
the function return 2. It may also return 0 or 1, in that case no more
|
88
|
-
calls (even with finish 1) may be made.
|
89
|
-
1: Only the last call may have finish set to 1. It's ok to give empty input
|
90
|
-
if all input was already given to previous calls. It is also ok to have
|
91
|
-
only one single call in total, with finish 1, and with all input
|
92
|
-
available immediately. That matches the non-streaming case. If finish is
|
93
|
-
1, the function can only return 0 or 1, never 2. After a finish, no more
|
94
|
-
calls may be done.
|
95
|
-
After everything is done, the state must be cleaned with BrotliStateCleanup
|
96
|
-
to free allocated resources.
|
97
|
-
The given BrotliOutput must always accept all output and make enough space,
|
98
|
-
it returning a smaller value than the amount of bytes to write always results
|
99
|
-
in an error.
|
100
|
-
*/
|
101
|
-
/* DEPRECATED */
|
102
|
-
BrotliResult BrotliDecompressStreaming(BrotliInput input, BrotliOutput output,
|
103
|
-
int finish, BrotliState* s);
|
104
|
-
|
105
|
-
/* Same as above, but with memory buffers.
|
106
|
-
Must be called with an allocated input buffer in *next_in and an allocated
|
107
|
-
output buffer in *next_out. The values *available_in and *available_out
|
108
|
-
must specify the allocated size in *next_in and *next_out respectively.
|
109
|
-
The value *total_out must be 0 initially, and will be summed with the
|
110
|
-
amount of output bytes written after each call, so that at the end it
|
111
|
-
gives the complete decoded size.
|
112
|
-
After each call, *available_in will be decremented by the amount of input
|
113
|
-
bytes consumed, and the *next_in pointer will be incremented by that amount.
|
114
|
-
Similarly, *available_out will be decremented by the amount of output
|
115
|
-
bytes written, and the *next_out pointer will be incremented by that
|
116
|
-
amount.
|
117
|
-
|
118
|
-
The input may be partial. With each next function call, *next_in and
|
119
|
-
*available_in must be updated to point to a next part of the compressed
|
120
|
-
input. The current implementation will always consume all input unless
|
121
|
-
an error occurs, so normally *available_in will always be 0 after
|
122
|
-
calling this function and the next adjacent part of input is desired.
|
123
|
-
|
124
|
-
In the current implementation, the function requires that there is enough
|
125
|
-
output buffer size to write all currently processed input, so
|
126
|
-
*available_out must be large enough. Since the function updates *next_out
|
127
|
-
each time, as long as the output buffer is large enough you can keep
|
128
|
-
reusing this variable. It is also possible to update *next_out and
|
129
|
-
*available_out yourself before a next call, e.g. to point to a new larger
|
130
|
-
buffer.
|
131
|
-
*/
|
132
|
-
/* DEPRECATED */
|
133
|
-
BrotliResult BrotliDecompressBufferStreaming(size_t* available_in,
|
134
|
-
const uint8_t** next_in,
|
135
|
-
int finish,
|
136
|
-
size_t* available_out,
|
137
|
-
uint8_t** next_out,
|
138
|
-
size_t* total_out,
|
139
|
-
BrotliState* s);
|
108
|
+
/* Decompresses the data. Supports partial input and output.
|
140
109
|
|
110
|
+
Must be called with an allocated input buffer in |*next_in| and an allocated
|
111
|
+
output buffer in |*next_out|. The values |*available_in| and |*available_out|
|
112
|
+
must specify the allocated size in |*next_in| and |*next_out| respectively.
|
113
|
+
|
114
|
+
After each call, |*available_in| will be decremented by the amount of input
|
115
|
+
bytes consumed, and the |*next_in| pointer will be incremented by that
|
116
|
+
amount. Similarly, |*available_out| will be decremented by the amount of
|
117
|
+
output bytes written, and the |*next_out| pointer will be incremented by that
|
118
|
+
amount. |total_out|, if it is not a null-pointer, will be set to the number
|
119
|
+
of bytes decompressed since the last state initialization.
|
120
|
+
|
121
|
+
Input is never overconsumed, so |next_in| and |available_in| could be passed
|
122
|
+
to the next consumer after decoding is complete. */
|
141
123
|
BrotliResult BrotliDecompressStream(size_t* available_in,
|
142
124
|
const uint8_t** next_in,
|
143
125
|
size_t* available_out,
|
@@ -148,16 +130,30 @@ BrotliResult BrotliDecompressStream(size_t* available_in,
|
|
148
130
|
/* Fills the new state with a dictionary for LZ77, warming up the ringbuffer,
|
149
131
|
e.g. for custom static dictionaries for data formats.
|
150
132
|
Not to be confused with the built-in transformable dictionary of Brotli.
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
133
|
+
|size| should be less or equal to 2^24 (16MiB), otherwise the dictionary will
|
134
|
+
be ignored. The dictionary must exist in memory until decoding is done and
|
135
|
+
is owned by the caller. To use:
|
136
|
+
1) Allocate and initialize state with BrotliCreateState
|
137
|
+
2) Use BrotliSetCustomDictionary
|
138
|
+
3) Use BrotliDecompressStream
|
139
|
+
4) Clean up and free state with BrotliDestroyState
|
157
140
|
*/
|
158
141
|
void BrotliSetCustomDictionary(
|
159
142
|
size_t size, const uint8_t* dict, BrotliState* s);
|
160
143
|
|
144
|
+
/* Returns 1, if s is in a state where we have not read any input bytes yet,
|
145
|
+
and 0 otherwise */
|
146
|
+
int BrotliStateIsStreamStart(const BrotliState* s);
|
147
|
+
|
148
|
+
/* Returns 1, if s is in a state where we reached the end of the input and
|
149
|
+
produced all of the output, and 0 otherwise. */
|
150
|
+
int BrotliStateIsStreamEnd(const BrotliState* s);
|
151
|
+
|
152
|
+
/* Returns detailed error code after BrotliDecompressStream returns
|
153
|
+
BROTLI_RESULT_ERROR. */
|
154
|
+
BrotliErrorCode BrotliGetErrorCode(const BrotliState* s);
|
155
|
+
|
156
|
+
const char* BrotliErrorString(BrotliErrorCode c);
|
161
157
|
|
162
158
|
#if defined(__cplusplus) || defined(c_plusplus)
|
163
159
|
} /* extern "C" */
|
@@ -17,23 +17,22 @@ extern "C" {
|
|
17
17
|
|
18
18
|
extern const uint8_t kBrotliDictionary[122784];
|
19
19
|
|
20
|
-
static const
|
21
|
-
|
22
|
-
|
23
|
-
|
20
|
+
static const uint32_t kBrotliDictionaryOffsetsByLength[] = {
|
21
|
+
0, 0, 0, 0, 0, 4096, 9216, 21504, 35840, 44032, 53248, 63488, 74752, 87040,
|
22
|
+
93696, 100864, 104704, 106752, 108928, 113536, 115968, 118528, 119872, 121280,
|
23
|
+
122016
|
24
24
|
};
|
25
25
|
|
26
26
|
static const uint8_t kBrotliDictionarySizeBitsByLength[] = {
|
27
|
-
0,
|
28
|
-
|
29
|
-
7, 6, 6, 5, 5,
|
27
|
+
0, 0, 0, 0, 10, 10, 11, 11, 10, 10, 10, 10, 10,
|
28
|
+
9, 9, 8, 7, 7, 8, 7, 7, 6, 6, 5, 5,
|
30
29
|
};
|
31
30
|
|
32
31
|
static const int kBrotliMinDictionaryWordLength = 4;
|
33
32
|
static const int kBrotliMaxDictionaryWordLength = 24;
|
34
33
|
|
35
34
|
#if defined(__cplusplus) || defined(c_plusplus)
|
36
|
-
}
|
35
|
+
} /* extern "C" */
|
37
36
|
#endif
|
38
37
|
|
39
38
|
#endif /* BROTLI_DEC_DICTIONARY_H_ */
|
data/vendor/brotli/dec/huffman.c
CHANGED
@@ -6,11 +6,12 @@
|
|
6
6
|
|
7
7
|
/* Utilities for building Huffman decoding tables. */
|
8
8
|
|
9
|
-
#include <stdlib.h>
|
10
|
-
#include <stdio.h>
|
11
|
-
#include <string.h>
|
12
9
|
#include "./huffman.h"
|
10
|
+
|
11
|
+
#include <string.h> /* memcpy, memset */
|
12
|
+
|
13
13
|
#include "./port.h"
|
14
|
+
#include "./types.h"
|
14
15
|
|
15
16
|
#if defined(__cplusplus) || defined(c_plusplus)
|
16
17
|
extern "C" {
|
@@ -23,43 +24,43 @@ extern "C" {
|
|
23
24
|
#else
|
24
25
|
#define BROTLI_REVERSE_BITS_BASE 0
|
25
26
|
static uint8_t kReverseBits[1 << BROTLI_REVERSE_BITS_MAX] = {
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
27
|
+
0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,
|
28
|
+
0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
|
29
|
+
0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8,
|
30
|
+
0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
|
31
|
+
0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4,
|
32
|
+
0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
|
33
|
+
0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC,
|
34
|
+
0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
|
35
|
+
0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2,
|
36
|
+
0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
|
37
|
+
0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA,
|
38
|
+
0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
|
39
|
+
0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6,
|
40
|
+
0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
|
41
|
+
0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,
|
42
|
+
0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
|
43
|
+
0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1,
|
44
|
+
0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
|
45
|
+
0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9,
|
46
|
+
0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
|
47
|
+
0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5,
|
48
|
+
0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
|
49
|
+
0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED,
|
50
|
+
0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
|
51
|
+
0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3,
|
52
|
+
0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
|
53
|
+
0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB,
|
54
|
+
0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
|
55
|
+
0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7,
|
56
|
+
0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
|
57
|
+
0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF,
|
58
|
+
0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
|
58
59
|
};
|
59
|
-
#endif
|
60
|
+
#endif /* BROTLI_RBIT */
|
60
61
|
|
61
62
|
#define BROTLI_REVERSE_BITS_LOWEST \
|
62
|
-
|
63
|
+
(1U << (BROTLI_REVERSE_BITS_MAX - 1 + BROTLI_REVERSE_BITS_BASE))
|
63
64
|
|
64
65
|
/* Returns reverse(num >> BROTLI_REVERSE_BITS_BASE, BROTLI_REVERSE_BITS_MAX),
|
65
66
|
where reverse(value, len) is the bit-wise reversal of the len least
|
@@ -98,23 +99,22 @@ static BROTLI_INLINE int NextTableBitSize(const uint16_t* const count,
|
|
98
99
|
return len - root_bits;
|
99
100
|
}
|
100
101
|
|
101
|
-
|
102
102
|
void BrotliBuildCodeLengthsHuffmanTable(HuffmanCode* table,
|
103
103
|
const uint8_t* const code_lengths,
|
104
|
-
uint16_t
|
105
|
-
HuffmanCode code;
|
106
|
-
int symbol;
|
107
|
-
uint32_t key;
|
108
|
-
uint32_t key_step;
|
109
|
-
int step;
|
110
|
-
int table_size;
|
111
|
-
int sorted[18];
|
104
|
+
uint16_t* count) {
|
105
|
+
HuffmanCode code; /* current table entry */
|
106
|
+
int symbol; /* symbol index in original or sorted table */
|
107
|
+
uint32_t key; /* prefix code */
|
108
|
+
uint32_t key_step; /* prefix code addend */
|
109
|
+
int step; /* step size to replicate values in current table */
|
110
|
+
int table_size; /* size of current table */
|
111
|
+
int sorted[18]; /* symbols sorted by code length */
|
112
112
|
/* offsets in sorted table for each length */
|
113
113
|
int offset[BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH + 1];
|
114
114
|
int bits;
|
115
115
|
int bits_count;
|
116
|
-
BROTLI_DCHECK(
|
117
|
-
|
116
|
+
BROTLI_DCHECK(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH <=
|
117
|
+
BROTLI_REVERSE_BITS_MAX);
|
118
118
|
|
119
119
|
/* generate offsets into sorted symbol table by code length */
|
120
120
|
symbol = -1;
|
@@ -169,26 +169,26 @@ void BrotliBuildCodeLengthsHuffmanTable(HuffmanCode* table,
|
|
169
169
|
uint32_t BrotliBuildHuffmanTable(HuffmanCode* root_table,
|
170
170
|
int root_bits,
|
171
171
|
const uint16_t* const symbol_lists,
|
172
|
-
uint16_t
|
173
|
-
HuffmanCode code;
|
174
|
-
HuffmanCode* table;
|
175
|
-
int len;
|
176
|
-
int symbol;
|
177
|
-
uint32_t key;
|
178
|
-
uint32_t key_step;
|
179
|
-
uint32_t sub_key;
|
180
|
-
uint32_t sub_key_step
|
181
|
-
int step;
|
182
|
-
int table_bits;
|
183
|
-
int table_size;
|
184
|
-
int total_size;
|
172
|
+
uint16_t* count) {
|
173
|
+
HuffmanCode code; /* current table entry */
|
174
|
+
HuffmanCode* table; /* next available space in table */
|
175
|
+
int len; /* current code length */
|
176
|
+
int symbol; /* symbol index in original or sorted table */
|
177
|
+
uint32_t key; /* prefix code */
|
178
|
+
uint32_t key_step; /* prefix code addend */
|
179
|
+
uint32_t sub_key; /* 2nd level table prefix code */
|
180
|
+
uint32_t sub_key_step; /* 2nd level table prefix code addend */
|
181
|
+
int step; /* step size to replicate values in current table */
|
182
|
+
int table_bits; /* key length of current table */
|
183
|
+
int table_size; /* size of current table */
|
184
|
+
int total_size; /* sum of root table size and 2nd level table sizes */
|
185
185
|
int max_length = -1;
|
186
186
|
int bits;
|
187
187
|
int bits_count;
|
188
188
|
|
189
189
|
BROTLI_DCHECK(root_bits <= BROTLI_REVERSE_BITS_MAX);
|
190
|
-
BROTLI_DCHECK(
|
191
|
-
|
190
|
+
BROTLI_DCHECK(BROTLI_HUFFMAN_MAX_CODE_LENGTH - root_bits <=
|
191
|
+
BROTLI_REVERSE_BITS_MAX);
|
192
192
|
|
193
193
|
while (symbol_lists[max_length] == 0xFFFF) max_length--;
|
194
194
|
max_length += BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1;
|
@@ -237,7 +237,7 @@ uint32_t BrotliBuildHuffmanTable(HuffmanCode* root_table,
|
|
237
237
|
for (len = root_bits + 1, step = 2; len <= max_length; ++len) {
|
238
238
|
symbol = len - (BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1);
|
239
239
|
for (; count[len] != 0; --count[len]) {
|
240
|
-
if (sub_key == (
|
240
|
+
if (sub_key == (BROTLI_REVERSE_BITS_LOWEST << 1U)) {
|
241
241
|
table += table_size;
|
242
242
|
table_bits = NextTableBitSize(count, len, root_bits);
|
243
243
|
table_size = 1 << table_bits;
|
@@ -245,8 +245,8 @@ uint32_t BrotliBuildHuffmanTable(HuffmanCode* root_table,
|
|
245
245
|
sub_key = BrotliReverseBits(key);
|
246
246
|
key += key_step;
|
247
247
|
root_table[sub_key].bits = (uint8_t)(table_bits + root_bits);
|
248
|
-
root_table[sub_key].value =
|
249
|
-
((size_t)(table - root_table)) - sub_key);
|
248
|
+
root_table[sub_key].value =
|
249
|
+
(uint16_t)(((size_t)(table - root_table)) - sub_key);
|
250
250
|
sub_key = 0;
|
251
251
|
}
|
252
252
|
code.bits = (uint8_t)(len - root_bits);
|
@@ -264,7 +264,7 @@ uint32_t BrotliBuildHuffmanTable(HuffmanCode* root_table,
|
|
264
264
|
|
265
265
|
uint32_t BrotliBuildSimpleHuffmanTable(HuffmanCode* table,
|
266
266
|
int root_bits,
|
267
|
-
uint16_t
|
267
|
+
uint16_t* val,
|
268
268
|
uint32_t num_symbols) {
|
269
269
|
uint32_t table_size = 1;
|
270
270
|
const uint32_t goal_size = 1U << root_bits;
|
@@ -301,49 +301,47 @@ uint32_t BrotliBuildSimpleHuffmanTable(HuffmanCode* table,
|
|
301
301
|
table[3].bits = 2;
|
302
302
|
table_size = 4;
|
303
303
|
break;
|
304
|
-
case 3:
|
305
|
-
|
306
|
-
|
307
|
-
for (
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
val[i] = t;
|
313
|
-
}
|
304
|
+
case 3: {
|
305
|
+
int i, k;
|
306
|
+
for (i = 0; i < 3; ++i) {
|
307
|
+
for (k = i + 1; k < 4; ++k) {
|
308
|
+
if (val[k] < val[i]) {
|
309
|
+
uint16_t t = val[k];
|
310
|
+
val[k] = val[i];
|
311
|
+
val[i] = t;
|
314
312
|
}
|
315
313
|
}
|
316
|
-
for (i = 0; i < 4; ++i) {
|
317
|
-
table[i].bits = 2;
|
318
|
-
}
|
319
|
-
table[0].value = val[0];
|
320
|
-
table[2].value = val[1];
|
321
|
-
table[1].value = val[2];
|
322
|
-
table[3].value = val[3];
|
323
|
-
table_size = 4;
|
324
314
|
}
|
315
|
+
for (i = 0; i < 4; ++i) {
|
316
|
+
table[i].bits = 2;
|
317
|
+
}
|
318
|
+
table[0].value = val[0];
|
319
|
+
table[2].value = val[1];
|
320
|
+
table[1].value = val[2];
|
321
|
+
table[3].value = val[3];
|
322
|
+
table_size = 4;
|
325
323
|
break;
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
}
|
334
|
-
for (i = 0; i < 7; ++i) {
|
335
|
-
table[i].value = val[0];
|
336
|
-
table[i].bits = (uint8_t)(1 + (i & 1));
|
337
|
-
}
|
338
|
-
table[1].value = val[1];
|
339
|
-
table[3].value = val[2];
|
340
|
-
table[5].value = val[1];
|
341
|
-
table[7].value = val[3];
|
342
|
-
table[3].bits = 3;
|
343
|
-
table[7].bits = 3;
|
344
|
-
table_size = 8;
|
324
|
+
}
|
325
|
+
case 4: {
|
326
|
+
int i;
|
327
|
+
if (val[3] < val[2]) {
|
328
|
+
uint16_t t = val[3];
|
329
|
+
val[3] = val[2];
|
330
|
+
val[2] = t;
|
345
331
|
}
|
332
|
+
for (i = 0; i < 7; ++i) {
|
333
|
+
table[i].value = val[0];
|
334
|
+
table[i].bits = (uint8_t)(1 + (i & 1));
|
335
|
+
}
|
336
|
+
table[1].value = val[1];
|
337
|
+
table[3].value = val[2];
|
338
|
+
table[5].value = val[1];
|
339
|
+
table[7].value = val[3];
|
340
|
+
table[3].bits = 3;
|
341
|
+
table[7].bits = 3;
|
342
|
+
table_size = 8;
|
346
343
|
break;
|
344
|
+
}
|
347
345
|
}
|
348
346
|
while (table_size != goal_size) {
|
349
347
|
memcpy(&table[table_size], &table[0],
|
@@ -354,5 +352,5 @@ uint32_t BrotliBuildSimpleHuffmanTable(HuffmanCode* table,
|
|
354
352
|
}
|
355
353
|
|
356
354
|
#if defined(__cplusplus) || defined(c_plusplus)
|
357
|
-
}
|
355
|
+
} /* extern "C" */
|
358
356
|
#endif
|
data/vendor/brotli/dec/huffman.h
CHANGED
@@ -10,6 +10,7 @@
|
|
10
10
|
#define BROTLI_DEC_HUFFMAN_H_
|
11
11
|
|
12
12
|
#include "./types.h"
|
13
|
+
#include "./port.h"
|
13
14
|
|
14
15
|
#if defined(__cplusplus) || defined(c_plusplus)
|
15
16
|
extern "C" {
|
@@ -20,38 +21,37 @@ extern "C" {
|
|
20
21
|
/* For current format this constant equals to kNumInsertAndCopyCodes */
|
21
22
|
#define BROTLI_HUFFMAN_MAX_CODE_LENGTHS_SIZE 704
|
22
23
|
|
23
|
-
/* Maximum possible Huffman table size for an alphabet size of
|
24
|
-
* length 15 and root table bits 8. */
|
25
|
-
|
24
|
+
/* Maximum possible Huffman table size for an alphabet size of (index * 32),
|
25
|
+
* max code length 15 and root table bits 8. */
|
26
|
+
static const uint16_t kMaxHuffmanTableSize[] = {
|
27
|
+
256, 402, 436, 468, 500, 534, 566, 598, 630, 662, 694, 726, 758, 790, 822,
|
28
|
+
854, 886, 920, 952, 984, 1016, 1048, 1080};
|
29
|
+
#define BROTLI_HUFFMAN_MAX_SIZE_26 396
|
30
|
+
#define BROTLI_HUFFMAN_MAX_SIZE_258 632
|
31
|
+
#define BROTLI_HUFFMAN_MAX_SIZE_272 646
|
26
32
|
|
27
33
|
#define BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH 5
|
28
34
|
|
29
35
|
typedef struct {
|
30
|
-
uint8_t bits;
|
31
|
-
uint16_t value;
|
36
|
+
uint8_t bits; /* number of bits used for this symbol */
|
37
|
+
uint16_t value; /* symbol value or table offset */
|
32
38
|
} HuffmanCode;
|
33
39
|
|
34
|
-
|
35
40
|
/* Builds Huffman lookup table assuming code lengths are in symbol order. */
|
36
|
-
void BrotliBuildCodeLengthsHuffmanTable(HuffmanCode* root_table,
|
37
|
-
|
38
|
-
uint16_t *count);
|
41
|
+
BROTLI_INTERNAL void BrotliBuildCodeLengthsHuffmanTable(HuffmanCode* root_table,
|
42
|
+
const uint8_t* const code_lengths, uint16_t* count);
|
39
43
|
|
40
44
|
/* Builds Huffman lookup table assuming code lengths are in symbol order. */
|
41
45
|
/* Returns size of resulting table. */
|
42
|
-
uint32_t BrotliBuildHuffmanTable(HuffmanCode* root_table,
|
43
|
-
|
44
|
-
const uint16_t* const symbol_lists,
|
45
|
-
uint16_t *count_arg);
|
46
|
+
BROTLI_INTERNAL uint32_t BrotliBuildHuffmanTable(HuffmanCode* root_table,
|
47
|
+
int root_bits, const uint16_t* const symbol_lists, uint16_t* count_arg);
|
46
48
|
|
47
49
|
/* Builds a simple Huffman table. The num_symbols parameter is to be */
|
48
50
|
/* interpreted as follows: 0 means 1 symbol, 1 means 2 symbols, 2 means 3 */
|
49
51
|
/* symbols, 3 means 4 symbols with lengths 2,2,2,2, 4 means 4 symbols with */
|
50
52
|
/* lengths 1,2,3,3. */
|
51
|
-
uint32_t BrotliBuildSimpleHuffmanTable(HuffmanCode* table,
|
52
|
-
|
53
|
-
uint16_t *symbols,
|
54
|
-
uint32_t num_symbols);
|
53
|
+
BROTLI_INTERNAL uint32_t BrotliBuildSimpleHuffmanTable(HuffmanCode* table,
|
54
|
+
int root_bits, uint16_t* symbols, uint32_t num_symbols);
|
55
55
|
|
56
56
|
/* Contains a collection of Huffman trees with the same alphabet size. */
|
57
57
|
typedef struct {
|
@@ -62,7 +62,7 @@ typedef struct {
|
|
62
62
|
} HuffmanTreeGroup;
|
63
63
|
|
64
64
|
#if defined(__cplusplus) || defined(c_plusplus)
|
65
|
-
}
|
65
|
+
} /* extern "C" */
|
66
66
|
#endif
|
67
67
|
|
68
68
|
#endif /* BROTLI_DEC_HUFFMAN_H_ */
|