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