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 */
43typedef 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 */
78extern 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 */
88extern 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 */
119extern 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 */
139extern 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 */
158extern 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 */
179extern 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 */
197extern 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 */
228extern 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 */
259extern 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 */
283extern 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 */
308extern 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 */
334extern 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 to filter->options.
345 * filter->options is set to NULL if there are no
346 * properties or if an error occurs.
347 * \param allocator Custom memory allocator used to allocate the
348 * options. Set to NULL to use the default malloc(),
349 * and in case of an error, also free().
350 * \param props Input buffer containing the properties.
351 * \param props_size Size of the properties. This must be the exact
352 * size; giving too much or too little input will
353 * return LZMA_OPTIONS_ERROR.
354 *
355 * \return - LZMA_OK
356 * - LZMA_OPTIONS_ERROR
357 * - LZMA_MEM_ERROR
358 */
359extern LZMA_API(lzma_ret) lzma_properties_decode(
360 lzma_filter *filter, const lzma_allocator *allocator,
361 const uint8_t *props, size_t props_size) lzma_nothrow;
362
363
364/**
365 * \brief Calculate encoded size of a Filter Flags field
366 *
367 * Knowing the size of Filter Flags is useful to know when allocating
368 * memory to hold the encoded Filter Flags.
369 *
370 * \param size Pointer to integer to hold the calculated size
371 * \param filter Filter ID and associated options whose encoded
372 * size is to be calculated
373 *
374 * \return - LZMA_OK: *size set successfully. Note that this doesn't
375 * guarantee that filter->options is valid, thus
376 * lzma_filter_flags_encode() may still fail.
377 * - LZMA_OPTIONS_ERROR: Unknown Filter ID or unsupported options.
378 * - LZMA_PROG_ERROR: Invalid options
379 *
380 * \note If you need to calculate size of List of Filter Flags,
381 * you need to loop over every lzma_filter entry.
382 */
383extern LZMA_API(lzma_ret) lzma_filter_flags_size(
384 uint32_t *size, const lzma_filter *filter)
385 lzma_nothrow lzma_attr_warn_unused_result;
386
387
388/**
389 * \brief Encode Filter Flags into given buffer
390 *
391 * In contrast to some functions, this doesn't allocate the needed buffer.
392 * This is due to how this function is used internally by liblzma.
393 *
394 * \param filter Filter ID and options to be encoded
395 * \param out Beginning of the output buffer
396 * \param out_pos out[*out_pos] is the next write position. This
397 * is updated by the encoder.
398 * \param out_size out[out_size] is the first byte to not write.
399 *
400 * \return - LZMA_OK: Encoding was successful.
401 * - LZMA_OPTIONS_ERROR: Invalid or unsupported options.
402 * - LZMA_PROG_ERROR: Invalid options or not enough output
403 * buffer space (you should have checked it with
404 * lzma_filter_flags_size()).
405 */
406extern LZMA_API(lzma_ret) lzma_filter_flags_encode(const lzma_filter *filter,
407 uint8_t *out, size_t *out_pos, size_t out_size)
408 lzma_nothrow lzma_attr_warn_unused_result;
409
410
411/**
412 * \brief Decode Filter Flags from given buffer
413 *
414 * The decoded result is stored into *filter. The old value of
415 * filter->options is not free()d.
416 *
417 * \return - LZMA_OK
418 * - LZMA_OPTIONS_ERROR
419 * - LZMA_MEM_ERROR
420 * - LZMA_PROG_ERROR
421 */
422extern LZMA_API(lzma_ret) lzma_filter_flags_decode(
423 lzma_filter *filter, const lzma_allocator *allocator,
424 const uint8_t *in, size_t *in_pos, size_t in_size)
425 lzma_nothrow lzma_attr_warn_unused_result;
426