From a2a2a72416bbdda9c0a6caf803fa81cc529fa117 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Thu, 12 Nov 2009 22:55:30 +0100 Subject: [PATCH] wma: Improve error diagnostics. This makes all functions in wmadec.c and bitstream.c return proper error codes. --- bitstream.c | 2 +- error.h | 8 ++++++-- wmadec_filter.c | 48 +++++++++++++++++++++++++----------------------- 3 files changed, 32 insertions(+), 26 deletions(-) diff --git a/bitstream.c b/bitstream.c index f0f6012c..1139edc0 100644 --- a/bitstream.c +++ b/bitstream.c @@ -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 ee5bac34..75582106 100644 --- 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"), \ diff --git a/wmadec_filter.c b/wmadec_filter.c index 9cb964fc..a03463d4 100644 --- a/wmadec_filter.c +++ b/wmadec_filter.c @@ -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; -- 2.30.2