Commit 7c60bf8e authored by Mathis Rosenhauer's avatar Mathis Rosenhauer Committed by Thomas Jahns

lib functions for simple buffer encoding/decoding

parent 58fe035a
......@@ -607,3 +607,16 @@ int aec_decode(struct aec_stream *strm, int flush)
req_buffer:
return AEC_OK;
}
int aec_buf_decode(struct aec_stream *strm)
{
int status;
status = aec_decode_init(strm);
if (status != AEC_OK)
return status;
status = aec_decode(strm, AEC_FLUSH);
aec_decode_end(strm);
return status;
}
......@@ -737,3 +737,18 @@ int aec_encode_end(struct aec_stream *strm)
free(state);
return AEC_OK;
}
int aec_buf_encode(struct aec_stream *strm)
{
int status;
status = aec_encode_init(strm);
if (status != AEC_OK)
return status;
status = aec_encode(strm, AEC_FLUSH);
if (strm->avail_in > 0 || strm->avail_out == 0)
status = AEC_DATA_ERROR;
aec_encode_end(strm);
return status;
}
......@@ -7,30 +7,41 @@ struct internal_state;
struct aec_stream {
const unsigned char *next_in;
size_t avail_in; /* number of bytes available at
* next_in */
size_t total_in; /* total number of input bytes read so
* far */
size_t avail_in; /* number of bytes available at
* next_in
*/
size_t total_in; /* total number of input bytes read so
* far
*/
unsigned char *next_out;
size_t avail_out; /* remaining free space at next_out */
size_t total_out; /* total number of bytes output so far */
int bit_per_sample; /* resolution in bits per sample (n =
* 1,..., 32) */
int block_size; /* block size in samples */
int rsi; /* Reference sample interval, the number of
blocks between consecutive reference
samples. */
size_t avail_out; /* remaining free space at next_out */
size_t total_out; /* total number of bytes output so far */
int bit_per_sample; /* resolution in bits per sample (n =
* 1, ..., 32)
*/
int block_size; /* block size in samples */
int rsi; /* Reference sample interval, the number
* of _blocks_ between consecutive
* reference samples (up to 4096).
*/
int flags;
struct internal_state *state;
};
/* Coder flags */
#define AEC_DATA_UNSIGNED 0
#define AEC_DATA_SIGNED 1
#define AEC_DATA_3BYTE 2 /* 24 bit samples coded in 3 bytes */
#define AEC_DATA_LSB 0
#define AEC_DATA_MSB 16
/* Sample data description flags */
#define AEC_DATA_UNSIGNED 0 /* Samples are unsigned integers (default) */
#define AEC_DATA_SIGNED 1 /* Samples are signed. Telling libaec
* this results in a slightly better
* compression ratio.
*/
#define AEC_DATA_3BYTE 2 /* 24 bit samples are coded in 3 bytes */
#define AEC_DATA_MSB 16 /* Samples are stored with their most
* significant bit first. This has
* nothing to do with the endianness
* of the host.
*/
#define AEC_DATA_LSB 0 /* Samples are stored LSB first (default) */
#define AEC_DATA_PREPROCESS 32 /* Set if preprocessor should be used */
/* Return codes of library functions */
......@@ -41,27 +52,32 @@ struct aec_stream {
#define AEC_MEM_ERROR (-4)
/* Options for flushing */
#define AEC_NO_FLUSH 0 /* Do not enforce output flushing. More
* input may be provided with later
* calls. So far only relevant for
* encoding.
*/
#define AEC_FLUSH 1 /* Flush output and end encoding. The last
* call to aec_encode() must set AEC_FLUSH to
* drain all output.
*
* It is not possible to continue encoding
* of the same stream after it has been
* flushed because the last byte may be
* padded with fill bits.
*/
#define AEC_NO_FLUSH 0 /* Do not enforce output
* flushing. More input may be
* provided with later calls. So far
* only relevant for encoding.
*/
#define AEC_FLUSH 1 /* Flush output and end encoding. The
* last call to aec_encode() must set
* AEC_FLUSH to drain all output.
*
* It is not possible to continue
* encoding of the same stream after it
* has been flushed because the last byte
* may be padded with fill bits.
*/
/* Streaming encoding and decoding functions */
int aec_encode_init(struct aec_stream *strm);
int aec_encode(struct aec_stream *strm, int flush);
int aec_encode_end(struct aec_stream *strm);
int aec_decode_init(struct aec_stream *strm);
int aec_decode(struct aec_stream *strm, int flush);
int aec_decode_end(struct aec_stream *strm);
int aec_encode_init(struct aec_stream *strm);
int aec_encode(struct aec_stream *strm, int flush);
int aec_encode_end(struct aec_stream *strm);
/* Utility functions for encoding or decoding a memory buffer. */
int aec_buffer_encode(struct aec_stream *strm);
int aec_buffer_decode(struct aec_stream *strm);
#endif /* LIBAEC_H */
#include <stdio.h>
#include <stddef.h>
#include "szlib.h"
#include "libaec.h"
int SZ_BufftoBuffCompress(void *dest, size_t *destLen, const void *source, size_t sourceLen, SZ_com_t *param)
int SZ_BufftoBuffCompress(void *dest, size_t *destLen,
const void *source, size_t sourceLen,
SZ_com_t *param)
{
int status;
struct aec_stream strm;
......@@ -16,21 +19,17 @@ int SZ_BufftoBuffCompress(void *dest, size_t *destLen, const void *source, size_
strm.next_out = dest;
strm.next_in = source;
if ((status = aec_encode_init(&strm)) != AEC_OK)
return status;
if ((status = aec_encode(&strm, AEC_FLUSH)) != AEC_OK)
status = aec_buf_encode(&strm);
if (status != AEC_OK)
return status;
*destLen = strm.total_out;
if ((status = aec_encode_end(&strm)) != AEC_OK)
return status;
return SZ_OK;
}
int SZ_BufftoBuffDecompress(void *dest, size_t *destLen, const void *source, size_t sourceLen, SZ_com_t *param)
int SZ_BufftoBuffDecompress(void *dest, size_t *destLen,
const void *source, size_t sourceLen,
SZ_com_t *param)
{
int status;
struct aec_stream strm;
......@@ -44,16 +43,10 @@ int SZ_BufftoBuffDecompress(void *dest, size_t *destLen, const void *source, siz
strm.next_out = dest;
strm.next_in = source;
if ((status = aec_decode_init(&strm)) != AEC_OK)
return status;
if ((status = aec_decode(&strm, AEC_FLUSH)) != AEC_OK)
status = aec_buf_decode(&strm);
if (status != AEC_OK)
return status;
*destLen = strm.total_out;
if ((status = aec_decode_end(&strm)) != AEC_OK)
return status;
return SZ_OK;
}
......@@ -22,7 +22,11 @@ typedef struct SZ_com_t_s
int pixels_per_scanline;
} SZ_com_t;
int SZ_BufftoBuffCompress(void *dest, size_t *destLen, const void *source, size_t sourceLen, SZ_com_t *param);
int SZ_BufftoBuffDecompress(void *dest, size_t *destLen, const void *source, size_t sourceLen, SZ_com_t *param);
int SZ_BufftoBuffCompress(void *dest, size_t *destLen,
const void *source, size_t sourceLen,
SZ_com_t *param);
int SZ_BufftoBuffDecompress(void *dest, size_t *destLen,
const void *source, size_t sourceLen,
SZ_com_t *param);
#endif /* SZLIB_H */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment