bwc_to_eas3 and writing decompressed data, tested output can be parsed to compress again

This commit is contained in:
Gregor Weiss 2024-11-05 18:45:40 +01:00
parent d13354078b
commit d4acd85c37
Signed by: Gregor Weiss
GPG key ID: 61E170A8BBFE5756
3 changed files with 126 additions and 24 deletions

View file

@ -359,6 +359,9 @@
void
eas3_free_data(eas3_data* data);
uchar
bwc_to_eas3(bwc_stream *const stream, eas3_data *const data);
/*----------------------------------------------------------------------------------------------------------*\
! FUNCTION NAME: bwc_data* read_eas3(const char* const filename) !
! -------------- !

View file

@ -317,6 +317,118 @@ eas3_add_param_name(eas3_data *const data, char *name)
strcpy(data->param_names->name, name ? name : "undefined");
}
/*================================================================================================*/
/**
* @details Parses the uncompressed output from bwc_stream into the eas3_data.
*
* @param[in] stream Pointer to uncompressed data set.
* @param[inout] data Pointer to eas3_data structure to be filled.
*
* @retval uchar
*/
/*================================================================================================*/
uchar
bwc_to_eas3(bwc_stream *const stream, eas3_data *const data)
{
/*-----------------------*\
! DEFINE INT VARIABLES: !
\*-----------------------*/
uint64 Lread;
uint64 size;
uint64 i;
/*-----------------------*\
! DEFINE CHAR VARIABLES: !
\*-----------------------*/
uchar *buffer_char;
char param_name[ATTRLEN + 1] = {};
/*-----------------------*\
! DEFINE STRUCTS: !
\*-----------------------*/
eas3_std_params *params;
params = &data->params;
data->aux.ptr = calloc(stream->codestream.aux->size, sizeof(uchar));
data->aux.pos = 0;
data->aux.len = stream->codestream.aux->size;
if(!data->aux.ptr)
{
// memory allocation error
fprintf(stderr, MEMERROR);
free(data->aux.ptr);
return 1;
}
memcpy(data->aux.ptr, stream->codestream.aux->memory,
stream->codestream.aux->size);
aux_dequeue(data->aux, (uchar*)params, 176);
endian_conversion(&params->nts, 8);
endian_conversion(&params->npar, 8);
endian_conversion(&params->ndim1, 8);
endian_conversion(&params->ndim2, 8);
endian_conversion(&params->ndim3, 8);
endian_conversion(&params->accuracy, 8);
if(params->accuracy != 1 && params->accuracy != 2)
{
fprintf(stderr, "o##########################################################o\n"\
"| ERROR: The accuracy of the specified dataset is not sup- |\n"\
"| ported by the compression algorithm. |\n"\
"o##########################################################o\n");
return 1;
}
buffer_char = calloc(params->nts, sizeof(uint64));
if(!buffer_char)
{
// memory allocation error
fprintf(stderr, MEMERROR);
free(buffer_char);
return 1;
}
aux_dequeue(data->aux, buffer_char, params->nts * sizeof(uint64));
if(params->attribute_mode == EAS3_ALL_ATTR)
{
buffer_char = realloc(buffer_char, params->nts * ATTRLEN * sizeof(char));
if(!buffer_char)
{
// memory allocation error
fprintf(stderr, MEMERROR);
free(buffer_char);
return 1;
}
aux_dequeue(data->aux, buffer_char, params->nts * ATTRLEN * sizeof(char));
for(i = 0; i < params->npar; ++i)
{
aux_dequeue(data->aux, param_name, ATTRLEN * sizeof(char));
eas3_add_param_name(data, param_name);
memset(param_name, 0, ATTRLEN + 1);
}
}
size = params->ndim1 * params->ndim2 * params->ndim3 *
params->nts * params->npar;
if(params->accuracy == 1)
{
data->field.d = NULL;
data->field.f = calloc(size, sizeof(float));
memcpy(data->field.f, stream->out, size);
}
else if(params->accuracy == 2)
{
data->field.f = NULL;
data->field.d = calloc(size, sizeof(double));
memcpy(data->field.d, stream->out, size);
}
return 0;
}
/*----------------------------------------------------------------------------------------------------------*\
! FUNCTION NAME: uchar read_eas3_header(bwc_data *const data) !
! -------------- !
@ -756,7 +868,13 @@ write_eas3_header(FILE *const fp, eas3_data *const data)
! Convert the size parameters, used to write the rest of !
! the header, to little endian. !
\*--------------------------------------------------------*/
endian_conversion(&params->file_type, 8);
endian_conversion(&params->accuracy, 8);
endian_conversion(&params->nts, 8);
endian_conversion(&params->npar, 8);
endian_conversion(&params->ndim1, 8);
endian_conversion(&params->ndim2, 8);
endian_conversion(&params->ndim3, 8);
endian_conversion(&params->size_time, 8);
endian_conversion(&params->size_parameter, 8);
endian_conversion(&params->size_dim1, 8);
@ -766,6 +884,8 @@ write_eas3_header(FILE *const fp, eas3_data *const data)
endian_conversion(&params->udef_int_size, 8);
endian_conversion(&params->udef_real_size, 8);
data->params = *params;
/*--------------------------------------------------------*\
! Allocate the buffer character array. If successful, get !
! the timestep array from the auxiliary information block !

View file

@ -1554,30 +1554,9 @@ int main(int argc, char *argv[])
bwc_decompress(coder, stream);
size = coder->info.nX * coder->info.nY * coder->info.nZ *
coder->info.nTS * coder->info.nPar;
data->params.ndim1 = coder->info.nX;
data->params.ndim2 = coder->info.nY;
data->params.ndim3 = coder->info.nZ;
data->params.nts = coder->info.nTS;
data->params.npar = coder->info.nPar;
if (coder->info.data_prec == bwc_precision_single)
{
data->params.accuracy = 1;
data->field.d = NULL;
data->field.f = calloc(size, sizeof(float));
memcpy(data->field.f, stream->out, size);
}
else if (coder->info.data_prec == bwc_precision_double)
{
data->params.accuracy = 2;
data->field.f = NULL;
data->field.d = calloc(size, sizeof(double));
memcpy(data->field.d, stream->out, size);
}
//write_eas3(data, cli_output);
data = calloc(1, sizeof(eas3_data));
bwc_to_eas3(stream, data);
write_eas3(data, cli_output);
goto OUT;
}