1 | /** |
2 | * \file lzma/filter.h |
3 | * \brief Common filter related types and functions |
4 | */ |
5 | |
6 | /* |
7 | * Author: Lasse Collin |
8 | * |
9 | * This file has been put into the public domain. |
10 | * You can do whatever you want with this file. |
11 | * |
12 | * See ../lzma.h for information about liblzma as a whole. |
13 | */ |
14 | |
15 | #ifndef LZMA_H_INTERNAL |
16 | # error Never include this file directly. Use <lzma.h> instead. |
17 | #endif |
18 | |
19 | |
20 | /** |
21 | * \brief Maximum number of filters in a chain |
22 | * |
23 | * A filter chain can have 1-4 filters, of which three are allowed to change |
24 | * the size of the data. Usually only one or two filters are needed. |
25 | */ |
26 | #define LZMA_FILTERS_MAX 4 |
27 | |
28 | |
29 | /** |
30 | * \brief Filter options |
31 | * |
32 | * This structure is used to pass Filter ID and a pointer filter's |
33 | * options to liblzma. A few functions work with a single lzma_filter |
34 | * structure, while most functions expect a filter chain. |
35 | * |
36 | * A filter chain is indicated with an array of lzma_filter structures. |
37 | * The array is terminated with .id = LZMA_VLI_UNKNOWN. Thus, the filter |
38 | * array must have LZMA_FILTERS_MAX + 1 elements (that is, five) to |
39 | * be able to hold any arbitrary filter chain. This is important when |
40 | * using lzma_block_header_decode() from block.h, because too small |
41 | * array would make liblzma write past the end of the filters array. |
42 | */ |
43 | typedef struct { |
44 | /** |
45 | * \brief Filter ID |
46 | * |
47 | * Use constants whose name begin with `LZMA_FILTER_' to specify |
48 | * different filters. In an array of lzma_filter structures, use |
49 | * LZMA_VLI_UNKNOWN to indicate end of filters. |
50 | * |
51 | * \note This is not an enum, because on some systems enums |
52 | * cannot be 64-bit. |
53 | */ |
54 | lzma_vli id; |
55 | |
56 | /** |
57 | * \brief Pointer to filter-specific options structure |
58 | * |
59 | * If the filter doesn't need options, set this to NULL. If id is |
60 | * set to LZMA_VLI_UNKNOWN, options is ignored, and thus |
61 | * doesn't need be initialized. |
62 | */ |
63 | void *options; |
64 | |
65 | } lzma_filter; |
66 | |
67 | |
68 | /** |
69 | * \brief Test if the given Filter ID is supported for encoding |
70 | * |
71 | * Return true if the give Filter ID is supported for encoding by this |
72 | * liblzma build. Otherwise false is returned. |
73 | * |
74 | * There is no way to list which filters are available in this particular |
75 | * liblzma version and build. It would be useless, because the application |
76 | * couldn't know what kind of options the filter would need. |
77 | */ |
78 | extern LZMA_API(lzma_bool) lzma_filter_encoder_is_supported(lzma_vli id) |
79 | lzma_nothrow lzma_attr_const; |
80 | |
81 | |
82 | /** |
83 | * \brief Test if the given Filter ID is supported for decoding |
84 | * |
85 | * Return true if the give Filter ID is supported for decoding by this |
86 | * liblzma build. Otherwise false is returned. |
87 | */ |
88 | extern LZMA_API(lzma_bool) lzma_filter_decoder_is_supported(lzma_vli id) |
89 | lzma_nothrow lzma_attr_const; |
90 | |
91 | |
92 | /** |
93 | * \brief Copy the filters array |
94 | * |
95 | * Copy the Filter IDs and filter-specific options from src to dest. |
96 | * Up to LZMA_FILTERS_MAX filters are copied, plus the terminating |
97 | * .id == LZMA_VLI_UNKNOWN. Thus, dest should have at least |
98 | * LZMA_FILTERS_MAX + 1 elements space unless the caller knows that |
99 | * src is smaller than that. |
100 | * |
101 | * Unless the filter-specific options is NULL, the Filter ID has to be |
102 | * supported by liblzma, because liblzma needs to know the size of every |
103 | * filter-specific options structure. The filter-specific options are not |
104 | * validated. If options is NULL, any unsupported Filter IDs are copied |
105 | * without returning an error. |
106 | * |
107 | * Old filter-specific options in dest are not freed, so dest doesn't |
108 | * need to be initialized by the caller in any way. |
109 | * |
110 | * If an error occurs, memory possibly already allocated by this function |
111 | * is always freed. |
112 | * |
113 | * \return - LZMA_OK |
114 | * - LZMA_MEM_ERROR |
115 | * - LZMA_OPTIONS_ERROR: Unsupported Filter ID and its options |
116 | * is not NULL. |
117 | * - LZMA_PROG_ERROR: src or dest is NULL. |
118 | */ |
119 | extern LZMA_API(lzma_ret) lzma_filters_copy( |
120 | const lzma_filter *src, lzma_filter *dest, |
121 | const lzma_allocator *allocator) lzma_nothrow; |
122 | |
123 | |
124 | /** |
125 | * \brief Calculate approximate memory requirements for raw encoder |
126 | * |
127 | * This function can be used to calculate the memory requirements for |
128 | * Block and Stream encoders too because Block and Stream encoders don't |
129 | * need significantly more memory than raw encoder. |
130 | * |
131 | * \param filters Array of filters terminated with |
132 | * .id == LZMA_VLI_UNKNOWN. |
133 | * |
134 | * \return Number of bytes of memory required for the given |
135 | * filter chain when encoding. If an error occurs, |
136 | * for example due to unsupported filter chain, |
137 | * UINT64_MAX is returned. |
138 | */ |
139 | extern LZMA_API(uint64_t) lzma_raw_encoder_memusage(const lzma_filter *filters) |
140 | lzma_nothrow lzma_attr_pure; |
141 | |
142 | |
143 | /** |
144 | * \brief Calculate approximate memory requirements for raw decoder |
145 | * |
146 | * This function can be used to calculate the memory requirements for |
147 | * Block and Stream decoders too because Block and Stream decoders don't |
148 | * need significantly more memory than raw decoder. |
149 | * |
150 | * \param filters Array of filters terminated with |
151 | * .id == LZMA_VLI_UNKNOWN. |
152 | * |
153 | * \return Number of bytes of memory required for the given |
154 | * filter chain when decoding. If an error occurs, |
155 | * for example due to unsupported filter chain, |
156 | * UINT64_MAX is returned. |
157 | */ |
158 | extern LZMA_API(uint64_t) lzma_raw_decoder_memusage(const lzma_filter *filters) |
159 | lzma_nothrow lzma_attr_pure; |
160 | |
161 | |
162 | /** |
163 | * \brief Initialize raw encoder |
164 | * |
165 | * This function may be useful when implementing custom file formats. |
166 | * |
167 | * \param strm Pointer to properly prepared lzma_stream |
168 | * \param filters Array of lzma_filter structures. The end of the |
169 | * array must be marked with .id = LZMA_VLI_UNKNOWN. |
170 | * |
171 | * The `action' with lzma_code() can be LZMA_RUN, LZMA_SYNC_FLUSH (if the |
172 | * filter chain supports it), or LZMA_FINISH. |
173 | * |
174 | * \return - LZMA_OK |
175 | * - LZMA_MEM_ERROR |
176 | * - LZMA_OPTIONS_ERROR |
177 | * - LZMA_PROG_ERROR |
178 | */ |
179 | extern LZMA_API(lzma_ret) lzma_raw_encoder( |
180 | lzma_stream *strm, const lzma_filter *filters) |
181 | lzma_nothrow lzma_attr_warn_unused_result; |
182 | |
183 | |
184 | /** |
185 | * \brief Initialize raw decoder |
186 | * |
187 | * The initialization of raw decoder goes similarly to raw encoder. |
188 | * |
189 | * The `action' with lzma_code() can be LZMA_RUN or LZMA_FINISH. Using |
190 | * LZMA_FINISH is not required, it is supported just for convenience. |
191 | * |
192 | * \return - LZMA_OK |
193 | * - LZMA_MEM_ERROR |
194 | * - LZMA_OPTIONS_ERROR |
195 | * - LZMA_PROG_ERROR |
196 | */ |
197 | extern LZMA_API(lzma_ret) lzma_raw_decoder( |
198 | lzma_stream *strm, const lzma_filter *filters) |
199 | lzma_nothrow lzma_attr_warn_unused_result; |
200 | |
201 | |
202 | /** |
203 | * \brief Update the filter chain in the encoder |
204 | * |
205 | * This function is for advanced users only. This function has two slightly |
206 | * different purposes: |
207 | * |
208 | * - After LZMA_FULL_FLUSH when using Stream encoder: Set a new filter |
209 | * chain, which will be used starting from the next Block. |
210 | * |
211 | * - After LZMA_SYNC_FLUSH using Raw, Block, or Stream encoder: Change |
212 | * the filter-specific options in the middle of encoding. The actual |
213 | * filters in the chain (Filter IDs) cannot be changed. In the future, |
214 | * it might become possible to change the filter options without |
215 | * using LZMA_SYNC_FLUSH. |
216 | * |
217 | * While rarely useful, this function may be called also when no data has |
218 | * been compressed yet. In that case, this function will behave as if |
219 | * LZMA_FULL_FLUSH (Stream encoder) or LZMA_SYNC_FLUSH (Raw or Block |
220 | * encoder) had been used right before calling this function. |
221 | * |
222 | * \return - LZMA_OK |
223 | * - LZMA_MEM_ERROR |
224 | * - LZMA_MEMLIMIT_ERROR |
225 | * - LZMA_OPTIONS_ERROR |
226 | * - LZMA_PROG_ERROR |
227 | */ |
228 | extern LZMA_API(lzma_ret) lzma_filters_update( |
229 | lzma_stream *strm, const lzma_filter *filters) lzma_nothrow; |
230 | |
231 | |
232 | /** |
233 | * \brief Single-call raw encoder |
234 | * |
235 | * \param filters Array of lzma_filter structures. The end of the |
236 | * array must be marked with .id = LZMA_VLI_UNKNOWN. |
237 | * \param allocator lzma_allocator for custom allocator functions. |
238 | * Set to NULL to use malloc() and free(). |
239 | * \param in Beginning of the input buffer |
240 | * \param in_size Size of the input buffer |
241 | * \param out Beginning of the output buffer |
242 | * \param out_pos The next byte will be written to out[*out_pos]. |
243 | * *out_pos is updated only if encoding succeeds. |
244 | * \param out_size Size of the out buffer; the first byte into |
245 | * which no data is written to is out[out_size]. |
246 | * |
247 | * \return - LZMA_OK: Encoding was successful. |
248 | * - LZMA_BUF_ERROR: Not enough output buffer space. |
249 | * - LZMA_OPTIONS_ERROR |
250 | * - LZMA_MEM_ERROR |
251 | * - LZMA_DATA_ERROR |
252 | * - LZMA_PROG_ERROR |
253 | * |
254 | * \note There is no function to calculate how big output buffer |
255 | * would surely be big enough. (lzma_stream_buffer_bound() |
256 | * works only for lzma_stream_buffer_encode(); raw encoder |
257 | * won't necessarily meet that bound.) |
258 | */ |
259 | extern LZMA_API(lzma_ret) lzma_raw_buffer_encode( |
260 | const lzma_filter *filters, const lzma_allocator *allocator, |
261 | const uint8_t *in, size_t in_size, uint8_t *out, |
262 | size_t *out_pos, size_t out_size) lzma_nothrow; |
263 | |
264 | |
265 | /** |
266 | * \brief Single-call raw decoder |
267 | * |
268 | * \param filters Array of lzma_filter structures. The end of the |
269 | * array must be marked with .id = LZMA_VLI_UNKNOWN. |
270 | * \param allocator lzma_allocator for custom allocator functions. |
271 | * Set to NULL to use malloc() and free(). |
272 | * \param in Beginning of the input buffer |
273 | * \param in_pos The next byte will be read from in[*in_pos]. |
274 | * *in_pos is updated only if decoding succeeds. |
275 | * \param in_size Size of the input buffer; the first byte that |
276 | * won't be read is in[in_size]. |
277 | * \param out Beginning of the output buffer |
278 | * \param out_pos The next byte will be written to out[*out_pos]. |
279 | * *out_pos is updated only if encoding succeeds. |
280 | * \param out_size Size of the out buffer; the first byte into |
281 | * which no data is written to is out[out_size]. |
282 | */ |
283 | extern LZMA_API(lzma_ret) lzma_raw_buffer_decode( |
284 | const lzma_filter *filters, const lzma_allocator *allocator, |
285 | const uint8_t *in, size_t *in_pos, size_t in_size, |
286 | uint8_t *out, size_t *out_pos, size_t out_size) lzma_nothrow; |
287 | |
288 | |
289 | /** |
290 | * \brief Get the size of the Filter Properties field |
291 | * |
292 | * This function may be useful when implementing custom file formats |
293 | * using the raw encoder and decoder. |
294 | * |
295 | * \param size Pointer to uint32_t to hold the size of the properties |
296 | * \param filter Filter ID and options (the size of the properties may |
297 | * vary depending on the options) |
298 | * |
299 | * \return - LZMA_OK |
300 | * - LZMA_OPTIONS_ERROR |
301 | * - LZMA_PROG_ERROR |
302 | * |
303 | * \note This function validates the Filter ID, but does not |
304 | * necessarily validate the options. Thus, it is possible |
305 | * that this returns LZMA_OK while the following call to |
306 | * lzma_properties_encode() returns LZMA_OPTIONS_ERROR. |
307 | */ |
308 | extern LZMA_API(lzma_ret) lzma_properties_size( |
309 | uint32_t *size, const lzma_filter *filter) lzma_nothrow; |
310 | |
311 | |
312 | /** |
313 | * \brief Encode the Filter Properties field |
314 | * |
315 | * \param filter Filter ID and options |
316 | * \param props Buffer to hold the encoded options. The size of |
317 | * buffer must have been already determined with |
318 | * lzma_properties_size(). |
319 | * |
320 | * \return - LZMA_OK |
321 | * - LZMA_OPTIONS_ERROR |
322 | * - LZMA_PROG_ERROR |
323 | * |
324 | * \note Even this function won't validate more options than actually |
325 | * necessary. Thus, it is possible that encoding the properties |
326 | * succeeds but using the same options to initialize the encoder |
327 | * will fail. |
328 | * |
329 | * \note If lzma_properties_size() indicated that the size |
330 | * of the Filter Properties field is zero, calling |
331 | * lzma_properties_encode() is not required, but it |
332 | * won't do any harm either. |
333 | */ |
334 | extern LZMA_API(lzma_ret) lzma_properties_encode( |
335 | const lzma_filter *filter, uint8_t *props) lzma_nothrow; |
336 | |
337 | |
338 | /** |
339 | * \brief Decode the Filter Properties field |
340 | * |
341 | * \param filter filter->id must have been set to the correct |
342 | * Filter ID. filter->options doesn't need to be |
343 | * initialized (it's not freed by this function). The |
344 | * decoded options will be stored in filter->options; |
345 | * it's application's responsibility to free it when |
346 | * appropriate. filter->options is set to NULL if |
347 | * there are no properties or if an error occurs. |
348 | * \param allocator Custom memory allocator used to allocate the |
349 | * options. Set to NULL to use the default malloc(), |
350 | * and in case of an error, also free(). |
351 | * \param props Input buffer containing the properties. |
352 | * \param props_size Size of the properties. This must be the exact |
353 | * size; giving too much or too little input will |
354 | * return LZMA_OPTIONS_ERROR. |
355 | * |
356 | * \return - LZMA_OK |
357 | * - LZMA_OPTIONS_ERROR |
358 | * - LZMA_MEM_ERROR |
359 | */ |
360 | extern LZMA_API(lzma_ret) lzma_properties_decode( |
361 | lzma_filter *filter, const lzma_allocator *allocator, |
362 | const uint8_t *props, size_t props_size) lzma_nothrow; |
363 | |
364 | |
365 | /** |
366 | * \brief Calculate encoded size of a Filter Flags field |
367 | * |
368 | * Knowing the size of Filter Flags is useful to know when allocating |
369 | * memory to hold the encoded Filter Flags. |
370 | * |
371 | * \param size Pointer to integer to hold the calculated size |
372 | * \param filter Filter ID and associated options whose encoded |
373 | * size is to be calculated |
374 | * |
375 | * \return - LZMA_OK: *size set successfully. Note that this doesn't |
376 | * guarantee that filter->options is valid, thus |
377 | * lzma_filter_flags_encode() may still fail. |
378 | * - LZMA_OPTIONS_ERROR: Unknown Filter ID or unsupported options. |
379 | * - LZMA_PROG_ERROR: Invalid options |
380 | * |
381 | * \note If you need to calculate size of List of Filter Flags, |
382 | * you need to loop over every lzma_filter entry. |
383 | */ |
384 | extern LZMA_API(lzma_ret) lzma_filter_flags_size( |
385 | uint32_t *size, const lzma_filter *filter) |
386 | lzma_nothrow lzma_attr_warn_unused_result; |
387 | |
388 | |
389 | /** |
390 | * \brief Encode Filter Flags into given buffer |
391 | * |
392 | * In contrast to some functions, this doesn't allocate the needed buffer. |
393 | * This is due to how this function is used internally by liblzma. |
394 | * |
395 | * \param filter Filter ID and options to be encoded |
396 | * \param out Beginning of the output buffer |
397 | * \param out_pos out[*out_pos] is the next write position. This |
398 | * is updated by the encoder. |
399 | * \param out_size out[out_size] is the first byte to not write. |
400 | * |
401 | * \return - LZMA_OK: Encoding was successful. |
402 | * - LZMA_OPTIONS_ERROR: Invalid or unsupported options. |
403 | * - LZMA_PROG_ERROR: Invalid options or not enough output |
404 | * buffer space (you should have checked it with |
405 | * lzma_filter_flags_size()). |
406 | */ |
407 | extern LZMA_API(lzma_ret) lzma_filter_flags_encode(const lzma_filter *filter, |
408 | uint8_t *out, size_t *out_pos, size_t out_size) |
409 | lzma_nothrow lzma_attr_warn_unused_result; |
410 | |
411 | |
412 | /** |
413 | * \brief Decode Filter Flags from given buffer |
414 | * |
415 | * The decoded result is stored into *filter. The old value of |
416 | * filter->options is not free()d. |
417 | * |
418 | * \return - LZMA_OK |
419 | * - LZMA_OPTIONS_ERROR |
420 | * - LZMA_MEM_ERROR |
421 | * - LZMA_PROG_ERROR |
422 | */ |
423 | extern LZMA_API(lzma_ret) lzma_filter_flags_decode( |
424 | lzma_filter *filter, const lzma_allocator *allocator, |
425 | const uint8_t *in, size_t *in_pos, size_t in_size) |
426 | lzma_nothrow lzma_attr_warn_unused_result; |
427 | |