Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>tags/n0.10
| @@ -130,7 +130,6 @@ static uint16_t band_index_long[9][23]; | |||
| static INTFLOAT is_table[2][16]; | |||
| static INTFLOAT is_table_lsf[2][2][16]; | |||
| static INTFLOAT csa_table[8][4]; | |||
| static INTFLOAT mdct_win[8][36]; | |||
| static int16_t division_tab3[1<<6 ]; | |||
| static int16_t division_tab5[1<<8 ]; | |||
| @@ -417,43 +416,6 @@ static av_cold void decode_init_static(void) | |||
| csa_table[i][3] = ca - cs; | |||
| #endif | |||
| } | |||
| /* compute mdct windows */ | |||
| for (i = 0; i < 36; i++) { | |||
| for (j = 0; j < 4; j++) { | |||
| double d; | |||
| if (j == 2 && i % 3 != 1) | |||
| continue; | |||
| d = sin(M_PI * (i + 0.5) / 36.0); | |||
| if (j == 1) { | |||
| if (i >= 30) d = 0; | |||
| else if (i >= 24) d = sin(M_PI * (i - 18 + 0.5) / 12.0); | |||
| else if (i >= 18) d = 1; | |||
| } else if (j == 3) { | |||
| if (i < 6) d = 0; | |||
| else if (i < 12) d = sin(M_PI * (i - 6 + 0.5) / 12.0); | |||
| else if (i < 18) d = 1; | |||
| } | |||
| //merge last stage of imdct into the window coefficients | |||
| d *= 0.5 / cos(M_PI * (2 * i + 19) / 72); | |||
| if (j == 2) | |||
| mdct_win[j][i/3] = FIXHR((d / (1<<5))); | |||
| else | |||
| mdct_win[j][i ] = FIXHR((d / (1<<5))); | |||
| } | |||
| } | |||
| /* NOTE: we do frequency inversion adter the MDCT by changing | |||
| the sign of the right window coefs */ | |||
| for (j = 0; j < 4; j++) { | |||
| for (i = 0; i < 36; i += 2) { | |||
| mdct_win[j + 4][i ] = mdct_win[j][i ]; | |||
| mdct_win[j + 4][i + 1] = -mdct_win[j][i + 1]; | |||
| } | |||
| } | |||
| } | |||
| static av_cold int decode_init(AVCodecContext * avctx) | |||
| @@ -483,32 +445,9 @@ static av_cold int decode_init(AVCodecContext * avctx) | |||
| } | |||
| #define C3 FIXHR(0.86602540378443864676/2) | |||
| /* 0.5 / cos(pi*(2*i+1)/36) */ | |||
| static const INTFLOAT icos36[9] = { | |||
| FIXR(0.50190991877167369479), | |||
| FIXR(0.51763809020504152469), //0 | |||
| FIXR(0.55168895948124587824), | |||
| FIXR(0.61038729438072803416), | |||
| FIXR(0.70710678118654752439), //1 | |||
| FIXR(0.87172339781054900991), | |||
| FIXR(1.18310079157624925896), | |||
| FIXR(1.93185165257813657349), //2 | |||
| FIXR(5.73685662283492756461), | |||
| }; | |||
| /* 0.5 / cos(pi*(2*i+1)/36) */ | |||
| static const INTFLOAT icos36h[9] = { | |||
| FIXHR(0.50190991877167369479/2), | |||
| FIXHR(0.51763809020504152469/2), //0 | |||
| FIXHR(0.55168895948124587824/2), | |||
| FIXHR(0.61038729438072803416/2), | |||
| FIXHR(0.70710678118654752439/2), //1 | |||
| FIXHR(0.87172339781054900991/2), | |||
| FIXHR(1.18310079157624925896/4), | |||
| FIXHR(1.93185165257813657349/4), //2 | |||
| // FIXHR(5.73685662283492756461), | |||
| }; | |||
| #define C4 FIXHR(0.70710678118654752439/2) //0.5 / cos(pi*(9)/36) | |||
| #define C5 FIXHR(0.51763809020504152469/2) //0.5 / cos(pi*(5)/36) | |||
| #define C6 FIXHR(1.93185165257813657349/4) //0.5 / cos(pi*(15)/36) | |||
| /* 12 points IMDCT. We compute it "by hand" by factorizing obvious | |||
| cases. */ | |||
| @@ -529,7 +468,7 @@ static void imdct12(INTFLOAT *out, INTFLOAT *in) | |||
| in3 = MULH3(in3, C3, 4); | |||
| t1 = in0 - in4; | |||
| t2 = MULH3(in1 - in5, icos36h[4], 2); | |||
| t2 = MULH3(in1 - in5, C4, 2); | |||
| out[ 7] = | |||
| out[10] = t1 + t2; | |||
| @@ -539,112 +478,20 @@ static void imdct12(INTFLOAT *out, INTFLOAT *in) | |||
| in0 += SHR(in4, 1); | |||
| in4 = in0 + in2; | |||
| in5 += 2*in1; | |||
| in1 = MULH3(in5 + in3, icos36h[1], 1); | |||
| in1 = MULH3(in5 + in3, C5, 1); | |||
| out[ 8] = | |||
| out[ 9] = in4 + in1; | |||
| out[ 2] = | |||
| out[ 3] = in4 - in1; | |||
| in0 -= in2; | |||
| in5 = MULH3(in5 - in3, icos36h[7], 2); | |||
| in5 = MULH3(in5 - in3, C6, 2); | |||
| out[ 0] = | |||
| out[ 5] = in0 - in5; | |||
| out[ 6] = | |||
| out[11] = in0 + in5; | |||
| } | |||
| /* cos(pi*i/18) */ | |||
| #define C1 FIXHR(0.98480775301220805936/2) | |||
| #define C2 FIXHR(0.93969262078590838405/2) | |||
| #define C3 FIXHR(0.86602540378443864676/2) | |||
| #define C4 FIXHR(0.76604444311897803520/2) | |||
| #define C5 FIXHR(0.64278760968653932632/2) | |||
| #define C6 FIXHR(0.5/2) | |||
| #define C7 FIXHR(0.34202014332566873304/2) | |||
| #define C8 FIXHR(0.17364817766693034885/2) | |||
| /* using Lee like decomposition followed by hand coded 9 points DCT */ | |||
| static void imdct36(INTFLOAT *out, INTFLOAT *buf, INTFLOAT *in, INTFLOAT *win) | |||
| { | |||
| int i, j; | |||
| INTFLOAT t0, t1, t2, t3, s0, s1, s2, s3; | |||
| INTFLOAT tmp[18], *tmp1, *in1; | |||
| for (i = 17; i >= 1; i--) | |||
| in[i] += in[i-1]; | |||
| for (i = 17; i >= 3; i -= 2) | |||
| in[i] += in[i-2]; | |||
| for (j = 0; j < 2; j++) { | |||
| tmp1 = tmp + j; | |||
| in1 = in + j; | |||
| t2 = in1[2*4] + in1[2*8] - in1[2*2]; | |||
| t3 = in1[2*0] + SHR(in1[2*6],1); | |||
| t1 = in1[2*0] - in1[2*6]; | |||
| tmp1[ 6] = t1 - SHR(t2,1); | |||
| tmp1[16] = t1 + t2; | |||
| t0 = MULH3(in1[2*2] + in1[2*4] , C2, 2); | |||
| t1 = MULH3(in1[2*4] - in1[2*8] , -2*C8, 1); | |||
| t2 = MULH3(in1[2*2] + in1[2*8] , -C4, 2); | |||
| tmp1[10] = t3 - t0 - t2; | |||
| tmp1[ 2] = t3 + t0 + t1; | |||
| tmp1[14] = t3 + t2 - t1; | |||
| tmp1[ 4] = MULH3(in1[2*5] + in1[2*7] - in1[2*1], -C3, 2); | |||
| t2 = MULH3(in1[2*1] + in1[2*5], C1, 2); | |||
| t3 = MULH3(in1[2*5] - in1[2*7], -2*C7, 1); | |||
| t0 = MULH3(in1[2*3], C3, 2); | |||
| t1 = MULH3(in1[2*1] + in1[2*7], -C5, 2); | |||
| tmp1[ 0] = t2 + t3 + t0; | |||
| tmp1[12] = t2 + t1 - t0; | |||
| tmp1[ 8] = t3 - t1 - t0; | |||
| } | |||
| i = 0; | |||
| for (j = 0; j < 4; j++) { | |||
| t0 = tmp[i]; | |||
| t1 = tmp[i + 2]; | |||
| s0 = t1 + t0; | |||
| s2 = t1 - t0; | |||
| t2 = tmp[i + 1]; | |||
| t3 = tmp[i + 3]; | |||
| s1 = MULH3(t3 + t2, icos36h[ j], 2); | |||
| s3 = MULLx(t3 - t2, icos36 [8 - j], FRAC_BITS); | |||
| t0 = s0 + s1; | |||
| t1 = s0 - s1; | |||
| out[(9 + j) * SBLIMIT] = MULH3(t1, win[ 9 + j], 1) + buf[4*(9 + j)]; | |||
| out[(8 - j) * SBLIMIT] = MULH3(t1, win[ 8 - j], 1) + buf[4*(8 - j)]; | |||
| buf[4 * ( 9 + j )] = MULH3(t0, win[18 + 9 + j], 1); | |||
| buf[4 * ( 8 - j )] = MULH3(t0, win[18 + 8 - j], 1); | |||
| t0 = s2 + s3; | |||
| t1 = s2 - s3; | |||
| out[(9 + 8 - j) * SBLIMIT] = MULH3(t1, win[ 9 + 8 - j], 1) + buf[4*(9 + 8 - j)]; | |||
| out[ j * SBLIMIT] = MULH3(t1, win[ j], 1) + buf[4*( j)]; | |||
| buf[4 * ( 9 + 8 - j )] = MULH3(t0, win[18 + 9 + 8 - j], 1); | |||
| buf[4 * ( j )] = MULH3(t0, win[18 + j], 1); | |||
| i += 4; | |||
| } | |||
| s0 = tmp[16]; | |||
| s1 = MULH3(tmp[17], icos36h[4], 2); | |||
| t0 = s0 + s1; | |||
| t1 = s0 - s1; | |||
| out[(9 + 4) * SBLIMIT] = MULH3(t1, win[ 9 + 4], 1) + buf[4*(9 + 4)]; | |||
| out[(8 - 4) * SBLIMIT] = MULH3(t1, win[ 8 - 4], 1) + buf[4*(8 - 4)]; | |||
| buf[4 * ( 9 + 4 )] = MULH3(t0, win[18 + 9 + 4], 1); | |||
| buf[4 * ( 8 - 4 )] = MULH3(t0, win[18 + 8 - 4], 1); | |||
| } | |||
| /* return the number of decoded frames */ | |||
| static int mp_decode_layer1(MPADecodeContext *s) | |||
| { | |||
| @@ -1366,7 +1213,7 @@ static void compute_antialias(MPADecodeContext *s, GranuleDef *g) | |||
| static void compute_imdct(MPADecodeContext *s, GranuleDef *g, | |||
| INTFLOAT *sb_samples, INTFLOAT *mdct_buf) | |||
| { | |||
| INTFLOAT *win, *win1, *out_ptr, *ptr, *buf, *ptr1; | |||
| INTFLOAT *win, *out_ptr, *ptr, *buf, *ptr1; | |||
| INTFLOAT out2[12]; | |||
| int i, j, mdct_long_end, sblimit; | |||
| @@ -1392,26 +1239,16 @@ static void compute_imdct(MPADecodeContext *s, GranuleDef *g, | |||
| mdct_long_end = sblimit; | |||
| } | |||
| buf = mdct_buf; | |||
| ptr = g->sb_hybrid; | |||
| for (j = 0; j < mdct_long_end; j++) { | |||
| /* apply window & overlap with previous buffer */ | |||
| out_ptr = sb_samples + j; | |||
| /* select window */ | |||
| if (g->switch_point && j < 2) | |||
| win1 = mdct_win[0]; | |||
| else | |||
| win1 = mdct_win[g->block_type]; | |||
| /* select frequency inversion */ | |||
| win = win1 + ((4 * 36) & -(j & 1)); | |||
| imdct36(out_ptr, buf, ptr, win); | |||
| out_ptr += 18 * SBLIMIT; | |||
| ptr += 18; | |||
| buf += (j&3) != 3 ? 1 : (4*18-3); | |||
| } | |||
| s->mpadsp.RENAME(imdct36_blocks)(sb_samples, mdct_buf, g->sb_hybrid, | |||
| mdct_long_end, g->switch_point, | |||
| g->block_type); | |||
| buf = mdct_buf + 4*18*(mdct_long_end >> 2) + (mdct_long_end & 3); | |||
| ptr = g->sb_hybrid + 18 * mdct_long_end; | |||
| for (j = mdct_long_end; j < sblimit; j++) { | |||
| /* select frequency inversion */ | |||
| win = mdct_win[2 + (4 & -(j & 1))]; | |||
| win = RENAME(ff_mdct_win)[2 + (4 & -(j & 1))]; | |||
| out_ptr = sb_samples + j; | |||
| for (i = 0; i < 6; i++) { | |||
| @@ -28,6 +28,8 @@ void ff_mpadsp_init(MPADSPContext *s) | |||
| DCTContext dct; | |||
| ff_dct_init(&dct, 5, DCT_II); | |||
| ff_init_mpadsp_tabs_float(); | |||
| ff_init_mpadsp_tabs_fixed(); | |||
| s->apply_window_float = ff_mpadsp_apply_window_float; | |||
| s->apply_window_fixed = ff_mpadsp_apply_window_fixed; | |||
| @@ -35,6 +37,9 @@ void ff_mpadsp_init(MPADSPContext *s) | |||
| s->dct32_float = dct.dct32; | |||
| s->dct32_fixed = ff_dct32_fixed; | |||
| s->imdct36_blocks_float = ff_imdct36_blocks_float; | |||
| s->imdct36_blocks_fixed = ff_imdct36_blocks_fixed; | |||
| if (ARCH_ARM) ff_mpadsp_init_arm(s); | |||
| if (HAVE_MMX) ff_mpadsp_init_mmx(s); | |||
| if (HAVE_ALTIVEC) ff_mpadsp_init_altivec(s); | |||
| @@ -28,6 +28,10 @@ typedef struct MPADSPContext { | |||
| int *dither_state, int16_t *samples, int incr); | |||
| void (*dct32_float)(float *dst, const float *src); | |||
| void (*dct32_fixed)(int *dst, const int *src); | |||
| void (*imdct36_blocks_float)(float *out, float *buf, float *in, | |||
| int count, int switch_point, int block_type); | |||
| void (*imdct36_blocks_fixed)(int *out, int *buf, int *in, | |||
| int count, int switch_point, int block_type); | |||
| } MPADSPContext; | |||
| void ff_mpadsp_init(MPADSPContext *s); | |||
| @@ -61,4 +65,16 @@ void ff_mpadsp_apply_window_fixed(int32_t *synth_buf, int32_t *window, | |||
| int *dither_state, int16_t *samples, | |||
| int incr); | |||
| void ff_imdct36_blocks_float(float *out, float *buf, float *in, | |||
| int count, int switch_point, int block_type); | |||
| void ff_imdct36_blocks_fixed(int *out, int *buf, int *in, | |||
| int count, int switch_point, int block_type); | |||
| void ff_init_mpadsp_tabs_float(void); | |||
| void ff_init_mpadsp_tabs_fixed(void); | |||
| extern int ff_mdct_win_fixed[8][36]; | |||
| extern float ff_mdct_win_float[8][36]; | |||
| #endif /* AVCODEC_MPEGAUDIODSP_H */ | |||
| @@ -39,7 +39,12 @@ static inline float round_sample(float *sum) | |||
| #define MACS(rt, ra, rb) rt+=(ra)*(rb) | |||
| #define MULS(ra, rb) ((ra)*(rb)) | |||
| #define MULH3(x, y, s) ((s)*(y)*(x)) | |||
| #define MLSS(rt, ra, rb) rt-=(ra)*(rb) | |||
| #define MULLx(x, y, s) ((y)*(x)) | |||
| #define FIXHR(x) ((float)(x)) | |||
| #define FIXR(x) ((float)(x)) | |||
| #define SHR(a,b) ((a)*(1.0f/(1<<(b)))) | |||
| #else | |||
| @@ -57,8 +62,16 @@ static inline int round_sample(int64_t *sum) | |||
| # define MULS(ra, rb) MUL64(ra, rb) | |||
| # define MACS(rt, ra, rb) MAC64(rt, ra, rb) | |||
| # define MLSS(rt, ra, rb) MLS64(rt, ra, rb) | |||
| # define MULH3(x, y, s) MULH((s)*(x), y) | |||
| # define MULLx(x, y, s) MULL(x,y,s) | |||
| # define SHR(a,b) ((a)>>(b)) | |||
| # define FIXR(a) ((int)((a) * FRAC_ONE + 0.5)) | |||
| # define FIXHR(a) ((int)((a) * (1LL<<32) + 0.5)) | |||
| #endif | |||
| /** Window for MDCT. */ | |||
| DECLARE_ALIGNED(16, INTFLOAT, RENAME(ff_mdct_win))[8][36]; | |||
| DECLARE_ALIGNED(16, MPA_INT, RENAME(ff_mpa_synth_window))[512+256]; | |||
| #define SUM8(op, sum, w, p) \ | |||
| @@ -194,6 +207,7 @@ void av_cold RENAME(ff_mpa_synth_init)(MPA_INT *window) | |||
| window[512 - i] = v; | |||
| } | |||
| // Needed for avoiding shuffles in ASM implementations | |||
| for(i=0; i < 8; i++) | |||
| for(j=0; j < 16; j++) | |||
| @@ -203,3 +217,179 @@ void av_cold RENAME(ff_mpa_synth_init)(MPA_INT *window) | |||
| for(j=0; j < 16; j++) | |||
| window[512+128+16*i+j] = window[64*i+48-j]; | |||
| } | |||
| void RENAME(ff_init_mpadsp_tabs)(void) | |||
| { | |||
| int i, j; | |||
| /* compute mdct windows */ | |||
| for (i = 0; i < 36; i++) { | |||
| for (j = 0; j < 4; j++) { | |||
| double d; | |||
| if (j == 2 && i % 3 != 1) | |||
| continue; | |||
| d = sin(M_PI * (i + 0.5) / 36.0); | |||
| if (j == 1) { | |||
| if (i >= 30) d = 0; | |||
| else if (i >= 24) d = sin(M_PI * (i - 18 + 0.5) / 12.0); | |||
| else if (i >= 18) d = 1; | |||
| } else if (j == 3) { | |||
| if (i < 6) d = 0; | |||
| else if (i < 12) d = sin(M_PI * (i - 6 + 0.5) / 12.0); | |||
| else if (i < 18) d = 1; | |||
| } | |||
| //merge last stage of imdct into the window coefficients | |||
| d *= 0.5 / cos(M_PI * (2 * i + 19) / 72); | |||
| if (j == 2) | |||
| RENAME(ff_mdct_win)[j][i/3] = FIXHR((d / (1<<5))); | |||
| else | |||
| RENAME(ff_mdct_win)[j][i ] = FIXHR((d / (1<<5))); | |||
| } | |||
| } | |||
| /* NOTE: we do frequency inversion adter the MDCT by changing | |||
| the sign of the right window coefs */ | |||
| for (j = 0; j < 4; j++) { | |||
| for (i = 0; i < 36; i += 2) { | |||
| RENAME(ff_mdct_win)[j + 4][i ] = RENAME(ff_mdct_win)[j][i ]; | |||
| RENAME(ff_mdct_win)[j + 4][i + 1] = -RENAME(ff_mdct_win)[j][i + 1]; | |||
| } | |||
| } | |||
| } | |||
| /* cos(pi*i/18) */ | |||
| #define C1 FIXHR(0.98480775301220805936/2) | |||
| #define C2 FIXHR(0.93969262078590838405/2) | |||
| #define C3 FIXHR(0.86602540378443864676/2) | |||
| #define C4 FIXHR(0.76604444311897803520/2) | |||
| #define C5 FIXHR(0.64278760968653932632/2) | |||
| #define C6 FIXHR(0.5/2) | |||
| #define C7 FIXHR(0.34202014332566873304/2) | |||
| #define C8 FIXHR(0.17364817766693034885/2) | |||
| /* 0.5 / cos(pi*(2*i+1)/36) */ | |||
| static const INTFLOAT icos36[9] = { | |||
| FIXR(0.50190991877167369479), | |||
| FIXR(0.51763809020504152469), //0 | |||
| FIXR(0.55168895948124587824), | |||
| FIXR(0.61038729438072803416), | |||
| FIXR(0.70710678118654752439), //1 | |||
| FIXR(0.87172339781054900991), | |||
| FIXR(1.18310079157624925896), | |||
| FIXR(1.93185165257813657349), //2 | |||
| FIXR(5.73685662283492756461), | |||
| }; | |||
| /* 0.5 / cos(pi*(2*i+1)/36) */ | |||
| static const INTFLOAT icos36h[9] = { | |||
| FIXHR(0.50190991877167369479/2), | |||
| FIXHR(0.51763809020504152469/2), //0 | |||
| FIXHR(0.55168895948124587824/2), | |||
| FIXHR(0.61038729438072803416/2), | |||
| FIXHR(0.70710678118654752439/2), //1 | |||
| FIXHR(0.87172339781054900991/2), | |||
| FIXHR(1.18310079157624925896/4), | |||
| FIXHR(1.93185165257813657349/4), //2 | |||
| // FIXHR(5.73685662283492756461), | |||
| }; | |||
| /* using Lee like decomposition followed by hand coded 9 points DCT */ | |||
| static void imdct36(INTFLOAT *out, INTFLOAT *buf, INTFLOAT *in, INTFLOAT *win) | |||
| { | |||
| int i, j; | |||
| INTFLOAT t0, t1, t2, t3, s0, s1, s2, s3; | |||
| INTFLOAT tmp[18], *tmp1, *in1; | |||
| for (i = 17; i >= 1; i--) | |||
| in[i] += in[i-1]; | |||
| for (i = 17; i >= 3; i -= 2) | |||
| in[i] += in[i-2]; | |||
| for (j = 0; j < 2; j++) { | |||
| tmp1 = tmp + j; | |||
| in1 = in + j; | |||
| t2 = in1[2*4] + in1[2*8] - in1[2*2]; | |||
| t3 = in1[2*0] + SHR(in1[2*6],1); | |||
| t1 = in1[2*0] - in1[2*6]; | |||
| tmp1[ 6] = t1 - SHR(t2,1); | |||
| tmp1[16] = t1 + t2; | |||
| t0 = MULH3(in1[2*2] + in1[2*4] , C2, 2); | |||
| t1 = MULH3(in1[2*4] - in1[2*8] , -2*C8, 1); | |||
| t2 = MULH3(in1[2*2] + in1[2*8] , -C4, 2); | |||
| tmp1[10] = t3 - t0 - t2; | |||
| tmp1[ 2] = t3 + t0 + t1; | |||
| tmp1[14] = t3 + t2 - t1; | |||
| tmp1[ 4] = MULH3(in1[2*5] + in1[2*7] - in1[2*1], -C3, 2); | |||
| t2 = MULH3(in1[2*1] + in1[2*5], C1, 2); | |||
| t3 = MULH3(in1[2*5] - in1[2*7], -2*C7, 1); | |||
| t0 = MULH3(in1[2*3], C3, 2); | |||
| t1 = MULH3(in1[2*1] + in1[2*7], -C5, 2); | |||
| tmp1[ 0] = t2 + t3 + t0; | |||
| tmp1[12] = t2 + t1 - t0; | |||
| tmp1[ 8] = t3 - t1 - t0; | |||
| } | |||
| i = 0; | |||
| for (j = 0; j < 4; j++) { | |||
| t0 = tmp[i]; | |||
| t1 = tmp[i + 2]; | |||
| s0 = t1 + t0; | |||
| s2 = t1 - t0; | |||
| t2 = tmp[i + 1]; | |||
| t3 = tmp[i + 3]; | |||
| s1 = MULH3(t3 + t2, icos36h[ j], 2); | |||
| s3 = MULLx(t3 - t2, icos36 [8 - j], FRAC_BITS); | |||
| t0 = s0 + s1; | |||
| t1 = s0 - s1; | |||
| out[(9 + j) * SBLIMIT] = MULH3(t1, win[ 9 + j], 1) + buf[4*(9 + j)]; | |||
| out[(8 - j) * SBLIMIT] = MULH3(t1, win[ 8 - j], 1) + buf[4*(8 - j)]; | |||
| buf[4 * ( 9 + j )] = MULH3(t0, win[18 + 9 + j], 1); | |||
| buf[4 * ( 8 - j )] = MULH3(t0, win[18 + 8 - j], 1); | |||
| t0 = s2 + s3; | |||
| t1 = s2 - s3; | |||
| out[(9 + 8 - j) * SBLIMIT] = MULH3(t1, win[ 9 + 8 - j], 1) + buf[4*(9 + 8 - j)]; | |||
| out[ j * SBLIMIT] = MULH3(t1, win[ j], 1) + buf[4*( j)]; | |||
| buf[4 * ( 9 + 8 - j )] = MULH3(t0, win[18 + 9 + 8 - j], 1); | |||
| buf[4 * ( j )] = MULH3(t0, win[18 + j], 1); | |||
| i += 4; | |||
| } | |||
| s0 = tmp[16]; | |||
| s1 = MULH3(tmp[17], icos36h[4], 2); | |||
| t0 = s0 + s1; | |||
| t1 = s0 - s1; | |||
| out[(9 + 4) * SBLIMIT] = MULH3(t1, win[ 9 + 4], 1) + buf[4*(9 + 4)]; | |||
| out[(8 - 4) * SBLIMIT] = MULH3(t1, win[ 8 - 4], 1) + buf[4*(8 - 4)]; | |||
| buf[4 * ( 9 + 4 )] = MULH3(t0, win[18 + 9 + 4], 1); | |||
| buf[4 * ( 8 - 4 )] = MULH3(t0, win[18 + 8 - 4], 1); | |||
| } | |||
| void RENAME(ff_imdct36_blocks)(INTFLOAT *out, INTFLOAT *buf, INTFLOAT *in, | |||
| int count, int switch_point, int block_type) | |||
| { | |||
| int j; | |||
| for (j=0 ; j < count; j++) { | |||
| /* apply window & overlap with previous buffer */ | |||
| /* select window */ | |||
| int win_idx = (switch_point && j < 2) ? 0 : block_type; | |||
| INTFLOAT *win = RENAME(ff_mdct_win)[win_idx + (4 & -(j & 1))]; | |||
| imdct36(out, buf, in, win); | |||
| in += 18; | |||
| buf += ((j&3) != 3 ? 1 : (72-3)); | |||
| out++; | |||
| } | |||
| } | |||