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/enc/encode.h
CHANGED
@@ -26,7 +26,7 @@ static const int kMinInputBlockBits = 16;
|
|
26
26
|
static const int kMaxInputBlockBits = 24;
|
27
27
|
|
28
28
|
struct BrotliParams {
|
29
|
-
BrotliParams()
|
29
|
+
BrotliParams(void)
|
30
30
|
: mode(MODE_GENERIC),
|
31
31
|
quality(11),
|
32
32
|
lgwin(22),
|
@@ -68,10 +68,10 @@ struct BrotliParams {
|
|
68
68
|
class BrotliCompressor {
|
69
69
|
public:
|
70
70
|
explicit BrotliCompressor(BrotliParams params);
|
71
|
-
~BrotliCompressor();
|
71
|
+
~BrotliCompressor(void);
|
72
72
|
|
73
73
|
// The maximum input size that can be processed at once.
|
74
|
-
size_t input_block_size() const { return size_t(1) << params_.lgblock; }
|
74
|
+
size_t input_block_size(void) const { return size_t(1) << params_.lgblock; }
|
75
75
|
|
76
76
|
// Encodes the data in input_buffer as a meta-block and writes it to
|
77
77
|
// encoded_buffer (*encoded_size should be set to the size of
|
@@ -115,9 +115,9 @@ class BrotliCompressor {
|
|
115
115
|
// the new output meta-block, or to zero if no new output meta-block was
|
116
116
|
// created (in this case the processed input data is buffered internally).
|
117
117
|
// If *out_size is positive, *output points to the start of the output data.
|
118
|
-
// Returns false if the size of the input data is larger than
|
119
|
-
// input_block_size() or if there was an error during writing the output.
|
120
118
|
// If is_last or force_flush is true, an output meta-block is always created.
|
119
|
+
// Returns false if the size of the input data is larger than
|
120
|
+
// input_block_size().
|
121
121
|
bool WriteBrotliData(const bool is_last, const bool force_flush,
|
122
122
|
size_t* out_size, uint8_t** output);
|
123
123
|
|
@@ -129,28 +129,29 @@ class BrotliCompressor {
|
|
129
129
|
void BrotliSetCustomDictionary(size_t size, const uint8_t* dict);
|
130
130
|
|
131
131
|
// No-op, but we keep it here for API backward-compatibility.
|
132
|
-
void WriteStreamHeader() {}
|
132
|
+
void WriteStreamHeader(void) {}
|
133
133
|
|
134
134
|
private:
|
135
135
|
uint8_t* GetBrotliStorage(size_t size);
|
136
136
|
|
137
|
-
|
138
|
-
|
139
|
-
|
137
|
+
// Allocates and clears a hash table using memory in "*this",
|
138
|
+
// stores the number of buckets in "*table_size" and returns a pointer to
|
139
|
+
// the base of the hash table.
|
140
|
+
int* GetHashTable(int quality,
|
141
|
+
size_t input_size, size_t* table_size);
|
140
142
|
|
141
143
|
BrotliParams params_;
|
142
|
-
int max_backward_distance_;
|
143
144
|
Hashers* hashers_;
|
144
145
|
int hash_type_;
|
145
|
-
|
146
|
+
uint64_t input_pos_;
|
146
147
|
RingBuffer* ringbuffer_;
|
147
148
|
size_t cmd_alloc_size_;
|
148
149
|
Command* commands_;
|
149
150
|
size_t num_commands_;
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
151
|
+
size_t num_literals_;
|
152
|
+
size_t last_insert_len_;
|
153
|
+
uint64_t last_flush_pos_;
|
154
|
+
uint64_t last_processed_pos_;
|
154
155
|
int dist_cache_[4];
|
155
156
|
int saved_dist_cache_[4];
|
156
157
|
uint8_t last_byte_;
|
@@ -159,6 +160,28 @@ class BrotliCompressor {
|
|
159
160
|
uint8_t prev_byte2_;
|
160
161
|
size_t storage_size_;
|
161
162
|
uint8_t* storage_;
|
163
|
+
// Hash table for quality 0 mode.
|
164
|
+
int small_table_[1 << 10]; // 2KB
|
165
|
+
int* large_table_; // Allocated only when needed
|
166
|
+
// Command and distance prefix codes (each 64 symbols, stored back-to-back)
|
167
|
+
// used for the next block in quality 0. The command prefix code is over a
|
168
|
+
// smaller alphabet with the following 64 symbols:
|
169
|
+
// 0 - 15: insert length code 0, copy length code 0 - 15, same distance
|
170
|
+
// 16 - 39: insert length code 0, copy length code 0 - 23
|
171
|
+
// 40 - 63: insert length code 0 - 23, copy length code 0
|
172
|
+
// Note that symbols 16 and 40 represent the same code in the full alphabet,
|
173
|
+
// but we do not use either of them in quality 0.
|
174
|
+
uint8_t cmd_depths_[128];
|
175
|
+
uint16_t cmd_bits_[128];
|
176
|
+
// The compressed form of the command and distance prefix codes for the next
|
177
|
+
// block in quality 0.
|
178
|
+
uint8_t cmd_code_[512];
|
179
|
+
size_t cmd_code_numbits_;
|
180
|
+
// Command and literal buffers for quality 1.
|
181
|
+
uint32_t* command_buf_;
|
182
|
+
uint8_t* literal_buf_;
|
183
|
+
|
184
|
+
int is_last_block_emitted_;
|
162
185
|
};
|
163
186
|
|
164
187
|
// Compresses the data in input_buffer into encoded_buffer, and sets
|
@@ -32,15 +32,15 @@ namespace brotli {
|
|
32
32
|
namespace {
|
33
33
|
|
34
34
|
void RecomputeDistancePrefixes(Command* cmds, size_t num_commands,
|
35
|
-
|
36
|
-
|
35
|
+
uint32_t num_direct_distance_codes,
|
36
|
+
uint32_t distance_postfix_bits) {
|
37
37
|
if (num_direct_distance_codes == 0 &&
|
38
38
|
distance_postfix_bits == 0) {
|
39
39
|
return;
|
40
40
|
}
|
41
41
|
for (size_t i = 0; i < num_commands; ++i) {
|
42
42
|
Command* cmd = &cmds[i];
|
43
|
-
if (cmd->
|
43
|
+
if (cmd->copy_len() && cmd->cmd_prefix_ >= 128) {
|
44
44
|
PrefixEncodeCopyDistance(cmd->DistanceCode(),
|
45
45
|
num_direct_distance_codes,
|
46
46
|
distance_postfix_bits,
|
@@ -51,21 +51,20 @@ void RecomputeDistancePrefixes(Command* cmds, size_t num_commands,
|
|
51
51
|
}
|
52
52
|
|
53
53
|
bool WriteMetaBlockParallel(const BrotliParams& params,
|
54
|
-
const
|
54
|
+
const uint32_t input_size,
|
55
55
|
const uint8_t* input_buffer,
|
56
|
-
const
|
56
|
+
const uint32_t prefix_size,
|
57
57
|
const uint8_t* prefix_buffer,
|
58
58
|
const bool is_first,
|
59
59
|
const bool is_last,
|
60
60
|
size_t* encoded_size,
|
61
61
|
uint8_t* encoded_buffer) {
|
62
|
-
if (
|
62
|
+
if (input_size == 0) {
|
63
63
|
return false;
|
64
64
|
}
|
65
|
-
const size_t input_size = block_size;
|
66
65
|
|
67
66
|
// Copy prefix + next input block into a continuous area.
|
68
|
-
|
67
|
+
uint32_t input_pos = prefix_size;
|
69
68
|
// CreateBackwardReferences reads up to 3 bytes past the end of input if the
|
70
69
|
// mask points past the end of input.
|
71
70
|
// FindMatchLengthWithLimit could do another 8 bytes look-forward.
|
@@ -75,7 +74,7 @@ bool WriteMetaBlockParallel(const BrotliParams& params,
|
|
75
74
|
// Since we don't have a ringbuffer, masking is a no-op.
|
76
75
|
// We use one less bit than the full range because some of the code uses
|
77
76
|
// mask + 1 as the size of the ringbuffer.
|
78
|
-
const
|
77
|
+
const uint32_t mask = std::numeric_limits<uint32_t>::max() >> 1;
|
79
78
|
|
80
79
|
uint8_t prev_byte = input_pos > 0 ? input[(input_pos - 1) & mask] : 0;
|
81
80
|
uint8_t prev_byte2 = input_pos > 1 ? input[(input_pos - 2) & mask] : 0;
|
@@ -86,15 +85,14 @@ bool WriteMetaBlockParallel(const BrotliParams& params,
|
|
86
85
|
kMinUTF8Ratio);
|
87
86
|
|
88
87
|
// Initialize hashers.
|
89
|
-
int hash_type = std::min(
|
88
|
+
int hash_type = std::min(10, params.quality);
|
90
89
|
Hashers* hashers = new Hashers();
|
91
90
|
hashers->Init(hash_type);
|
92
91
|
|
93
92
|
// Compute backward references.
|
94
|
-
|
93
|
+
size_t last_insert_len = 0;
|
95
94
|
size_t num_commands = 0;
|
96
|
-
|
97
|
-
int max_backward_distance = (1 << params.lgwin) - 16;
|
95
|
+
size_t num_literals = 0;
|
98
96
|
int dist_cache[4] = { -4, -4, -4, -4 };
|
99
97
|
Command* commands = static_cast<Command*>(
|
100
98
|
malloc(sizeof(Command) * ((input_size + 1) >> 1)));
|
@@ -103,10 +101,10 @@ bool WriteMetaBlockParallel(const BrotliParams& params,
|
|
103
101
|
return false;
|
104
102
|
}
|
105
103
|
CreateBackwardReferences(
|
106
|
-
input_size, input_pos,
|
104
|
+
input_size, input_pos, is_last,
|
107
105
|
&input[0], mask,
|
108
|
-
max_backward_distance,
|
109
106
|
params.quality,
|
107
|
+
params.lgwin,
|
110
108
|
hashers,
|
111
109
|
hash_type,
|
112
110
|
dist_cache,
|
@@ -123,10 +121,11 @@ bool WriteMetaBlockParallel(const BrotliParams& params,
|
|
123
121
|
|
124
122
|
// Build the meta-block.
|
125
123
|
MetaBlockSplit mb;
|
126
|
-
|
124
|
+
uint32_t num_direct_distance_codes =
|
127
125
|
params.mode == BrotliParams::MODE_FONT ? 12 : 0;
|
128
|
-
|
129
|
-
|
126
|
+
uint32_t distance_postfix_bits =
|
127
|
+
params.mode == BrotliParams::MODE_FONT ? 1 : 0;
|
128
|
+
ContextType literal_context_mode = utf8_mode ? CONTEXT_UTF8 : CONTEXT_SIGNED;
|
130
129
|
RecomputeDistancePrefixes(commands, num_commands,
|
131
130
|
num_direct_distance_codes,
|
132
131
|
distance_postfix_bits);
|
@@ -145,8 +144,8 @@ bool WriteMetaBlockParallel(const BrotliParams& params,
|
|
145
144
|
// Set up the temporary output storage.
|
146
145
|
const size_t max_out_size = 2 * input_size + 500;
|
147
146
|
std::vector<uint8_t> storage(max_out_size);
|
148
|
-
|
149
|
-
|
147
|
+
uint8_t first_byte = 0;
|
148
|
+
size_t first_byte_bits = 0;
|
150
149
|
if (is_first) {
|
151
150
|
if (params.lgwin == 16) {
|
152
151
|
first_byte = 0;
|
@@ -155,26 +154,23 @@ bool WriteMetaBlockParallel(const BrotliParams& params,
|
|
155
154
|
first_byte = 1;
|
156
155
|
first_byte_bits = 7;
|
157
156
|
} else {
|
158
|
-
first_byte = ((params.lgwin - 17) << 1) | 1;
|
157
|
+
first_byte = static_cast<uint8_t>(((params.lgwin - 17) << 1) | 1);
|
159
158
|
first_byte_bits = 4;
|
160
159
|
}
|
161
160
|
}
|
162
161
|
storage[0] = static_cast<uint8_t>(first_byte);
|
163
|
-
|
162
|
+
size_t storage_ix = first_byte_bits;
|
164
163
|
|
165
164
|
// Store the meta-block to the temporary output.
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
free(commands);
|
176
|
-
return false;
|
177
|
-
}
|
165
|
+
StoreMetaBlock(&input[0], input_pos, input_size, mask,
|
166
|
+
prev_byte, prev_byte2,
|
167
|
+
is_last,
|
168
|
+
num_direct_distance_codes,
|
169
|
+
distance_postfix_bits,
|
170
|
+
literal_context_mode,
|
171
|
+
commands, num_commands,
|
172
|
+
mb,
|
173
|
+
&storage_ix, &storage[0]);
|
178
174
|
free(commands);
|
179
175
|
|
180
176
|
// If this is not the last meta-block, store an empty metadata
|
@@ -189,11 +185,9 @@ bool WriteMetaBlockParallel(const BrotliParams& params,
|
|
189
185
|
if (input_size + 4 < output_size) {
|
190
186
|
storage[0] = static_cast<uint8_t>(first_byte);
|
191
187
|
storage_ix = first_byte_bits;
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
return false;
|
196
|
-
}
|
188
|
+
StoreUncompressedMetaBlock(is_last, &input[0], input_pos, mask,
|
189
|
+
input_size,
|
190
|
+
&storage_ix, &storage[0]);
|
197
191
|
output_size = storage_ix >> 3;
|
198
192
|
}
|
199
193
|
|
@@ -239,19 +233,23 @@ int BrotliCompressBufferParallel(BrotliParams params,
|
|
239
233
|
params.lgblock = kMaxInputBlockBits;
|
240
234
|
}
|
241
235
|
size_t max_input_block_size = 1 << params.lgblock;
|
236
|
+
size_t max_prefix_size = 1u << params.lgwin;
|
242
237
|
|
243
238
|
std::vector<std::vector<uint8_t> > compressed_pieces;
|
244
239
|
|
245
240
|
// Compress block-by-block independently.
|
246
241
|
for (size_t pos = 0; pos < input_size; ) {
|
247
|
-
|
242
|
+
uint32_t input_block_size =
|
243
|
+
static_cast<uint32_t>(std::min(max_input_block_size, input_size - pos));
|
244
|
+
uint32_t prefix_size =
|
245
|
+
static_cast<uint32_t>(std::min(max_prefix_size, pos));
|
248
246
|
size_t out_size = input_block_size + (input_block_size >> 3) + 1024;
|
249
247
|
std::vector<uint8_t> out(out_size);
|
250
248
|
if (!WriteMetaBlockParallel(params,
|
251
249
|
input_block_size,
|
252
250
|
&input_buffer[pos],
|
253
|
-
|
254
|
-
input_buffer,
|
251
|
+
prefix_size,
|
252
|
+
&input_buffer[pos - prefix_size],
|
255
253
|
pos == 0,
|
256
254
|
pos + input_block_size == input_size,
|
257
255
|
&out_size,
|