ECC-1403: JPEG constant fields

This commit is contained in:
Shahram Najm 2022-06-22 11:43:48 +01:00
parent 685ea8b1a9
commit 5593a8b1c6
1 changed files with 47 additions and 17 deletions

View File

@ -178,15 +178,16 @@ static void init(grib_accessor* a, const long v, grib_arguments* args)
{ {
const char* user_lib = NULL; const char* user_lib = NULL;
grib_accessor_data_jpeg2000_packing* self = (grib_accessor_data_jpeg2000_packing*)a; grib_accessor_data_jpeg2000_packing* self = (grib_accessor_data_jpeg2000_packing*)a;
grib_handle* hand = grib_handle_of_accessor(a);
self->jpeg_lib = 0; self->jpeg_lib = 0;
self->type_of_compression_used = grib_arguments_get_name(grib_handle_of_accessor(a), args, self->carg++); self->type_of_compression_used = grib_arguments_get_name(hand, args, self->carg++);
self->target_compression_ratio = grib_arguments_get_name(grib_handle_of_accessor(a), args, self->carg++); self->target_compression_ratio = grib_arguments_get_name(hand, args, self->carg++);
self->ni = grib_arguments_get_name(grib_handle_of_accessor(a), args, self->carg++); self->ni = grib_arguments_get_name(hand, args, self->carg++);
self->nj = grib_arguments_get_name(grib_handle_of_accessor(a), args, self->carg++); self->nj = grib_arguments_get_name(hand, args, self->carg++);
self->list_defining_points = grib_arguments_get_name(grib_handle_of_accessor(a), args, self->carg++); self->list_defining_points = grib_arguments_get_name(hand, args, self->carg++);
self->number_of_data_points = grib_arguments_get_name(grib_handle_of_accessor(a), args, self->carg++); self->number_of_data_points = grib_arguments_get_name(hand, args, self->carg++);
self->scanning_mode = grib_arguments_get_name(grib_handle_of_accessor(a), args, self->carg++); self->scanning_mode = grib_arguments_get_name(hand, args, self->carg++);
self->edition = 2; self->edition = 2;
a->flags |= GRIB_ACCESSOR_FLAG_DATA; a->flags |= GRIB_ACCESSOR_FLAG_DATA;
@ -579,20 +580,34 @@ static int pack_double(grib_accessor* a, const double* val, size_t* len)
static int unpack_double_element(grib_accessor* a, size_t idx, double* val) static int unpack_double_element(grib_accessor* a, size_t idx, double* val)
{ {
size_t size; grib_accessor_data_jpeg2000_packing* self = (grib_accessor_data_jpeg2000_packing*)a;
double* values; grib_handle* hand = grib_handle_of_accessor(a);
size_t size = 0;
double* values = NULL;
int err = 0; int err = 0;
double reference_value = 0;
long bits_per_value = 0;
if ((err = grib_get_long_internal(hand, self->bits_per_value, &bits_per_value)) != GRIB_SUCCESS)
return err;
if ((err = grib_get_double_internal(hand, self->reference_value, &reference_value)) != GRIB_SUCCESS)
return err;
/* Special case of constant field */
if (bits_per_value == 0) {
*val = reference_value;
return GRIB_SUCCESS;
}
/* GRIB-564: The index idx relates to codedValues NOT values! */ /* GRIB-564: The index idx relates to codedValues NOT values! */
err = grib_get_size(hand, "codedValues", &size);
err = grib_get_size(grib_handle_of_accessor(a), "codedValues", &size);
if (err) if (err)
return err; return err;
if (idx > size) if (idx > size)
return GRIB_INVALID_ARGUMENT; return GRIB_INVALID_ARGUMENT;
values = (double*)grib_context_malloc_clear(a->context, size * sizeof(double)); values = (double*)grib_context_malloc_clear(a->context, size * sizeof(double));
err = grib_get_double_array(grib_handle_of_accessor(a), "codedValues", values, &size); err = grib_get_double_array(hand, "codedValues", values, &size);
if (err) { if (err) {
grib_context_free(a->context, values); grib_context_free(a->context, values);
return err; return err;
@ -604,21 +619,36 @@ static int unpack_double_element(grib_accessor* a, size_t idx, double* val)
static int unpack_double_element_set(grib_accessor* a, const size_t* index_array, size_t len, double* val_array) static int unpack_double_element_set(grib_accessor* a, const size_t* index_array, size_t len, double* val_array)
{ {
grib_accessor_data_jpeg2000_packing* self = (grib_accessor_data_jpeg2000_packing*)a;
grib_handle* hand = grib_handle_of_accessor(a);
size_t size = 0, i = 0; size_t size = 0, i = 0;
double* values; double* values = NULL;
int err = 0; int err = 0;
double reference_value = 0;
long bits_per_value = 0;
if ((err = grib_get_long_internal(hand, self->bits_per_value, &bits_per_value)) != GRIB_SUCCESS)
return err;
if ((err = grib_get_double_internal(hand, self->reference_value, &reference_value)) != GRIB_SUCCESS)
return err;
/* Special case of constant field */
if (bits_per_value == 0) {
for (i = 0; i < len; i++)
val_array[i] = reference_value;
return GRIB_SUCCESS;
}
/* GRIB-564: The indexes in index_array relate to codedValues NOT values! */ /* GRIB-564: The indexes in index_array relate to codedValues NOT values! */
err = grib_get_size(grib_handle_of_accessor(a), "codedValues", &size); err = grib_get_size(hand, "codedValues", &size);
if (err) if (err) return err;
return err;
for (i = 0; i < len; i++) { for (i = 0; i < len; i++) {
if (index_array[i] > size) return GRIB_INVALID_ARGUMENT; if (index_array[i] > size) return GRIB_INVALID_ARGUMENT;
} }
values = (double*)grib_context_malloc_clear(a->context, size * sizeof(double)); values = (double*)grib_context_malloc_clear(a->context, size * sizeof(double));
err = grib_get_double_array(grib_handle_of_accessor(a), "codedValues", values, &size); err = grib_get_double_array(hand, "codedValues", values, &size);
if (err) { if (err) {
grib_context_free(a->context, values); grib_context_free(a->context, values);
return err; return err;