diff --git a/write.c b/write.c index e710d0a..e8186de 100644 --- a/write.c +++ b/write.c @@ -47,7 +47,7 @@ static archive_read_callback tar_read; static archive_open_callback tar_ok; static archive_close_callback tar_ok; -static void block_init(lzma_block *block); +static void block_init(lzma_block *block, size_t insize); static void stream_edge(lzma_vli backward_size); static void write_block(pipeline_item_t *pi); static void encode_index(void); @@ -255,11 +255,11 @@ static void encode_thread(size_t thnum) { debug("encoder %zu: received %zu", thnum, pi->seq); io_block_t *ib = (io_block_t*)(pi->data); - block_init(&ib->block); - if (lzma_block_header_encode(&ib->block, ib->output) != LZMA_OK) - die("Error encoding block header"); - ib->outsize = ib->block.header_size; - + block_init(&ib->block, ib->insize); + size_t header_size = ib->block.header_size; + ib->block.uncompressed_size = LZMA_VLI_UNKNOWN; + ib->outsize = header_size; + if (lzma_block_encoder(&stream, &ib->block) != LZMA_OK) die("Error creating block encoder"); stream.next_in = ib->input; @@ -275,7 +275,10 @@ static void encode_thread(size_t thnum) { } ib->outsize = stream.next_out - ib->output; - debug("encoder %zu: sending %zu", thnum, pi->seq); + if (lzma_block_header_encode(&ib->block, ib->output) != LZMA_OK) + die("Error encoding block header"); + + debug("encoder %zu: sending %zu", thnum, pi->seq); queue_push(gPipelineMergeQ, PIPELINE_ITEM, pi); } @@ -285,12 +288,13 @@ static void encode_thread(size_t thnum) { #pragma mark WRITING -static void block_init(lzma_block *block) { +static void block_init(lzma_block *block, size_t insize) { block->version = 0; block->check = CHECK; block->filters = gFilters; - block->compressed_size = block->uncompressed_size = LZMA_VLI_UNKNOWN; - + block->uncompressed_size = insize ? insize : LZMA_VLI_UNKNOWN; + block->compressed_size = insize? gBlockOutSize : LZMA_VLI_UNKNOWN; + if (lzma_block_header_size(block) != LZMA_OK) die("Error getting block header size"); } @@ -355,7 +359,7 @@ static void encode_index(void) { static void write_file_index(void) { lzma_block block; - block_init(&block); + block_init(&block, 0); uint8_t hdrbuf[block.header_size]; if (lzma_block_header_encode(&block, hdrbuf) != LZMA_OK) die("Error encoding file index header");