#include "encode.h"
#include "encode_accessors.h"
-/* Marker for Remainder Of Segment condition in zero block encoding */
-#define ROS -1
-
static int m_get_block(struct aec_stream *strm);
static inline void emit(struct internal_state *state,
struct internal_state *state = strm->state;
- if (strm->avail_out > state->cds_len) {
+ if (strm->avail_out > CDSLEN) {
if (!state->direct_out) {
state->direct_out = 1;
*strm->next_out = *state->cds;
state->block = state->data_pp;
- /* Largest possible CDS according to specs */
- state->cds_len = (5 + 64 * 32) / 8 + 3;
- state->cds_buf = malloc(state->cds_len);
- if (state->cds_buf == NULL)
- return AEC_MEM_ERROR;
-
strm->total_in = 0;
strm->total_out = 0;
if (strm->flags & AEC_DATA_PREPROCESS)
free(state->data_raw);
free(state->data_pp);
- free(state->cds_buf);
free(state);
return AEC_OK;
}
#define M_EXIT 0
#define MIN(a, b) (((a) < (b))? (a): (b))
+/* Maximum CDS length in bytes: 5 bits ID, 64 * 32 bits samples, 7
+ * bits carry from previous CDS */
+#define CDSLEN ((5 + 64 * 32 + 7 + 7) / 8)
+
+/* Marker for Remainder Of Segment condition in zero block encoding */
+#define ROS -1
+
struct internal_state {
int (*mode)(struct aec_stream *);
uint32_t (*get_sample)(struct aec_stream *);
uint32_t *block; /* current (preprocessed) input block */
int rsi_len; /* reference sample interval in byte */
uint8_t *cds; /* current Coded Data Set output */
- uint8_t *cds_buf; /* buffer for one CDS (only used if
+ uint8_t cds_buf[CDSLEN];/* buffer for one CDS (only used if
* strm->next_out cannot hold full CDS) */
- int cds_len; /* max cds length in byte */
int direct_out; /* cds points to strm->next_out (1)
* or cds_buf (0) */
int bits; /* Free bits (LSB) in output buffer or