static inline uint32_t copysample(struct aec_stream *strm)
{
if (bits_ask(strm, strm->bits_per_sample) == 0
- || strm->avail_out == 0)
+ || strm->avail_out < strm->state->bytes_per_sample)
return 0;
put_sample(strm, bits_get(strm, strm->bits_per_sample));
int k = state->id - 1;
do {
- if (bits_ask(strm, k) == 0 || strm->avail_out == 0)
+ if (bits_ask(strm, k) == 0 || strm->avail_out < state->bytes_per_sample)
return M_EXIT;
if (k)
*state->rsip++ += bits_get(strm, k);
struct internal_state *state = strm->state;
do {
- if (strm->avail_out == 0)
+ if (strm->avail_out < state->bytes_per_sample)
return M_EXIT;
put_sample(strm, 0);
} while(--state->i);
d1 = m - state->se_table[2 * m + 1];
if ((state->i & 1) == 0) {
- if (strm->avail_out == 0)
+ if (strm->avail_out < state->bytes_per_sample)
return M_EXIT;
put_sample(strm, state->se_table[2 * m] - d1);
state->i++;
}
- if (strm->avail_out == 0)
+ if (strm->avail_out < state->bytes_per_sample)
return M_EXIT;
put_sample(strm, d1);
state->i++;
struct internal_state *state = strm->state;
int status;
- if (strm->avail_out % strm->state->bytes_per_sample)
- return AEC_MEM_ERROR;
-
strm->total_in += strm->avail_in;
strm->total_out += strm->avail_out;
if (status == M_ERROR)
return AEC_DATA_ERROR;
+ if (status == M_EXIT && strm->avail_out > 0 &&
+ strm->avail_out < state->bytes_per_sample)
+ return AEC_MEM_ERROR;
+
state->flush_output(strm);
strm->total_in -= strm->avail_in;