X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=wmadec_filter.c;h=c49489b70eea8d1d9ae271f318cefbb3a349e1e8;hp=15bb39253672dae4e4dd39e2d105c7ab41e026ba;hb=df6606e438a34c7bfc325e5f320843d1e97d3f7a;hpb=1899bae1378ad51dd8e43b3d426c174689b736fa diff --git a/wmadec_filter.c b/wmadec_filter.c index 15bb3925..c49489b7 100644 --- a/wmadec_filter.c +++ b/wmadec_filter.c @@ -131,6 +131,27 @@ struct private_wmadec_data { #define VLCBITS 9 #define VLCMAX ((22+VLCBITS-1)/VLCBITS) +DECLARE_ALIGNED(16, float, ff_sine_128[128]); +DECLARE_ALIGNED(16, float, ff_sine_256[256]); +DECLARE_ALIGNED(16, float, ff_sine_512[512]); +DECLARE_ALIGNED(16, float, ff_sine_1024[1024]); +DECLARE_ALIGNED(16, float, ff_sine_2048[2048]); +DECLARE_ALIGNED(16, float, ff_sine_4096[4096]); + +static float *ff_sine_windows[6] = { + ff_sine_128, ff_sine_256, ff_sine_512, ff_sine_1024, + ff_sine_2048, ff_sine_4096 +}; + +/* Generate a sine window. */ +static void sine_window_init(float *window, int n) +{ + int i; + + for (i = 0; i < n; i++) + window[i] = sinf((i + 0.5) * (M_PI / (2.0 * n))); +} + static int wmadec_cleanup(struct private_wmadec_data *s) { int i; @@ -461,7 +482,7 @@ static int wma_decode_init(char *initial_buf, int len, struct private_wmadec_dat return ret; /* init MDCT */ for (i = 0; i < s->nb_block_sizes; i++) { - ret = imdct_init(s->frame_len_bits - i + 1, 1, &s->mdct_ctx[i]); + ret = imdct_init(s->frame_len_bits - i + 1, &s->mdct_ctx[i]); if (ret < 0) return ret; } @@ -608,18 +629,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, int step) +/* 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 * step] = 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]; @@ -641,16 +665,15 @@ static void wma_window(struct private_wmadec_data *s, float *out) 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, 1); + 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, 1); + 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)); @@ -664,7 +687,7 @@ static void wma_window(struct private_wmadec_data *s, float *out) 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; @@ -673,7 +696,7 @@ static void wma_window(struct private_wmadec_data *s, float *out) memcpy(out, in, n * sizeof(float)); - vector_fmul_reverse_c(out + n, in + n, s->windows[bsize], + vector_mult_reverse(out + n, in + n, s->windows[bsize], block_len); memset(out + n + block_len, 0, n * sizeof(float));