X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=wmadec_filter.c;h=9b103f9f80aa71b187602a54c46056f5a5d96a0c;hp=3a88cdc02a247b49da519fb360abbba0b1dddce2;hb=22549e01c3e3a16a6adda2739ff35aa75f53f1a5;hpb=0756f0f6cf685f5e6c902f355cd8623c073af557 diff --git a/wmadec_filter.c b/wmadec_filter.c index 3a88cdc0..9b103f9f 100644 --- a/wmadec_filter.c +++ b/wmadec_filter.c @@ -9,7 +9,7 @@ * For licencing details see COPYING.LIB. */ -/** * \file wmadec_filter.c paraslash's WMA decoder. */ +/** \file wmadec_filter.c paraslash's WMA decoder. */ /* * This decoder handles Microsoft Windows Media Audio data version 2. @@ -123,13 +123,13 @@ struct private_wmadec_data { }; #define EXPVLCBITS 8 -#define EXPMAX ((19+EXPVLCBITS-1)/EXPVLCBITS) +#define EXPMAX ((19 + EXPVLCBITS - 1) / EXPVLCBITS) #define HGAINVLCBITS 9 -#define HGAINMAX ((13+HGAINVLCBITS-1)/HGAINVLCBITS) +#define HGAINMAX ((13 + HGAINVLCBITS - 1) / HGAINVLCBITS) #define VLCBITS 9 -#define VLCMAX ((22+VLCBITS-1)/VLCBITS) +#define VLCMAX ((22 + VLCBITS - 1) / VLCBITS) DECLARE_ALIGNED(16, float, ff_sine_128[128]); DECLARE_ALIGNED(16, float, ff_sine_256[256]); @@ -152,13 +152,12 @@ static void sine_window_init(float *window, int n) window[i] = sinf((i + 0.5) * (M_PI / (2.0 * n))); } -static int wmadec_cleanup(struct private_wmadec_data *s) +static void wmadec_cleanup(struct private_wmadec_data *s) { int i; for (i = 0; i < s->nb_block_sizes; i++) imdct_end(s->mdct_ctx[i]); - if (s->use_exp_vlc) free_vlc(&s->exp_vlc); if (s->use_noise_coding) @@ -169,7 +168,6 @@ static int wmadec_cleanup(struct private_wmadec_data *s) free(s->level_table[i]); free(s->int_table[i]); } - return 0; } /* XXX: use same run/length optimization as mpeg decoders */ @@ -309,9 +307,8 @@ static int wma_init(struct private_wmadec_data *s, int flags2, struct asf_header if (nb > nb_max) nb = nb_max; s->nb_block_sizes = nb + 1; - } else { + } else s->nb_block_sizes = 1; - } /* init rate dependent parameters */ s->use_noise_coding = 1; @@ -629,18 +626,21 @@ static int decode_exp_vlc(struct private_wmadec_data *s, int ch) return 0; } -static void vector_fmul_add(float *dst, const float *src0, const float *src1, - const float *src2, int src3, int len) +/* compute src0 * src1 + src2 */ +static inline void vector_mult_add(float *dst, const float *src0, const float *src1, + const float *src2, int len) { int i; + for (i = 0; i < len; i++) - dst[i] = src0[i] * src1[i] + src2[i] + src3; + dst[i] = src0[i] * src1[i] + src2[i]; } -static void vector_fmul_reverse_c(float *dst, const float *src0, +static inline void vector_mult_reverse(float *dst, const float *src0, const float *src1, int len) { int i; + src1 += len - 1; for (i = 0; i < len; i++) dst[i] = src0[i] * src1[-i]; @@ -661,42 +661,30 @@ static void wma_window(struct private_wmadec_data *s, float *out) if (s->block_len_bits <= s->prev_block_len_bits) { block_len = s->block_len; bsize = s->frame_len_bits - s->block_len_bits; - - vector_fmul_add(out, in, s->windows[bsize], - out, 0, block_len); - + vector_mult_add(out, in, s->windows[bsize], out, block_len); } else { block_len = 1 << s->prev_block_len_bits; n = (s->block_len - block_len) / 2; bsize = s->frame_len_bits - s->prev_block_len_bits; - - vector_fmul_add(out + n, in + n, s->windows[bsize], - out + n, 0, block_len); - + vector_mult_add(out + n, in + n, s->windows[bsize], out + n, + block_len); memcpy(out + n + block_len, in + n + block_len, - n * sizeof(float)); + n * sizeof(float)); } - out += s->block_len; in += s->block_len; - /* right part */ if (s->block_len_bits <= s->next_block_len_bits) { block_len = s->block_len; bsize = s->frame_len_bits - s->block_len_bits; - - vector_fmul_reverse_c(out, in, s->windows[bsize], block_len); - + vector_mult_reverse(out, in, s->windows[bsize], block_len); } else { block_len = 1 << s->next_block_len_bits; n = (s->block_len - block_len) / 2; bsize = s->frame_len_bits - s->next_block_len_bits; - memcpy(out, in, n * sizeof(float)); - - vector_fmul_reverse_c(out + n, in + n, s->windows[bsize], - block_len); - + vector_mult_reverse(out + n, in + n, s->windows[bsize], + block_len); memset(out + n + block_len, 0, n * sizeof(float)); } } @@ -761,9 +749,8 @@ static int wma_decode_block(struct private_wmadec_data *s) if ((s->block_pos + s->block_len) > s->frame_len) return -E_INCOHERENT_BLOCK_LEN; - if (s->ahi.channels == 2) { + if (s->ahi.channels == 2) s->ms_stereo = get_bits1(&s->gb); - } v = 0; for (ch = 0; ch < s->ahi.channels; ch++) { int a = get_bits1(&s->gb); @@ -1139,7 +1126,7 @@ static inline int16_t av_clip_int16(int a) } /* Decode a frame of frame_len samples. */ -static int wma_decode_frame(struct private_wmadec_data *s, int16_t * samples) +static int wma_decode_frame(struct private_wmadec_data *s, int16_t *samples) { int ret, i, n, ch, incr; int16_t *ptr; @@ -1214,9 +1201,8 @@ static int wma_decode_superframe(struct private_wmadec_data *s, void *data, *q++ = get_bits(&s->gb, 8); len -= 8; } - if (len > 0) { + if (len > 0) *q++ = get_bits(&s->gb, len) << (8 - len); - } /* XXX: bit_offset bits into last frame */ init_get_bits(&s->gb, s->last_superframe, @@ -1259,9 +1245,8 @@ static int wma_decode_superframe(struct private_wmadec_data *s, void *data, pos >>= 3; len = buf_size - pos; ret = -E_WMA_BAD_SUPERFRAME; - if (len > MAX_CODED_SUPERFRAME_SIZE || len < 0) { + if (len > MAX_CODED_SUPERFRAME_SIZE || len < 0) goto fail; - } s->last_superframe_len = len; memcpy(s->last_superframe, buf + pos, len); } else { @@ -1320,6 +1305,7 @@ static ssize_t wmadec_convert(char *inbuffer, size_t len, static void wmadec_close(struct filter_node *fn) { struct private_wmadec_data *pwd = fn->private_data; + if (!pwd) return; wmadec_cleanup(pwd);