isomorfeus-ferret 0.12.6 → 0.12.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -4
- data/ext/isomorfeus_ferret_ext/brotli_common_constants.c +15 -0
- data/ext/isomorfeus_ferret_ext/brotli_common_constants.h +200 -0
- data/ext/isomorfeus_ferret_ext/brotli_common_context.c +156 -0
- data/ext/isomorfeus_ferret_ext/brotli_common_context.h +113 -0
- data/ext/isomorfeus_ferret_ext/brotli_common_dictionary.c +5914 -0
- data/ext/isomorfeus_ferret_ext/brotli_common_dictionary.h +64 -0
- data/ext/isomorfeus_ferret_ext/brotli_common_platform.c +22 -0
- data/ext/isomorfeus_ferret_ext/brotli_common_platform.h +594 -0
- data/ext/isomorfeus_ferret_ext/brotli_common_transform.c +291 -0
- data/ext/isomorfeus_ferret_ext/brotli_common_transform.h +85 -0
- data/ext/isomorfeus_ferret_ext/brotli_common_version.h +26 -0
- data/ext/isomorfeus_ferret_ext/brotli_dec_bit_reader.c +76 -0
- data/ext/isomorfeus_ferret_ext/brotli_dec_bit_reader.h +351 -0
- data/ext/isomorfeus_ferret_ext/brotli_dec_decode.c +2608 -0
- data/ext/isomorfeus_ferret_ext/brotli_dec_huffman.c +339 -0
- data/ext/isomorfeus_ferret_ext/brotli_dec_huffman.h +121 -0
- data/ext/isomorfeus_ferret_ext/brotli_dec_prefix.h +732 -0
- data/ext/isomorfeus_ferret_ext/brotli_dec_state.c +159 -0
- data/ext/isomorfeus_ferret_ext/brotli_dec_state.h +365 -0
- data/ext/isomorfeus_ferret_ext/brotli_decode.h +344 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_backward_references.c +145 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_backward_references.h +39 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_backward_references_hq.c +843 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_backward_references_hq.h +95 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_backward_references_inc.h +163 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_bit_cost.c +35 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_bit_cost.h +63 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_bit_cost_inc.h +127 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_block_encoder_inc.h +34 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_block_splitter.c +194 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_block_splitter.h +51 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_block_splitter_inc.h +440 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_brotli_bit_stream.c +1314 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_brotli_bit_stream.h +84 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_cluster.c +56 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_cluster.h +48 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_cluster_inc.h +320 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_command.c +28 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_command.h +190 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_compress_fragment.c +790 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_compress_fragment.h +61 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_compress_fragment_two_pass.c +645 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_compress_fragment_two_pass.h +54 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_dictionary_hash.c +1846 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_dictionary_hash.h +25 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_encode.c +1927 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_encoder_dict.c +33 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_encoder_dict.h +43 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_entropy_encode.c +503 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_entropy_encode.h +122 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_entropy_encode_static.h +539 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_fast_log.c +105 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_fast_log.h +66 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_find_match_length.h +79 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_hash.h +488 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_hash_composite_inc.h +125 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_hash_forgetful_chain_inc.h +293 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_hash_longest_match64_inc.h +267 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_hash_longest_match_inc.h +262 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_hash_longest_match_quickly_inc.h +266 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_hash_rolling_inc.h +212 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_hash_to_binary_tree_inc.h +329 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_histogram.c +100 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_histogram.h +63 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_histogram_inc.h +51 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_literal_cost.c +175 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_literal_cost.h +30 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_memory.c +170 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_memory.h +114 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_metablock.c +663 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_metablock.h +105 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_metablock_inc.h +183 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_params.h +46 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_prefix.h +53 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_quality.h +165 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_ringbuffer.h +167 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_static_dict.c +486 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_static_dict.h +40 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_static_dict_lut.h +5864 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_utf8_util.c +85 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_utf8_util.h +32 -0
- data/ext/isomorfeus_ferret_ext/brotli_enc_write_bits.h +87 -0
- data/ext/isomorfeus_ferret_ext/brotli_encode.h +448 -0
- data/ext/isomorfeus_ferret_ext/brotli_port.h +288 -0
- data/ext/isomorfeus_ferret_ext/brotli_types.h +83 -0
- data/ext/isomorfeus_ferret_ext/frb_index.c +35 -4
- data/ext/isomorfeus_ferret_ext/frt_document.h +1 -0
- data/ext/isomorfeus_ferret_ext/frt_fs_store.c +1 -0
- data/ext/isomorfeus_ferret_ext/frt_index.c +174 -25
- data/ext/isomorfeus_ferret_ext/frt_index.h +6 -3
- data/ext/isomorfeus_ferret_ext/frt_ram_store.c +1 -0
- data/ext/isomorfeus_ferret_ext/test_fields.c +57 -45
- data/ext/isomorfeus_ferret_ext/test_index.c +4 -1
- data/lib/isomorfeus/ferret/version.rb +1 -1
- metadata +88 -3
@@ -0,0 +1,159 @@
|
|
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
|
+
#include "brotli_dec_state.h"
|
8
|
+
|
9
|
+
#include <stdlib.h> /* free, malloc */
|
10
|
+
|
11
|
+
#include "brotli_types.h"
|
12
|
+
#include "brotli_dec_huffman.h"
|
13
|
+
|
14
|
+
#if defined(__cplusplus) || defined(c_plusplus)
|
15
|
+
extern "C" {
|
16
|
+
#endif
|
17
|
+
|
18
|
+
BROTLI_BOOL BrotliDecoderStateInit(BrotliDecoderState* s,
|
19
|
+
brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque) {
|
20
|
+
if (!alloc_func) {
|
21
|
+
s->alloc_func = BrotliDefaultAllocFunc;
|
22
|
+
s->free_func = BrotliDefaultFreeFunc;
|
23
|
+
s->memory_manager_opaque = 0;
|
24
|
+
} else {
|
25
|
+
s->alloc_func = alloc_func;
|
26
|
+
s->free_func = free_func;
|
27
|
+
s->memory_manager_opaque = opaque;
|
28
|
+
}
|
29
|
+
|
30
|
+
s->error_code = 0; /* BROTLI_DECODER_NO_ERROR */
|
31
|
+
|
32
|
+
BrotliInitBitReader(&s->br);
|
33
|
+
s->state = BROTLI_STATE_UNINITED;
|
34
|
+
s->large_window = 0;
|
35
|
+
s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
|
36
|
+
s->substate_uncompressed = BROTLI_STATE_UNCOMPRESSED_NONE;
|
37
|
+
s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_NONE;
|
38
|
+
s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_NONE;
|
39
|
+
|
40
|
+
s->buffer_length = 0;
|
41
|
+
s->loop_counter = 0;
|
42
|
+
s->pos = 0;
|
43
|
+
s->rb_roundtrips = 0;
|
44
|
+
s->partial_pos_out = 0;
|
45
|
+
|
46
|
+
s->block_type_trees = NULL;
|
47
|
+
s->block_len_trees = NULL;
|
48
|
+
s->ringbuffer = NULL;
|
49
|
+
s->ringbuffer_size = 0;
|
50
|
+
s->new_ringbuffer_size = 0;
|
51
|
+
s->ringbuffer_mask = 0;
|
52
|
+
|
53
|
+
s->context_map = NULL;
|
54
|
+
s->context_modes = NULL;
|
55
|
+
s->dist_context_map = NULL;
|
56
|
+
s->context_map_slice = NULL;
|
57
|
+
s->dist_context_map_slice = NULL;
|
58
|
+
|
59
|
+
s->literal_hgroup.codes = NULL;
|
60
|
+
s->literal_hgroup.htrees = NULL;
|
61
|
+
s->insert_copy_hgroup.codes = NULL;
|
62
|
+
s->insert_copy_hgroup.htrees = NULL;
|
63
|
+
s->distance_hgroup.codes = NULL;
|
64
|
+
s->distance_hgroup.htrees = NULL;
|
65
|
+
|
66
|
+
s->is_last_metablock = 0;
|
67
|
+
s->is_uncompressed = 0;
|
68
|
+
s->is_metadata = 0;
|
69
|
+
s->should_wrap_ringbuffer = 0;
|
70
|
+
s->canny_ringbuffer_allocation = 1;
|
71
|
+
|
72
|
+
s->window_bits = 0;
|
73
|
+
s->max_distance = 0;
|
74
|
+
s->dist_rb[0] = 16;
|
75
|
+
s->dist_rb[1] = 15;
|
76
|
+
s->dist_rb[2] = 11;
|
77
|
+
s->dist_rb[3] = 4;
|
78
|
+
s->dist_rb_idx = 0;
|
79
|
+
s->block_type_trees = NULL;
|
80
|
+
s->block_len_trees = NULL;
|
81
|
+
|
82
|
+
s->mtf_upper_bound = 63;
|
83
|
+
|
84
|
+
s->dictionary = BrotliGetDictionary();
|
85
|
+
s->transforms = BrotliGetTransforms();
|
86
|
+
|
87
|
+
return BROTLI_TRUE;
|
88
|
+
}
|
89
|
+
|
90
|
+
void BrotliDecoderStateMetablockBegin(BrotliDecoderState* s) {
|
91
|
+
s->meta_block_remaining_len = 0;
|
92
|
+
s->block_length[0] = 1U << 24;
|
93
|
+
s->block_length[1] = 1U << 24;
|
94
|
+
s->block_length[2] = 1U << 24;
|
95
|
+
s->num_block_types[0] = 1;
|
96
|
+
s->num_block_types[1] = 1;
|
97
|
+
s->num_block_types[2] = 1;
|
98
|
+
s->block_type_rb[0] = 1;
|
99
|
+
s->block_type_rb[1] = 0;
|
100
|
+
s->block_type_rb[2] = 1;
|
101
|
+
s->block_type_rb[3] = 0;
|
102
|
+
s->block_type_rb[4] = 1;
|
103
|
+
s->block_type_rb[5] = 0;
|
104
|
+
s->context_map = NULL;
|
105
|
+
s->context_modes = NULL;
|
106
|
+
s->dist_context_map = NULL;
|
107
|
+
s->context_map_slice = NULL;
|
108
|
+
s->literal_htree = NULL;
|
109
|
+
s->dist_context_map_slice = NULL;
|
110
|
+
s->dist_htree_index = 0;
|
111
|
+
s->context_lookup = NULL;
|
112
|
+
s->literal_hgroup.codes = NULL;
|
113
|
+
s->literal_hgroup.htrees = NULL;
|
114
|
+
s->insert_copy_hgroup.codes = NULL;
|
115
|
+
s->insert_copy_hgroup.htrees = NULL;
|
116
|
+
s->distance_hgroup.codes = NULL;
|
117
|
+
s->distance_hgroup.htrees = NULL;
|
118
|
+
}
|
119
|
+
|
120
|
+
void BrotliDecoderStateCleanupAfterMetablock(BrotliDecoderState* s) {
|
121
|
+
BROTLI_DECODER_FREE(s, s->context_modes);
|
122
|
+
BROTLI_DECODER_FREE(s, s->context_map);
|
123
|
+
BROTLI_DECODER_FREE(s, s->dist_context_map);
|
124
|
+
BROTLI_DECODER_FREE(s, s->literal_hgroup.htrees);
|
125
|
+
BROTLI_DECODER_FREE(s, s->insert_copy_hgroup.htrees);
|
126
|
+
BROTLI_DECODER_FREE(s, s->distance_hgroup.htrees);
|
127
|
+
}
|
128
|
+
|
129
|
+
void BrotliDecoderStateCleanup(BrotliDecoderState* s) {
|
130
|
+
BrotliDecoderStateCleanupAfterMetablock(s);
|
131
|
+
|
132
|
+
BROTLI_DECODER_FREE(s, s->ringbuffer);
|
133
|
+
BROTLI_DECODER_FREE(s, s->block_type_trees);
|
134
|
+
}
|
135
|
+
|
136
|
+
BROTLI_BOOL BrotliDecoderHuffmanTreeGroupInit(BrotliDecoderState* s,
|
137
|
+
HuffmanTreeGroup* group, uint32_t alphabet_size_max,
|
138
|
+
uint32_t alphabet_size_limit, uint32_t ntrees) {
|
139
|
+
/* 376 = 256 (1-st level table) + 4 + 7 + 15 + 31 + 63 (2-nd level mix-tables)
|
140
|
+
This number is discovered "unlimited" "enough" calculator; it is actually
|
141
|
+
a wee bigger than required in several cases (especially for alphabets with
|
142
|
+
less than 16 symbols). */
|
143
|
+
const size_t max_table_size = alphabet_size_limit + 376;
|
144
|
+
const size_t code_size = sizeof(HuffmanCode) * ntrees * max_table_size;
|
145
|
+
const size_t htree_size = sizeof(HuffmanCode*) * ntrees;
|
146
|
+
/* Pointer alignment is, hopefully, wider than sizeof(HuffmanCode). */
|
147
|
+
HuffmanCode** p = (HuffmanCode**)BROTLI_DECODER_ALLOC(s,
|
148
|
+
code_size + htree_size);
|
149
|
+
group->alphabet_size_max = (uint16_t)alphabet_size_max;
|
150
|
+
group->alphabet_size_limit = (uint16_t)alphabet_size_limit;
|
151
|
+
group->num_htrees = (uint16_t)ntrees;
|
152
|
+
group->htrees = p;
|
153
|
+
group->codes = (HuffmanCode*)(&p[ntrees]);
|
154
|
+
return !!p;
|
155
|
+
}
|
156
|
+
|
157
|
+
#if defined(__cplusplus) || defined(c_plusplus)
|
158
|
+
} /* extern "C" */
|
159
|
+
#endif
|
@@ -0,0 +1,365 @@
|
|
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_common_constants.h"
|
13
|
+
#include "brotli_common_dictionary.h"
|
14
|
+
#include "brotli_common_platform.h"
|
15
|
+
#include "brotli_common_transform.h"
|
16
|
+
#include "brotli_types.h"
|
17
|
+
#include "brotli_dec_bit_reader.h"
|
18
|
+
#include "brotli_dec_huffman.h"
|
19
|
+
|
20
|
+
#if defined(__cplusplus) || defined(c_plusplus)
|
21
|
+
extern "C" {
|
22
|
+
#endif
|
23
|
+
|
24
|
+
/* Graphviz diagram that describes state transitions:
|
25
|
+
|
26
|
+
digraph 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
|
+
|
113
|
+
typedef enum {
|
114
|
+
BROTLI_STATE_UNINITED,
|
115
|
+
BROTLI_STATE_LARGE_WINDOW_BITS,
|
116
|
+
BROTLI_STATE_INITIALIZE,
|
117
|
+
BROTLI_STATE_METABLOCK_BEGIN,
|
118
|
+
BROTLI_STATE_METABLOCK_HEADER,
|
119
|
+
BROTLI_STATE_METABLOCK_HEADER_2,
|
120
|
+
BROTLI_STATE_CONTEXT_MODES,
|
121
|
+
BROTLI_STATE_COMMAND_BEGIN,
|
122
|
+
BROTLI_STATE_COMMAND_INNER,
|
123
|
+
BROTLI_STATE_COMMAND_POST_DECODE_LITERALS,
|
124
|
+
BROTLI_STATE_COMMAND_POST_WRAP_COPY,
|
125
|
+
BROTLI_STATE_UNCOMPRESSED,
|
126
|
+
BROTLI_STATE_METADATA,
|
127
|
+
BROTLI_STATE_COMMAND_INNER_WRITE,
|
128
|
+
BROTLI_STATE_METABLOCK_DONE,
|
129
|
+
BROTLI_STATE_COMMAND_POST_WRITE_1,
|
130
|
+
BROTLI_STATE_COMMAND_POST_WRITE_2,
|
131
|
+
BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_HEADER,
|
132
|
+
BROTLI_STATE_HUFFMAN_CODE_0,
|
133
|
+
BROTLI_STATE_HUFFMAN_CODE_1,
|
134
|
+
BROTLI_STATE_HUFFMAN_CODE_2,
|
135
|
+
BROTLI_STATE_HUFFMAN_CODE_3,
|
136
|
+
BROTLI_STATE_CONTEXT_MAP_1,
|
137
|
+
BROTLI_STATE_CONTEXT_MAP_2,
|
138
|
+
BROTLI_STATE_TREE_GROUP,
|
139
|
+
BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_BODY,
|
140
|
+
BROTLI_STATE_DONE
|
141
|
+
} BrotliRunningState;
|
142
|
+
|
143
|
+
typedef enum {
|
144
|
+
BROTLI_STATE_METABLOCK_HEADER_NONE,
|
145
|
+
BROTLI_STATE_METABLOCK_HEADER_EMPTY,
|
146
|
+
BROTLI_STATE_METABLOCK_HEADER_NIBBLES,
|
147
|
+
BROTLI_STATE_METABLOCK_HEADER_SIZE,
|
148
|
+
BROTLI_STATE_METABLOCK_HEADER_UNCOMPRESSED,
|
149
|
+
BROTLI_STATE_METABLOCK_HEADER_RESERVED,
|
150
|
+
BROTLI_STATE_METABLOCK_HEADER_BYTES,
|
151
|
+
BROTLI_STATE_METABLOCK_HEADER_METADATA
|
152
|
+
} BrotliRunningMetablockHeaderState;
|
153
|
+
|
154
|
+
typedef enum {
|
155
|
+
BROTLI_STATE_UNCOMPRESSED_NONE,
|
156
|
+
BROTLI_STATE_UNCOMPRESSED_WRITE
|
157
|
+
} BrotliRunningUncompressedState;
|
158
|
+
|
159
|
+
typedef enum {
|
160
|
+
BROTLI_STATE_TREE_GROUP_NONE,
|
161
|
+
BROTLI_STATE_TREE_GROUP_LOOP
|
162
|
+
} BrotliRunningTreeGroupState;
|
163
|
+
|
164
|
+
typedef enum {
|
165
|
+
BROTLI_STATE_CONTEXT_MAP_NONE,
|
166
|
+
BROTLI_STATE_CONTEXT_MAP_READ_PREFIX,
|
167
|
+
BROTLI_STATE_CONTEXT_MAP_HUFFMAN,
|
168
|
+
BROTLI_STATE_CONTEXT_MAP_DECODE,
|
169
|
+
BROTLI_STATE_CONTEXT_MAP_TRANSFORM
|
170
|
+
} BrotliRunningContextMapState;
|
171
|
+
|
172
|
+
typedef enum {
|
173
|
+
BROTLI_STATE_HUFFMAN_NONE,
|
174
|
+
BROTLI_STATE_HUFFMAN_SIMPLE_SIZE,
|
175
|
+
BROTLI_STATE_HUFFMAN_SIMPLE_READ,
|
176
|
+
BROTLI_STATE_HUFFMAN_SIMPLE_BUILD,
|
177
|
+
BROTLI_STATE_HUFFMAN_COMPLEX,
|
178
|
+
BROTLI_STATE_HUFFMAN_LENGTH_SYMBOLS
|
179
|
+
} BrotliRunningHuffmanState;
|
180
|
+
|
181
|
+
typedef enum {
|
182
|
+
BROTLI_STATE_DECODE_UINT8_NONE,
|
183
|
+
BROTLI_STATE_DECODE_UINT8_SHORT,
|
184
|
+
BROTLI_STATE_DECODE_UINT8_LONG
|
185
|
+
} BrotliRunningDecodeUint8State;
|
186
|
+
|
187
|
+
typedef enum {
|
188
|
+
BROTLI_STATE_READ_BLOCK_LENGTH_NONE,
|
189
|
+
BROTLI_STATE_READ_BLOCK_LENGTH_SUFFIX
|
190
|
+
} BrotliRunningReadBlockLengthState;
|
191
|
+
|
192
|
+
typedef struct BrotliMetablockHeaderArena {
|
193
|
+
BrotliRunningTreeGroupState substate_tree_group;
|
194
|
+
BrotliRunningContextMapState substate_context_map;
|
195
|
+
BrotliRunningHuffmanState substate_huffman;
|
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. */
|
212
|
+
uint16_t symbols_lists_array[BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1 +
|
213
|
+
BROTLI_NUM_COMMAND_SYMBOLS];
|
214
|
+
/* Tails of symbol chains. */
|
215
|
+
int next_symbol[32];
|
216
|
+
uint8_t code_length_code_lengths[BROTLI_CODE_LENGTH_CODES];
|
217
|
+
/* Population counts for the code lengths. */
|
218
|
+
uint16_t code_length_histo[16];
|
219
|
+
|
220
|
+
/* For HuffmanTreeGroupDecode. */
|
221
|
+
int htree_index;
|
222
|
+
HuffmanCode* next;
|
223
|
+
|
224
|
+
/* For DecodeContextMap. */
|
225
|
+
uint32_t context_index;
|
226
|
+
uint32_t max_run_length_prefix;
|
227
|
+
uint32_t code;
|
228
|
+
HuffmanCode context_map_table[BROTLI_HUFFMAN_MAX_SIZE_272];
|
229
|
+
} BrotliMetablockHeaderArena;
|
230
|
+
|
231
|
+
typedef struct BrotliMetablockBodyArena {
|
232
|
+
uint8_t dist_extra_bits[544];
|
233
|
+
uint32_t dist_offset[544];
|
234
|
+
} BrotliMetablockBodyArena;
|
235
|
+
|
236
|
+
struct BrotliDecoderStateStruct {
|
237
|
+
BrotliRunningState state;
|
238
|
+
|
239
|
+
/* This counter is reused for several disjoint loops. */
|
240
|
+
int loop_counter;
|
241
|
+
|
242
|
+
BrotliBitReader br;
|
243
|
+
|
244
|
+
brotli_alloc_func alloc_func;
|
245
|
+
brotli_free_func free_func;
|
246
|
+
void* memory_manager_opaque;
|
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];
|
253
|
+
} buffer;
|
254
|
+
uint32_t buffer_length;
|
255
|
+
|
256
|
+
int pos;
|
257
|
+
int max_backward_distance;
|
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;
|
266
|
+
HuffmanCode* htree_command;
|
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. */
|
273
|
+
HuffmanTreeGroup literal_hgroup;
|
274
|
+
HuffmanTreeGroup insert_copy_hgroup;
|
275
|
+
HuffmanTreeGroup distance_hgroup;
|
276
|
+
HuffmanCode* block_type_trees;
|
277
|
+
HuffmanCode* block_len_trees;
|
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). */
|
280
|
+
int trivial_literal_context;
|
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. */
|
283
|
+
int distance_context;
|
284
|
+
int meta_block_remaining_len;
|
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;
|
290
|
+
uint32_t num_direct_distance_codes;
|
291
|
+
uint32_t num_dist_htrees;
|
292
|
+
uint8_t* dist_context_map;
|
293
|
+
HuffmanCode* literal_htree;
|
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. */
|
310
|
+
BrotliRunningMetablockHeaderState substate_metablock_header;
|
311
|
+
BrotliRunningUncompressedState substate_uncompressed;
|
312
|
+
BrotliRunningDecodeUint8State substate_decode_uint8;
|
313
|
+
BrotliRunningReadBlockLengthState substate_read_block_length;
|
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
|
+
|
324
|
+
int new_ringbuffer_size;
|
325
|
+
|
326
|
+
uint32_t num_literal_htrees;
|
327
|
+
uint8_t* context_map;
|
328
|
+
uint8_t* context_modes;
|
329
|
+
|
330
|
+
const BrotliDictionary* dictionary;
|
331
|
+
const BrotliTransforms* transforms;
|
332
|
+
|
333
|
+
uint32_t trivial_literal_contexts[8]; /* 256 bits */
|
334
|
+
|
335
|
+
union {
|
336
|
+
BrotliMetablockHeaderArena header;
|
337
|
+
BrotliMetablockBodyArena body;
|
338
|
+
} arena;
|
339
|
+
};
|
340
|
+
|
341
|
+
typedef struct BrotliDecoderStateStruct BrotliDecoderStateInternal;
|
342
|
+
#define BrotliDecoderState BrotliDecoderStateInternal
|
343
|
+
|
344
|
+
BROTLI_INTERNAL BROTLI_BOOL BrotliDecoderStateInit(BrotliDecoderState* s,
|
345
|
+
brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque);
|
346
|
+
BROTLI_INTERNAL void BrotliDecoderStateCleanup(BrotliDecoderState* s);
|
347
|
+
BROTLI_INTERNAL void BrotliDecoderStateMetablockBegin(BrotliDecoderState* s);
|
348
|
+
BROTLI_INTERNAL void BrotliDecoderStateCleanupAfterMetablock(
|
349
|
+
BrotliDecoderState* s);
|
350
|
+
BROTLI_INTERNAL BROTLI_BOOL BrotliDecoderHuffmanTreeGroupInit(
|
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_ */
|