From 1c41147b73bf70ddff222d78b771346f34d0ce93 Mon Sep 17 00:00:00 2001 From: Gregor Weiss Date: Tue, 2 Jul 2024 17:58:41 +0200 Subject: [PATCH] resolved terminate_stream into shrink_to_fit and transfer_to_span. transferal of stream to span not required in assemble_codestream anymore. assemble_codestream and bwc_compress return the size of the compressed data. user provided buffer is used. --- include/library/private/bitstream.h | 6 +- include/library/private/codestream.h | 2 +- include/library/private/libbwc.h | 2 +- src/library/bitstream.c | 94 ++++++++++++++-------------- src/library/codestream.c | 26 +++----- src/library/libbwc.c | 21 ++++--- src/library/tier2.c | 7 ++- 7 files changed, 76 insertions(+), 82 deletions(-) diff --git a/include/library/private/bitstream.h b/include/library/private/bitstream.h index 42f6763..1e8aacc 100755 --- a/include/library/private/bitstream.h +++ b/include/library/private/bitstream.h @@ -117,8 +117,10 @@ //==========|==========================|======================|======|======|===================== uchar get_bit (bitstream *const stream); //==========|==========================|======================|======|======|===================== - uchar terminate_stream (bitstream *stream, - bwc_span *const packed_stream); + uchar shrink_to_fit (bitstream *const stream); + //==========|==========================|======================|======|======|===================== + uchar transfer_to_span (bitstream *const stream, + bwc_span *const span); //==========|==========================|======================|======|======|===================== void release_packed_stream (bwc_span *const stream); #endif diff --git a/include/library/private/codestream.h b/include/library/private/codestream.h index 6165760..e7f54fc 100755 --- a/include/library/private/codestream.h +++ b/include/library/private/codestream.h @@ -97,7 +97,7 @@ uchar codestream_write_com (bwc_span *const header, bwc_span *const com); //==========|==========================|======================|======|======|===================== - bwc_span* assemble_codestream (bwc_codec *const codec, + size_t assemble_codestream (bwc_codec *const codec, bwc_stream *const stream); //==========|==========================|======================|======|======|===================== bwc_codec* parse_codestream (bwc_codec *const codec, diff --git a/include/library/private/libbwc.h b/include/library/private/libbwc.h index 7becb04..7c65f6d 100755 --- a/include/library/private/libbwc.h +++ b/include/library/private/libbwc.h @@ -149,7 +149,7 @@ bwc_stream *const data, char *const rate_control); //==========|==========================|======================|======|=======|==================== - uchar bwc_compress (bwc_codec *const field, + size_t bwc_compress (bwc_codec *const field, bwc_stream *const data); //==========|==========================|======================|======|=======|==================== uchar bwc_create_decompression (bwc_codec *const codec, diff --git a/src/library/bitstream.c b/src/library/bitstream.c index b023bdd..2780b65 100755 --- a/src/library/bitstream.c +++ b/src/library/bitstream.c @@ -798,74 +798,74 @@ flush_stream(bitstream *const stream) } /*----------------------------------------------------------------------------------------------------------*\ -! FUNCTION NAME: void *test(void) ! -! -------------- ! -! ! ! DESCRIPTION: ! ! ------------ ! -! DESCRIPTION NEEDED ! -! ! -! PARAMETERS: ! -! ----------- ! -! Variable Type Description ! -! -------- ---- ----------- ! -! - - - ! +! Shrinks the bitstream memory to the actually filled range. ! ! ! ! RETURN VALUE: ! ! ------------- ! -! Type Description ! -! ---- ----------- ! -! - - ! -! ! -! DEVELOPMENT HISTORY: ! -! -------------------- ! -! ! -! Date Author Change Id Release Description Of Change ! -! ---- ------ --------- ------- --------------------- ! -! - Patrick Vogler B87D120 V 0.1.0 function created ! +! Returns 0 if successfull and 1 if memory could not be resized. ! ! ! \*----------------------------------------------------------------------------------------------------------*/ uchar -terminate_stream(bitstream *stream, bwc_span *const packed_stream) +shrink_to_fit(bitstream *const stream) { /*-----------------------*\ ! DEFINE ASSERTIONS: ! \*-----------------------*/ assert(stream); - // TODO: this seems dangerous because the bitstream is generated from provided (non-owning) pointer or allocated (owning). - // If the former is the case a user might get reallocations on his/her pointer. - // This risk is eminent now as bwc_stream data.out is now a user provided buffer pointer. - if(packed_stream) + if(stream->error) { - if(stream->error) + return 1; + } + else if(stream->L > stream->Lmax) + { + stream->Lmax = stream->L; + stream->memory = realloc(stream->memory, stream->Lmax); + if(!stream->memory) { + // memory allocation error + fprintf(stderr, MEMERROR); + stream->Lmax = 0; return 1; } - else if(stream->L != stream->Lmax) - { - stream->Lmax = stream->L; - stream->memory = realloc(stream->memory, stream->Lmax); - if(!stream->memory) - { - // memory allocation error - fprintf(stderr, MEMERROR); - stream->Lmax = 0; - return 1; - } - } + } + return 0; +} - packed_stream->memory = stream->memory; - packed_stream->access = stream->memory; - packed_stream->size = stream->L; - packed_stream->position = 0; - } - else +/*----------------------------------------------------------------------------------------------------------*\ +! DESCRIPTION: ! +! ------------ ! +! Swap memory pointer and size to span. Invalidates stream pointers. ! +! ! +! RETURN VALUE: ! +! ------------- ! +! Returns 0 if successfull and 1 if stream had previous memory error. ! +! ! +\*----------------------------------------------------------------------------------------------------------*/ +uchar +transfer_to_span(bitstream *const stream, bwc_span *const span) +{ + /*-----------------------*\ + ! DEFINE ASSERTIONS: ! + \*-----------------------*/ + assert(stream); + assert(span); + + if(stream->error) { - free(stream->memory); + return 1; } - - free(stream); + + span->memory = stream->memory; + span->access = stream->memory; + span->size = stream->L; + span->position = 0; + + stream->memory = NULL; + stream->L = 0; + return 0; } diff --git a/src/library/codestream.c b/src/library/codestream.c index a8afd0e..48255fa 100755 --- a/src/library/codestream.c +++ b/src/library/codestream.c @@ -1335,12 +1335,13 @@ parse_body(bwc_codec *const field, bitstream *const stream) ! 13.06.2019 Patrick Vogler B87D120 V 0.1.0 function created ! ! ! \*----------------------------------------------------------------------------------------------------------*/ -bwc_span* +size_t assemble_codestream(bwc_codec *const field, bwc_stream *const data) { /*-----------------------*\ ! DEFINE INT VARIABLES: ! \*-----------------------*/ + size_t compressed_size; uint64 i; /*-----------------------*\ @@ -1349,7 +1350,6 @@ assemble_codestream(bwc_codec *const field, bwc_stream *const data) bwc_gl_ctrl *control; bwc_tile *tile; bitstream *stream; - bwc_span *packed_stream; /*-----------------------*\ ! DEFINE ASSERTIONS: ! @@ -1385,7 +1385,7 @@ assemble_codestream(bwc_codec *const field, bwc_stream *const data) \*--------------------------------------------------------*/ if(sequence_packets(field, tile)) { - return NULL; + return 0; } control->codestreamSize += tile->control.header_size + tile->control.body_size; @@ -1414,24 +1414,12 @@ assemble_codestream(bwc_codec *const field, bwc_stream *const data) assemble_tile(field, tile, stream); } - emit_symbol(&(*stream), EOC, 2); + emit_symbol(stream, EOC, 2); - packed_stream = calloc(1, sizeof(bwc_span)); - if(!packed_stream) - { - // memory allocation error - fprintf(stderr, MEMERROR); - return NULL; - } + compressed_size = stream->L; + free(stream); - if(terminate_stream(stream, packed_stream)) - { - return NULL; - } - else - { - return packed_stream; - } + return compressed_size; } /*----------------------------------------------------------------------------------------------------------*\ diff --git a/src/library/libbwc.c b/src/library/libbwc.c index 5f7a6a1..239655c 100755 --- a/src/library/libbwc.c +++ b/src/library/libbwc.c @@ -3652,12 +3652,13 @@ bwc_create_compression(bwc_codec *codec, bwc_stream *stream, char *rate_control) ! 15.03.2018 Patrick Vogler B87D120 V 0.1.0 function created ! ! ! \*----------------------------------------------------------------------------------------------------------*/ -uchar +size_t bwc_compress(bwc_codec *const field, bwc_stream *const data) { /*-----------------------*\ ! DEFINE INT VARIABLES: ! \*-----------------------*/ + size_t compressed_size = 0; uint64 buff_size = 0; uint64 i; uint16 p; @@ -3731,7 +3732,7 @@ bwc_compress(bwc_codec *const field, bwc_stream *const data) { // memory allocation error fprintf(stderr, MEMERROR); - return 1; + return 0; } /*--------------------------------------------------------*\ @@ -3812,7 +3813,7 @@ bwc_compress(bwc_codec *const field, bwc_stream *const data) if(forward_wavelet_transform(field, parameter)) { free(working_buffer); - return 1; + return 0; } #ifdef BWC_PROFILE #if defined (_OPENMP) @@ -3837,7 +3838,7 @@ bwc_compress(bwc_codec *const field, bwc_stream *const data) if(t1_encode(field, tile, parameter)) { free(working_buffer); - return 1; + return 0; } #ifdef BWC_PROFILE #if defined (_OPENMP) @@ -3868,7 +3869,7 @@ bwc_compress(bwc_codec *const field, bwc_stream *const data) if(t2_encode(field, tile)) { free(working_buffer); - return 1; + return 0; } #ifdef BWC_PROFILE #if defined (_OPENMP) @@ -3890,11 +3891,11 @@ bwc_compress(bwc_codec *const field, bwc_stream *const data) start = (double)clock(); #endif #endif - data->codestream.data = assemble_codestream(field, data); - if(!data->codestream.data) + compressed_size = assemble_codestream(field, data); + if(compressed_size == 0) { free(working_buffer); - return 1; + return 0; } #ifdef BWC_PROFILE #if defined (_OPENMP) @@ -3922,7 +3923,7 @@ bwc_compress(bwc_codec *const field, bwc_stream *const data) #endif nfs = (uint64)(info->nX * info->nY * info->nZ * info->nTS * info->nPar * info->data_prec); - css = (uint64)data->codestream.data->size; + css = (uint64)compressed_size; cpr = (double)nfs/css; @@ -3944,7 +3945,7 @@ bwc_compress(bwc_codec *const field, bwc_stream *const data) /*--------------------------------------------------------*\ ! Return to the function caller. ! \*--------------------------------------------------------*/ - return 0; + return compressed_size; } /*----------------------------------------------------------------------------------------------------------*\ diff --git a/src/library/tier2.c b/src/library/tier2.c index e784c8d..c492162 100755 --- a/src/library/tier2.c +++ b/src/library/tier2.c @@ -652,7 +652,8 @@ create_packet(bwc_codec *const field, bwc_tile *const tile, } k = header->L; - terminate_stream(header, NULL); + free(header->memory); + free(header); return k; } /*--------------------------------------------------------*\ @@ -663,11 +664,13 @@ create_packet(bwc_codec *const field, bwc_tile *const tile, \*--------------------------------------------------------*/ else { - if(terminate_stream(header, &packet->header)) + if(shrink_to_fit(header)) { // memory allocation error return -1; } + transfer_to_span(header, &packet->header); + free(header); packet->size = packet->body.size + packet->header.size;