wma: Improve error diagnostics.
authorAndre Noll <maan@systemlinux.org>
Thu, 12 Nov 2009 21:55:30 +0000 (22:55 +0100)
committerAndre Noll <maan@systemlinux.org>
Wed, 18 Nov 2009 18:34:31 +0000 (19:34 +0100)
This makes all functions in wmadec.c and bitstream.c return proper
error codes.

bitstream.c
error.h
wmadec_filter.c

index f0f6012..1139edc 100644 (file)
@@ -203,5 +203,5 @@ int get_vlc(struct getbit_context *gbc, VLC_TYPE(*table)[2], int bits,
                }
        }
        skip_bits(gbc, n);
-       return code;
+       return code >= 0? code : -E_VLC;
 }
diff --git a/error.h b/error.h
index ee5bac3..7558210 100644 (file)
--- a/error.h
+++ b/error.h
@@ -34,10 +34,14 @@ DEFINE_ERRLIST_OBJECT_ENUM;
 #define SERVER_COMMAND_LIST_ERRORS
 #define AFS_COMMAND_LIST_ERRORS
 #define AUDIOD_COMMAND_LIST_ERRORS
-#define BITSTREAM_ERRORS
+
 
 extern const char **para_errlist[];
 
+#define BITSTREAM_ERRORS \
+       PARA_ERROR(VLC, "invalid vlc code"), \
+
+
 #define WMA_AFH_ERRORS \
        PARA_ERROR(NO_WMA, "asf/wma format not recognized"), \
 
@@ -51,7 +55,7 @@ extern const char **para_errlist[];
        PARA_ERROR(WMA_BAD_PARAMS, "invalid WMA parameters"), \
        PARA_ERROR(WMA_OUTPUT_SPACE, "insufficient output space"), \
        PARA_ERROR(WMA_BAD_SUPERFRAME, "invalid superframe"), \
-       PARA_ERROR(WMA_DECODE, "wma decode error"), \
+       PARA_ERROR(WMA_BLOCK_SIZE, "invalid block size"), \
        PARA_ERROR(INCOHERENT_BLOCK_LEN, "incoherent block length"), \
 
 
index 9cb964f..a03463d 100644 (file)
@@ -92,7 +92,8 @@ struct private_wmadec_data {
        /* frame info */
        int frame_len;          ///< frame length in samples
        int frame_len_bits;     ///< frame_len = 1 << frame_len_bits
-       int nb_block_sizes;     ///< number of block sizes
+       /** Number of block sizes. */
+       int nb_block_sizes;
        /* block info */
        int reset_block_lengths;
        int block_len_bits;     ///< log2 of current block length
@@ -588,7 +589,7 @@ static int decode_exp_vlc(struct private_wmadec_data *pwd, int ch)
        while (q < q_end) {
                code = get_vlc(&pwd->gb, pwd->exp_vlc.table, EXPVLCBITS, EXPMAX);
                if (code < 0)
-                       return -1;
+                       return code;
                /* NOTE: this offset is the same as MPEG4 AAC ! */
                last_exp += code - 60;
                /* XXX: use a table */
@@ -717,7 +718,7 @@ static int compute_high_band_values(struct private_wmadec_data *pwd,
                                        pwd->hgain_vlc.table, HGAINVLCBITS,
                                        HGAINMAX);
                                if (code < 0)
-                                       return -1;
+                                       return code;
                                val += code - 18;
                        }
                        pwd->high_band_values[ch][i] = val;
@@ -828,12 +829,12 @@ static void compute_mdct_coefficients(struct private_wmadec_data *pwd,
 }
 
 /**
- * @return 0 if OK. 1 if last block of frame. return -1 if
- * unrecorrable error.
+ * Returns 0 if OK, 1 if last block of frame, negative on uncorrectable
+ * errors.
  */
 static int wma_decode_block(struct private_wmadec_data *pwd)
 {
-       int n, v, ch, code, bsize;
+       int ret, n, v, ch, code, bsize;
        int coef_nb_bits, total_gain;
        int nb_coefs[MAX_CHANNELS];
 
@@ -845,11 +846,11 @@ static int wma_decode_block(struct private_wmadec_data *pwd)
                        pwd->reset_block_lengths = 0;
                        v = get_bits(&pwd->gb, n);
                        if (v >= pwd->nb_block_sizes)
-                               return -1;
+                               return -E_WMA_BLOCK_SIZE;
                        pwd->prev_block_len_bits = pwd->frame_len_bits - v;
                        v = get_bits(&pwd->gb, n);
                        if (v >= pwd->nb_block_sizes)
-                               return -1;
+                               return -E_WMA_BLOCK_SIZE;
                        pwd->block_len_bits = pwd->frame_len_bits - v;
                } else {
                        /* update block lengths */
@@ -858,7 +859,7 @@ static int wma_decode_block(struct private_wmadec_data *pwd)
                }
                v = get_bits(&pwd->gb, n);
                if (v >= pwd->nb_block_sizes)
-                       return -1;
+                       return -E_WMA_BLOCK_SIZE;
                pwd->next_block_len_bits = pwd->frame_len_bits - v;
        } else {
                /* fixed block len */
@@ -907,19 +908,20 @@ static int wma_decode_block(struct private_wmadec_data *pwd)
        for (ch = 0; ch < pwd->ahi.channels; ch++)
                nb_coefs[ch] = n;
 
-       if (compute_high_band_values(pwd, bsize, nb_coefs) < 0)
-               return -1;
+       ret = compute_high_band_values(pwd, bsize, nb_coefs);
+       if (ret < 0)
+               return ret;
 
        /* exponents can be reused in short blocks. */
        if ((pwd->block_len_bits == pwd->frame_len_bits) || get_bit(&pwd->gb)) {
                for (ch = 0; ch < pwd->ahi.channels; ch++) {
                        if (pwd->channel_coded[ch]) {
                                if (pwd->use_exp_vlc) {
-                                       if (decode_exp_vlc(pwd, ch) < 0)
-                                               return -1;
-                               } else {
+                                       ret = decode_exp_vlc(pwd, ch);
+                                       if (ret < 0)
+                                               return ret;
+                               } else
                                        decode_exp_lsp(pwd, ch);
-                               }
                                pwd->exponents_bsize[ch] = bsize;
                        }
                }
@@ -950,7 +952,7 @@ static int wma_decode_block(struct private_wmadec_data *pwd)
                        code = get_vlc(&pwd->gb, coef_vlc->table,
                                VLCBITS, VLCMAX);
                        if (code < 0)
-                               return -1;
+                               return code;
                        if (code == 1) /* EOB */
                                break;
                        if (code == 0) { /* escape */
@@ -1046,7 +1048,7 @@ static int wma_decode_frame(struct private_wmadec_data *pwd, int16_t *samples)
        for (;;) {
                ret = wma_decode_block(pwd);
                if (ret < 0)
-                       return -1;
+                       return ret;
                if (ret)
                        break;
        }
@@ -1125,8 +1127,8 @@ static int wma_decode_superframe(struct private_wmadec_data *pwd, void *data,
                         * This frame is stored in the last superframe and in
                         * the current one.
                         */
-                       ret = -E_WMA_DECODE;
-                       if (wma_decode_frame(pwd, samples) < 0)
+                       ret = wma_decode_frame(pwd, samples);
+                       if (ret < 0)
                                goto fail;
                        frame_count++;
                        samples += pwd->ahi.channels * pwd->frame_len;
@@ -1142,8 +1144,8 @@ static int wma_decode_superframe(struct private_wmadec_data *pwd, void *data,
 
                pwd->reset_block_lengths = 1;
                for (i = 0; i < nb_frames; i++) {
-                       ret = -E_WMA_DECODE;
-                       if (wma_decode_frame(pwd, samples) < 0)
+                       ret = wma_decode_frame(pwd, samples);
+                       if (ret < 0)
                                goto fail;
                        frame_count++;
                        samples += pwd->ahi.channels * pwd->frame_len;
@@ -1166,8 +1168,8 @@ static int wma_decode_superframe(struct private_wmadec_data *pwd, void *data,
                if (pwd->ahi.channels * pwd->frame_len * sizeof(int16_t) > *data_size)
                        goto fail;
                /* single frame decode */
-               ret = -E_WMA_DECODE;
-               if (wma_decode_frame(pwd, samples) < 0)
+               ret = wma_decode_frame(pwd, samples);
+               if (ret < 0)
                        goto fail;
                frame_count++;
                samples += pwd->ahi.channels * pwd->frame_len;