brotli 0.1.8 → 0.2.0
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/.gitignore +1 -0
- data/.travis.yml +7 -3
- data/brotli.gemspec +1 -1
- data/ext/brotli/brotli.c +4 -4
- data/ext/brotli/brotli.h +2 -2
- data/ext/brotli/extconf.rb +9 -16
- data/lib/brotli/version.rb +1 -1
- data/vendor/brotli/{common → c/common}/constants.h +11 -1
- data/vendor/brotli/c/common/dictionary.bin +432 -0
- data/vendor/brotli/c/common/dictionary.c +5905 -0
- data/vendor/brotli/c/common/dictionary.h +64 -0
- data/vendor/brotli/c/common/version.h +19 -0
- data/vendor/brotli/{dec → c/dec}/bit_reader.c +2 -2
- data/vendor/brotli/{dec → c/dec}/bit_reader.h +11 -34
- data/vendor/brotli/{dec → c/dec}/context.h +1 -1
- data/vendor/brotli/{dec → c/dec}/decode.c +389 -356
- data/vendor/brotli/{dec → c/dec}/huffman.c +24 -23
- data/vendor/brotli/{dec → c/dec}/huffman.h +1 -1
- data/vendor/brotli/{dec → c/dec}/port.h +19 -10
- data/vendor/brotli/{dec → c/dec}/prefix.h +1 -1
- data/vendor/brotli/{dec → c/dec}/state.c +23 -19
- data/vendor/brotli/{dec → c/dec}/state.h +18 -17
- data/vendor/brotli/{dec → c/dec}/transform.h +2 -2
- data/vendor/brotli/c/enc/backward_references.c +134 -0
- data/vendor/brotli/c/enc/backward_references.h +39 -0
- data/vendor/brotli/{enc/backward_references.c → c/enc/backward_references_hq.c} +144 -232
- data/vendor/brotli/{enc/backward_references.h → c/enc/backward_references_hq.h} +28 -31
- data/vendor/brotli/{enc → c/enc}/backward_references_inc.h +37 -31
- data/vendor/brotli/{enc → c/enc}/bit_cost.c +1 -1
- data/vendor/brotli/{enc → c/enc}/bit_cost.h +1 -1
- data/vendor/brotli/{enc → c/enc}/bit_cost_inc.h +0 -0
- data/vendor/brotli/{enc → c/enc}/block_encoder_inc.h +0 -0
- data/vendor/brotli/{enc → c/enc}/block_splitter.c +2 -4
- data/vendor/brotli/{enc → c/enc}/block_splitter.h +1 -1
- data/vendor/brotli/{enc → c/enc}/block_splitter_inc.h +6 -7
- data/vendor/brotli/{enc → c/enc}/brotli_bit_stream.c +22 -26
- data/vendor/brotli/{enc → c/enc}/brotli_bit_stream.h +1 -5
- data/vendor/brotli/{enc → c/enc}/cluster.c +1 -1
- data/vendor/brotli/{enc → c/enc}/cluster.h +1 -1
- data/vendor/brotli/{enc → c/enc}/cluster_inc.h +2 -0
- data/vendor/brotli/{enc → c/enc}/command.h +34 -17
- data/vendor/brotli/{enc → c/enc}/compress_fragment.c +97 -53
- data/vendor/brotli/{enc → c/enc}/compress_fragment.h +5 -2
- data/vendor/brotli/{enc → c/enc}/compress_fragment_two_pass.c +106 -51
- data/vendor/brotli/{enc → c/enc}/compress_fragment_two_pass.h +5 -2
- data/vendor/brotli/{enc → c/enc}/context.h +3 -3
- data/vendor/brotli/c/enc/dictionary_hash.c +1120 -0
- data/vendor/brotli/c/enc/dictionary_hash.h +24 -0
- data/vendor/brotli/{enc → c/enc}/encode.c +442 -240
- data/vendor/brotli/{enc → c/enc}/entropy_encode.c +9 -9
- data/vendor/brotli/{enc → c/enc}/entropy_encode.h +4 -4
- data/vendor/brotli/{enc → c/enc}/entropy_encode_static.h +4 -4
- data/vendor/brotli/{enc → c/enc}/fast_log.h +3 -3
- data/vendor/brotli/{enc → c/enc}/find_match_length.h +8 -8
- data/vendor/brotli/c/enc/hash.h +446 -0
- data/vendor/brotli/{enc → c/enc}/hash_forgetful_chain_inc.h +72 -68
- data/vendor/brotli/c/enc/hash_longest_match64_inc.h +266 -0
- data/vendor/brotli/c/enc/hash_longest_match_inc.h +258 -0
- data/vendor/brotli/{enc → c/enc}/hash_longest_match_quickly_inc.h +81 -77
- data/vendor/brotli/c/enc/hash_to_binary_tree_inc.h +326 -0
- data/vendor/brotli/{enc → c/enc}/histogram.c +4 -2
- data/vendor/brotli/{enc → c/enc}/histogram.h +1 -1
- data/vendor/brotli/{enc → c/enc}/histogram_inc.h +0 -0
- data/vendor/brotli/{enc → c/enc}/literal_cost.c +4 -7
- data/vendor/brotli/{enc → c/enc}/literal_cost.h +2 -2
- data/vendor/brotli/{enc → c/enc}/memory.c +1 -1
- data/vendor/brotli/{enc → c/enc}/memory.h +3 -2
- data/vendor/brotli/{enc → c/enc}/metablock.c +136 -123
- data/vendor/brotli/{enc → c/enc}/metablock.h +2 -12
- data/vendor/brotli/{enc → c/enc}/metablock_inc.h +0 -0
- data/vendor/brotli/{enc → c/enc}/port.h +49 -33
- data/vendor/brotli/{enc → c/enc}/prefix.h +4 -2
- data/vendor/brotli/{enc → c/enc}/quality.h +47 -17
- data/vendor/brotli/{enc → c/enc}/ringbuffer.h +6 -6
- data/vendor/brotli/{enc → c/enc}/static_dict.c +26 -22
- data/vendor/brotli/{enc → c/enc}/static_dict.h +3 -1
- data/vendor/brotli/c/enc/static_dict_lut.h +5864 -0
- data/vendor/brotli/{enc → c/enc}/utf8_util.c +1 -1
- data/vendor/brotli/{enc → c/enc}/utf8_util.h +2 -2
- data/vendor/brotli/{enc → c/enc}/write_bits.h +3 -3
- data/vendor/brotli/c/include/brotli/decode.h +339 -0
- data/vendor/brotli/c/include/brotli/encode.h +402 -0
- data/vendor/brotli/c/include/brotli/port.h +146 -0
- data/vendor/brotli/c/include/brotli/types.h +90 -0
- metadata +80 -79
- data/vendor/brotli/common/dictionary.c +0 -9474
- data/vendor/brotli/common/dictionary.h +0 -29
- data/vendor/brotli/common/port.h +0 -107
- data/vendor/brotli/common/types.h +0 -58
- data/vendor/brotli/dec/decode.h +0 -188
- data/vendor/brotli/enc/compressor.cc +0 -139
- data/vendor/brotli/enc/compressor.h +0 -161
- data/vendor/brotli/enc/dictionary_hash.h +0 -4121
- data/vendor/brotli/enc/encode.h +0 -221
- data/vendor/brotli/enc/encode_parallel.cc +0 -289
- data/vendor/brotli/enc/encode_parallel.h +0 -27
- data/vendor/brotli/enc/hash.h +0 -717
- data/vendor/brotli/enc/hash_longest_match_inc.h +0 -241
- data/vendor/brotli/enc/static_dict_lut.h +0 -11241
- data/vendor/brotli/enc/streams.cc +0 -114
- data/vendor/brotli/enc/streams.h +0 -121
data/vendor/brotli/enc/encode.h
DELETED
@@ -1,221 +0,0 @@
|
|
1
|
-
/* Copyright 2013 Google Inc. All Rights Reserved.
|
2
|
-
|
3
|
-
Distributed under MIT license.
|
4
|
-
See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
|
5
|
-
*/
|
6
|
-
|
7
|
-
/* API for Brotli compression. */
|
8
|
-
|
9
|
-
#ifndef BROTLI_ENC_ENCODE_H_
|
10
|
-
#define BROTLI_ENC_ENCODE_H_
|
11
|
-
|
12
|
-
#include "../common/types.h"
|
13
|
-
|
14
|
-
#if defined(__cplusplus) || defined(c_plusplus)
|
15
|
-
extern "C" {
|
16
|
-
#endif
|
17
|
-
|
18
|
-
static const int kBrotliMaxWindowBits = 24;
|
19
|
-
static const int kBrotliMinWindowBits = 10;
|
20
|
-
static const int kBrotliMinInputBlockBits = 16;
|
21
|
-
static const int kBrotliMaxInputBlockBits = 24;
|
22
|
-
|
23
|
-
#define BROTLI_MIN_QUALITY 0
|
24
|
-
#define BROTLI_MAX_QUALITY 11
|
25
|
-
|
26
|
-
typedef enum BrotliEncoderMode {
|
27
|
-
/* Default compression mode. The compressor does not know anything in
|
28
|
-
advance about the properties of the input. */
|
29
|
-
BROTLI_MODE_GENERIC = 0,
|
30
|
-
/* Compression mode for UTF-8 format text input. */
|
31
|
-
BROTLI_MODE_TEXT = 1,
|
32
|
-
/* Compression mode used in WOFF 2.0. */
|
33
|
-
BROTLI_MODE_FONT = 2
|
34
|
-
} BrotliEncoderMode;
|
35
|
-
|
36
|
-
#define BROTLI_DEFAULT_QUALITY 11
|
37
|
-
#define BROTLI_DEFAULT_WINDOW 22
|
38
|
-
#define BROTLI_DEFAULT_MODE BROTLI_MODE_GENERIC
|
39
|
-
|
40
|
-
typedef enum BrotliEncoderOperation {
|
41
|
-
BROTLI_OPERATION_PROCESS = 0,
|
42
|
-
/* Request output stream to flush. Performed when input stream is depleted
|
43
|
-
and there is enough space in output stream. */
|
44
|
-
BROTLI_OPERATION_FLUSH = 1,
|
45
|
-
/* Request output stream to finish. Performed when input stream is depleted
|
46
|
-
and there is enough space in output stream. */
|
47
|
-
BROTLI_OPERATION_FINISH = 2
|
48
|
-
} BrotliEncoderOperation;
|
49
|
-
|
50
|
-
typedef enum BrotliEncoderParameter {
|
51
|
-
BROTLI_PARAM_MODE = 0,
|
52
|
-
/* Controls the compression-speed vs compression-density tradeoffs. The higher
|
53
|
-
the quality, the slower the compression. Range is 0 to 11. */
|
54
|
-
BROTLI_PARAM_QUALITY = 1,
|
55
|
-
/* Base 2 logarithm of the sliding window size. Range is 10 to 24. */
|
56
|
-
BROTLI_PARAM_LGWIN = 2,
|
57
|
-
/* Base 2 logarithm of the maximum input block size. Range is 16 to 24.
|
58
|
-
If set to 0, the value will be set based on the quality. */
|
59
|
-
BROTLI_PARAM_LGBLOCK = 3
|
60
|
-
} BrotliEncoderParameter;
|
61
|
-
|
62
|
-
/* A state can not be reused for multiple brotli streams. */
|
63
|
-
typedef struct BrotliEncoderStateStruct BrotliEncoderState;
|
64
|
-
|
65
|
-
BROTLI_BOOL BrotliEncoderSetParameter(
|
66
|
-
BrotliEncoderState* state, BrotliEncoderParameter p, uint32_t value);
|
67
|
-
|
68
|
-
/* Creates the instance of BrotliEncoderState and initializes it.
|
69
|
-
|alloc_func| and |free_func| MUST be both zero or both non-zero. In the case
|
70
|
-
they are both zero, default memory allocators are used. |opaque| is passed to
|
71
|
-
|alloc_func| and |free_func| when they are called. */
|
72
|
-
BrotliEncoderState* BrotliEncoderCreateInstance(brotli_alloc_func alloc_func,
|
73
|
-
brotli_free_func free_func,
|
74
|
-
void* opaque);
|
75
|
-
|
76
|
-
/* Deinitializes and frees BrotliEncoderState instance. */
|
77
|
-
void BrotliEncoderDestroyInstance(BrotliEncoderState* state);
|
78
|
-
/* The maximum input size that can be processed at once. */
|
79
|
-
size_t BrotliEncoderInputBlockSize(BrotliEncoderState* state);
|
80
|
-
|
81
|
-
/* Encodes the data in |input_buffer| as a meta-block and writes it to
|
82
|
-
|encoded_buffer| (|*encoded_size should| be set to the size of
|
83
|
-
|encoded_buffer|) and sets |*encoded_size| to the number of bytes that
|
84
|
-
was written. The |input_size| must not be greater than input_block_size().
|
85
|
-
Returns false if there was an error and true otherwise. */
|
86
|
-
BROTLI_BOOL BrotliEncoderWriteMetaBlock(
|
87
|
-
BrotliEncoderState* state, const size_t input_size,
|
88
|
-
const uint8_t* input_buffer, const BROTLI_BOOL is_last,
|
89
|
-
size_t* encoded_size, uint8_t* encoded_buffer);
|
90
|
-
|
91
|
-
/* Writes a metadata meta-block containing the given input to encoded_buffer.
|
92
|
-
|*encoded_size| should be set to the size of the encoded_buffer.
|
93
|
-
Sets |*encoded_size| to the number of bytes that was written.
|
94
|
-
Note that the given input data will not be part of the sliding window and
|
95
|
-
thus no backward references can be made to this data from subsequent
|
96
|
-
metablocks. |input_size| must not be greater than 2^24 and provided
|
97
|
-
|*encoded_size| must not be less than |input_size| + 6.
|
98
|
-
Returns false if there was an error and true otherwise. */
|
99
|
-
BROTLI_BOOL BrotliEncoderWriteMetadata(
|
100
|
-
BrotliEncoderState* state, const size_t input_size,
|
101
|
-
const uint8_t* input_buffer, const BROTLI_BOOL is_last,
|
102
|
-
size_t* encoded_size, uint8_t* encoded_buffer);
|
103
|
-
|
104
|
-
/* Writes a zero-length meta-block with end-of-input bit set to the
|
105
|
-
internal output buffer and copies the output buffer to |encoded_buffer|
|
106
|
-
(|*encoded_size| should be set to the size of |encoded_buffer|) and sets
|
107
|
-
|*encoded_size| to the number of bytes written.
|
108
|
-
Returns false if there was an error and true otherwise. */
|
109
|
-
BROTLI_BOOL BrotliEncoderFinishStream(
|
110
|
-
BrotliEncoderState* state, size_t* encoded_size, uint8_t* encoded_buffer);
|
111
|
-
|
112
|
-
/* Copies the given input data to the internal ring buffer of the compressor.
|
113
|
-
No processing of the data occurs at this time and this function can be
|
114
|
-
called multiple times before calling WriteBrotliData() to process the
|
115
|
-
accumulated input. At most input_block_size() bytes of input data can be
|
116
|
-
copied to the ring buffer, otherwise the next WriteBrotliData() will fail.
|
117
|
-
*/
|
118
|
-
void BrotliEncoderCopyInputToRingBuffer(BrotliEncoderState* state,
|
119
|
-
const size_t input_size,
|
120
|
-
const uint8_t* input_buffer);
|
121
|
-
|
122
|
-
/* Processes the accumulated input data and sets |*out_size| to the length of
|
123
|
-
the new output meta-block, or to zero if no new output meta-block has been
|
124
|
-
created (in this case the processed input data is buffered internally).
|
125
|
-
If |*out_size| is positive, |*output| points to the start of the output
|
126
|
-
data. If |is_last| or |force_flush| is 1, an output meta-block is always
|
127
|
-
created. However, until |is_last| is 1 encoder may retain up to 7 bits
|
128
|
-
of the last byte of output. To force encoder to dump the remaining bits
|
129
|
-
use WriteMetadata() to append an empty meta-data block.
|
130
|
-
Returns false if the size of the input data is larger than
|
131
|
-
input_block_size(). */
|
132
|
-
BROTLI_BOOL BrotliEncoderWriteData(
|
133
|
-
BrotliEncoderState* state, const BROTLI_BOOL is_last,
|
134
|
-
const BROTLI_BOOL force_flush, size_t* out_size, uint8_t** output);
|
135
|
-
|
136
|
-
/* Fills the new state with a dictionary for LZ77, warming up the ringbuffer,
|
137
|
-
e.g. for custom static dictionaries for data formats.
|
138
|
-
Not to be confused with the built-in transformable dictionary of Brotli.
|
139
|
-
To decode, use BrotliSetCustomDictionary() of the decoder with the same
|
140
|
-
dictionary. */
|
141
|
-
void BrotliEncoderSetCustomDictionary(BrotliEncoderState* state, size_t size,
|
142
|
-
const uint8_t* dict);
|
143
|
-
|
144
|
-
/* Returns buffer size that is large enough to contain BrotliEncoderCompress
|
145
|
-
output for any input.
|
146
|
-
Returns 0 if result does not fit size_t. */
|
147
|
-
size_t BrotliEncoderMaxCompressedSize(size_t input_size);
|
148
|
-
|
149
|
-
/* Compresses the data in |input_buffer| into |encoded_buffer|, and sets
|
150
|
-
|*encoded_size| to the compressed length.
|
151
|
-
BROTLI_DEFAULT_QUALITY, BROTLI_DEFAULT_WINDOW and BROTLI_DEFAULT_MODE should
|
152
|
-
be used as |quality|, |lgwin| and |mode| if there are no specific
|
153
|
-
requirements to encoder speed and compression ratio.
|
154
|
-
If compression fails, |*encoded_size| is set to 0.
|
155
|
-
If BrotliEncoderMaxCompressedSize(|input_size|) is not zero, then
|
156
|
-
|*encoded_size| is never set to the bigger value.
|
157
|
-
Returns false if there was an error and true otherwise. */
|
158
|
-
BROTLI_BOOL BrotliEncoderCompress(
|
159
|
-
int quality, int lgwin, BrotliEncoderMode mode, size_t input_size,
|
160
|
-
const uint8_t* input_buffer, size_t* encoded_size, uint8_t* encoded_buffer);
|
161
|
-
|
162
|
-
/* Progressively compress input stream and push produced bytes to output stream.
|
163
|
-
Internally workflow consists of 3 tasks:
|
164
|
-
* (optional) copy input data to internal buffer
|
165
|
-
* actually compress data and (optionally) store it to internal buffer
|
166
|
-
* (optional) copy compressed bytes from internal buffer to output stream
|
167
|
-
Whenever all 3 tasks can't move forward anymore, or error occurs, this
|
168
|
-
method returns.
|
169
|
-
|
170
|
-
|available_in| and |next_in| represent input stream; when X bytes of input
|
171
|
-
are consumed, X is subtracted from |available_in| and added to |next_in|.
|
172
|
-
|available_out| and |next_out| represent output stream; when Y bytes are
|
173
|
-
pushed to output, Y is subtracted from |available_out| and added to
|
174
|
-
|next_out|. |total_out|, if it is not a null-pointer, is assigned to the
|
175
|
-
total amount of bytes pushed by the instance of encoder to output.
|
176
|
-
|
177
|
-
|op| is used to perform flush or finish the stream.
|
178
|
-
|
179
|
-
Flushing the stream means forcing encoding of all input passed to encoder and
|
180
|
-
completing the current output block, so it could be fully decoded by stream
|
181
|
-
decoder. To perform flush |op| must be set to BROTLI_OPERATION_FLUSH. Under
|
182
|
-
some circumstances (e.g. lack of output stream capacity) this operation would
|
183
|
-
require several calls to BrotliEncoderCompressStream. The method must be
|
184
|
-
called again until both input stream is depleted and encoder has no more
|
185
|
-
output (see BrotliEncoderHasMoreOutput) after the method is called.
|
186
|
-
|
187
|
-
Finishing the stream means encoding of all input passed to encoder and
|
188
|
-
adding specific "final" marks, so stream decoder could determine that stream
|
189
|
-
is complete. To perform finish |op| must be set to BROTLI_OPERATION_FINISH.
|
190
|
-
Under some circumstances (e.g. lack of output stream capacity) this operation
|
191
|
-
would require several calls to BrotliEncoderCompressStream. The method must
|
192
|
-
be called again until both input stream is depleted and encoder has no more
|
193
|
-
output (see BrotliEncoderHasMoreOutput) after the method is called.
|
194
|
-
|
195
|
-
WARNING: when flushing and finishing, |op| should not change until operation
|
196
|
-
is complete; input stream should not be refilled as well.
|
197
|
-
|
198
|
-
Returns false if there was an error and true otherwise.
|
199
|
-
*/
|
200
|
-
BROTLI_BOOL BrotliEncoderCompressStream(
|
201
|
-
BrotliEncoderState* s, BrotliEncoderOperation op, size_t* available_in,
|
202
|
-
const uint8_t** next_in, size_t* available_out, uint8_t** next_out,
|
203
|
-
size_t* total_out);
|
204
|
-
|
205
|
-
/* Check if encoder is in "finished" state, i.e. no more input is acceptable and
|
206
|
-
no more output will be produced.
|
207
|
-
Works only with BrotliEncoderCompressStream workflow.
|
208
|
-
Returns 1 if stream is finished and 0 otherwise. */
|
209
|
-
BROTLI_BOOL BrotliEncoderIsFinished(BrotliEncoderState* s);
|
210
|
-
|
211
|
-
/* Check if encoder has more output bytes in internal buffer.
|
212
|
-
Works only with BrotliEncoderCompressStream workflow.
|
213
|
-
Returns 1 if has more output (in internal buffer) and 0 otherwise. */
|
214
|
-
BROTLI_BOOL BrotliEncoderHasMoreOutput(BrotliEncoderState* s);
|
215
|
-
|
216
|
-
|
217
|
-
#if defined(__cplusplus) || defined(c_plusplus)
|
218
|
-
} /* extern "C" */
|
219
|
-
#endif
|
220
|
-
|
221
|
-
#endif /* BROTLI_ENC_ENCODE_H_ */
|
@@ -1,289 +0,0 @@
|
|
1
|
-
/* Copyright 2013 Google Inc. All Rights Reserved.
|
2
|
-
|
3
|
-
Distributed under MIT license.
|
4
|
-
See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
|
5
|
-
*/
|
6
|
-
|
7
|
-
/* Implementation of parallel Brotli compressor. */
|
8
|
-
|
9
|
-
#include "./encode_parallel.h"
|
10
|
-
|
11
|
-
#include <vector>
|
12
|
-
|
13
|
-
#include "./backward_references.h"
|
14
|
-
#include "./brotli_bit_stream.h"
|
15
|
-
#include "./context.h"
|
16
|
-
#include "./entropy_encode.h"
|
17
|
-
#include "./fast_log.h"
|
18
|
-
#include "./hash.h"
|
19
|
-
#include "./metablock.h"
|
20
|
-
#include "./port.h"
|
21
|
-
#include "./prefix.h"
|
22
|
-
#include "./quality.h"
|
23
|
-
#include "./utf8_util.h"
|
24
|
-
|
25
|
-
namespace brotli {
|
26
|
-
|
27
|
-
namespace {
|
28
|
-
|
29
|
-
static void RecomputeDistancePrefixes(Command* cmds, size_t num_commands,
|
30
|
-
uint32_t num_direct_distance_codes,
|
31
|
-
uint32_t distance_postfix_bits) {
|
32
|
-
if (num_direct_distance_codes == 0 &&
|
33
|
-
distance_postfix_bits == 0) {
|
34
|
-
return;
|
35
|
-
}
|
36
|
-
for (size_t i = 0; i < num_commands; ++i) {
|
37
|
-
Command* cmd = &cmds[i];
|
38
|
-
if (CommandCopyLen(cmd) && cmd->cmd_prefix_ >= 128) {
|
39
|
-
PrefixEncodeCopyDistance(CommandDistanceCode(cmd),
|
40
|
-
num_direct_distance_codes,
|
41
|
-
distance_postfix_bits,
|
42
|
-
&cmd->dist_prefix_,
|
43
|
-
&cmd->dist_extra_);
|
44
|
-
}
|
45
|
-
}
|
46
|
-
}
|
47
|
-
|
48
|
-
/* Returns 1 on success, otherwise 0. */
|
49
|
-
int WriteMetaBlockParallel(const BrotliEncoderParams* params,
|
50
|
-
const uint32_t input_size,
|
51
|
-
const uint8_t* input_buffer,
|
52
|
-
const uint32_t prefix_size,
|
53
|
-
const uint8_t* prefix_buffer,
|
54
|
-
const int is_first,
|
55
|
-
const int is_last,
|
56
|
-
size_t* encoded_size,
|
57
|
-
uint8_t* encoded_buffer) {
|
58
|
-
if (input_size == 0) {
|
59
|
-
return 0;
|
60
|
-
}
|
61
|
-
|
62
|
-
MemoryManager memory_manager;
|
63
|
-
MemoryManager* m = &memory_manager;
|
64
|
-
BrotliInitMemoryManager(m, 0, 0, 0);
|
65
|
-
|
66
|
-
uint8_t* storage;
|
67
|
-
size_t storage_ix;
|
68
|
-
uint8_t first_byte;
|
69
|
-
size_t first_byte_bits;
|
70
|
-
size_t output_size;
|
71
|
-
uint32_t num_direct_distance_codes;
|
72
|
-
uint32_t distance_postfix_bits;
|
73
|
-
ContextType literal_context_mode;
|
74
|
-
size_t last_insert_len = 0;
|
75
|
-
size_t num_commands = 0;
|
76
|
-
size_t num_literals = 0;
|
77
|
-
int dist_cache[4] = { -4, -4, -4, -4 };
|
78
|
-
Command* commands;
|
79
|
-
Hashers* hashers;
|
80
|
-
int use_utf8_mode;
|
81
|
-
uint8_t prev_byte;
|
82
|
-
uint8_t prev_byte2;
|
83
|
-
const uint32_t mask = BROTLI_UINT32_MAX >> 1;
|
84
|
-
|
85
|
-
/* Copy prefix + next input block into a continuous area. */
|
86
|
-
uint32_t input_pos = prefix_size;
|
87
|
-
/* CreateBackwardReferences reads up to 3 bytes past the end of input if the
|
88
|
-
mask points past the end of input.
|
89
|
-
FindMatchLengthWithLimit could do another 8 bytes look-forward. */
|
90
|
-
uint8_t* input = BROTLI_ALLOC(m, uint8_t, prefix_size + input_size + 4 + 8);
|
91
|
-
if (BROTLI_IS_OOM(m)) goto oom;
|
92
|
-
memcpy(input, prefix_buffer, prefix_size);
|
93
|
-
memcpy(input + input_pos, input_buffer, input_size);
|
94
|
-
/* Since we don't have a ringbuffer, masking is a no-op.
|
95
|
-
We use one less bit than the full range because some of the code uses
|
96
|
-
mask + 1 as the size of the ringbuffer. */
|
97
|
-
|
98
|
-
prev_byte = input_pos > 0 ? input[(input_pos - 1) & mask] : 0;
|
99
|
-
prev_byte2 = input_pos > 1 ? input[(input_pos - 2) & mask] : 0;
|
100
|
-
|
101
|
-
/* Decide about UTF8 mode. */
|
102
|
-
static const double kMinUTF8Ratio = 0.75;
|
103
|
-
use_utf8_mode = BrotliIsMostlyUTF8(
|
104
|
-
input, input_pos, mask, input_size, kMinUTF8Ratio);
|
105
|
-
|
106
|
-
/* Initialize hashers. */
|
107
|
-
hashers = BROTLI_ALLOC(m, Hashers, 1);
|
108
|
-
if (BROTLI_IS_OOM(m)) goto oom;
|
109
|
-
InitHashers(hashers);
|
110
|
-
HashersSetup(m, hashers, ChooseHasher(params));
|
111
|
-
if (BROTLI_IS_OOM(m)) goto oom;
|
112
|
-
|
113
|
-
/* Compute backward references. */
|
114
|
-
commands = BROTLI_ALLOC(m, Command, ((input_size + 1) >> 1));
|
115
|
-
if (BROTLI_IS_OOM(m)) goto oom;
|
116
|
-
BrotliCreateBackwardReferences(m, input_size, input_pos,
|
117
|
-
TO_BROTLI_BOOL(is_last), input, mask, params,
|
118
|
-
hashers, dist_cache, &last_insert_len, commands, &num_commands,
|
119
|
-
&num_literals);
|
120
|
-
if (BROTLI_IS_OOM(m)) goto oom;
|
121
|
-
DestroyHashers(m, hashers);
|
122
|
-
BROTLI_FREE(m, hashers);
|
123
|
-
if (last_insert_len > 0) {
|
124
|
-
InitInsertCommand(&commands[num_commands++], last_insert_len);
|
125
|
-
num_literals += last_insert_len;
|
126
|
-
}
|
127
|
-
assert(num_commands != 0);
|
128
|
-
|
129
|
-
/* Build the meta-block. */
|
130
|
-
MetaBlockSplit mb;
|
131
|
-
InitMetaBlockSplit(&mb);
|
132
|
-
num_direct_distance_codes = params->mode == BROTLI_MODE_FONT ? 12 : 0;
|
133
|
-
distance_postfix_bits = params->mode == BROTLI_MODE_FONT ? 1 : 0;
|
134
|
-
literal_context_mode = use_utf8_mode ? CONTEXT_UTF8 : CONTEXT_SIGNED;
|
135
|
-
RecomputeDistancePrefixes(commands, num_commands,
|
136
|
-
num_direct_distance_codes,
|
137
|
-
distance_postfix_bits);
|
138
|
-
if (params->quality < MIN_QUALITY_FOR_HQ_BLOCK_SPLITTING) {
|
139
|
-
BrotliBuildMetaBlockGreedy(m, input, input_pos, mask,
|
140
|
-
commands, num_commands,
|
141
|
-
&mb);
|
142
|
-
if (BROTLI_IS_OOM(m)) goto oom;
|
143
|
-
} else {
|
144
|
-
BrotliBuildMetaBlock(m, input, input_pos, mask, params,
|
145
|
-
prev_byte, prev_byte2,
|
146
|
-
commands, num_commands,
|
147
|
-
literal_context_mode,
|
148
|
-
&mb);
|
149
|
-
if (BROTLI_IS_OOM(m)) goto oom;
|
150
|
-
}
|
151
|
-
|
152
|
-
/* Set up the temporary output storage. */
|
153
|
-
storage = BROTLI_ALLOC(m, uint8_t, 2 * input_size + 500);
|
154
|
-
if (BROTLI_IS_OOM(m)) goto oom;
|
155
|
-
first_byte = 0;
|
156
|
-
first_byte_bits = 0;
|
157
|
-
if (is_first) {
|
158
|
-
if (params->lgwin == 16) {
|
159
|
-
first_byte = 0;
|
160
|
-
first_byte_bits = 1;
|
161
|
-
} else if (params->lgwin == 17) {
|
162
|
-
first_byte = 1;
|
163
|
-
first_byte_bits = 7;
|
164
|
-
} else {
|
165
|
-
first_byte = static_cast<uint8_t>(((params->lgwin - 17) << 1) | 1);
|
166
|
-
first_byte_bits = 4;
|
167
|
-
}
|
168
|
-
}
|
169
|
-
storage[0] = static_cast<uint8_t>(first_byte);
|
170
|
-
storage_ix = first_byte_bits;
|
171
|
-
|
172
|
-
/* Store the meta-block to the temporary output. */
|
173
|
-
BrotliStoreMetaBlock(m, input, input_pos, input_size, mask,
|
174
|
-
prev_byte, prev_byte2,
|
175
|
-
TO_BROTLI_BOOL(is_last),
|
176
|
-
num_direct_distance_codes,
|
177
|
-
distance_postfix_bits,
|
178
|
-
literal_context_mode,
|
179
|
-
commands, num_commands,
|
180
|
-
&mb,
|
181
|
-
&storage_ix, storage);
|
182
|
-
if (BROTLI_IS_OOM(m)) goto oom;
|
183
|
-
DestroyMetaBlockSplit(m, &mb);
|
184
|
-
BROTLI_FREE(m, commands);
|
185
|
-
|
186
|
-
/* If this is not the last meta-block, store an empty metadata
|
187
|
-
meta-block so that the meta-block will end at a byte boundary. */
|
188
|
-
if (!is_last) {
|
189
|
-
BrotliStoreSyncMetaBlock(&storage_ix, storage);
|
190
|
-
}
|
191
|
-
|
192
|
-
/* If the compressed data is too large, fall back to an uncompressed
|
193
|
-
meta-block. */
|
194
|
-
output_size = storage_ix >> 3;
|
195
|
-
if (input_size + 4 < output_size) {
|
196
|
-
storage[0] = static_cast<uint8_t>(first_byte);
|
197
|
-
storage_ix = first_byte_bits;
|
198
|
-
BrotliStoreUncompressedMetaBlock(
|
199
|
-
TO_BROTLI_BOOL(is_last), input, input_pos, mask, input_size,
|
200
|
-
&storage_ix, storage);
|
201
|
-
output_size = storage_ix >> 3;
|
202
|
-
}
|
203
|
-
|
204
|
-
/* Copy the temporary output with size-check to the output. */
|
205
|
-
if (output_size > *encoded_size) {
|
206
|
-
BROTLI_FREE(m, storage);
|
207
|
-
BROTLI_FREE(m, input);
|
208
|
-
return 0;
|
209
|
-
}
|
210
|
-
memcpy(encoded_buffer, storage, output_size);
|
211
|
-
*encoded_size = output_size;
|
212
|
-
BROTLI_FREE(m, storage);
|
213
|
-
BROTLI_FREE(m, input);
|
214
|
-
return 1;
|
215
|
-
|
216
|
-
oom:
|
217
|
-
BrotliWipeOutMemoryManager(m);
|
218
|
-
return 0;
|
219
|
-
}
|
220
|
-
|
221
|
-
} /* namespace */
|
222
|
-
|
223
|
-
int BrotliCompressBufferParallel(BrotliParams compressor_params,
|
224
|
-
size_t input_size,
|
225
|
-
const uint8_t* input_buffer,
|
226
|
-
size_t* encoded_size,
|
227
|
-
uint8_t* encoded_buffer) {
|
228
|
-
if (*encoded_size == 0) {
|
229
|
-
/* Output buffer needs at least one byte. */
|
230
|
-
return 0;
|
231
|
-
} else if (input_size == 0) {
|
232
|
-
encoded_buffer[0] = 6;
|
233
|
-
*encoded_size = 1;
|
234
|
-
return 1;
|
235
|
-
}
|
236
|
-
|
237
|
-
BrotliEncoderParams params;
|
238
|
-
params.mode = (BrotliEncoderMode)compressor_params.mode;
|
239
|
-
params.quality = compressor_params.quality;
|
240
|
-
params.lgwin = compressor_params.lgwin;
|
241
|
-
params.lgblock = compressor_params.lgblock;
|
242
|
-
|
243
|
-
SanitizeParams(¶ms);
|
244
|
-
params.lgblock = ComputeLgBlock(¶ms);
|
245
|
-
size_t max_input_block_size = 1 << params.lgblock;
|
246
|
-
size_t max_prefix_size = 1u << params.lgwin;
|
247
|
-
|
248
|
-
std::vector<std::vector<uint8_t> > compressed_pieces;
|
249
|
-
|
250
|
-
/* Compress block-by-block independently. */
|
251
|
-
for (size_t pos = 0; pos < input_size; ) {
|
252
|
-
uint32_t input_block_size = static_cast<uint32_t>(
|
253
|
-
BROTLI_MIN(size_t, max_input_block_size, input_size - pos));
|
254
|
-
uint32_t prefix_size =
|
255
|
-
static_cast<uint32_t>(BROTLI_MIN(size_t, max_prefix_size, pos));
|
256
|
-
size_t out_size = input_block_size + (input_block_size >> 3) + 1024;
|
257
|
-
std::vector<uint8_t> out(out_size);
|
258
|
-
if (!WriteMetaBlockParallel(¶ms,
|
259
|
-
input_block_size,
|
260
|
-
&input_buffer[pos],
|
261
|
-
prefix_size,
|
262
|
-
&input_buffer[pos - prefix_size],
|
263
|
-
(pos == 0) ? 1 : 0,
|
264
|
-
(pos + input_block_size == input_size) ? 1 : 0,
|
265
|
-
&out_size,
|
266
|
-
&out[0])) {
|
267
|
-
return 0;
|
268
|
-
}
|
269
|
-
out.resize(out_size);
|
270
|
-
compressed_pieces.push_back(out);
|
271
|
-
pos += input_block_size;
|
272
|
-
}
|
273
|
-
|
274
|
-
/* Piece together the output. */
|
275
|
-
size_t out_pos = 0;
|
276
|
-
for (size_t i = 0; i < compressed_pieces.size(); ++i) {
|
277
|
-
const std::vector<uint8_t>& out = compressed_pieces[i];
|
278
|
-
if (out_pos + out.size() > *encoded_size) {
|
279
|
-
return 0;
|
280
|
-
}
|
281
|
-
memcpy(&encoded_buffer[out_pos], &out[0], out.size());
|
282
|
-
out_pos += out.size();
|
283
|
-
}
|
284
|
-
*encoded_size = out_pos;
|
285
|
-
|
286
|
-
return 1;
|
287
|
-
}
|
288
|
-
|
289
|
-
} /* namespace brotli */
|