From: Mathis Rosenhauer Date: Tue, 2 Oct 2012 07:02:22 +0000 (+0200) Subject: lib functions for simple buffer encoding/decoding X-Git-Tag: accepted/tizen/5.0/unified/20181102.025501~214 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7c60bf8ef72f248b0d5993d541b5689925b77008;p=platform%2Fupstream%2Flibaec.git lib functions for simple buffer encoding/decoding --- diff --git a/src/decode.c b/src/decode.c index 179cf7f..36a88c7 100644 --- a/src/decode.c +++ b/src/decode.c @@ -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; +} diff --git a/src/encode.c b/src/encode.c index 7747f8f..82fa56b 100644 --- a/src/encode.c +++ b/src/encode.c @@ -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; +} diff --git a/src/libaec.h b/src/libaec.h index 4d1f0f6..1587857 100644 --- a/src/libaec.h +++ b/src/libaec.h @@ -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 */ diff --git a/src/sz_compat.c b/src/sz_compat.c index 288cce3..b4798c9 100644 --- a/src/sz_compat.c +++ b/src/sz_compat.c @@ -1,8 +1,11 @@ #include #include #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; } diff --git a/src/szlib.h b/src/szlib.h index 5d303df..5ce9e65 100644 --- a/src/szlib.h +++ b/src/szlib.h @@ -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 */