liblzma: Use LZMA1EXT feature in lzma_microlzma_decoder().

Here too this avoids the slightly ugly method to set
the uncompressed size.

Also moved the setting of dict_size to the struct initializer.
This commit is contained in:
Lasse Collin 2022-11-28 10:48:53 +02:00
parent e310e8b6a4
commit cee8320646
1 changed files with 8 additions and 7 deletions

View File

@ -80,10 +80,17 @@ microlzma_decode(void *coder_ptr, const lzma_allocator *allocator,
return LZMA_OK;
lzma_options_lzma options = {
.dict_size = coder->dict_size,
.preset_dict = NULL,
.preset_dict_size = 0,
.ext_flags = 0, // EOPM not allowed when size is known
.ext_size_low = UINT32_MAX, // Unknown size by default
.ext_size_high = UINT32_MAX,
};
if (coder->uncomp_size_is_exact)
lzma_set_ext_size(options, coder->uncomp_size);
// The properties are stored as bitwise-negation
// of the typical encoding.
if (lzma_lzma_lclppb_decode(&options, ~in[*in_pos]))
@ -92,10 +99,9 @@ microlzma_decode(void *coder_ptr, const lzma_allocator *allocator,
++*in_pos;
// Initialize the decoder.
options.dict_size = coder->dict_size;
lzma_filter_info filters[2] = {
{
.id = LZMA_FILTER_LZMA1,
.id = LZMA_FILTER_LZMA1EXT,
.init = &lzma_lzma_decoder_init,
.options = &options,
}, {
@ -106,11 +112,6 @@ microlzma_decode(void *coder_ptr, const lzma_allocator *allocator,
return_if_error(lzma_next_filter_init(&coder->lzma,
allocator, filters));
// Use a hack to set the uncompressed size.
if (coder->uncomp_size_is_exact)
lzma_lz_decoder_uncompressed(coder->lzma.coder,
coder->uncomp_size, false);
// Pass one dummy 0x00 byte to the LZMA decoder since that
// is what it expects the first byte to be.
const uint8_t dummy_in = 0;