src/liblzma/api/lzma/block.h File Reference

.xz Block handling More...

Data Structures

struct  lzma_block
 Options for the Block and Block Header encoders and decoders. More...

Defines

#define LZMA_BLOCK_HEADER_SIZE_MIN   8
#define LZMA_BLOCK_HEADER_SIZE_MAX   1024
#define lzma_block_header_size_decode(b)   (((uint32_t)(b) + 1) * 4)
 Decode the Block Header Size field.

Functions

 LZMA_API (lzma_ret) lzma_block_header_size(lzma_block *block) lzma_attr_warn_unused_result
 Calculate Block Header Size.
 LZMA_API (lzma_vli) lzma_block_unpadded_size(const lzma_block *block) lzma_attr_pure
 Calculate Unpadded Size.
 LZMA_API (size_t) lzma_block_buffer_bound(size_t uncompressed_size)
 Calculate maximum output buffer size for single-call encoding.

Variables

uint8_t *out lzma_attr_warn_unused_result
lzma_allocatorallocator
lzma_allocator const uint8_t * in
lzma_allocator const uint8_t size_t in_size
lzma_allocator const uint8_t
size_t uint8_t * 
out
lzma_allocator const uint8_t
size_t uint8_t size_t * 
out_pos
lzma_allocator const uint8_t
size_t * 
in_pos
lzma_allocator const uint8_t
size_t size_t uint8_t size_t
size_t 
out_size

Detailed Description

.xz Block handling

Author:
Copyright (C) 1999-2006 Igor Pavlov
Copyright (C) 2007 Lasse Collin

This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.


Define Documentation

#define lzma_block_header_size_decode (  )     (((uint32_t)(b) + 1) * 4)

Decode the Block Header Size field.

To decode Block Header using lzma_block_header_decode(), the size of the Block Header has to be known and stored into lzma_block.header_size. The size can be calculated from the first byte of a Block using this macro. Note that if the first byte is 0x00, it indicates beginning of Index; use this macro only when the byte is not 0x00.

There is no encoding macro, because Block Header encoder is enough for that.


Function Documentation

LZMA_API ( lzma_ret   ) 

Calculate Block Header Size.

Single-call .xz Block decoder.

Single-call .xz Block encoder.

Initialize .xz Block decoder.

Initialize .xz Block encoder.

Validate and set Compressed Size according to Unpadded Size.

Decode Block Header.

Encode Block Header.

Calculate the minimum size needed for the Block Header field using the settings specified in the lzma_block structure. Note that it is OK to increase the calculated header_size value as long as it is a multiple of four and doesn't exceed LZMA_BLOCK_HEADER_SIZE_MAX. Increasing header_size just means that lzma_block_header_encode() will add Header Padding.

Returns:
- LZMA_OK: Size calculated successfully and stored to block->header_size.
  • LZMA_OPTIONS_ERROR: Unsupported version, filters or filter options.
  • LZMA_PROG_ERROR: Invalid values like compressed_size == 0.
Note:
This doesn't check that all the options are valid i.e. this may return LZMA_OK even if lzma_block_header_encode() or lzma_block_encoder() would fail. If you want to validate the filter chain, consider using lzma_memlimit_encoder() which as a side-effect validates the filter chain.

The caller must have calculated the size of the Block Header already with lzma_block_header_size(). If larger value than the one calculated by lzma_block_header_size() is used, the Block Header will be padded to the specified size.

Parameters:
out Beginning of the output buffer. This must be at least block->header_size bytes.
block Block options to be encoded.
Returns:
- LZMA_OK: Encoding was successful. block->header_size bytes were written to output buffer.
  • LZMA_OPTIONS_ERROR: Invalid or unsupported options.
  • LZMA_PROG_ERROR: Invalid arguments, for example block->header_size is invalid or block->filters is NULL.

The size of the Block Header must have already been decoded with lzma_block_header_size_decode() macro and stored to block->header_size. block->filters must have been allocated, but not necessarily initialized. Possible existing filter options are _not_ freed.

Parameters:
block Destination for block options with header_size properly initialized.
allocator lzma_allocator for custom allocator functions. Set to NULL to use malloc() (and also free() if an error occurs).
in Beginning of the input buffer. This must be at least block->header_size bytes.
Returns:
- LZMA_OK: Decoding was successful. block->header_size bytes were read from the input buffer.
  • LZMA_OPTIONS_ERROR: The Block Header specifies some unsupported options such as unsupported filters.
  • LZMA_DATA_ERROR: Block Header is corrupt, for example, the CRC32 doesn't match.
  • LZMA_PROG_ERROR: Invalid arguments, for example block->header_size is invalid or block->filters is NULL.

Block Header stores Compressed Size, but Index has Unpadded Size. If the application has already parsed the Index and is now decoding Blocks, it can calculate Compressed Size from Unpadded Size. This function does exactly that with error checking:

  • Compressed Size calculated from Unpadded Size must be positive integer, that is, Unpadded Size must be big enough that after Block Header and Check fields there's still at least one byte for Compressed Size.
  • If Compressed Size was present in Block Header, the new value calculated from Unpadded Size is compared against the value from Block Header.
Note:
This function must be called _after_ decoding the Block Header field so that it can properly validate Compressed Size if it was present in Block Header.
Returns:
- LZMA_OK: block->compressed_size was set successfully.
  • LZMA_DATA_ERROR: unpadded_size is too small compared to block->header_size and lzma_check_size(block->check).
  • LZMA_PROG_ERROR: Some values are invalid. For example, block->header_size must be a multiple of four and between 8 and 1024 inclusive.

Valid actions for lzma_code() are LZMA_RUN, LZMA_SYNC_FLUSH (only if the filter chain supports it), and LZMA_FINISH.

Returns:
- LZMA_OK: All good, continue with lzma_code().
  • LZMA_MEM_ERROR
  • LZMA_OPTIONS_ERROR
  • LZMA_UNSUPPORTED_CHECK: block->check specfies a Check ID that is not supported by this buid of liblzma. Initializing the encoder failed.
  • LZMA_PROG_ERROR

Valid actions for lzma_code() are LZMA_RUN and LZMA_FINISH. Using LZMA_FINISH is not required. It is supported only for convenience.

Returns:
- LZMA_OK: All good, continue with lzma_code().
  • LZMA_UNSUPPORTED_CHECK: Initialization was successful, but the given Check ID is not supported, thus Check will be ignored.
  • LZMA_PROG_ERROR
  • LZMA_MEM_ERROR

In contrast to the multi-call encoder initialized with lzma_block_encoder(), this function encodes also the Block Header. This is required to make it possible to write appropriate Block Header also in case the data isn't compressible, and different filter chain has to be used to encode the data in uncompressed form using uncompressed chunks of the LZMA2 filter.

When the data isn't compressible, header_size, compressed_size, and uncompressed_size are set just like when the data was compressible, but it is possible that header_size is too small to hold the filter chain specified in block->filters, because that isn't necessarily the filter chain that was actually used to encode the data. lzma_block_unpadded_size() still works normally, because it doesn't read the filters array.

Parameters:
block Block options: block->version, block->check, and block->filters must be initialized.
allocator lzma_allocator for custom allocator functions. Set to NULL to use malloc() and free().
in Beginning of the input buffer
in_size Size of the input buffer
out Beginning of the output buffer
out_pos The next byte will be written to out[*out_pos]. *out_pos is updated only if encoding succeeds.
out_size Size of the out buffer; the first byte into which no data is written to is out[out_size].
Returns:
- LZMA_OK: Encoding was successful.
  • LZMA_BUF_ERROR: Not enough output buffer space.
  • LZMA_OPTIONS_ERROR
  • LZMA_MEM_ERROR
  • LZMA_DATA_ERROR
  • LZMA_PROG_ERROR

This is single-call equivalent of lzma_block_decoder(), and requires that the caller has already decoded Block Header and checked its memory usage.

Parameters:
block Block options just like with lzma_block_decoder().
allocator lzma_allocator for custom allocator functions. Set to NULL to use malloc() and free().
in Beginning of the input buffer
in_pos The next byte will be read from in[*in_pos]. *in_pos is updated only if decoding succeeds.
in_size Size of the input buffer; the first byte that won't be read is in[in_size].
out Beginning of the output buffer
out_pos The next byte will be written to out[*out_pos]. *out_pos is updated only if encoding succeeds.
out_size Size of the out buffer; the first byte into which no data is written to is out[out_size].
Returns:
- LZMA_OK: Decoding was successful.
  • LZMA_OPTIONS_ERROR
  • LZMA_DATA_ERROR
  • LZMA_MEM_ERROR
  • LZMA_BUF_ERROR: Output buffer was too small.
  • LZMA_PROG_ERROR
LZMA_API ( uint64_t   )  const

Calculate Unpadded Size.

Calculate the total encoded size of a Block.

The Index field stores Unpadded Size and Uncompressed Size. The latter can be taken directly from the lzma_block structure after coding a Block, but Unpadded Size needs to be calculated from Block Header Size, Compressed Size, and size of the Check field. This is where this function is needed.

Returns:
Unpadded Size on success, or zero on error.

This is equivalent to lzma_block_unpadded_size() except that the returned value includes the size of the Block Padding field.

Returns:
On success, total encoded size of the Block. On error, zero is returned.

Calculate Unpadded Size.

Get the memory usage of decoder filter chain.

Calculates CRC64 using the polynomial from the ECMA-182 standard.

This function is used similarly to lzma_crc32(). See its documentation.

LZMA_API ( size_t   ) 

Calculate maximum output buffer size for single-call encoding.

This is equivalent to lzma_stream_buffer_bound() but for .xz Blocks. See the documentation of lzma_stream_buffer_bound().


Generated on Tue Oct 6 14:02:22 2009 for XZ Utils by  doxygen 1.6.1