1 | /* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */ |
2 | // vim: expandtab:ts=8:sw=4:softtabstop=4: |
3 | /** |
4 | * \file lzma/subblock.h |
5 | * \brief Subblock filter |
6 | */ |
7 | |
8 | /* |
9 | * Author: Lasse Collin |
10 | * |
11 | * This file has been put into the public domain. |
12 | * You can do whatever you want with this file. |
13 | * |
14 | * See ../lzma.h for information about liblzma as a whole. |
15 | */ |
16 | |
17 | #ifndef LZMA_H_INTERNAL |
18 | # error Never include this file directly. Use <lzma.h> instead. |
19 | #endif |
20 | |
21 | |
22 | /** |
23 | * \brief Filter ID |
24 | * |
25 | * Filter ID of the Subblock filter. This is used as lzma_filter.id. |
26 | */ |
27 | #define LZMA_FILTER_SUBBLOCK LZMA_VLI_C(0x01) |
28 | |
29 | |
30 | /** |
31 | * \brief Subfilter mode |
32 | * |
33 | * See lzma_options_subblock.subfilter_mode for details. |
34 | */ |
35 | typedef enum { |
36 | LZMA_SUBFILTER_NONE, |
37 | /**< |
38 | * No Subfilter is in use. |
39 | */ |
40 | |
41 | LZMA_SUBFILTER_SET, |
42 | /**< |
43 | * New Subfilter has been requested to be initialized. |
44 | */ |
45 | |
46 | LZMA_SUBFILTER_RUN, |
47 | /**< |
48 | * Subfilter is active. |
49 | */ |
50 | |
51 | LZMA_SUBFILTER_FINISH |
52 | /**< |
53 | * Subfilter has been requested to be finished. |
54 | */ |
55 | } lzma_subfilter_mode; |
56 | |
57 | |
58 | /** |
59 | * \brief Options for the Subblock filter |
60 | * |
61 | * Specifying options for the Subblock filter is optional: if the pointer |
62 | * options is NULL, no subfilters are allowed and the default value is used |
63 | * for subblock_data_size. |
64 | */ |
65 | typedef struct { |
66 | /* Options for encoder and decoder */ |
67 | |
68 | /** |
69 | * \brief Allowing subfilters |
70 | * |
71 | * If this true, subfilters are allowed. |
72 | * |
73 | * In the encoder, if this is set to false, subfilter_mode and |
74 | * subfilter_options are completely ignored. |
75 | */ |
76 | lzma_bool allow_subfilters; |
77 | |
78 | /* Options for encoder only */ |
79 | |
80 | /** |
81 | * \brief Alignment |
82 | * |
83 | * The Subblock filter encapsulates the input data into Subblocks. |
84 | * Each Subblock has a header which takes a few bytes of space. |
85 | * When the output of the Subblock encoder is fed to another filter |
86 | * that takes advantage of the alignment of the input data (e.g. LZMA), |
87 | * the Subblock filter can add padding to keep the actual data parts |
88 | * in the Subblocks aligned correctly. |
89 | * |
90 | * The alignment should be a positive integer. Subblock filter will |
91 | * add enough padding between Subblocks so that this is true for |
92 | * every payload byte: |
93 | * input_offset % alignment == output_offset % alignment |
94 | * |
95 | * The Subblock filter assumes that the first output byte will be |
96 | * written to a position in the output stream that is properly |
97 | * aligned. This requirement is automatically met when the start |
98 | * offset of the Stream or Block is correctly told to Block or |
99 | * Stream encoder. |
100 | */ |
101 | uint32_t alignment; |
102 | # define LZMA_SUBBLOCK_ALIGNMENT_MIN 1 |
103 | # define LZMA_SUBBLOCK_ALIGNMENT_MAX 32 |
104 | # define LZMA_SUBBLOCK_ALIGNMENT_DEFAULT 4 |
105 | |
106 | /** |
107 | * \brief Size of the Subblock Data part of each Subblock |
108 | * |
109 | * This value is re-read every time a new Subblock is started. |
110 | * |
111 | * Bigger values |
112 | * - save a few bytes of space; |
113 | * - increase latency in the encoder (but no effect for decoding); |
114 | * - decrease memory locality (increased cache pollution) in the |
115 | * encoder (no effect in decoding). |
116 | */ |
117 | uint32_t subblock_data_size; |
118 | # define LZMA_SUBBLOCK_DATA_SIZE_MIN 1 |
119 | # define LZMA_SUBBLOCK_DATA_SIZE_MAX (UINT32_C(1) << 28) |
120 | # define LZMA_SUBBLOCK_DATA_SIZE_DEFAULT 4096 |
121 | |
122 | /** |
123 | * \brief Run-length encoder remote control |
124 | * |
125 | * The Subblock filter has an internal run-length encoder (RLE). It |
126 | * can be useful when the data includes byte sequences that repeat |
127 | * very many times. The RLE can be used also when a Subfilter is |
128 | * in use; the RLE will be applied to the output of the Subfilter. |
129 | * |
130 | * Note that in contrast to traditional RLE, this RLE is intended to |
131 | * be used only when there's a lot of data to be repeated. If the |
132 | * input data has e.g. 500 bytes of NULs now and then, this RLE |
133 | * is probably useless, because plain LZMA should provide better |
134 | * results. |
135 | * |
136 | * Due to above reasons, it was decided to keep the implementation |
137 | * of the RLE very simple. When the rle variable is non-zero, it |
138 | * subblock_data_size must be a multiple of rle. Once the Subblock |
139 | * encoder has got subblock_data_size bytes of input, it will check |
140 | * if the whole buffer of the last subblock_data_size can be |
141 | * represented with repeats of chunks having size of rle bytes. |
142 | * |
143 | * If there are consecutive identical buffers of subblock_data_size |
144 | * bytes, they will be encoded using a single repeat entry if |
145 | * possible. |
146 | * |
147 | * If need arises, more advanced RLE can be implemented later |
148 | * without breaking API or ABI. |
149 | */ |
150 | uint32_t rle; |
151 | # define LZMA_SUBBLOCK_RLE_OFF 0 |
152 | # define LZMA_SUBBLOCK_RLE_MIN 1 |
153 | # define LZMA_SUBBLOCK_RLE_MAX 256 |
154 | |
155 | /** |
156 | * \brief Subfilter remote control |
157 | * |
158 | * When the Subblock filter is initialized, this variable must be |
159 | * LZMA_SUBFILTER_NONE or LZMA_SUBFILTER_SET. |
160 | * |
161 | * When subfilter_mode is LZMA_SUBFILTER_NONE, the application may |
162 | * put Subfilter options to subfilter_options structure, and then |
163 | * set subfilter_mode to LZMA_SUBFILTER_SET. No new input data will |
164 | * be read until the Subfilter has been enabled. Once the Subfilter |
165 | * has been enabled, liblzma will set subfilter_mode to |
166 | * LZMA_SUBFILTER_RUN. |
167 | * |
168 | * When subfilter_mode is LZMA_SUBFILTER_RUN, the application may |
169 | * set subfilter_mode to LZMA_SUBFILTER_FINISH. All the input |
170 | * currently available will be encoded before unsetting the |
171 | * Subfilter. Application must not change the amount of available |
172 | * input until the Subfilter has finished. Once the Subfilter has |
173 | * finished, liblzma will set subfilter_mode to LZMA_SUBFILTER_NONE. |
174 | * |
175 | * If the intent is to have Subfilter enabled to the very end of |
176 | * the data, it is not needed to separately disable Subfilter with |
177 | * LZMA_SUBFILTER_FINISH. Using LZMA_FINISH as the second argument |
178 | * of lzma_code() will make the Subblock encoder to disable the |
179 | * Subfilter once all the data has been ran through the Subfilter. |
180 | * |
181 | * After the first call with LZMA_SYNC_FLUSH or LZMA_FINISH, the |
182 | * application must not change subfilter_mode until LZMA_STREAM_END. |
183 | * Setting LZMA_SUBFILTER_SET/LZMA_SUBFILTER_FINISH and |
184 | * LZMA_SYNC_FLUSH/LZMA_FINISH _at the same time_ is fine. |
185 | * |
186 | * \note This variable is ignored if allow_subfilters is false. |
187 | */ |
188 | lzma_subfilter_mode subfilter_mode; |
189 | |
190 | /** |
191 | * \brief Subfilter and its options |
192 | * |
193 | * When no Subfilter is used, the data is copied as is into Subblocks. |
194 | * Setting a Subfilter allows encoding some parts of the data with |
195 | * an additional filter. It is possible to many different Subfilters |
196 | * in the same Block, although only one can be used at once. |
197 | * |
198 | * \note This variable is ignored if allow_subfilters is false. |
199 | */ |
200 | lzma_filter subfilter_options; |
201 | |
202 | } lzma_options_subblock; |
203 | |