From 4f9895014e589422d4efad2af8e4f5f70a9a4a00 Mon Sep 17 00:00:00 2001 From: Mathis Rosenhauer Date: Mon, 12 Nov 2012 17:04:48 +0100 Subject: [PATCH] Interleaving for 32 and 64 bit in sz compatibility --- src/sz_compat.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++----- src/test_szcomp.c | 12 ++++++---- 2 files changed, 68 insertions(+), 9 deletions(-) diff --git a/src/sz_compat.c b/src/sz_compat.c index b61818a..095aa13 100644 --- a/src/sz_compat.c +++ b/src/sz_compat.c @@ -1,5 +1,7 @@ #include #include +#include +#include #include "szlib.h" #include "libaec.h" @@ -21,26 +23,62 @@ static int convert_options(int sz_opts) return opts; } +static void interleave_buffer(unsigned char *dest, unsigned char *src, + size_t n, int wordsize) +{ + size_t i, j; + + for (i = 0; i < n / wordsize; i++) + for (j = 0; j < wordsize; j++) + dest[j * (n / wordsize) + i] = src[i * wordsize + j]; +} + +static void deinterleave_buffer(unsigned char *dest, unsigned char *src, + size_t n, int wordsize) +{ + size_t i, j; + + for (i = 0; i < n / wordsize; i++) + for (j = 0; j < wordsize; j++) + dest[i * wordsize + j] = src[j * (n / wordsize) + i]; +} + int SZ_BufftoBuffCompress(void *dest, size_t *destLen, const void *source, size_t sourceLen, SZ_com_t *param) { int status; struct aec_stream strm; + unsigned char *buf; + + if (param->bits_per_pixel == 32 || param->bits_per_pixel == 64) { + buf = (unsigned char *)malloc(sourceLen); + if (buf == NULL) + return SZ_MEM_ERROR; + + interleave_buffer(buf, source, sourceLen, param->bits_per_pixel / 8); + strm.bit_per_sample = 8; + strm.next_in = buf; + } else { + strm.next_in = source; + strm.bit_per_sample = param->bits_per_pixel; + } - strm.bit_per_sample = param->bits_per_pixel; + strm.avail_in = sourceLen; strm.block_size = param->pixels_per_block; strm.rsi = param->pixels_per_scanline / param->pixels_per_block; strm.flags = convert_options(param->options_mask); - strm.avail_in = sourceLen; strm.avail_out = *destLen; strm.next_out = dest; - strm.next_in = source; status = aec_buffer_encode(&strm); if (status != AEC_OK) return status; + if (param->bits_per_pixel == 32 || param->bits_per_pixel == 64) { + free(buf); + } + *destLen = strm.total_out; return SZ_OK; } @@ -51,14 +89,25 @@ int SZ_BufftoBuffDecompress(void *dest, size_t *destLen, { int status; struct aec_stream strm; + unsigned char *buf; + + if (param->bits_per_pixel == 32 || param->bits_per_pixel == 64) { + buf = (unsigned char *)malloc(*destLen); + if (buf == NULL) + return SZ_MEM_ERROR; + + strm.bit_per_sample = 8; + strm.next_out = buf; + } else { + strm.next_out = dest; + strm.bit_per_sample = param->bits_per_pixel; + } - strm.bit_per_sample = param->bits_per_pixel; strm.block_size = param->pixels_per_block; strm.rsi = param->pixels_per_scanline / param->pixels_per_block; strm.flags = convert_options(param->options_mask); strm.avail_in = sourceLen; strm.avail_out = *destLen; - strm.next_out = dest; strm.next_in = source; status = aec_buffer_decode(&strm); @@ -66,6 +115,12 @@ int SZ_BufftoBuffDecompress(void *dest, size_t *destLen, return status; *destLen = strm.total_out; + + if (param->bits_per_pixel == 32 || param->bits_per_pixel == 64) { + deinterleave_buffer(dest, buf, *destLen, param->bits_per_pixel / 8); + free(buf); + } + return SZ_OK; } diff --git a/src/test_szcomp.c b/src/test_szcomp.c index a8b885f..4d219e7 100644 --- a/src/test_szcomp.c +++ b/src/test_szcomp.c @@ -4,7 +4,9 @@ #include #include "szlib.h" -#define OPTIONS_MASK (SZ_RAW_OPTION_MASK | SZ_MSB_OPTION_MASK | SZ_NN_OPTION_MASK) +#define OPTIONS_MASK (SZ_RAW_OPTION_MASK \ + | SZ_MSB_OPTION_MASK \ + | SZ_NN_OPTION_MASK) #define PIXELS_PER_BLOCK (8) #define PIXELS_PER_SCANLINE (PIXELS_PER_BLOCK*128) @@ -22,7 +24,7 @@ int main(int argc, char *argv[]) return 1; } sz_param.options_mask = OPTIONS_MASK; - sz_param.bits_per_pixel = 16; + sz_param.bits_per_pixel = 64; sz_param.pixels_per_block = PIXELS_PER_BLOCK; sz_param.pixels_per_scanline = PIXELS_PER_SCANLINE; @@ -43,12 +45,14 @@ int main(int argc, char *argv[]) sourceLen = fread(source, 1, sourceLen, fp); - status = SZ_BufftoBuffCompress(dest, &destLen, source, sourceLen, &sz_param); + status = SZ_BufftoBuffCompress(dest, &destLen, + source, sourceLen, &sz_param); if (status != SZ_OK) return status; dest1Len = sourceLen; - status = SZ_BufftoBuffDecompress(dest1, &dest1Len, dest, destLen, &sz_param); + status = SZ_BufftoBuffDecompress(dest1, &dest1Len, + dest, destLen, &sz_param); if (status != SZ_OK) return status; -- 2.7.4