diff --git a/libavcodec/aacpsdsp_template.c b/libavcodec/aacpsdsp_template.c index e644037587..e3cbf3feec 100644 --- a/libavcodec/aacpsdsp_template.c +++ b/libavcodec/aacpsdsp_template.c @@ -47,21 +47,24 @@ static void ps_hybrid_analysis_c(INTFLOAT (*out)[2], INTFLOAT (*in)[2], const INTFLOAT (*filter)[8][2], ptrdiff_t stride, int n) { - int i, j; + INT64FLOAT inre0[6], inre1[6], inim0[6], inim1[6]; - for (i = 0; i < n; i++) { + for (int j = 0; j < 6; j++) { + inre0[j] = in[j][0] + in[12 - j][0]; + inre1[j] = in[j][1] - in[12 - j][1]; + inim0[j] = in[j][1] + in[12 - j][1]; + inim1[j] = in[j][0] - in[12 - j][0]; + } + + for (int i = 0; i < n; i++) { INT64FLOAT sum_re = (INT64FLOAT)filter[i][6][0] * in[6][0]; INT64FLOAT sum_im = (INT64FLOAT)filter[i][6][0] * in[6][1]; - for (j = 0; j < 6; j++) { - INT64FLOAT in0_re = in[j][0]; - INT64FLOAT in0_im = in[j][1]; - INT64FLOAT in1_re = in[12-j][0]; - INT64FLOAT in1_im = in[12-j][1]; - sum_re += (INT64FLOAT)filter[i][j][0] * (in0_re + in1_re) - - (INT64FLOAT)filter[i][j][1] * (in0_im - in1_im); - sum_im += (INT64FLOAT)filter[i][j][0] * (in0_im + in1_im) + - (INT64FLOAT)filter[i][j][1] * (in0_re - in1_re); + for (int j = 0; j < 6; j++) { + sum_re += (INT64FLOAT)filter[i][j][0] * inre0[j] - + (INT64FLOAT)filter[i][j][1] * inre1[j]; + sum_im += (INT64FLOAT)filter[i][j][0] * inim0[j] + + (INT64FLOAT)filter[i][j][1] * inim1[j]; } #if USE_FIXED out[i * stride][0] = (int)((sum_re + 0x40000000) >> 31);