From d433e6b1d0a8bb38c5c799a9d695c37ac114a4a2 Mon Sep 17 00:00:00 2001 From: Charles Mita Date: Mon, 20 Aug 2018 10:38:56 +0100 Subject: [PATCH] Apply mask at same time as data conversion --- src/filters.h | 9 ------- src/plugin.c | 75 ++++++++++++++++++++++++++++++++------------------- src/test.c | 42 ++++++++++++++++------------- 3 files changed, 72 insertions(+), 54 deletions(-) diff --git a/src/filters.h b/src/filters.h index 7996783..caa9a37 100644 --- a/src/filters.h +++ b/src/filters.h @@ -11,15 +11,6 @@ #define BS_H5_PARAM_LZ4_COMPRESS 2 -/* Perform type conversion during buffer copy */ -#define CONVERT_BUFFER(in, t_in, out, t_out, size) \ -{ \ - t_in *pin = in; \ - t_out *pout = out; \ - t_in *end = pin + size; \ - while (pin < end) *pout++ = (t_out) *pin++; \ -} - int bslz4_decompress( const unsigned int* bs_params, diff --git a/src/plugin.c b/src/plugin.c index 1989157..ef5be54 100644 --- a/src/plugin.c +++ b/src/plugin.c @@ -16,6 +16,38 @@ #define ERROR_OUTPUT stderr + +/* mask bits loosely based on what Neggia does and what NeXus says should be done */ +/* basically - anything in the low byte (& 0xFF) means "ignore this" */ +/* Neggia usses the value -2 if bit 1, 2 or 3 are set */ +#define COPY_AND_MASK(in, out, size, mask) \ +{ \ + int i; \ + if (mask) { \ + for (i = 0; i < size; ++i) { \ + out[i] = in[i]; \ + if (mask[i] & 0xFF) out[i] = -1; \ + if (mask[i] & 30) out[i] = -2; \ + } \ + } else { \ + for (i = 0; i < size; i++) { \ + out[i] = in[i]; \ + } \ + } \ +} + +#define APPLY_MASK(buffer, mask, size) \ +{ \ + int i; \ + if (mask) { \ + for (i = 0; i < size; ++i) { \ + if (mask[i] & 0xFF) buffer[i] = -1; \ + if (mask[i] & 30) buffer[i] = -2; \ + } \ + } \ +} + + static hid_t file_id = 0; static struct ds_desc_t *data_desc = NULL; static int *mask_buffer = NULL; @@ -29,35 +61,26 @@ void fill_info_array(int info[1024]) { info[4] = VERSION_TIMESTAMP; } -void apply_mask(int *data, int *mask, int size) { - int *dptr, *mptr; - dptr = data; - mptr = mask; - while (dptr < data + size && mptr < mask + size) { - /* mask bits loosely based on what Neggia does and what NeXus says should be done */ - /* basically - anything in the low byte (& 0xFF) means "ignore this" */ - if (*mptr & 0x01) *dptr = -1; - if (*mptr & 0xFE) *dptr = -2; - dptr++; - mptr++; - } -} - -int convert_data_to_int(void *in_buffer, int d_width, int *out_buffer, int length) { +int convert_to_int_and_mask(void *in_buffer, int d_width, int *out_buffer, int length, int *mask) { /* transfer data to output buffer, performing data conversion as required */ int retval = 0; - /* TODO: decide how conversion of data should work - * Should we sign extend? Neggia doesn't (casts from uint*), but may be more intuitive */ + /* TODO: decide how conversion of data should work */ + /* Should we sign extend? Neggia doesn't (casts from uint*), but may be more intuitive */ if (d_width == sizeof(signed char)) { - CONVERT_BUFFER(in_buffer, signed char, out_buffer, int, length); + signed char *in = in_buffer; + COPY_AND_MASK(in, out_buffer, length, mask); } else if (d_width == sizeof(short)) { - CONVERT_BUFFER(in_buffer, short, out_buffer, int, length); + short *in = in_buffer; + COPY_AND_MASK(in, out_buffer, length, mask); } else if (d_width == sizeof(int)) { - CONVERT_BUFFER(in_buffer, int, out_buffer, int, length); + int *in = in_buffer; + COPY_AND_MASK(in, out_buffer, length, mask); } else if (d_width == sizeof(long int)) { - CONVERT_BUFFER(in_buffer, long int, out_buffer, int, length); + long int *in = in_buffer; + COPY_AND_MASK(in, out_buffer, length, mask); } else if (d_width == sizeof(long long int)) { - CONVERT_BUFFER(in_buffer, long long int, out_buffer, int, length); + long long int *in = in_buffer; + COPY_AND_MASK(in, out_buffer, length, mask); } else { char message[128]; sprintf(message, "Unsupported conversion of data width %d to %ld (int)", d_width, sizeof(int)); @@ -188,15 +211,13 @@ void plugin_get_data( } if (buffer != data_array) { - if (convert_data_to_int(buffer, data_desc->data_width, data_array, frame_size_px) < 0) { + if (convert_to_int_and_mask(buffer, data_desc->data_width, data_array, frame_size_px, mask_buffer) < 0) { char message[64]; sprintf(message, "Error converting data for frame %d", *frame_number); ERROR_JUMP(-2, done, message); } - } - - if (mask_buffer) { - apply_mask(data_array, mask_buffer, data_desc->dims[1] * data_desc->dims[2]); + } else { + APPLY_MASK(data_array, mask_buffer, frame_size_px); } done: diff --git a/src/test.c b/src/test.c index b29b2ce..68a7ef9 100644 --- a/src/test.c +++ b/src/test.c @@ -4,20 +4,22 @@ #include "file.h" #include "err.h" - -void apply_mask(int *data, int *mask, int size) { - int *dptr, *mptr; - dptr = data; - mptr = mask; - while (dptr < data + size && mptr < mask + size) { - if (*mptr & 0x01) *dptr = -1; - if (*mptr & 0xFE) *dptr = -2; - dptr++; - mptr++; - } +#define COPY_AND_MASK(in, out, size, mask) \ +{ \ + int i; \ + if (mask) { \ + for (i = 0; i < size; ++i) { \ + out[i] = in[i]; \ + if (mask[i] & 0xFE) out[i] = -2; \ + if (mask[i] & 0x01) out[i] = -1; \ + } \ + } else { \ + for (i = 0; i < size; i++) { \ + out[i] = in[i]; \ + } \ + } \ } - int parse_args(int argc, char **argv, char **file_name, int *frame_idx) { int retval = 0; if (argc == 2) { @@ -91,19 +93,23 @@ int main(int argc, char **argv) { if (buffer != data) { if (desc->data_width == sizeof(signed char)) { - CONVERT_BUFFER(buffer, signed char, data, int, dims[1] * dims[2]); + signed char *in = buffer; + COPY_AND_MASK(in, data, dims[1] * dims[2], mask); } else if (desc->data_width == sizeof(short)) { - CONVERT_BUFFER(buffer, short, data, int, dims[1] * dims[2]); + short *in = buffer; + COPY_AND_MASK(in, data, dims[1] * dims[2], mask); } else if (desc->data_width == sizeof(int)) { - CONVERT_BUFFER(buffer, int, data, int, dims[1] * dims[2]); + int *in = buffer; + COPY_AND_MASK(in, data, dims[1] * dims[2], mask); } else if (desc->data_width == sizeof(long int)) { - CONVERT_BUFFER(buffer, long int, data, int, dims[1] * dims[2]); + long int *in = buffer; + COPY_AND_MASK(in, data, dims[1] * dims[2], mask); } else if (desc->data_width == sizeof(long long int)) { - CONVERT_BUFFER(buffer, long long int, data, int, dims[1] * dims[2]); + long long int *in = buffer; + COPY_AND_MASK(in, data, dims[1] * dims[2], mask); } } - apply_mask(data, mask, dims[1] * dims[2]); { int i, j; int max_i = 30;