brotli 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- 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_ */
|