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 <brotli/decode.h>
13#include <brotli/shared_dictionary.h>
14#include <brotli/types.h>
15
16#include "../common/constants.h"
18#include "../common/platform.h"
19#include "../common/transform.h"
20#include "bit_reader.h"
21#include "huffman.h"
22
23#if defined(__cplusplus) || defined(c_plusplus)
24extern "C" {
25#endif
26
27/* Graphviz diagram that describes state transitions:
28
29digraph States {
30 graph [compound=true]
31 concentrate=true
32 node [shape="box"]
33
34 UNINITED -> {LARGE_WINDOW_BITS -> INITIALIZE}
35 subgraph cluster_metablock_workflow {
36 style="rounded"
37 label=< <B>METABLOCK CYCLE</B> >
38 METABLOCK_BEGIN -> METABLOCK_HEADER
39 METABLOCK_HEADER:sw -> METADATA
40 METABLOCK_HEADER:s -> UNCOMPRESSED
41 METABLOCK_HEADER:se -> METABLOCK_DONE:ne
42 METADATA:s -> METABLOCK_DONE:w
43 UNCOMPRESSED:s -> METABLOCK_DONE:n
44 METABLOCK_DONE:e -> METABLOCK_BEGIN:e [constraint="false"]
45 }
46 INITIALIZE -> METABLOCK_BEGIN
47 METABLOCK_DONE -> DONE
48
49 subgraph cluster_compressed_metablock {
50 style="rounded"
51 label=< <B>COMPRESSED METABLOCK</B> >
52
53 subgraph cluster_command {
54 style="rounded"
55 label=< <B>HOT LOOP</B> >
56
57 _METABLOCK_DONE_PORT_ [shape=point style=invis]
58
59 {
60 // Set different shape for nodes returning from "compressed metablock".
61 node [shape=invhouse]; CMD_INNER CMD_POST_DECODE_LITERALS;
62 CMD_POST_WRAP_COPY; CMD_INNER_WRITE; CMD_POST_WRITE_1;
63 }
64
65 CMD_BEGIN -> CMD_INNER -> CMD_POST_DECODE_LITERALS -> CMD_POST_WRAP_COPY
66
67 // IO ("write") nodes are not in the hot loop!
68 CMD_INNER_WRITE [style=dashed]
69 CMD_INNER -> CMD_INNER_WRITE
70 CMD_POST_WRITE_1 [style=dashed]
71 CMD_POST_DECODE_LITERALS -> CMD_POST_WRITE_1
72 CMD_POST_WRITE_2 [style=dashed]
73 CMD_POST_WRAP_COPY -> CMD_POST_WRITE_2
74
75 CMD_POST_WRITE_1 -> CMD_BEGIN:s [constraint="false"]
76 CMD_INNER_WRITE -> {CMD_INNER CMD_POST_DECODE_LITERALS}
77 [constraint="false"]
78 CMD_BEGIN:ne -> CMD_POST_DECODE_LITERALS [constraint="false"]
79 CMD_POST_WRAP_COPY -> CMD_BEGIN [constraint="false"]
80 CMD_POST_DECODE_LITERALS -> CMD_BEGIN:ne [constraint="false"]
81 CMD_POST_WRITE_2 -> CMD_POST_WRAP_COPY [constraint="false"]
82 {rank=same; CMD_BEGIN; CMD_INNER; CMD_POST_DECODE_LITERALS;
83 CMD_POST_WRAP_COPY}
84 {rank=same; CMD_INNER_WRITE; CMD_POST_WRITE_1; CMD_POST_WRITE_2}
85
86 {CMD_INNER CMD_POST_DECODE_LITERALS CMD_POST_WRAP_COPY} ->
87 _METABLOCK_DONE_PORT_ [style=invis]
88 {CMD_INNER_WRITE CMD_POST_WRITE_1} -> _METABLOCK_DONE_PORT_
89 [constraint="false" style=invis]
90 }
91
92 BEFORE_COMPRESSED_METABLOCK_HEADER:s -> HUFFMAN_CODE_0:n
93 HUFFMAN_CODE_0 -> HUFFMAN_CODE_1 -> HUFFMAN_CODE_2 -> HUFFMAN_CODE_3
94 HUFFMAN_CODE_0 -> METABLOCK_HEADER_2 -> CONTEXT_MODES -> CONTEXT_MAP_1
95 CONTEXT_MAP_1 -> CONTEXT_MAP_2 -> TREE_GROUP
96 TREE_GROUP -> BEFORE_COMPRESSED_METABLOCK_BODY:e
97 BEFORE_COMPRESSED_METABLOCK_BODY:s -> CMD_BEGIN:n
98
99 HUFFMAN_CODE_3:e -> HUFFMAN_CODE_0:ne [constraint="false"]
100 {rank=same; HUFFMAN_CODE_0; HUFFMAN_CODE_1; HUFFMAN_CODE_2; HUFFMAN_CODE_3}
101 {rank=same; METABLOCK_HEADER_2; CONTEXT_MODES; CONTEXT_MAP_1; CONTEXT_MAP_2;
102 TREE_GROUP}
103 }
104 METABLOCK_HEADER:e -> BEFORE_COMPRESSED_METABLOCK_HEADER:n
105
106 _METABLOCK_DONE_PORT_ -> METABLOCK_DONE:se
107 [constraint="false" ltail=cluster_command]
108
109 UNINITED [shape=Mdiamond];
110 DONE [shape=Msquare];
111}
112
113
114 */
115
145
156
161
166
174
183
189
194
195/* BrotliDecoderState addon, used for Compound Dictionary functionality. */
196typedef struct BrotliDecoderCompoundDictionary {
197 int num_chunks;
198 int total_size;
199 int br_index;
200 int br_offset;
201 int br_length;
202 int br_copied;
203 const uint8_t* chunks[16];
204 int chunk_offsets[16];
205 int block_bits;
206 uint8_t block_map[256];
208
209typedef struct BrotliMetablockHeaderArena {
213
215
218
219 /* For ReadHuffmanCode. */
223
224 /* Huffman table for "histograms". */
225 HuffmanCode table[32];
226 /* List of heads of symbol chains. */
227 uint16_t* symbol_lists;
228 /* Storage from symbol_lists. */
231 /* Tails of symbol chains. */
232 int next_symbol[32];
234 /* Population counts for the code lengths. */
235 uint16_t code_length_histo[16];
236 /* TODO(eustas): +2 bytes padding */
237
238 /* For HuffmanTreeGroupDecode. */
239 int htree_index;
241
242 /* For DecodeContextMap. */
248
249typedef struct BrotliMetablockBodyArena {
250 uint8_t dist_extra_bits[544];
253
256
257 /* This counter is reused for several disjoint loops. */
258 int loop_counter;
259
261
265
266 /* Temporary storage for remaining input. Brotli stream format is designed in
267 a way, that 64 bits are enough to make progress in decoding. */
268 union {
269 uint64_t u64;
270 uint8_t u8[8];
273
274 int pos;
276 int max_distance;
277 int ringbuffer_size;
278 int ringbuffer_mask;
279 int dist_rb_idx;
280 int dist_rb[4];
281 int error_code;
283
284 uint8_t* ringbuffer;
285 uint8_t* ringbuffer_end;
287 const uint8_t* context_lookup;
288 uint8_t* context_map_slice;
289 uint8_t* dist_context_map_slice;
290
291 /* This ring buffer holds a few past copy distances that will be used by
292 some special distance codes. */
298 /* This is true if the literal context map histogram type always matches the
299 block type. It is then not needed to keep the context (faster decoding). */
301 /* Distance context is actual after command is decoded and before distance is
302 computed. After distance computation it is used as a temporary variable. */
311 uint8_t* dist_context_map;
313
314 /* For partial write operations. */
315 size_t rb_roundtrips; /* how many times we went around the ring-buffer */
316 size_t partial_pos_out; /* how much output to the user in total */
317
318 /* For InverseMoveToFrontTransform. */
320 uint32_t mtf[64 + 1];
321
322 int copy_length;
323 int distance_code;
324
325 uint8_t dist_htree_index;
326 /* TODO(eustas): +3 bytes padding */
327
328 /* Less used attributes are at the end of this struct. */
329
333
334 /* For reporting. */
335 uint64_t used_input; /* how many bytes of input are consumed */
336
337 /* States inside function calls. */
342
344 /* TODO(eustas): +4 bytes padding */
345
346 unsigned int is_last_metablock : 1;
347 unsigned int is_uncompressed : 1;
348 unsigned int is_metadata : 1;
349 unsigned int should_wrap_ringbuffer : 1;
350 unsigned int canny_ringbuffer_allocation : 1;
351 unsigned int large_window : 1;
352 unsigned int window_bits : 6;
353 unsigned int size_nibbles : 8;
354 /* TODO(eustas): +12 bits padding */
355
357 uint8_t* context_map;
358 uint8_t* context_modes;
359
362
363 uint32_t trivial_literal_contexts[8]; /* 256 bits */
364
365 union {
369};
370
372#define BrotliDecoderState BrotliDecoderStateInternal
373
382 brotli_reg_t alphabet_size_max, brotli_reg_t alphabet_size_limit,
383 brotli_reg_t ntrees);
384
385#define BROTLI_DECODER_ALLOC(S, L) S->alloc_func(S->memory_manager_opaque, L)
386
387#define BROTLI_DECODER_FREE(S, X) { \
388 S->free_func(S->memory_manager_opaque, X); \
389 X = NULL; \
390}
391
392/* Literal/Command/Distance block size maximum; same as maximum metablock size;
393 used as block size when there is no block switching. */
394#define BROTLI_BLOCK_SIZE_CAP (1U << 24)
395
396#if defined(__cplusplus) || defined(c_plusplus)
397} /* extern "C" */
398#endif
399
400#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
struct BrotliDecoderCompoundDictionary BrotliDecoderCompoundDictionary
void(* brotli_decoder_metadata_chunk_func)(void *opaque, const uint8_t *data, size_t size)
Definition decode.h:388
void(* brotli_decoder_metadata_start_func)(void *opaque, size_t size)
Definition decode.h:374
Definition bit_reader.h:36
Definition state.h:196
int total_size
Definition state.h:198
const uint8_t * chunks[16]
Definition state.h:203
int br_copied
Definition state.h:202
int br_length
Definition state.h:201
int br_index
Definition state.h:199
int block_bits
Definition state.h:205
int num_chunks
Definition state.h:197
int chunk_offsets[16]
Definition state.h:204
uint8_t block_map[256]
Definition state.h:206
int br_offset
Definition state.h:200
Definition state.h:236
void * metadata_callback_opaque
Definition state.h:332
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
brotli_decoder_metadata_chunk_func metadata_chunk_func
Definition state.h:331
int dist_rb_idx
Definition state.h:261
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
BrotliDecoderCompoundDictionary * compound_dictionary
Definition state.h:361
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
brotli_decoder_metadata_start_func metadata_start_func
Definition state.h:330
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
uint64_t used_input
Definition state.h:335
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 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 shared_dictionary_internal.h:22
Definition huffman.h:38
Definition huffman.h:109
#define brotli_reg_t
Definition platform.h:243
#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