summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMathis Rosenhauer <rosenhauer@dkrz.de>2014-07-31 11:57:36 +0200
committerMathis Rosenhauer <rosenhauer@dkrz.de>2014-07-31 11:58:56 +0200
commit7885ec21e2422a95dc2fbf601548eb988de4b3b3 (patch)
tree984ca098a2a641eb706732b53b707a8539b9f256 /src
parent415afb968b556802100338c64724956417b8208b (diff)
downloadlibaec-7885ec21e2422a95dc2fbf601548eb988de4b3b3.tar.gz
libaec-7885ec21e2422a95dc2fbf601548eb988de4b3b3.tar.bz2
libaec-7885ec21e2422a95dc2fbf601548eb988de4b3b3.zip
Omit redundant SE-encoding of reference sample.
Diffstat (limited to 'src')
-rw-r--r--src/encode.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/src/encode.c b/src/encode.c
index 19acd9e..71a638c 100644
--- a/src/encode.c
+++ b/src/encode.c
@@ -429,8 +429,11 @@ static uint32_t assess_se_option(struct aec_stream *strm)
len = 1;
for (i = 0; i < strm->block_size; i+= 2) {
- d = (uint64_t)state->block[i]
- + (uint64_t)state->block[i + 1];
+ if (i == 0 && state->ref)
+ d = state->block[i + 1];
+ else
+ d = (uint64_t)state->block[i]
+ + (uint64_t)state->block[i + 1];
/* we have to worry about overflow here */
if (d > state->uncomp_len) {
len = UINT32_MAX;
@@ -531,7 +534,6 @@ static int m_encode_splitting(struct aec_stream *strm)
int k = state->k;
emit(state, k + 1, state->id_len);
-
if (state->ref)
emit(state, state->block[0], strm->bits_per_sample);
@@ -548,7 +550,6 @@ static int m_encode_uncomp(struct aec_stream *strm)
emit(state, (1U << state->id_len) - 1, state->id_len);
emitblock(strm, strm->bits_per_sample, 0);
-
return m_flush_block(strm);
}
@@ -559,8 +560,10 @@ static int m_encode_se(struct aec_stream *strm)
struct internal_state *state = strm->state;
emit(state, 1, state->id_len + 1);
- if (state->ref)
+ if (state->ref) {
emit(state, state->block[0], strm->bits_per_sample);
+ state->block[0] = 0;
+ }
for (i = 0; i < strm->block_size; i+= 2) {
d = state->block[i] + state->block[i + 1];