#include <stdio.h>
#include <stddef.h>
+#include <string.h>
+#include <stdlib.h>
#include "szlib.h"
#include "libaec.h"
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;
}
{
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);
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;
}
#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)
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;
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;