Parolin 0.7.9 6796
Console (soon DLLs) to do a tar like job
Loading...
Searching...
No Matches
state.h
Go to the documentation of this file.
1/* Copyright 2015 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/* Brotli state for partial streaming decoding. */
8
9#ifndef BROTLI_DEC_STATE_H_
10#define BROTLI_DEC_STATE_H_
11
12#include "../common/constants.h"
14#include "../common/platform.h"
15#include "../common/transform.h"
16#include <brotli/types.h>
17#include "./bit_reader.h"
18#include "./huffman.h"
19
20#if defined(__cplusplus) || defined(c_plusplus)
21extern "C" {
22#endif
23
24/* Graphviz diagram that describes state transitions:
25
26digraph States {
27 graph [compound=true]
28 concentrate=true
29 node [shape="box"]
30
31 UNINITED -> {LARGE_WINDOW_BITS -> INITIALIZE}
32 subgraph cluster_metablock_workflow {
33 style="rounded"
34 label=< <B>METABLOCK CYCLE</B> >
35 METABLOCK_BEGIN -> METABLOCK_HEADER
36 METABLOCK_HEADER:sw -> METADATA
37 METABLOCK_HEADER:s -> UNCOMPRESSED
38 METABLOCK_HEADER:se -> METABLOCK_DONE:ne
39 METADATA:s -> METABLOCK_DONE:w
40 UNCOMPRESSED:s -> METABLOCK_DONE:n
41 METABLOCK_DONE:e -> METABLOCK_BEGIN:e [constraint="false"]
42 }
43 INITIALIZE -> METABLOCK_BEGIN
44 METABLOCK_DONE -> DONE
45
46 subgraph cluster_compressed_metablock {
47 style="rounded"
48 label=< <B>COMPRESSED METABLOCK</B> >
49
50 subgraph cluster_command {
51 style="rounded"
52 label=< <B>HOT LOOP</B> >
53
54 _METABLOCK_DONE_PORT_ [shape=point style=invis]
55
56 {
57 // Set different shape for nodes returning from "compressed metablock".
58 node [shape=invhouse]; CMD_INNER CMD_POST_DECODE_LITERALS;
59 CMD_POST_WRAP_COPY; CMD_INNER_WRITE; CMD_POST_WRITE_1;
60 }
61
62 CMD_BEGIN -> CMD_INNER -> CMD_POST_DECODE_LITERALS -> CMD_POST_WRAP_COPY
63
64 // IO ("write") nodes are not in the hot loop!
65 CMD_INNER_WRITE [style=dashed]
66 CMD_INNER -> CMD_INNER_WRITE
67 CMD_POST_WRITE_1 [style=dashed]
68 CMD_POST_DECODE_LITERALS -> CMD_POST_WRITE_1
69 CMD_POST_WRITE_2 [style=dashed]
70 CMD_POST_WRAP_COPY -> CMD_POST_WRITE_2
71
72 CMD_POST_WRITE_1 -> CMD_BEGIN:s [constraint="false"]
73 CMD_INNER_WRITE -> {CMD_INNER CMD_POST_DECODE_LITERALS}
74 [constraint="false"]
75 CMD_BEGIN:ne -> CMD_POST_DECODE_LITERALS [constraint="false"]
76 CMD_POST_WRAP_COPY -> CMD_BEGIN [constraint="false"]
77 CMD_POST_DECODE_LITERALS -> CMD_BEGIN:ne [constraint="false"]
78 CMD_POST_WRITE_2 -> CMD_POST_WRAP_COPY [constraint="false"]
79 {rank=same; CMD_BEGIN; CMD_INNER; CMD_POST_DECODE_LITERALS;
80 CMD_POST_WRAP_COPY}
81 {rank=same; CMD_INNER_WRITE; CMD_POST_WRITE_1; CMD_POST_WRITE_2}
82
83 {CMD_INNER CMD_POST_DECODE_LITERALS CMD_POST_WRAP_COPY} ->
84 _METABLOCK_DONE_PORT_ [style=invis]
85 {CMD_INNER_WRITE CMD_POST_WRITE_1} -> _METABLOCK_DONE_PORT_
86 [constraint="false" style=invis]
87 }
88
89 BEFORE_COMPRESSED_METABLOCK_HEADER:s -> HUFFMAN_CODE_0:n
90 HUFFMAN_CODE_0 -> HUFFMAN_CODE_1 -> HUFFMAN_CODE_2 -> HUFFMAN_CODE_3
91 HUFFMAN_CODE_0 -> METABLOCK_HEADER_2 -> CONTEXT_MODES -> CONTEXT_MAP_1
92 CONTEXT_MAP_1 -> CONTEXT_MAP_2 -> TREE_GROUP
93 TREE_GROUP -> BEFORE_COMPRESSED_METABLOCK_BODY:e
94 BEFORE_COMPRESSED_METABLOCK_BODY:s -> CMD_BEGIN:n
95
96 HUFFMAN_CODE_3:e -> HUFFMAN_CODE_0:ne [constraint="false"]
97 {rank=same; HUFFMAN_CODE_0; HUFFMAN_CODE_1; HUFFMAN_CODE_2; HUFFMAN_CODE_3}
98 {rank=same; METABLOCK_HEADER_2; CONTEXT_MODES; CONTEXT_MAP_1; CONTEXT_MAP_2;
99 TREE_GROUP}
100 }
101 METABLOCK_HEADER:e -> BEFORE_COMPRESSED_METABLOCK_HEADER:n
102
103 _METABLOCK_DONE_PORT_ -> METABLOCK_DONE:se
104 [constraint="false" ltail=cluster_command]
105
106 UNINITED [shape=Mdiamond];
107 DONE [shape=Msquare];
108}
109
110
111 */
112
142
153
158
163
171
180
186
191
192typedef struct BrotliMetablockHeaderArena {
196
197 uint32_t sub_loop_counter;
198
199 uint32_t repeat_code_len;
200 uint32_t prev_code_len;
201
202 /* For ReadHuffmanCode. */
203 uint32_t symbol;
204 uint32_t repeat;
205 uint32_t space;
206
207 /* Huffman table for "histograms". */
208 HuffmanCode table[32];
209 /* List of heads of symbol chains. */
210 uint16_t* symbol_lists;
211 /* Storage from symbol_lists. */
214 /* Tails of symbol chains. */
215 int next_symbol[32];
217 /* Population counts for the code lengths. */
218 uint16_t code_length_histo[16];
219
220 /* For HuffmanTreeGroupDecode. */
221 int htree_index;
223
224 /* For DecodeContextMap. */
225 uint32_t context_index;
226 uint32_t max_run_length_prefix;
227 uint32_t code;
230
231typedef struct BrotliMetablockBodyArena {
232 uint8_t dist_extra_bits[544];
233 uint32_t dist_offset[544];
235
238
239 /* This counter is reused for several disjoint loops. */
240 int loop_counter;
241
243
247
248 /* Temporary storage for remaining input. Brotli stream format is designed in
249 a way, that 64 bits are enough to make progress in decoding. */
250 union {
251 uint64_t u64;
252 uint8_t u8[8];
254 uint32_t buffer_length;
255
256 int pos;
258 int max_distance;
259 int ringbuffer_size;
260 int ringbuffer_mask;
261 int dist_rb_idx;
262 int dist_rb[4];
263 int error_code;
264 uint8_t* ringbuffer;
265 uint8_t* ringbuffer_end;
267 const uint8_t* context_lookup;
268 uint8_t* context_map_slice;
269 uint8_t* dist_context_map_slice;
270
271 /* This ring buffer holds a few past copy distances that will be used by
272 some special distance codes. */
278 /* This is true if the literal context map histogram type always matches the
279 block type. It is then not needed to keep the context (faster decoding). */
281 /* Distance context is actual after command is decoded and before distance is
282 computed. After distance computation it is used as a temporary variable. */
285 uint32_t block_length_index;
286 uint32_t block_length[3];
287 uint32_t num_block_types[3];
288 uint32_t block_type_rb[6];
289 uint32_t distance_postfix_bits;
291 uint32_t num_dist_htrees;
292 uint8_t* dist_context_map;
294 uint8_t dist_htree_index;
295
296 int copy_length;
297 int distance_code;
298
299 /* For partial write operations. */
300 size_t rb_roundtrips; /* how many times we went around the ring-buffer */
301 size_t partial_pos_out; /* how much output to the user in total */
302
303 /* For InverseMoveToFrontTransform. */
304 uint32_t mtf_upper_bound;
305 uint32_t mtf[64 + 1];
306
307 /* Less used attributes are at the end of this struct. */
308
309 /* States inside function calls. */
314
315 unsigned int is_last_metablock : 1;
316 unsigned int is_uncompressed : 1;
317 unsigned int is_metadata : 1;
318 unsigned int should_wrap_ringbuffer : 1;
319 unsigned int canny_ringbuffer_allocation : 1;
320 unsigned int large_window : 1;
321 unsigned int size_nibbles : 8;
322 uint32_t window_bits;
323
325
326 uint32_t num_literal_htrees;
327 uint8_t* context_map;
328 uint8_t* context_modes;
329
332
333 uint32_t trivial_literal_contexts[8]; /* 256 bits */
334
335 union {
339};
340
342#define BrotliDecoderState BrotliDecoderStateInternal
343
351 BrotliDecoderState* s, HuffmanTreeGroup* group, uint32_t alphabet_size_max,
352 uint32_t alphabet_size_limit, uint32_t ntrees);
353
354#define BROTLI_DECODER_ALLOC(S, L) S->alloc_func(S->memory_manager_opaque, L)
355
356#define BROTLI_DECODER_FREE(S, X) { \
357 S->free_func(S->memory_manager_opaque, X); \
358 X = NULL; \
359}
360
361#if defined(__cplusplus) || defined(c_plusplus)
362} /* extern "C" */
363#endif
364
365#endif /* BROTLI_DEC_STATE_H_ */
#define BROTLI_NUM_COMMAND_SYMBOLS
Definition constants.h:27
#define BROTLI_CODE_LENGTH_CODES
Definition constants.h:36
#define BROTLI_HUFFMAN_MAX_SIZE_272
Definition huffman.h:26
#define BROTLI_HUFFMAN_MAX_CODE_LENGTH
Definition huffman.h:19
BrotliRunningReadBlockLengthState
Definition state.h:187
@ BROTLI_STATE_READ_BLOCK_LENGTH_NONE
Definition state.h:188
@ BROTLI_STATE_READ_BLOCK_LENGTH_SUFFIX
Definition state.h:189
BROTLI_INTERNAL BROTLI_BOOL BrotliDecoderHuffmanTreeGroupInit(BrotliDecoderState *s, HuffmanTreeGroup *group, uint32_t alphabet_size_max, uint32_t alphabet_size_limit, uint32_t ntrees)
Definition state.c:136
BrotliRunningDecodeUint8State
Definition state.h:181
@ BROTLI_STATE_DECODE_UINT8_SHORT
Definition state.h:183
@ BROTLI_STATE_DECODE_UINT8_LONG
Definition state.h:184
@ BROTLI_STATE_DECODE_UINT8_NONE
Definition state.h:182
struct BrotliMetablockHeaderArena BrotliMetablockHeaderArena
BrotliRunningState
Definition state.h:113
@ BROTLI_STATE_METABLOCK_DONE
Definition state.h:128
@ BROTLI_STATE_COMMAND_POST_DECODE_LITERALS
Definition state.h:123
@ BROTLI_STATE_DONE
Definition state.h:140
@ BROTLI_STATE_COMMAND_INNER
Definition state.h:122
@ BROTLI_STATE_COMMAND_POST_WRITE_2
Definition state.h:130
@ BROTLI_STATE_COMMAND_POST_WRITE_1
Definition state.h:129
@ BROTLI_STATE_HUFFMAN_CODE_1
Definition state.h:133
@ BROTLI_STATE_METABLOCK_HEADER_2
Definition state.h:119
@ BROTLI_STATE_COMMAND_INNER_WRITE
Definition state.h:127
@ BROTLI_STATE_HUFFMAN_CODE_3
Definition state.h:135
@ BROTLI_STATE_HUFFMAN_CODE_0
Definition state.h:132
@ BROTLI_STATE_METADATA
Definition state.h:126
@ BROTLI_STATE_COMMAND_BEGIN
Definition state.h:121
@ BROTLI_STATE_CONTEXT_MAP_2
Definition state.h:137
@ BROTLI_STATE_INITIALIZE
Definition state.h:116
@ BROTLI_STATE_UNINITED
Definition state.h:114
@ BROTLI_STATE_TREE_GROUP
Definition state.h:138
@ BROTLI_STATE_METABLOCK_BEGIN
Definition state.h:117
@ BROTLI_STATE_COMMAND_POST_WRAP_COPY
Definition state.h:124
@ BROTLI_STATE_METABLOCK_HEADER
Definition state.h:118
@ BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_BODY
Definition state.h:139
@ BROTLI_STATE_UNCOMPRESSED
Definition state.h:125
@ BROTLI_STATE_LARGE_WINDOW_BITS
Definition state.h:115
@ BROTLI_STATE_HUFFMAN_CODE_2
Definition state.h:134
@ BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_HEADER
Definition state.h:131
@ BROTLI_STATE_CONTEXT_MODES
Definition state.h:120
@ BROTLI_STATE_CONTEXT_MAP_1
Definition state.h:136
BrotliRunningUncompressedState
Definition state.h:154
@ BROTLI_STATE_UNCOMPRESSED_NONE
Definition state.h:155
@ BROTLI_STATE_UNCOMPRESSED_WRITE
Definition state.h:156
BrotliRunningTreeGroupState
Definition state.h:159
@ BROTLI_STATE_TREE_GROUP_NONE
Definition state.h:160
@ BROTLI_STATE_TREE_GROUP_LOOP
Definition state.h:161
BrotliRunningHuffmanState
Definition state.h:172
@ BROTLI_STATE_HUFFMAN_LENGTH_SYMBOLS
Definition state.h:178
@ BROTLI_STATE_HUFFMAN_SIMPLE_READ
Definition state.h:175
@ BROTLI_STATE_HUFFMAN_NONE
Definition state.h:173
@ BROTLI_STATE_HUFFMAN_SIMPLE_BUILD
Definition state.h:176
@ BROTLI_STATE_HUFFMAN_COMPLEX
Definition state.h:177
@ BROTLI_STATE_HUFFMAN_SIMPLE_SIZE
Definition state.h:174
BrotliRunningMetablockHeaderState
Definition state.h:143
@ BROTLI_STATE_METABLOCK_HEADER_UNCOMPRESSED
Definition state.h:148
@ BROTLI_STATE_METABLOCK_HEADER_SIZE
Definition state.h:147
@ BROTLI_STATE_METABLOCK_HEADER_EMPTY
Definition state.h:145
@ BROTLI_STATE_METABLOCK_HEADER_METADATA
Definition state.h:151
@ BROTLI_STATE_METABLOCK_HEADER_NIBBLES
Definition state.h:146
@ BROTLI_STATE_METABLOCK_HEADER_NONE
Definition state.h:144
@ BROTLI_STATE_METABLOCK_HEADER_BYTES
Definition state.h:150
@ BROTLI_STATE_METABLOCK_HEADER_RESERVED
Definition state.h:149
struct BrotliMetablockBodyArena BrotliMetablockBodyArena
BROTLI_INTERNAL void BrotliDecoderStateCleanup(BrotliDecoderState *s)
Definition state.c:129
BROTLI_INTERNAL BROTLI_BOOL BrotliDecoderStateInit(BrotliDecoderState *s, brotli_alloc_func alloc_func, brotli_free_func free_func, void *opaque)
Definition state.c:18
BROTLI_INTERNAL void BrotliDecoderStateMetablockBegin(BrotliDecoderState *s)
Definition state.c:90
BROTLI_INTERNAL void BrotliDecoderStateCleanupAfterMetablock(BrotliDecoderState *s)
Definition state.c:120
BrotliRunningContextMapState
Definition state.h:164
@ BROTLI_STATE_CONTEXT_MAP_DECODE
Definition state.h:168
@ BROTLI_STATE_CONTEXT_MAP_READ_PREFIX
Definition state.h:166
@ BROTLI_STATE_CONTEXT_MAP_HUFFMAN
Definition state.h:167
@ BROTLI_STATE_CONTEXT_MAP_TRANSFORM
Definition state.h:169
@ BROTLI_STATE_CONTEXT_MAP_NONE
Definition state.h:165
Definition bit_reader.h:36
Definition state.h:236
HuffmanTreeGroup literal_hgroup
Definition state.h:273
uint32_t mtf[64+1]
Definition state.h:305
unsigned int is_last_metablock
Definition state.h:315
int pos
Definition state.h:256
BrotliRunningReadBlockLengthState substate_read_block_length
Definition state.h:313
int max_backward_distance
Definition state.h:257
uint8_t * context_modes
Definition state.h:328
int dist_rb_idx
Definition state.h:261
const BrotliTransforms * transforms
Definition state.h:331
BrotliMetablockBodyArena body
Definition state.h:337
uint32_t buffer_length
Definition state.h:254
HuffmanCode * htree_command
Definition state.h:266
BrotliMetablockHeaderArena header
Definition state.h:336
HuffmanCode * block_len_trees
Definition state.h:277
int ringbuffer_size
Definition state.h:259
size_t rb_roundtrips
Definition state.h:300
unsigned int large_window
Definition state.h:320
uint32_t trivial_literal_contexts[8]
Definition state.h:333
uint32_t distance_postfix_bits
Definition state.h:289
unsigned int should_wrap_ringbuffer
Definition state.h:318
BrotliBitReader br
Definition state.h:242
uint32_t num_dist_htrees
Definition state.h:291
unsigned int canny_ringbuffer_allocation
Definition state.h:319
uint8_t * ringbuffer_end
Definition state.h:265
int error_code
Definition state.h:263
HuffmanCode * block_type_trees
Definition state.h:276
unsigned int is_metadata
Definition state.h:317
uint32_t block_type_rb[6]
Definition state.h:288
uint8_t * dist_context_map_slice
Definition state.h:269
uint64_t u64
Definition state.h:251
BrotliRunningDecodeUint8State substate_decode_uint8
Definition state.h:312
uint8_t * context_map
Definition state.h:327
HuffmanCode * literal_htree
Definition state.h:293
BrotliRunningUncompressedState substate_uncompressed
Definition state.h:311
unsigned int is_uncompressed
Definition state.h:316
uint8_t * context_map_slice
Definition state.h:268
int distance_code
Definition state.h:297
unsigned int size_nibbles
Definition state.h:321
int ringbuffer_mask
Definition state.h:260
uint8_t * dist_context_map
Definition state.h:292
BrotliRunningMetablockHeaderState substate_metablock_header
Definition state.h:310
int copy_length
Definition state.h:296
int max_distance
Definition state.h:258
union BrotliDecoderStateStruct::@8 buffer
uint32_t window_bits
Definition state.h:322
size_t partial_pos_out
Definition state.h:301
uint32_t num_literal_htrees
Definition state.h:326
HuffmanTreeGroup insert_copy_hgroup
Definition state.h:274
int distance_context
Definition state.h:283
BrotliRunningState state
Definition state.h:237
union BrotliDecoderStateStruct::@9 arena
void * memory_manager_opaque
Definition state.h:246
int meta_block_remaining_len
Definition state.h:284
brotli_free_func free_func
Definition state.h:245
uint32_t num_block_types[3]
Definition state.h:287
brotli_alloc_func alloc_func
Definition state.h:244
const uint8_t * context_lookup
Definition state.h:267
int loop_counter
Definition state.h:240
uint32_t block_length[3]
Definition state.h:286
uint32_t mtf_upper_bound
Definition state.h:304
uint32_t num_direct_distance_codes
Definition state.h:290
const BrotliDictionary * dictionary
Definition state.h:330
int trivial_literal_context
Definition state.h:280
uint8_t dist_htree_index
Definition state.h:294
HuffmanTreeGroup distance_hgroup
Definition state.h:275
uint8_t * ringbuffer
Definition state.h:264
int dist_rb[4]
Definition state.h:262
int new_ringbuffer_size
Definition state.h:324
uint32_t block_length_index
Definition state.h:285
Definition dictionary.h:19
Definition state.h:231
uint32_t dist_offset[544]
Definition state.h:233
uint8_t dist_extra_bits[544]
Definition state.h:232
Definition state.h:192
HuffmanCode table[32]
Definition state.h:208
HuffmanCode * next
Definition state.h:222
uint32_t sub_loop_counter
Definition state.h:197
uint32_t code
Definition state.h:227
uint32_t prev_code_len
Definition state.h:200
uint16_t * symbol_lists
Definition state.h:210
int next_symbol[32]
Definition state.h:215
BrotliRunningHuffmanState substate_huffman
Definition state.h:195
uint32_t context_index
Definition state.h:225
int htree_index
Definition state.h:221
uint32_t symbol
Definition state.h:203
uint8_t code_length_code_lengths[BROTLI_CODE_LENGTH_CODES]
Definition state.h:216
uint16_t symbols_lists_array[BROTLI_HUFFMAN_MAX_CODE_LENGTH+1+BROTLI_NUM_COMMAND_SYMBOLS]
Definition state.h:213
uint32_t repeat_code_len
Definition state.h:199
uint32_t repeat
Definition state.h:204
uint32_t max_run_length_prefix
Definition state.h:226
BrotliRunningTreeGroupState substate_tree_group
Definition state.h:193
BrotliRunningContextMapState substate_context_map
Definition state.h:194
HuffmanCode context_map_table[BROTLI_HUFFMAN_MAX_SIZE_272]
Definition state.h:228
uint32_t space
Definition state.h:205
uint16_t code_length_histo[16]
Definition state.h:218
Definition transform.h:47
Definition huffman.h:38
Definition huffman.h:109
#define BROTLI_INTERNAL
Definition platform.h:173
void *(* brotli_alloc_func)(void *opaque, size_t size)
Definition types.h:71
void(* brotli_free_func)(void *opaque, void *address)
Definition types.h:81
#define BROTLI_BOOL
Definition types.h:49
unsigned char u8
Definition harness.c:16