Commit cda68cb1 authored by Mathis Rosenhauer's avatar Mathis Rosenhauer Committed by Thomas Jahns
Browse files

Small PP improvement, avoid buffer copy

parent c1cc9010
...@@ -74,7 +74,7 @@ ...@@ -74,7 +74,7 @@
static void flush_##KIND(struct aec_stream *strm) \ static void flush_##KIND(struct aec_stream *strm) \
{ \ { \
int i; \ int i; \
int64_t x, d, th, D, lower, m; \ int64_t x, d, th, lower, m; \
int64_t data; \ int64_t data; \
struct internal_state *state = strm->state; \ struct internal_state *state = strm->state; \
\ \
...@@ -99,16 +99,15 @@ ...@@ -99,16 +99,15 @@
\ \
if (d <= 2 * th) { \ if (d <= 2 * th) { \
if (d & 1) \ if (d & 1) \
D = - (d + 1) / 2; \ data = x - (d + 1) / 2; \
else \ else \
D = d / 2; \ data = x + d / 2; \
} else { \ } else { \
if (th == lower) \ if (th == lower) \
D = d - th; \ data = x + d - th; \
else \ else \
D = th - d; \ data = x + th - d; \
} \ } \
data = x + D; \
state->last_out = data; \ state->last_out = data; \
put_##KIND(strm, data); \ put_##KIND(strm, data); \
} \ } \
...@@ -193,6 +192,31 @@ static inline void put_sample(struct aec_stream *strm, uint32_t s) ...@@ -193,6 +192,31 @@ static inline void put_sample(struct aec_stream *strm, uint32_t s)
} }
} }
static uint32_t *get_block_buffer(struct aec_stream *strm)
{
/**
Return a pointer to (the remaining part of) a block buffer
*/
return strm->state->buf + strm->state->buf_i;
}
static void flush_block_buffer(struct aec_stream *strm)
{
/**
Update counters and flush output if necessary
*/
struct internal_state *state = strm->state;
int b = strm->block_size - state->buf_i % strm->block_size;
state->buf_i += b;
strm->avail_out -= b * state->bytes_per_sample;
strm->total_out += b * state->bytes_per_sample;
if (state->buf_i == state->buf_size) {
state->flush_output(strm);
state->buf_i = 0;
}
}
static inline void fill_acc(struct aec_stream *strm) static inline void fill_acc(struct aec_stream *strm)
{ {
int b = (63 - strm->state->bitp) >> 3; int b = (63 - strm->state->bitp) >> 3;
...@@ -367,22 +391,23 @@ static int m_split_fs(struct aec_stream *strm) ...@@ -367,22 +391,23 @@ static int m_split_fs(struct aec_stream *strm)
static int m_split(struct aec_stream *strm) static int m_split(struct aec_stream *strm)
{ {
int i, k; int i, k;
uint32_t sample; uint32_t *block;
struct internal_state *state = strm->state; struct internal_state *state = strm->state;
if (BUFFERSPACE(strm)) { if (BUFFERSPACE(strm)) {
k = state->id - 1; k = state->id - 1;
block = get_block_buffer(strm);
if (state->ref) if (state->ref)
put_sample(strm, direct_get(strm, strm->bits_per_sample)); block[0] = direct_get(strm, strm->bits_per_sample);
for (i = state->ref; i < strm->block_size; i++) for (i = state->ref; i < strm->block_size; i++)
state->block[i] = direct_get_fs(strm) << k; block[i] = direct_get_fs(strm) << k;
for (i = state->ref; i < strm->block_size; i++) { for (i = state->ref; i < strm->block_size; i++)
sample = state->block[i] + direct_get(strm, k); block[i] += direct_get(strm, k);
put_sample(strm, sample);
} flush_block_buffer(strm);
state->mode = m_id; state->mode = m_id;
return M_CONTINUE; return M_CONTINUE;
...@@ -551,14 +576,14 @@ static int m_uncomp_copy(struct aec_stream *strm) ...@@ -551,14 +576,14 @@ static int m_uncomp_copy(struct aec_stream *strm)
static int m_uncomp(struct aec_stream *strm) static int m_uncomp(struct aec_stream *strm)
{ {
int i; int i;
uint32_t sample; uint32_t *block;
struct internal_state *state = strm->state; struct internal_state *state = strm->state;
if (BUFFERSPACE(strm)) { if (BUFFERSPACE(strm)) {
for (i = 0; i < strm->block_size; i++) { block = get_block_buffer(strm);
sample = direct_get(strm, strm->bits_per_sample); for (i = 0; i < strm->block_size; i++)
put_sample(strm, sample); block[i] = direct_get(strm, strm->bits_per_sample);
} flush_block_buffer(strm);
state->mode = m_id; state->mode = m_id;
return M_CONTINUE; return M_CONTINUE;
} }
......
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