Allow nonconforming block sizes in SZ mode.
authorMathis Rosenhauer <rosenhauer@dkrz.de>
Wed, 4 Feb 2015 08:39:05 +0000 (09:39 +0100)
committerMathis Rosenhauer <rosenhauer@dkrz.de>
Wed, 4 Feb 2015 08:39:05 +0000 (09:39 +0100)
src/encode.c
src/libaec.h
src/sz_compat.c

index 1c36008..b6b5e26 100644 (file)
@@ -775,11 +775,18 @@ int aec_encode_init(struct aec_stream *strm)
     if (strm->bits_per_sample > 32 || strm->bits_per_sample == 0)
         return AEC_CONF_ERROR;
 
-    if (strm->block_size != 8
-        && strm->block_size != 16
-        && strm->block_size != 32
-        && strm->block_size != 64)
-        return AEC_CONF_ERROR;
+    if (strm->flags & AEC_NOT_ENFORCE) {
+        /* All even block sizes are allowed. */
+        if (strm->block_size & 1)
+            return AEC_CONF_ERROR;
+    } else {
+        /* Only allow standard conforming block sizes */
+        if (strm->block_size != 8
+            && strm->block_size != 16
+            && strm->block_size != 32
+            && strm->block_size != 64)
+            return AEC_CONF_ERROR;
+    }
 
     if (strm->rsi > 4096)
         return AEC_CONF_ERROR;
index dd90ba4..e1ba30c 100644 (file)
@@ -120,6 +120,9 @@ struct aec_stream {
 /* Pad RSI to byte boundary. Only for decoding CCSDS sample data. */
 #define AEC_PAD_RSI 32
 
+/* Do not enforce standard regarding legal block sizes. */
+#define AEC_NOT_ENFORCE 64
+
 /*************************************/
 /* Return codes of library functions */
 /*************************************/
index 10f9232..0f7a4c7 100644 (file)
@@ -70,8 +70,8 @@ static void deinterleave_buffer(void *dest, const void *src,
 }
 
 static void add_padding(void *dest, const void *src, size_t total,
-                          size_t line_size, size_t padding_size,
-                          int pixel_size, int pp)
+                        size_t line_size, size_t padding_size,
+                        int pixel_size, int pp)
 {
     size_t i, j, k, ls, ps;
     const char *pixel;
@@ -127,7 +127,7 @@ int SZ_BufftoBuffCompress(void *dest, size_t *destLen,
     strm.block_size = param->pixels_per_block;
     strm.rsi = (param->pixels_per_scanline + param->pixels_per_block - 1)
         / param->pixels_per_block;
-    strm.flags = convert_options(param->options_mask);
+    strm.flags = AEC_NOT_ENFORCE | convert_options(param->options_mask);
     strm.avail_out = *destLen;
     strm.next_out = dest;
     buf = 0;