Interleaving for 32 and 64 bit in sz compatibility
authorMathis Rosenhauer <rosenhauer@dkrz.de>
Mon, 12 Nov 2012 16:04:48 +0000 (17:04 +0100)
committerThomas Jahns <jahns@dkrz.de>
Tue, 19 Feb 2013 10:33:00 +0000 (11:33 +0100)
src/sz_compat.c
src/test_szcomp.c

index b61818a..095aa13 100644 (file)
@@ -1,5 +1,7 @@
 #include <stdio.h>
 #include <stddef.h>
+#include <string.h>
+#include <stdlib.h>
 #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;
 }
 
index a8b885f..4d219e7 100644 (file)
@@ -4,7 +4,9 @@
 #include <string.h>
 #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;