From 31c03e45d21d72c4ba2aa01116623c7ce15db125 Mon Sep 17 00:00:00 2001 From: Patrick Vogler Date: Thu, 1 Feb 2024 15:35:35 +0100 Subject: [PATCH] Removed sampling operation to simplify API since it falls outside of the purview of the compression library. --- include/library/private/libbwc.h | 2 +- include/library/private/types.h | 23 ++------ src/interfaces/reader/eas3.c | 2 +- src/library/codestream.c | 24 +------- src/library/libbwc.c | 95 ++++++++++++-------------------- src/tools/bwccmdl.c | 9 +-- 6 files changed, 44 insertions(+), 111 deletions(-) diff --git a/include/library/private/libbwc.h b/include/library/private/libbwc.h index fcf36a1..9a0cfe6 100755 --- a/include/library/private/libbwc.h +++ b/include/library/private/libbwc.h @@ -114,7 +114,7 @@ ! ! \*----------------------------------------------------------------------------------------------------------*/ void - bwc_add_param(bwc_data* data, char *name, uint16 sample, uchar dim, uint8 precision); + bwc_add_param(bwc_data* data, char *name, uint8 precision); /*----------------------------------------------------------------------------------------------------------*\ ! FUNCTION NAME: bwc_field *bwc_initialize_data(...) ! diff --git a/include/library/private/types.h b/include/library/private/types.h index e41fa35..2946984 100755 --- a/include/library/private/types.h +++ b/include/library/private/types.h @@ -435,27 +435,22 @@ ! ! ! DESCRIPTION: ! ! ------------ ! - ! This structure defines a linked list which stores a parameters name, its index, bit preci- ! - ! sion, sampling factor and the dimension for which the sampling is active. ! + ! This structure defines a linked list which stores a parameters name, its index and bit ! + ! precision. ! ! ! ! PARAMETERS: ! ! ----------- ! ! Variable Type Description ! ! -------- ---- ----------- ! - ! size unsigned int(64 bit) - Size of parameter after sub-sampling. ! + ! size unsigned int(64 bit) - Size of parameter. ! ! ! ! id unsigned int(8 bit) - Index of the parameter. ! ! ! ! precision unsigned int(8 bit) - Defines the precision of a compressed ! ! dataset. ! ! ! - ! sample unsigned int(8 bit) - Sampling factor for parameter(id). ! - ! ! ! name char - Defines the name of parameter(id). ! ! ! - ! dim unsigned char - Dimension(s) for which the sampling ! - ! factor is active. ! - ! ! ! DEPENDENCIES: ! ! ------------- ! ! Variable Type Description ! @@ -478,8 +473,6 @@ uint64 size; uint8 id; uint8 precision; - uint8 sample; - uchar dim; char name[24]; struct opt *next; struct opt *root; @@ -519,8 +512,7 @@ ! Variable Type Description ! ! -------- ---- ----------- ! ! parameter bwc_cmd_opts_ll* - Linked list storing the parameter names,! - ! indices, sampling factors and active ! - ! dimensions. ! + ! indices, size and precision. ! ! ! ! DEVELOPMENT HISTORY: ! ! -------------------- ! @@ -1319,11 +1311,6 @@ ! number_of_codeblocks unsigned int(64 bit) - Defines the number of codeblocks for ! ! the current tile parameter. ! ! ! - ! sampX, sampY, sampZ unsigned int(8 bit) - Variables defining the spatial sub- ! - ! sampling value. ! - ! ! - ! sampT unsigned int(8 bit) - Defines the temporal subsampling value. ! - ! ! ! alpha, beta bwc_float - Parameters used to normalized the cur- ! ! rent tile parameter. ! ! ! @@ -1344,8 +1331,6 @@ typedef struct { uint64 number_of_codeblocks; - uint8 sampX, sampY, sampZ; - uint8 sampTS; bwc_float alpha, beta; } bwc_param_ctrl; diff --git a/src/interfaces/reader/eas3.c b/src/interfaces/reader/eas3.c index 5a6a6cf..dd0cb21 100644 --- a/src/interfaces/reader/eas3.c +++ b/src/interfaces/reader/eas3.c @@ -473,7 +473,7 @@ read_eas3_header(bwc_data *const data) return 1; } - bwc_add_param(data, param_name, 0, (DIM_X | DIM_Y | DIM_Z), precision); + bwc_add_param(data, param_name, precision); /*--------------------------------------------------------*\ ! Read the parameter name from the file stream and add all ! diff --git a/src/library/codestream.c b/src/library/codestream.c index ab99f5e..814f502 100755 --- a/src/library/codestream.c +++ b/src/library/codestream.c @@ -867,7 +867,7 @@ assemble_main_header(bwc_field *const field) parameter = &tile->parameter[0]; - Linf = 40 + info->nPar * 29; + Linf = 40 + info->nPar * 25; Lctr = 50 + control->nLayers * 4; size = 6 + Linf + Lctr; @@ -893,10 +893,6 @@ assemble_main_header(bwc_field *const field) for(p = 0; p < info->nPar; ++p) { bwc_emit_chunck(stream, (uchar*)parameter[p].info.name, 24); - bwc_emit_symbol(stream, parameter[p].control.sampX, 1); - bwc_emit_symbol(stream, parameter[p].control.sampY, 1); - bwc_emit_symbol(stream, parameter[p].control.sampZ, 1); - bwc_emit_symbol(stream, parameter[p].control.sampTS, 1); bwc_emit_symbol(stream, parameter[p].info.precision, 1); } @@ -1089,25 +1085,9 @@ bwc_parse_main_header(bwc_data *const data,bwc_stream *const stream) for(p = 0; p < nPar; ++p) { buffer_char = (char*)bwc_get_chunck(stream, 24); - - samp = (uint8)bwc_get_symbol(stream, 1); - dim = DIM_X; - - buff_long = bwc_get_symbol(stream, 1); - samp = (buff_long > samp) ? (uint8)buff_long : samp; - dim = (buff_long > samp) ? DIM_Y : (buff_long == samp) ? dim | DIM_Y : dim; - - buff_long = bwc_get_symbol(stream, 1); - samp = (buff_long > samp) ? (uint8)buff_long : samp; - dim = (buff_long > samp) ? DIM_Z : (buff_long == samp) ? dim | DIM_Z : dim; - - buff_long = bwc_get_symbol(stream, 1); - samp = (buff_long > samp) ? (uint8)buff_long : samp; - dim = (buff_long > samp) ? DIM_TS : (buff_long == samp) ? dim | DIM_TS : dim; - precision = (uint8)bwc_get_symbol(stream, 1); - bwc_add_param(data, buffer_char, samp, dim, precision); + bwc_add_param(data, buffer_char, precision); free(buffer_char); } diff --git a/src/library/libbwc.c b/src/library/libbwc.c index 0f321af..0b26b18 100755 --- a/src/library/libbwc.c +++ b/src/library/libbwc.c @@ -912,10 +912,8 @@ fill_buffer(bwc_field *const field, bwc_tile *const tile, bwc_parameter *const p ! DEFINE INT VARIABLES: ! \*-----------------------*/ uint64 width, height, depth, dt; - uint64 sampX, sampY, sampZ; uint64 param_offset; - uint64 w, x, y, z; - uint16 sampTS; + uint64 x, y, z; uint16 t; /*-----------------------*\ @@ -993,11 +991,6 @@ fill_buffer(bwc_field *const field, bwc_tile *const tile, bwc_parameter *const p depth = param_info->Z1 - param_info->Z0; dt = param_info->TS1 - param_info->TS0; - sampX = 1 << param_control->sampX; - sampY = 1 << param_control->sampY; - sampZ = 1 << param_control->sampZ; - sampTS = 1 << param_control->sampTS; - /*--------------------------------------------------------*\ ! Check if the parameter is single or double precision and ! ! handle the field accordingly. ! @@ -1014,7 +1007,7 @@ fill_buffer(bwc_field *const field, bwc_tile *const tile, bwc_parameter *const p ! Walk through the tile parameter working buffer. ! \*--------------------------------------------------------*/ #if defined(_OPENMP) - #pragma omp parallel for collapse(3) private(dest, src_d, w, x) reduction(max:max) reduction(min:min) + #pragma omp parallel for collapse(3) private(dest, src_d, x) reduction(max:max) reduction(min:min) #endif for(t = 0; t < dt; ++t) { @@ -1028,24 +1021,23 @@ fill_buffer(bwc_field *const field, bwc_tile *const tile, bwc_parameter *const p ! arrays. ! \*--------------------------------------------------------*/ src_d = &tmp_d[param_offset + tile_info->X0 + info->nX * - (tile_info->Y0 + y * sampY + info->nY * - (tile_info->Z0 + z * sampZ + info->nZ * - t * sampTS))]; + (tile_info->Y0 + y + info->nY * + (tile_info->Z0 + z + info->nZ * t))]; dest = &working_buffer[(uint64) width * (y + height * (z + depth * t))]; - for(w = 0, x = 0; w < width; ++w, x += sampX) + for(x = 0; x < width; ++x) { /*--------------------------------------------------------*\ ! Copy the data sample to the working buffer. ! \*--------------------------------------------------------*/ - dest[w].f = (bwc_float)src_d[x]; + dest[x].f = (bwc_float)src_d[x]; /*--------------------------------------------------------*\ ! Update the maximum and minimum parameter value. ! \*--------------------------------------------------------*/ - max = MAX(max, dest[w].f); - min = MIN(min, dest[w].f); + max = MAX(max, dest[x].f); + min = MIN(min, dest[x].f); } } } @@ -1063,7 +1055,7 @@ fill_buffer(bwc_field *const field, bwc_tile *const tile, bwc_parameter *const p ! Walk through the tile parameter working buffer. ! \*--------------------------------------------------------*/ #if defined(_OPENMP) - #pragma omp parallel for collapse(3) private(dest, src_f, w, x) reduction(max:max) reduction(min:min) + #pragma omp parallel for collapse(3) private(dest, src_f, x) reduction(max:max) reduction(min:min) #endif for(t = 0; t < dt; ++t) { @@ -1077,24 +1069,23 @@ fill_buffer(bwc_field *const field, bwc_tile *const tile, bwc_parameter *const p ! arrays. ! \*--------------------------------------------------------*/ src_f = &tmp_f[param_offset + tile_info->X0 + info->nX * - (tile_info->Y0 + y * sampY + info->nY * - (tile_info->Z0 + z * sampZ + info->nZ * - t * sampTS))]; + (tile_info->Y0 + y + info->nY * + (tile_info->Z0 + z + info->nZ * t))]; dest = &working_buffer[(uint64) width * (y + height * (z + depth * t))]; - for(w = 0, x = 0; w < width; ++w, x += sampX) + for(x = 0; x < width; ++x) { /*--------------------------------------------------------*\ ! Copy the data sample to the working buffer. ! \*--------------------------------------------------------*/ - dest[w].f = (bwc_float)src_f[x]; + dest[x].f = (bwc_float)src_f[x]; /*--------------------------------------------------------*\ ! Update the maximum and minimum parameter value. ! \*--------------------------------------------------------*/ - max = MAX(max, dest[w].f); - min = MIN(min, dest[w].f); + max = MAX(max, dest[x].f); + min = MIN(min, dest[x].f); } } } @@ -1212,6 +1203,10 @@ flush_buffer(bwc_field *const field, bwc_tile *const tile, bwc_parameter *const param_control = ¶meter->control; param_info = ¶meter->info; + nX = info->nX; + nY = info->nY; + nZ = info->nZ; + /*--------------------------------------------------------*\ ! Calculate the offset of the current parameter in the da- ! ! ta array. ! @@ -1228,14 +1223,6 @@ flush_buffer(bwc_field *const field, bwc_tile *const tile, bwc_parameter *const param = param -> next; } - /*--------------------------------------------------------*\ - ! Calculate the number of data points in all spatial dimen-! - ! sions after subsampling. ! - \*--------------------------------------------------------*/ - nX = info->nX >> param_control->sampX ; - nY = info->nY >> param_control->sampY ; - nZ = info->nZ >> param_control->sampZ ; - /*--------------------------------------------------------*\ ! Calculate the width, height, depth and dt of the current ! ! tile parameter. ! @@ -1700,7 +1687,7 @@ bwc_initialize_data(double* field, uint64 const nX, uint64 const nY, uint64 cons ! ! \*----------------------------------------------------------------------------------------------------------*/ void -bwc_add_param(bwc_data* data, char *name, uint16 sample, uchar dim, uint8 precision) +bwc_add_param(bwc_data* data, char *name, uint8 precision) { /*-----------------------*\ ! DEFINE STRUCTS: ! @@ -1761,23 +1748,17 @@ bwc_add_param(bwc_data* data, char *name, uint16 sample, uchar dim, uint8 precis } /*--------------------------------------------------------*\ - ! Save the name of the new parameter, its sampling value, ! - ! the dimension for which the sampling is active and the ! - ! the parameters index in the structure of the new node. ! + ! Save the name of the new parameter its precision in the ! + ! structure of the new node. ! \*--------------------------------------------------------*/ strcpy(info->parameter->name, name ? name : "undefined"); - info->parameter->sample = (sample < 64) ? sample : 0; - info->parameter->dim = dim ? dim : (DIM_X | DIM_Y | DIM_Z); info->parameter->precision = precision ? precision : PREC_BYTE; /*--------------------------------------------------------*\ - ! Evaluate the parameter size after sub-sampling and safe ! - ! the information in the linked list. ! + ! Evaluate the parameter size the information in the ! + ! linked list. ! \*--------------------------------------------------------*/ - info->parameter->size = (info->nX >> ((dim & DIM_X) ? sample : 0)) * - (info->nY >> ((dim & DIM_Y) ? sample : 0)) * - (info->nZ >> ((dim & DIM_Z) ? sample : 0)) * - (info->nTS >> ((dim & DIM_TS) ? sample : 0)); + info->parameter->size = (info->nX * info->nY * info->nZ * info->nTS); } /*----------------------------------------------------------------------------------------------------------*\ @@ -2119,11 +2100,6 @@ create_field(bwc_field *const field) param_info->name = param->name; param_info->precision = param->precision; - param_control->sampX = (param->dim & 1) ? param->sample : 0; - param_control->sampY = (param->dim & 2) ? param->sample : 0; - param_control->sampZ = (param->dim & 4) ? param->sample : 0; - param_control->sampTS = (param->dim & 8) ? param->sample : 0; - /*--------------------------------------------------------*\ ! Initialize the number of codeblocks for the current ! ! parameter. ! @@ -2139,18 +2115,17 @@ create_field(bwc_field *const field) param_info->parameter_min = FLT_MAX; /*--------------------------------------------------------*\ - ! Calculate the boundaries for the current parmeter ac- ! - ! cording to equation (11.4) from JPEG2000 by David S. ! - ! Taubman and Michael W. Marcellin (p.454). ! + ! Safe the boundaries of the current tile in the parameter ! + ! info structure. \*--------------------------------------------------------*/ - param_info->X0 = (uint64)ceil((float)tile->info.X0 / (1 << parameter->control.sampX)); - param_info->Y0 = (uint64)ceil((float)tile->info.Y0 / (1 << parameter->control.sampY)); - param_info->Z0 = (uint64)ceil((float)tile->info.Z0 / (1 << parameter->control.sampZ)); - param_info->TS0 = (uint16)ceil((float)tile->info.TS0/ (1 << parameter->control.sampTS)); - param_info->X1 = (uint64)ceil((float)tile->info.X1 / (1 << parameter->control.sampX)); - param_info->Y1 = (uint64)ceil((float)tile->info.Y1 / (1 << parameter->control.sampY)); - param_info->Z1 = (uint64)ceil((float)tile->info.Z1 / (1 << parameter->control.sampZ)); - param_info->TS1 = (uint16)ceil((float)tile->info.TS1/ (1 << parameter->control.sampTS)); + param_info->X0 = tile->info.X0; + param_info->Y0 = tile->info.Y0; + param_info->Z0 = tile->info.Z0; + param_info->TS0 = tile->info.TS0; + param_info->X1 = tile->info.X1; + param_info->Y1 = tile->info.Y1; + param_info->Z1 = tile->info.Z1; + param_info->TS1 = tile->info.TS1; /*--------------------------------------------------------*\ ! Allocate, walk through and setup the resolution struc- ! diff --git a/src/tools/bwccmdl.c b/src/tools/bwccmdl.c index fc79dd2..bcaa591 100644 --- a/src/tools/bwccmdl.c +++ b/src/tools/bwccmdl.c @@ -1838,17 +1838,10 @@ output_info(bwc_cmdl_arg_node *const args, printf("| Name: %55s |\n"\ "| Minimum value: %55.2e |\n"\ "| Maximum value: %55.2e |\n"\ - "| |\n"\ - "| 1.D | 2.D | 3.D | TS |\n"\ - "| Sampling factor: %2d | %2d | %2d | %2d |\n"\ "| ........................................................................ |\n" "|%80s|\n", param_info->name, minVal, - maxVal, - param_ctrl->sampX, - param_ctrl->sampY, - param_ctrl->sampZ, - param_ctrl->sampTS, " "); + maxVal, " "); } /*--------------------------------------------------------*\