No dynamic allocation of cds_buffer. Struct member instead.
authorMathis Rosenhauer <rosenhauer@dkrz.de>
Fri, 15 Mar 2013 12:45:13 +0000 (13:45 +0100)
committerMathis Rosenhauer <rosenhauer@dkrz.de>
Fri, 15 Mar 2013 12:46:10 +0000 (13:46 +0100)
src/encode.c
src/encode.h

index d18dd34..e70624b 100644 (file)
@@ -66,9 +66,6 @@
 #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,
@@ -471,7 +468,7 @@ static void init_output(struct aec_stream *strm)
 
     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;
@@ -867,12 +864,6 @@ int aec_encode_init(struct aec_stream *strm)
 
     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;
 
@@ -920,7 +911,6 @@ int aec_encode_end(struct aec_stream *strm)
     if (strm->flags & AEC_DATA_PREPROCESS)
         free(state->data_raw);
     free(state->data_pp);
-    free(state->cds_buf);
     free(state);
     return AEC_OK;
 }
index c2a1ba2..490718e 100644 (file)
 #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 *);
@@ -82,9 +89,8 @@ struct internal_state {
     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