1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker * *
3*15dc779aSAndroid Build Coastguard Worker * Copyright (C) 2018 The Android Open Source Project
4*15dc779aSAndroid Build Coastguard Worker *
5*15dc779aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*15dc779aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*15dc779aSAndroid Build Coastguard Worker * You may obtain a copy of the License at:
8*15dc779aSAndroid Build Coastguard Worker *
9*15dc779aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*15dc779aSAndroid Build Coastguard Worker *
11*15dc779aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*15dc779aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*15dc779aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*15dc779aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*15dc779aSAndroid Build Coastguard Worker * limitations under the License.
16*15dc779aSAndroid Build Coastguard Worker *
17*15dc779aSAndroid Build Coastguard Worker *****************************************************************************
18*15dc779aSAndroid Build Coastguard Worker * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*15dc779aSAndroid Build Coastguard Worker */
20*15dc779aSAndroid Build Coastguard Worker #include <string.h>
21*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
22*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_common_rom.h"
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecsettings.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_scale.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr_part.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_rom.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_hybrid.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ps_dec.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_config.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_qmf_dec.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_polyphase.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_struct_def.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_res_rom.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_aac_struct.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_dec.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_macro_def.h"
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_basic_op.h"
42*15dc779aSAndroid Build Coastguard Worker
43*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 ixheaacd_ia_mps_hyb_filter_coeff_8[QMF_HYBRID_FILT_ORDER];
44*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 ixheaacd_mps_hyb_filter_coeff_2[QMF_HYBRID_FILT_ORDER];
45*15dc779aSAndroid Build Coastguard Worker
46*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 ixheaacd_sine[8][8];
47*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 ixheaacd_cosine[8][8];
48*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_hyb_filt_type1(ia_cmplx_flt_struct * input,ia_cmplx_flt_struct output[8][MAX_TIME_SLOTS],WORD32 num_samples,const FLOAT32 * filt_coeff)49*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_mps_hyb_filt_type1(ia_cmplx_flt_struct *input,
50*15dc779aSAndroid Build Coastguard Worker ia_cmplx_flt_struct output[8][MAX_TIME_SLOTS],
51*15dc779aSAndroid Build Coastguard Worker WORD32 num_samples, const FLOAT32 *filt_coeff) {
52*15dc779aSAndroid Build Coastguard Worker WORD32 i, n, q;
53*15dc779aSAndroid Build Coastguard Worker
54*15dc779aSAndroid Build Coastguard Worker FLOAT32 in_re, in_im;
55*15dc779aSAndroid Build Coastguard Worker FLOAT32 coeff;
56*15dc779aSAndroid Build Coastguard Worker FLOAT32 acc_re_l, acc_re_h, acc_im_l, acc_im_h;
57*15dc779aSAndroid Build Coastguard Worker
58*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_samples; i++) {
59*15dc779aSAndroid Build Coastguard Worker FLOAT32 x0_re[13], x0_im[13], x0_1_re[8], x0_1_im[8];
60*15dc779aSAndroid Build Coastguard Worker FLOAT32 acc_re_val[8], acc_im_val[8];
61*15dc779aSAndroid Build Coastguard Worker for (n = 0; n < QMF_HYBRID_FILT_ORDER; n++) {
62*15dc779aSAndroid Build Coastguard Worker in_re = input[n + i].re;
63*15dc779aSAndroid Build Coastguard Worker in_im = input[n + i].im;
64*15dc779aSAndroid Build Coastguard Worker
65*15dc779aSAndroid Build Coastguard Worker coeff = filt_coeff[QMF_HYBRID_FILT_ORDER - 1 - n];
66*15dc779aSAndroid Build Coastguard Worker
67*15dc779aSAndroid Build Coastguard Worker x0_re[n] = coeff * in_re;
68*15dc779aSAndroid Build Coastguard Worker x0_im[n] = coeff * in_im;
69*15dc779aSAndroid Build Coastguard Worker }
70*15dc779aSAndroid Build Coastguard Worker
71*15dc779aSAndroid Build Coastguard Worker x0_1_re[0] = x0_re[6];
72*15dc779aSAndroid Build Coastguard Worker x0_1_im[0] = x0_im[6];
73*15dc779aSAndroid Build Coastguard Worker
74*15dc779aSAndroid Build Coastguard Worker x0_1_re[1] = x0_re[7];
75*15dc779aSAndroid Build Coastguard Worker x0_1_im[1] = x0_im[7];
76*15dc779aSAndroid Build Coastguard Worker
77*15dc779aSAndroid Build Coastguard Worker x0_1_re[2] = x0_re[8] - x0_re[0];
78*15dc779aSAndroid Build Coastguard Worker x0_1_im[2] = x0_im[8] - x0_im[0];
79*15dc779aSAndroid Build Coastguard Worker
80*15dc779aSAndroid Build Coastguard Worker x0_1_re[3] = x0_re[9] - x0_re[1];
81*15dc779aSAndroid Build Coastguard Worker x0_1_im[3] = x0_im[9] - x0_im[1];
82*15dc779aSAndroid Build Coastguard Worker
83*15dc779aSAndroid Build Coastguard Worker x0_1_re[4] = x0_re[10] - x0_re[2];
84*15dc779aSAndroid Build Coastguard Worker x0_1_im[4] = x0_im[10] - x0_im[2];
85*15dc779aSAndroid Build Coastguard Worker
86*15dc779aSAndroid Build Coastguard Worker x0_1_re[5] = x0_re[11] - x0_re[3];
87*15dc779aSAndroid Build Coastguard Worker x0_1_im[5] = x0_im[11] - x0_im[3];
88*15dc779aSAndroid Build Coastguard Worker
89*15dc779aSAndroid Build Coastguard Worker x0_1_re[6] = x0_re[12] - x0_re[4];
90*15dc779aSAndroid Build Coastguard Worker x0_1_im[6] = x0_im[12] - x0_im[4];
91*15dc779aSAndroid Build Coastguard Worker
92*15dc779aSAndroid Build Coastguard Worker x0_1_re[7] = -(x0_re[5]);
93*15dc779aSAndroid Build Coastguard Worker x0_1_im[7] = -(x0_im[5]);
94*15dc779aSAndroid Build Coastguard Worker
95*15dc779aSAndroid Build Coastguard Worker acc_re_val[0] = x0_1_re[0];
96*15dc779aSAndroid Build Coastguard Worker acc_re_val[1] = x0_1_re[1] - x0_1_re[7];
97*15dc779aSAndroid Build Coastguard Worker acc_re_val[2] = x0_1_re[2] - x0_1_re[6];
98*15dc779aSAndroid Build Coastguard Worker acc_re_val[3] = x0_1_re[3] - x0_1_re[5];
99*15dc779aSAndroid Build Coastguard Worker acc_re_val[4] = x0_1_im[1] + x0_1_im[7];
100*15dc779aSAndroid Build Coastguard Worker acc_re_val[5] = x0_1_im[2] + x0_1_im[6];
101*15dc779aSAndroid Build Coastguard Worker acc_re_val[6] = x0_1_im[3] + x0_1_im[5];
102*15dc779aSAndroid Build Coastguard Worker acc_re_val[7] = x0_1_im[4];
103*15dc779aSAndroid Build Coastguard Worker
104*15dc779aSAndroid Build Coastguard Worker acc_im_val[0] = x0_1_im[0];
105*15dc779aSAndroid Build Coastguard Worker acc_im_val[1] = x0_1_im[1] - x0_1_im[7];
106*15dc779aSAndroid Build Coastguard Worker acc_im_val[2] = x0_1_im[2] - x0_1_im[6];
107*15dc779aSAndroid Build Coastguard Worker acc_im_val[3] = x0_1_im[3] - x0_1_im[5];
108*15dc779aSAndroid Build Coastguard Worker acc_im_val[4] = x0_1_re[1] + x0_1_re[7];
109*15dc779aSAndroid Build Coastguard Worker acc_im_val[5] = x0_1_re[2] + x0_1_re[6];
110*15dc779aSAndroid Build Coastguard Worker acc_im_val[6] = x0_1_re[3] + x0_1_re[5];
111*15dc779aSAndroid Build Coastguard Worker acc_im_val[7] = x0_1_re[4];
112*15dc779aSAndroid Build Coastguard Worker
113*15dc779aSAndroid Build Coastguard Worker for (q = 0; q < 4; q++) {
114*15dc779aSAndroid Build Coastguard Worker acc_re_l = 0;
115*15dc779aSAndroid Build Coastguard Worker acc_im_l = 0;
116*15dc779aSAndroid Build Coastguard Worker acc_re_h = 0;
117*15dc779aSAndroid Build Coastguard Worker acc_im_h = 0;
118*15dc779aSAndroid Build Coastguard Worker
119*15dc779aSAndroid Build Coastguard Worker acc_re_l += acc_re_val[0];
120*15dc779aSAndroid Build Coastguard Worker acc_re_l += acc_re_val[1] * ixheaacd_cosine[q][1];
121*15dc779aSAndroid Build Coastguard Worker acc_re_l += acc_re_val[2] * ixheaacd_cosine[q][2];
122*15dc779aSAndroid Build Coastguard Worker acc_re_l += acc_re_val[3] * ixheaacd_cosine[q][3];
123*15dc779aSAndroid Build Coastguard Worker
124*15dc779aSAndroid Build Coastguard Worker acc_re_h = acc_re_l;
125*15dc779aSAndroid Build Coastguard Worker
126*15dc779aSAndroid Build Coastguard Worker acc_re_l -= acc_re_val[4] * ixheaacd_sine[q][1];
127*15dc779aSAndroid Build Coastguard Worker acc_re_l -= acc_re_val[5] * ixheaacd_sine[q][2];
128*15dc779aSAndroid Build Coastguard Worker acc_re_l -= acc_re_val[6] * ixheaacd_sine[q][3];
129*15dc779aSAndroid Build Coastguard Worker acc_re_l -= acc_re_val[7] * ixheaacd_sine[q][4];
130*15dc779aSAndroid Build Coastguard Worker
131*15dc779aSAndroid Build Coastguard Worker acc_re_h = acc_re_h - (acc_re_l - acc_re_h);
132*15dc779aSAndroid Build Coastguard Worker
133*15dc779aSAndroid Build Coastguard Worker acc_im_l += acc_im_val[0];
134*15dc779aSAndroid Build Coastguard Worker acc_im_l += acc_im_val[1] * ixheaacd_cosine[q][1];
135*15dc779aSAndroid Build Coastguard Worker acc_im_l += acc_im_val[2] * ixheaacd_cosine[q][2];
136*15dc779aSAndroid Build Coastguard Worker acc_im_l += acc_im_val[3] * ixheaacd_cosine[q][3];
137*15dc779aSAndroid Build Coastguard Worker
138*15dc779aSAndroid Build Coastguard Worker acc_im_h = acc_im_l;
139*15dc779aSAndroid Build Coastguard Worker
140*15dc779aSAndroid Build Coastguard Worker acc_im_l += acc_im_val[4] * ixheaacd_sine[q][1];
141*15dc779aSAndroid Build Coastguard Worker acc_im_l += acc_im_val[5] * ixheaacd_sine[q][2];
142*15dc779aSAndroid Build Coastguard Worker acc_im_l += acc_im_val[6] * ixheaacd_sine[q][3];
143*15dc779aSAndroid Build Coastguard Worker acc_im_l += acc_im_val[7] * ixheaacd_sine[q][4];
144*15dc779aSAndroid Build Coastguard Worker
145*15dc779aSAndroid Build Coastguard Worker acc_im_h = acc_im_h - (acc_im_l - acc_im_h);
146*15dc779aSAndroid Build Coastguard Worker
147*15dc779aSAndroid Build Coastguard Worker output[q][i].re = acc_re_l;
148*15dc779aSAndroid Build Coastguard Worker output[q][i].im = acc_im_l;
149*15dc779aSAndroid Build Coastguard Worker
150*15dc779aSAndroid Build Coastguard Worker output[7 - q][i].re = acc_re_h;
151*15dc779aSAndroid Build Coastguard Worker output[7 - q][i].im = acc_im_h;
152*15dc779aSAndroid Build Coastguard Worker }
153*15dc779aSAndroid Build Coastguard Worker }
154*15dc779aSAndroid Build Coastguard Worker }
155*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_hyb_filt_type2(ia_cmplx_flt_struct * input,ia_cmplx_flt_struct output[2][MAX_TIME_SLOTS],WORD32 num_samples,const FLOAT32 * filt_coeff)156*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_mps_hyb_filt_type2(ia_cmplx_flt_struct *input,
157*15dc779aSAndroid Build Coastguard Worker ia_cmplx_flt_struct output[2][MAX_TIME_SLOTS],
158*15dc779aSAndroid Build Coastguard Worker WORD32 num_samples, const FLOAT32 *filt_coeff) {
159*15dc779aSAndroid Build Coastguard Worker WORD32 i, n;
160*15dc779aSAndroid Build Coastguard Worker
161*15dc779aSAndroid Build Coastguard Worker FLOAT32 in_re, in_im;
162*15dc779aSAndroid Build Coastguard Worker FLOAT32 coeff;
163*15dc779aSAndroid Build Coastguard Worker FLOAT32 acc_re[2], acc_im[2];
164*15dc779aSAndroid Build Coastguard Worker
165*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_samples; i++) {
166*15dc779aSAndroid Build Coastguard Worker FLOAT32 x_0_re[13], x_0_im[13];
167*15dc779aSAndroid Build Coastguard Worker
168*15dc779aSAndroid Build Coastguard Worker for (n = 1; n < 6; n = n + 2) {
169*15dc779aSAndroid Build Coastguard Worker in_re = input[n + i].re;
170*15dc779aSAndroid Build Coastguard Worker in_im = input[n + i].im;
171*15dc779aSAndroid Build Coastguard Worker
172*15dc779aSAndroid Build Coastguard Worker in_re += input[12 - n + i].re;
173*15dc779aSAndroid Build Coastguard Worker in_im += input[12 - n + i].im;
174*15dc779aSAndroid Build Coastguard Worker
175*15dc779aSAndroid Build Coastguard Worker coeff = filt_coeff[QMF_HYBRID_FILT_ORDER - 1 - n];
176*15dc779aSAndroid Build Coastguard Worker
177*15dc779aSAndroid Build Coastguard Worker x_0_re[n] = coeff * in_re;
178*15dc779aSAndroid Build Coastguard Worker x_0_im[n] = coeff * in_im;
179*15dc779aSAndroid Build Coastguard Worker }
180*15dc779aSAndroid Build Coastguard Worker
181*15dc779aSAndroid Build Coastguard Worker n = 6;
182*15dc779aSAndroid Build Coastguard Worker in_re = input[n + i].re;
183*15dc779aSAndroid Build Coastguard Worker in_im = input[n + i].im;
184*15dc779aSAndroid Build Coastguard Worker
185*15dc779aSAndroid Build Coastguard Worker coeff = filt_coeff[QMF_HYBRID_FILT_ORDER - 1 - n];
186*15dc779aSAndroid Build Coastguard Worker
187*15dc779aSAndroid Build Coastguard Worker x_0_re[n] = coeff * in_re;
188*15dc779aSAndroid Build Coastguard Worker x_0_im[n] = coeff * in_im;
189*15dc779aSAndroid Build Coastguard Worker
190*15dc779aSAndroid Build Coastguard Worker x_0_re[1] = x_0_re[1] + x_0_re[3] + x_0_re[5];
191*15dc779aSAndroid Build Coastguard Worker x_0_im[1] = x_0_im[1] + x_0_im[3] + x_0_im[5];
192*15dc779aSAndroid Build Coastguard Worker
193*15dc779aSAndroid Build Coastguard Worker acc_re[0] = x_0_re[6] + x_0_re[1];
194*15dc779aSAndroid Build Coastguard Worker acc_im[0] = x_0_im[6] + x_0_im[1];
195*15dc779aSAndroid Build Coastguard Worker
196*15dc779aSAndroid Build Coastguard Worker acc_re[1] = x_0_re[6] - x_0_re[1];
197*15dc779aSAndroid Build Coastguard Worker acc_im[1] = x_0_im[6] - x_0_im[1];
198*15dc779aSAndroid Build Coastguard Worker
199*15dc779aSAndroid Build Coastguard Worker output[0][i].re = acc_re[0];
200*15dc779aSAndroid Build Coastguard Worker output[0][i].im = acc_im[0];
201*15dc779aSAndroid Build Coastguard Worker
202*15dc779aSAndroid Build Coastguard Worker output[1][i].re = acc_re[1];
203*15dc779aSAndroid Build Coastguard Worker output[1][i].im = acc_im[1];
204*15dc779aSAndroid Build Coastguard Worker }
205*15dc779aSAndroid Build Coastguard Worker }
206*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_qmf_hybrid_analysis_init(ia_mps_hybrid_filt_struct * handle)207*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_mps_qmf_hybrid_analysis_init(ia_mps_hybrid_filt_struct *handle) {
208*15dc779aSAndroid Build Coastguard Worker memset(handle->lf_buffer, 0,
209*15dc779aSAndroid Build Coastguard Worker QMF_BANDS_TO_HYBRID * BUFFER_LEN_LF_MPS * sizeof(ia_cmplx_w32_struct));
210*15dc779aSAndroid Build Coastguard Worker memset(handle->hf_buffer, 0,
211*15dc779aSAndroid Build Coastguard Worker MAX_NUM_QMF_BANDS_MPS * BUFFER_LEN_HF_MPS * sizeof(ia_cmplx_flt_struct));
212*15dc779aSAndroid Build Coastguard Worker }
213*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_qmf_hybrid_analysis_no_pre_mix(ia_mps_hybrid_filt_struct * handle,ia_cmplx_flt_struct in_qmf[MAX_NUM_QMF_BANDS_MPS][MAX_TIME_SLOTS],WORD32 num_bands,WORD32 num_samples,ia_cmplx_flt_struct v[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS])214*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_mps_qmf_hybrid_analysis_no_pre_mix(
215*15dc779aSAndroid Build Coastguard Worker ia_mps_hybrid_filt_struct *handle,
216*15dc779aSAndroid Build Coastguard Worker ia_cmplx_flt_struct in_qmf[MAX_NUM_QMF_BANDS_MPS][MAX_TIME_SLOTS], WORD32 num_bands,
217*15dc779aSAndroid Build Coastguard Worker WORD32 num_samples, ia_cmplx_flt_struct v[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS]) {
218*15dc779aSAndroid Build Coastguard Worker WORD32 lf_samples_shift;
219*15dc779aSAndroid Build Coastguard Worker WORD32 hf_samples_shift;
220*15dc779aSAndroid Build Coastguard Worker WORD32 lf_qmf_bands;
221*15dc779aSAndroid Build Coastguard Worker WORD32 k, n;
222*15dc779aSAndroid Build Coastguard Worker
223*15dc779aSAndroid Build Coastguard Worker ia_cmplx_flt_struct scratch[MAX_HYBRID_ONLY_BANDS_PER_QMF][MAX_TIME_SLOTS];
224*15dc779aSAndroid Build Coastguard Worker
225*15dc779aSAndroid Build Coastguard Worker lf_samples_shift = BUFFER_LEN_LF_MPS - num_samples;
226*15dc779aSAndroid Build Coastguard Worker hf_samples_shift = BUFFER_LEN_HF_MPS - num_samples;
227*15dc779aSAndroid Build Coastguard Worker
228*15dc779aSAndroid Build Coastguard Worker lf_qmf_bands = QMF_BANDS_TO_HYBRID;
229*15dc779aSAndroid Build Coastguard Worker
230*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < lf_qmf_bands; k++) {
231*15dc779aSAndroid Build Coastguard Worker memmove(&handle->lf_buffer[k][0].re, &handle->lf_buffer[k][num_samples].re,
232*15dc779aSAndroid Build Coastguard Worker 2 * lf_samples_shift * sizeof(FLOAT32));
233*15dc779aSAndroid Build Coastguard Worker }
234*15dc779aSAndroid Build Coastguard Worker
235*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < lf_qmf_bands; k++) {
236*15dc779aSAndroid Build Coastguard Worker memcpy(&handle->lf_buffer[k][lf_samples_shift].re, &in_qmf[k][0].re,
237*15dc779aSAndroid Build Coastguard Worker 2 * num_samples * sizeof(FLOAT32));
238*15dc779aSAndroid Build Coastguard Worker }
239*15dc779aSAndroid Build Coastguard Worker
240*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < MAX_NUM_QMF_BANDS_SAC / 2 - lf_qmf_bands; k++) {
241*15dc779aSAndroid Build Coastguard Worker memmove(&handle->hf_buffer[k][0].re, &handle->hf_buffer[k][num_samples].re,
242*15dc779aSAndroid Build Coastguard Worker 2 * hf_samples_shift * sizeof(FLOAT32));
243*15dc779aSAndroid Build Coastguard Worker }
244*15dc779aSAndroid Build Coastguard Worker
245*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < num_bands - lf_qmf_bands; k++) {
246*15dc779aSAndroid Build Coastguard Worker memcpy(&handle->hf_buffer[k][hf_samples_shift].re, &in_qmf[k + lf_qmf_bands][0].re,
247*15dc779aSAndroid Build Coastguard Worker 2 * num_samples * sizeof(FLOAT32));
248*15dc779aSAndroid Build Coastguard Worker }
249*15dc779aSAndroid Build Coastguard Worker
250*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_hyb_filt_type1(
251*15dc779aSAndroid Build Coastguard Worker &(handle->lf_buffer[0][lf_samples_shift + 1 - QMF_HYBRID_FILT_ORDER]), scratch, num_samples,
252*15dc779aSAndroid Build Coastguard Worker ixheaacd_ia_mps_hyb_filter_coeff_8);
253*15dc779aSAndroid Build Coastguard Worker
254*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < 2; k++) {
255*15dc779aSAndroid Build Coastguard Worker for (n = 0; n < num_samples; n++) {
256*15dc779aSAndroid Build Coastguard Worker v[n][k].re = scratch[k + 6][n].re;
257*15dc779aSAndroid Build Coastguard Worker v[n][k + 2].re = scratch[k][n].re;
258*15dc779aSAndroid Build Coastguard Worker v[n][k + 4].re = scratch[k + 2][n].re;
259*15dc779aSAndroid Build Coastguard Worker v[n][k + 4].re += scratch[5 - k][n].re;
260*15dc779aSAndroid Build Coastguard Worker
261*15dc779aSAndroid Build Coastguard Worker v[n][k].im = scratch[k + 6][n].im;
262*15dc779aSAndroid Build Coastguard Worker v[n][k + 2].im = scratch[k][n].im;
263*15dc779aSAndroid Build Coastguard Worker v[n][k + 4].im = scratch[k + 2][n].im;
264*15dc779aSAndroid Build Coastguard Worker v[n][k + 4].im += scratch[5 - k][n].im;
265*15dc779aSAndroid Build Coastguard Worker }
266*15dc779aSAndroid Build Coastguard Worker }
267*15dc779aSAndroid Build Coastguard Worker
268*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_hyb_filt_type2(
269*15dc779aSAndroid Build Coastguard Worker &(handle->lf_buffer[1][lf_samples_shift + 1 - QMF_HYBRID_FILT_ORDER]), scratch, num_samples,
270*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_hyb_filter_coeff_2);
271*15dc779aSAndroid Build Coastguard Worker
272*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < 2; k++) {
273*15dc779aSAndroid Build Coastguard Worker for (n = 0; n < num_samples; n++) {
274*15dc779aSAndroid Build Coastguard Worker v[n][k + 6].re = scratch[1 - k][n].re;
275*15dc779aSAndroid Build Coastguard Worker v[n][k + 6].im = scratch[1 - k][n].im;
276*15dc779aSAndroid Build Coastguard Worker }
277*15dc779aSAndroid Build Coastguard Worker }
278*15dc779aSAndroid Build Coastguard Worker
279*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_hyb_filt_type2(
280*15dc779aSAndroid Build Coastguard Worker &(handle->lf_buffer[2][lf_samples_shift + 1 - QMF_HYBRID_FILT_ORDER]), scratch, num_samples,
281*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_hyb_filter_coeff_2);
282*15dc779aSAndroid Build Coastguard Worker
283*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < 2; k++) {
284*15dc779aSAndroid Build Coastguard Worker for (n = 0; n < num_samples; n++) {
285*15dc779aSAndroid Build Coastguard Worker v[n][k + 8].re = scratch[k][n].re;
286*15dc779aSAndroid Build Coastguard Worker v[n][k + 8].im = scratch[k][n].im;
287*15dc779aSAndroid Build Coastguard Worker }
288*15dc779aSAndroid Build Coastguard Worker }
289*15dc779aSAndroid Build Coastguard Worker
290*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < num_bands - lf_qmf_bands; k++) {
291*15dc779aSAndroid Build Coastguard Worker for (n = 0; n < num_samples; n++) {
292*15dc779aSAndroid Build Coastguard Worker v[n][k + 10].re = (handle->hf_buffer[k][n + hf_samples_shift].re);
293*15dc779aSAndroid Build Coastguard Worker v[n][k + 10].im = (handle->hf_buffer[k][n + hf_samples_shift].im);
294*15dc779aSAndroid Build Coastguard Worker }
295*15dc779aSAndroid Build Coastguard Worker }
296*15dc779aSAndroid Build Coastguard Worker }
297*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_qmf_hybrid_analysis(ia_mps_hybrid_filt_struct * handle,ia_cmplx_flt_struct in_qmf[MAX_NUM_QMF_BANDS_MPS_NEW][MAX_TIME_SLOTS],WORD32 num_bands,WORD32 num_samples,ia_cmplx_flt_struct hyb[MAX_HYBRID_BANDS_MPS][MAX_TIME_SLOTS])298*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_mps_qmf_hybrid_analysis(
299*15dc779aSAndroid Build Coastguard Worker ia_mps_hybrid_filt_struct *handle,
300*15dc779aSAndroid Build Coastguard Worker ia_cmplx_flt_struct in_qmf[MAX_NUM_QMF_BANDS_MPS_NEW][MAX_TIME_SLOTS], WORD32 num_bands,
301*15dc779aSAndroid Build Coastguard Worker WORD32 num_samples, ia_cmplx_flt_struct hyb[MAX_HYBRID_BANDS_MPS][MAX_TIME_SLOTS]) {
302*15dc779aSAndroid Build Coastguard Worker WORD32 lf_samples_shift;
303*15dc779aSAndroid Build Coastguard Worker WORD32 hf_samples_shift;
304*15dc779aSAndroid Build Coastguard Worker WORD32 lf_qmf_bands;
305*15dc779aSAndroid Build Coastguard Worker WORD32 k, n;
306*15dc779aSAndroid Build Coastguard Worker
307*15dc779aSAndroid Build Coastguard Worker ia_cmplx_flt_struct scratch[MAX_HYBRID_ONLY_BANDS_PER_QMF][MAX_TIME_SLOTS];
308*15dc779aSAndroid Build Coastguard Worker
309*15dc779aSAndroid Build Coastguard Worker lf_samples_shift = BUFFER_LEN_LF_MPS - num_samples;
310*15dc779aSAndroid Build Coastguard Worker hf_samples_shift = BUFFER_LEN_HF_MPS - num_samples;
311*15dc779aSAndroid Build Coastguard Worker
312*15dc779aSAndroid Build Coastguard Worker lf_qmf_bands = QMF_BANDS_TO_HYBRID;
313*15dc779aSAndroid Build Coastguard Worker
314*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < lf_qmf_bands; k++) {
315*15dc779aSAndroid Build Coastguard Worker memmove(&handle->lf_buffer[k][0].re, &handle->lf_buffer[k][num_samples].re,
316*15dc779aSAndroid Build Coastguard Worker 2 * lf_samples_shift * sizeof(FLOAT32));
317*15dc779aSAndroid Build Coastguard Worker }
318*15dc779aSAndroid Build Coastguard Worker
319*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < lf_qmf_bands; k++) {
320*15dc779aSAndroid Build Coastguard Worker memcpy(&handle->lf_buffer[k][lf_samples_shift].re, &in_qmf[k][0].re,
321*15dc779aSAndroid Build Coastguard Worker 2 * num_samples * sizeof(FLOAT32));
322*15dc779aSAndroid Build Coastguard Worker }
323*15dc779aSAndroid Build Coastguard Worker
324*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < MAX_NUM_QMF_BANDS_SAC / 2 - lf_qmf_bands; k++) {
325*15dc779aSAndroid Build Coastguard Worker memmove(&handle->hf_buffer[k][0].re, &handle->hf_buffer[k][num_samples].re,
326*15dc779aSAndroid Build Coastguard Worker 2 * hf_samples_shift * sizeof(FLOAT32));
327*15dc779aSAndroid Build Coastguard Worker }
328*15dc779aSAndroid Build Coastguard Worker
329*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < num_bands - lf_qmf_bands; k++) {
330*15dc779aSAndroid Build Coastguard Worker memcpy(&handle->hf_buffer[k][hf_samples_shift].re, &in_qmf[k + lf_qmf_bands][0].re,
331*15dc779aSAndroid Build Coastguard Worker 2 * num_samples * sizeof(FLOAT32));
332*15dc779aSAndroid Build Coastguard Worker }
333*15dc779aSAndroid Build Coastguard Worker
334*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_hyb_filt_type1(
335*15dc779aSAndroid Build Coastguard Worker &(handle->lf_buffer[0][lf_samples_shift + 1 - QMF_HYBRID_FILT_ORDER]), scratch, num_samples,
336*15dc779aSAndroid Build Coastguard Worker ixheaacd_ia_mps_hyb_filter_coeff_8);
337*15dc779aSAndroid Build Coastguard Worker
338*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < 2; k++) {
339*15dc779aSAndroid Build Coastguard Worker for (n = 0; n < num_samples; n++) {
340*15dc779aSAndroid Build Coastguard Worker hyb[k][n].re = scratch[k + 6][n].re;
341*15dc779aSAndroid Build Coastguard Worker hyb[k + 2][n].re = scratch[k][n].re;
342*15dc779aSAndroid Build Coastguard Worker hyb[k + 4][n].re = scratch[k + 2][n].re;
343*15dc779aSAndroid Build Coastguard Worker hyb[k + 4][n].re += scratch[5 - k][n].re;
344*15dc779aSAndroid Build Coastguard Worker
345*15dc779aSAndroid Build Coastguard Worker hyb[k][n].im = scratch[k + 6][n].im;
346*15dc779aSAndroid Build Coastguard Worker hyb[k + 2][n].im = scratch[k][n].im;
347*15dc779aSAndroid Build Coastguard Worker hyb[k + 4][n].im = scratch[k + 2][n].im;
348*15dc779aSAndroid Build Coastguard Worker hyb[k + 4][n].im += scratch[5 - k][n].im;
349*15dc779aSAndroid Build Coastguard Worker }
350*15dc779aSAndroid Build Coastguard Worker }
351*15dc779aSAndroid Build Coastguard Worker
352*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_hyb_filt_type2(
353*15dc779aSAndroid Build Coastguard Worker &(handle->lf_buffer[1][lf_samples_shift + 1 - QMF_HYBRID_FILT_ORDER]), scratch, num_samples,
354*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_hyb_filter_coeff_2);
355*15dc779aSAndroid Build Coastguard Worker
356*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < 2; k++) {
357*15dc779aSAndroid Build Coastguard Worker for (n = 0; n < num_samples; n++) {
358*15dc779aSAndroid Build Coastguard Worker hyb[k + 6][n].re = scratch[1 - k][n].re;
359*15dc779aSAndroid Build Coastguard Worker hyb[k + 6][n].im = scratch[1 - k][n].im;
360*15dc779aSAndroid Build Coastguard Worker }
361*15dc779aSAndroid Build Coastguard Worker }
362*15dc779aSAndroid Build Coastguard Worker
363*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_hyb_filt_type2(
364*15dc779aSAndroid Build Coastguard Worker &(handle->lf_buffer[2][lf_samples_shift + 1 - QMF_HYBRID_FILT_ORDER]), scratch, num_samples,
365*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_hyb_filter_coeff_2);
366*15dc779aSAndroid Build Coastguard Worker
367*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < 2; k++) {
368*15dc779aSAndroid Build Coastguard Worker for (n = 0; n < num_samples; n++) {
369*15dc779aSAndroid Build Coastguard Worker hyb[k + 8][n].re = scratch[k][n].re;
370*15dc779aSAndroid Build Coastguard Worker hyb[k + 8][n].im = scratch[k][n].im;
371*15dc779aSAndroid Build Coastguard Worker }
372*15dc779aSAndroid Build Coastguard Worker }
373*15dc779aSAndroid Build Coastguard Worker
374*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < num_bands - lf_qmf_bands; k++) {
375*15dc779aSAndroid Build Coastguard Worker memcpy(&hyb[k + 10][0].re, &handle->hf_buffer[k][hf_samples_shift].re,
376*15dc779aSAndroid Build Coastguard Worker 2 * num_samples * sizeof(FLOAT32));
377*15dc779aSAndroid Build Coastguard Worker }
378*15dc779aSAndroid Build Coastguard Worker }
379*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_qmf_hybrid_synthesis(ia_cmplx_flt_struct hyb[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS],WORD32 num_bands,WORD32 num_samples,ia_cmplx_flt_struct in_qmf[MAX_TIME_SLOTS][MAX_NUM_QMF_BANDS_MPS])380*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_mps_qmf_hybrid_synthesis(
381*15dc779aSAndroid Build Coastguard Worker ia_cmplx_flt_struct hyb[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS], WORD32 num_bands,
382*15dc779aSAndroid Build Coastguard Worker WORD32 num_samples, ia_cmplx_flt_struct in_qmf[MAX_TIME_SLOTS][MAX_NUM_QMF_BANDS_MPS]) {
383*15dc779aSAndroid Build Coastguard Worker WORD32 k, n;
384*15dc779aSAndroid Build Coastguard Worker
385*15dc779aSAndroid Build Coastguard Worker for (n = 0; n < num_samples; n++) {
386*15dc779aSAndroid Build Coastguard Worker in_qmf[n][0].re = hyb[n][0].re;
387*15dc779aSAndroid Build Coastguard Worker in_qmf[n][0].im = hyb[n][0].im;
388*15dc779aSAndroid Build Coastguard Worker
389*15dc779aSAndroid Build Coastguard Worker for (k = 1; k < 6; k++) {
390*15dc779aSAndroid Build Coastguard Worker in_qmf[n][0].re += hyb[n][k].re;
391*15dc779aSAndroid Build Coastguard Worker in_qmf[n][0].im += hyb[n][k].im;
392*15dc779aSAndroid Build Coastguard Worker }
393*15dc779aSAndroid Build Coastguard Worker
394*15dc779aSAndroid Build Coastguard Worker in_qmf[n][1].re = hyb[n][6].re + hyb[n][7].re;
395*15dc779aSAndroid Build Coastguard Worker in_qmf[n][1].im = hyb[n][6].im + hyb[n][7].im;
396*15dc779aSAndroid Build Coastguard Worker
397*15dc779aSAndroid Build Coastguard Worker in_qmf[n][2].re = hyb[n][8].re + hyb[n][9].re;
398*15dc779aSAndroid Build Coastguard Worker in_qmf[n][2].im = hyb[n][8].im + hyb[n][9].im;
399*15dc779aSAndroid Build Coastguard Worker
400*15dc779aSAndroid Build Coastguard Worker memcpy(&in_qmf[n][3].re, &hyb[n][10].re, 2 * (num_bands - 3) * sizeof(FLOAT32));
401*15dc779aSAndroid Build Coastguard Worker }
402*15dc779aSAndroid Build Coastguard Worker }
403*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_fft(complex * out,LOOPINDEX idx,WORD32 nob,const ia_mps_dec_hybrid_tables_struct * hyb_tab)404*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_mps_fft(complex *out, LOOPINDEX idx, WORD32 nob,
405*15dc779aSAndroid Build Coastguard Worker const ia_mps_dec_hybrid_tables_struct *hyb_tab) {
406*15dc779aSAndroid Build Coastguard Worker LOOPINDEX block_per_stage, stage_num, inner;
407*15dc779aSAndroid Build Coastguard Worker const WORD32 *cosine_array = hyb_tab->cosine_array;
408*15dc779aSAndroid Build Coastguard Worker const WORD32 *sine_array = hyb_tab->sine_array;
409*15dc779aSAndroid Build Coastguard Worker WORD32 index_1, index_2, index, tab_modifier;
410*15dc779aSAndroid Build Coastguard Worker WORD32 len, increment, i;
411*15dc779aSAndroid Build Coastguard Worker
412*15dc779aSAndroid Build Coastguard Worker WORD32 cos_val;
413*15dc779aSAndroid Build Coastguard Worker WORD32 sin_val;
414*15dc779aSAndroid Build Coastguard Worker
415*15dc779aSAndroid Build Coastguard Worker WORD16 index1;
416*15dc779aSAndroid Build Coastguard Worker WORD32 re_temp;
417*15dc779aSAndroid Build Coastguard Worker WORD32 im_temp;
418*15dc779aSAndroid Build Coastguard Worker WORD32 *out1_w32, *out2_w32;
419*15dc779aSAndroid Build Coastguard Worker
420*15dc779aSAndroid Build Coastguard Worker len = idx;
421*15dc779aSAndroid Build Coastguard Worker i = 1;
422*15dc779aSAndroid Build Coastguard Worker increment = 0;
423*15dc779aSAndroid Build Coastguard Worker
424*15dc779aSAndroid Build Coastguard Worker len = len >> 1;
425*15dc779aSAndroid Build Coastguard Worker index_1 = 0;
426*15dc779aSAndroid Build Coastguard Worker increment += 1;
427*15dc779aSAndroid Build Coastguard Worker
428*15dc779aSAndroid Build Coastguard Worker index = 11 - increment;
429*15dc779aSAndroid Build Coastguard Worker tab_modifier = ixheaac_shl32(1, index);
430*15dc779aSAndroid Build Coastguard Worker
431*15dc779aSAndroid Build Coastguard Worker out1_w32 = (WORD32 *)&out[index_1];
432*15dc779aSAndroid Build Coastguard Worker out2_w32 = (WORD32 *)&out[index_1 + 1];
433*15dc779aSAndroid Build Coastguard Worker
434*15dc779aSAndroid Build Coastguard Worker for (block_per_stage = 0; block_per_stage < len; block_per_stage++) {
435*15dc779aSAndroid Build Coastguard Worker re_temp = out2_w32[0];
436*15dc779aSAndroid Build Coastguard Worker im_temp = out2_w32[1];
437*15dc779aSAndroid Build Coastguard Worker
438*15dc779aSAndroid Build Coastguard Worker out2_w32[0] = (out1_w32[0] - re_temp);
439*15dc779aSAndroid Build Coastguard Worker out2_w32[1] = (out1_w32[1] - im_temp);
440*15dc779aSAndroid Build Coastguard Worker
441*15dc779aSAndroid Build Coastguard Worker out1_w32[0] = (re_temp + out1_w32[0]);
442*15dc779aSAndroid Build Coastguard Worker out1_w32[1] = (im_temp + out1_w32[1]);
443*15dc779aSAndroid Build Coastguard Worker
444*15dc779aSAndroid Build Coastguard Worker out1_w32 += 4;
445*15dc779aSAndroid Build Coastguard Worker out2_w32 += 4;
446*15dc779aSAndroid Build Coastguard Worker }
447*15dc779aSAndroid Build Coastguard Worker
448*15dc779aSAndroid Build Coastguard Worker i <<= 1;
449*15dc779aSAndroid Build Coastguard Worker
450*15dc779aSAndroid Build Coastguard Worker for (stage_num = 1; stage_num < nob; stage_num++) {
451*15dc779aSAndroid Build Coastguard Worker len = len >> 1;
452*15dc779aSAndroid Build Coastguard Worker index_1 = 0;
453*15dc779aSAndroid Build Coastguard Worker increment += 1;
454*15dc779aSAndroid Build Coastguard Worker
455*15dc779aSAndroid Build Coastguard Worker index = 11 - increment;
456*15dc779aSAndroid Build Coastguard Worker tab_modifier = ixheaac_shl32(1, index);
457*15dc779aSAndroid Build Coastguard Worker
458*15dc779aSAndroid Build Coastguard Worker for (block_per_stage = 0; block_per_stage < len; block_per_stage++) {
459*15dc779aSAndroid Build Coastguard Worker index_2 = index_1 + i;
460*15dc779aSAndroid Build Coastguard Worker
461*15dc779aSAndroid Build Coastguard Worker out1_w32 = (WORD32 *)&out[index_1];
462*15dc779aSAndroid Build Coastguard Worker out2_w32 = (WORD32 *)&out[index_2];
463*15dc779aSAndroid Build Coastguard Worker
464*15dc779aSAndroid Build Coastguard Worker re_temp = out1_w32[0];
465*15dc779aSAndroid Build Coastguard Worker im_temp = out1_w32[1];
466*15dc779aSAndroid Build Coastguard Worker
467*15dc779aSAndroid Build Coastguard Worker out1_w32[0] = (re_temp + out2_w32[0]) >> 1;
468*15dc779aSAndroid Build Coastguard Worker out1_w32[1] = (im_temp + out2_w32[1]) >> 1;
469*15dc779aSAndroid Build Coastguard Worker
470*15dc779aSAndroid Build Coastguard Worker out2_w32[0] = (re_temp - out2_w32[0]) >> 1;
471*15dc779aSAndroid Build Coastguard Worker out2_w32[1] = (im_temp - out2_w32[1]) >> 1;
472*15dc779aSAndroid Build Coastguard Worker
473*15dc779aSAndroid Build Coastguard Worker index1 = tab_modifier;
474*15dc779aSAndroid Build Coastguard Worker
475*15dc779aSAndroid Build Coastguard Worker out1_w32 += 2;
476*15dc779aSAndroid Build Coastguard Worker out2_w32 += 2;
477*15dc779aSAndroid Build Coastguard Worker
478*15dc779aSAndroid Build Coastguard Worker for (inner = 0; inner < ((i - 1) << 1); inner += 2) {
479*15dc779aSAndroid Build Coastguard Worker cos_val = cosine_array[index1];
480*15dc779aSAndroid Build Coastguard Worker sin_val = sine_array[index1];
481*15dc779aSAndroid Build Coastguard Worker
482*15dc779aSAndroid Build Coastguard Worker re_temp = ixheaacd_mps_mult32x16_shr_16(out2_w32[inner], cos_val) +
483*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_mult32x16_shr_16(out2_w32[inner + 1], sin_val);
484*15dc779aSAndroid Build Coastguard Worker im_temp = ixheaacd_mps_mult32x16_shr_16(out2_w32[inner + 1], cos_val) -
485*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_mult32x16_shr_16(out2_w32[inner], sin_val);
486*15dc779aSAndroid Build Coastguard Worker
487*15dc779aSAndroid Build Coastguard Worker out1_w32[inner] >>= 1;
488*15dc779aSAndroid Build Coastguard Worker out1_w32[inner + 1] >>= 1;
489*15dc779aSAndroid Build Coastguard Worker
490*15dc779aSAndroid Build Coastguard Worker out2_w32[inner] = out1_w32[inner] - re_temp;
491*15dc779aSAndroid Build Coastguard Worker out2_w32[inner + 1] = out1_w32[inner + 1] - im_temp;
492*15dc779aSAndroid Build Coastguard Worker
493*15dc779aSAndroid Build Coastguard Worker out1_w32[inner] = (out1_w32[inner] + re_temp);
494*15dc779aSAndroid Build Coastguard Worker out1_w32[inner + 1] = (out1_w32[inner + 1] + im_temp);
495*15dc779aSAndroid Build Coastguard Worker
496*15dc779aSAndroid Build Coastguard Worker index1 += tab_modifier;
497*15dc779aSAndroid Build Coastguard Worker }
498*15dc779aSAndroid Build Coastguard Worker
499*15dc779aSAndroid Build Coastguard Worker index_1 += ixheaac_shl32(1, increment);
500*15dc779aSAndroid Build Coastguard Worker }
501*15dc779aSAndroid Build Coastguard Worker i <<= 1;
502*15dc779aSAndroid Build Coastguard Worker }
503*15dc779aSAndroid Build Coastguard Worker }
504*15dc779aSAndroid Build Coastguard Worker
ixheaacd_8ch_filtering(const WORD32 * p_qmf_real,const WORD32 * p_qmf_imag,WORD32 * m_hybrid_real,WORD32 * m_hybrid_imag,const ia_mps_dec_hybrid_tables_struct * hyb_tab)505*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_8ch_filtering(const WORD32 *p_qmf_real, const WORD32 *p_qmf_imag,
506*15dc779aSAndroid Build Coastguard Worker WORD32 *m_hybrid_real, WORD32 *m_hybrid_imag,
507*15dc779aSAndroid Build Coastguard Worker const ia_mps_dec_hybrid_tables_struct *hyb_tab) {
508*15dc779aSAndroid Build Coastguard Worker WORD32 n;
509*15dc779aSAndroid Build Coastguard Worker WORD32 real, imag;
510*15dc779aSAndroid Build Coastguard Worker const WORD16 tcos = COS_PI_BY_8;
511*15dc779aSAndroid Build Coastguard Worker const WORD16 tsin = SIN_PI_BY_8;
512*15dc779aSAndroid Build Coastguard Worker WORD32 cum[16];
513*15dc779aSAndroid Build Coastguard Worker WORD32 *p_complex;
514*15dc779aSAndroid Build Coastguard Worker const WORD16 *p8_13 = hyb_tab->p8_13;
515*15dc779aSAndroid Build Coastguard Worker
516*15dc779aSAndroid Build Coastguard Worker real = ixheaac_shl32((ixheaac_mult32x16in32(p_qmf_real[4], p8_13[4]) +
517*15dc779aSAndroid Build Coastguard Worker ixheaac_mult32x16in32(p_qmf_real[12], p8_13[12])),
518*15dc779aSAndroid Build Coastguard Worker 1);
519*15dc779aSAndroid Build Coastguard Worker imag = ixheaac_shl32((ixheaac_mult32x16in32(p_qmf_imag[4], p8_13[4]) +
520*15dc779aSAndroid Build Coastguard Worker ixheaac_mult32x16in32(p_qmf_imag[12], p8_13[12])),
521*15dc779aSAndroid Build Coastguard Worker 1);
522*15dc779aSAndroid Build Coastguard Worker
523*15dc779aSAndroid Build Coastguard Worker cum[5] = imag - real;
524*15dc779aSAndroid Build Coastguard Worker cum[4] = -(imag + real);
525*15dc779aSAndroid Build Coastguard Worker
526*15dc779aSAndroid Build Coastguard Worker real = ixheaac_shl32((ixheaac_mult32x16in32(p_qmf_real[3], p8_13[3]) +
527*15dc779aSAndroid Build Coastguard Worker ixheaac_mult32x16in32(p_qmf_real[11], p8_13[11])),
528*15dc779aSAndroid Build Coastguard Worker 1);
529*15dc779aSAndroid Build Coastguard Worker imag = ixheaac_shl32((ixheaac_mult32x16in32(p_qmf_imag[3], p8_13[3]) +
530*15dc779aSAndroid Build Coastguard Worker ixheaac_mult32x16in32(p_qmf_imag[11], p8_13[11])),
531*15dc779aSAndroid Build Coastguard Worker 1);
532*15dc779aSAndroid Build Coastguard Worker
533*15dc779aSAndroid Build Coastguard Worker cum[13] = ixheaac_shl32(
534*15dc779aSAndroid Build Coastguard Worker (ixheaac_mult32x16in32(imag, tcos) - ixheaac_mult32x16in32(real, tsin)), 1);
535*15dc779aSAndroid Build Coastguard Worker cum[12] = ixheaac_shl32(
536*15dc779aSAndroid Build Coastguard Worker -((ixheaac_mult32x16in32(imag, tsin) + ixheaac_mult32x16in32(real, tcos))), 1);
537*15dc779aSAndroid Build Coastguard Worker
538*15dc779aSAndroid Build Coastguard Worker cum[2] = ixheaac_shl32(ixheaac_mult32x16in32((p_qmf_real[2] - p_qmf_real[10]), p8_13[10]), 1);
539*15dc779aSAndroid Build Coastguard Worker cum[3] = ixheaac_shl32(ixheaac_mult32x16in32((p_qmf_imag[2] - p_qmf_imag[10]), p8_13[2]), 1);
540*15dc779aSAndroid Build Coastguard Worker
541*15dc779aSAndroid Build Coastguard Worker real = ixheaac_shl32((ixheaac_mult32x16in32(p_qmf_real[1], p8_13[1]) +
542*15dc779aSAndroid Build Coastguard Worker ixheaac_mult32x16in32(p_qmf_real[9], p8_13[9])),
543*15dc779aSAndroid Build Coastguard Worker 1);
544*15dc779aSAndroid Build Coastguard Worker imag = ixheaac_shl32((ixheaac_mult32x16in32(p_qmf_imag[1], p8_13[1]) +
545*15dc779aSAndroid Build Coastguard Worker ixheaac_mult32x16in32(p_qmf_imag[9], p8_13[9])),
546*15dc779aSAndroid Build Coastguard Worker 1);
547*15dc779aSAndroid Build Coastguard Worker
548*15dc779aSAndroid Build Coastguard Worker cum[11] = ixheaac_shl32(
549*15dc779aSAndroid Build Coastguard Worker (ixheaac_mult32x16in32(imag, tcos) + ixheaac_mult32x16in32(real, tsin)), 1);
550*15dc779aSAndroid Build Coastguard Worker cum[10] = ixheaac_shl32(
551*15dc779aSAndroid Build Coastguard Worker (ixheaac_mult32x16in32(imag, tsin) - ixheaac_mult32x16in32(real, tcos)), 1);
552*15dc779aSAndroid Build Coastguard Worker
553*15dc779aSAndroid Build Coastguard Worker real = ixheaac_shl32((ixheaac_mult32x16in32(p_qmf_real[0], p8_13[0]) +
554*15dc779aSAndroid Build Coastguard Worker ixheaac_mult32x16in32(p_qmf_real[8], p8_13[8])),
555*15dc779aSAndroid Build Coastguard Worker 1);
556*15dc779aSAndroid Build Coastguard Worker imag = ixheaac_shl32((ixheaac_mult32x16in32(p_qmf_imag[0], p8_13[0]) +
557*15dc779aSAndroid Build Coastguard Worker ixheaac_mult32x16in32(p_qmf_imag[8], p8_13[8])),
558*15dc779aSAndroid Build Coastguard Worker 1);
559*15dc779aSAndroid Build Coastguard Worker
560*15dc779aSAndroid Build Coastguard Worker cum[7] = imag + real;
561*15dc779aSAndroid Build Coastguard Worker cum[6] = imag - real;
562*15dc779aSAndroid Build Coastguard Worker
563*15dc779aSAndroid Build Coastguard Worker cum[15] = ixheaac_shl32((ixheaac_mult32x16in32(p_qmf_imag[7], p8_13[14]) +
564*15dc779aSAndroid Build Coastguard Worker ixheaac_mult32x16in32(p_qmf_real[7], p8_13[13])),
565*15dc779aSAndroid Build Coastguard Worker 1);
566*15dc779aSAndroid Build Coastguard Worker cum[14] = ixheaac_shl32((ixheaac_mult32x16in32(p_qmf_imag[7], p8_13[13]) -
567*15dc779aSAndroid Build Coastguard Worker ixheaac_mult32x16in32(p_qmf_real[7], p8_13[14])),
568*15dc779aSAndroid Build Coastguard Worker 1);
569*15dc779aSAndroid Build Coastguard Worker
570*15dc779aSAndroid Build Coastguard Worker cum[1] = ixheaac_shl32(
571*15dc779aSAndroid Build Coastguard Worker ixheaac_mult32x16in32(p_qmf_real[HYBRID_FILTER_DELAY], p8_13[HYBRID_FILTER_DELAY]), 1);
572*15dc779aSAndroid Build Coastguard Worker cum[0] = ixheaac_shl32(
573*15dc779aSAndroid Build Coastguard Worker ixheaac_mult32x16in32(p_qmf_imag[HYBRID_FILTER_DELAY], p8_13[HYBRID_FILTER_DELAY]), 1);
574*15dc779aSAndroid Build Coastguard Worker
575*15dc779aSAndroid Build Coastguard Worker cum[9] = ixheaac_shl32((ixheaac_mult32x16in32(p_qmf_real[5], p8_13[13]) -
576*15dc779aSAndroid Build Coastguard Worker ixheaac_mult32x16in32(p_qmf_imag[5], p8_13[14])),
577*15dc779aSAndroid Build Coastguard Worker 1);
578*15dc779aSAndroid Build Coastguard Worker cum[8] = ixheaac_shl32((ixheaac_mult32x16in32(p_qmf_real[5], p8_13[14]) +
579*15dc779aSAndroid Build Coastguard Worker ixheaac_mult32x16in32(p_qmf_imag[5], p8_13[13])),
580*15dc779aSAndroid Build Coastguard Worker 1);
581*15dc779aSAndroid Build Coastguard Worker
582*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_fft((complex *)cum, 8, 3, hyb_tab);
583*15dc779aSAndroid Build Coastguard Worker
584*15dc779aSAndroid Build Coastguard Worker p_complex = cum;
585*15dc779aSAndroid Build Coastguard Worker
586*15dc779aSAndroid Build Coastguard Worker for (n = 0; n < 8; n++) {
587*15dc779aSAndroid Build Coastguard Worker m_hybrid_imag[n] = *p_complex++;
588*15dc779aSAndroid Build Coastguard Worker m_hybrid_real[n] = *p_complex++;
589*15dc779aSAndroid Build Coastguard Worker }
590*15dc779aSAndroid Build Coastguard Worker }
591*15dc779aSAndroid Build Coastguard Worker
ixheaacd_2ch_filtering(WORD32 * p_qmf,WORD32 * m_hybrid,const ia_mps_dec_hybrid_tables_struct * hyb_tab_ptr)592*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_2ch_filtering(WORD32 *p_qmf, WORD32 *m_hybrid,
593*15dc779aSAndroid Build Coastguard Worker const ia_mps_dec_hybrid_tables_struct *hyb_tab_ptr) {
594*15dc779aSAndroid Build Coastguard Worker WORD32 cum0, cum1;
595*15dc779aSAndroid Build Coastguard Worker WORD64 temp;
596*15dc779aSAndroid Build Coastguard Worker const WORD16 *p2_6 = hyb_tab_ptr->p2_6;
597*15dc779aSAndroid Build Coastguard Worker
598*15dc779aSAndroid Build Coastguard Worker cum0 = (WORD32)p_qmf[HYBRID_FILTER_DELAY] >> 1;
599*15dc779aSAndroid Build Coastguard Worker
600*15dc779aSAndroid Build Coastguard Worker temp = (WORD64)((WORD64)p2_6[0] * (WORD64)(p_qmf[1] + p_qmf[11]) +
601*15dc779aSAndroid Build Coastguard Worker (WORD64)p2_6[1] * (WORD64)(p_qmf[3] + p_qmf[9]));
602*15dc779aSAndroid Build Coastguard Worker temp += (WORD64)p2_6[2] * (WORD64)(p_qmf[5] + p_qmf[7]);
603*15dc779aSAndroid Build Coastguard Worker cum1 = (WORD32)(temp >> 16);
604*15dc779aSAndroid Build Coastguard Worker
605*15dc779aSAndroid Build Coastguard Worker m_hybrid[0] = cum0 + cum1;
606*15dc779aSAndroid Build Coastguard Worker m_hybrid[1] = cum0 - cum1;
607*15dc779aSAndroid Build Coastguard Worker }
608*15dc779aSAndroid Build Coastguard Worker
ixheaacd_get_qmf_sb(WORD32 hybrid_subband,const ia_mps_dec_mdct2qmf_table_struct * ixheaacd_mps_dec_mdct2qmf_table)609*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_get_qmf_sb(
610*15dc779aSAndroid Build Coastguard Worker WORD32 hybrid_subband,
611*15dc779aSAndroid Build Coastguard Worker const ia_mps_dec_mdct2qmf_table_struct *ixheaacd_mps_dec_mdct2qmf_table) {
612*15dc779aSAndroid Build Coastguard Worker return ixheaacd_mps_dec_mdct2qmf_table->hybrid_2_qmf[hybrid_subband];
613*15dc779aSAndroid Build Coastguard Worker }
614*15dc779aSAndroid Build Coastguard Worker
ixheaacd_init_ana_hyb_filt_bank(ia_mps_dec_thyb_filter_state_struct * hyb_state)615*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_init_ana_hyb_filt_bank(ia_mps_dec_thyb_filter_state_struct *hyb_state) {
616*15dc779aSAndroid Build Coastguard Worker WORD32 k, n;
617*15dc779aSAndroid Build Coastguard Worker
618*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < QMF_BANDS_TO_HYBRID; k++) {
619*15dc779aSAndroid Build Coastguard Worker for (n = 0; n < PROTO_LEN - 1 + MAX_TIME_SLOTS; n++) {
620*15dc779aSAndroid Build Coastguard Worker hyb_state->buffer_lf_real[k][n] = 0;
621*15dc779aSAndroid Build Coastguard Worker hyb_state->buffer_lf_imag[k][n] = 0;
622*15dc779aSAndroid Build Coastguard Worker hyb_state->qmf_lf_real[k][n] = 0;
623*15dc779aSAndroid Build Coastguard Worker hyb_state->qmf_lf_imag[k][n] = 0;
624*15dc779aSAndroid Build Coastguard Worker }
625*15dc779aSAndroid Build Coastguard Worker }
626*15dc779aSAndroid Build Coastguard Worker
627*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < MAX_NUM_QMF_BANDS; k++) {
628*15dc779aSAndroid Build Coastguard Worker for (n = 0; n < ((PROTO_LEN - 1) >> 1) + MAX_TIME_SLOTS; n++) {
629*15dc779aSAndroid Build Coastguard Worker hyb_state->buffer_hf_real[k][n] = 0;
630*15dc779aSAndroid Build Coastguard Worker hyb_state->buffer_hf_imag[k][n] = 0;
631*15dc779aSAndroid Build Coastguard Worker }
632*15dc779aSAndroid Build Coastguard Worker }
633*15dc779aSAndroid Build Coastguard Worker }
634*15dc779aSAndroid Build Coastguard Worker
ixheaacd_apply_ana_hyb_filt_bank_create_x(ia_mps_dec_thyb_filter_state_struct * hyb_state,WORD32 * m_qmf_real,WORD32 * m_qmf_imag,WORD32 nr_bands,WORD32 nr_samples,WORD32 * m_hybrid_real,WORD32 * m_hybrid_imag,const ia_mps_dec_hybrid_tables_struct * hyb_tab_ptr)635*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_apply_ana_hyb_filt_bank_create_x(
636*15dc779aSAndroid Build Coastguard Worker ia_mps_dec_thyb_filter_state_struct *hyb_state, WORD32 *m_qmf_real, WORD32 *m_qmf_imag,
637*15dc779aSAndroid Build Coastguard Worker WORD32 nr_bands, WORD32 nr_samples, WORD32 *m_hybrid_real, WORD32 *m_hybrid_imag,
638*15dc779aSAndroid Build Coastguard Worker const ia_mps_dec_hybrid_tables_struct *hyb_tab_ptr) {
639*15dc779aSAndroid Build Coastguard Worker WORD32 nr_samples_shift_lf;
640*15dc779aSAndroid Build Coastguard Worker WORD32 nr_qmf_bands_lf;
641*15dc779aSAndroid Build Coastguard Worker WORD32 k, n;
642*15dc779aSAndroid Build Coastguard Worker WORD32 time_slot;
643*15dc779aSAndroid Build Coastguard Worker
644*15dc779aSAndroid Build Coastguard Worker WORD32 proto_len = (PROTO_LEN - 1) >> 1;
645*15dc779aSAndroid Build Coastguard Worker WORD32 val = nr_samples - proto_len;
646*15dc779aSAndroid Build Coastguard Worker WORD32 val_xhb = val * MAX_HYBRID_BANDS;
647*15dc779aSAndroid Build Coastguard Worker WORD32 loop_cnt, loop_cnt_x4;
648*15dc779aSAndroid Build Coastguard Worker WORD32 *p_qmf_real, *p_qmf_re, *p_qmf_imag, *p_qmf_im;
649*15dc779aSAndroid Build Coastguard Worker
650*15dc779aSAndroid Build Coastguard Worker WORD32 m_temp_output_real[MAX_HYBRID_ONLY_BANDS_PER_QMF];
651*15dc779aSAndroid Build Coastguard Worker WORD32 m_temp_output_imag[MAX_HYBRID_ONLY_BANDS_PER_QMF];
652*15dc779aSAndroid Build Coastguard Worker
653*15dc779aSAndroid Build Coastguard Worker WORD32 *p_hybrid_real = m_hybrid_real + 10;
654*15dc779aSAndroid Build Coastguard Worker WORD32 *p_hybrid_imag = m_hybrid_imag + 10;
655*15dc779aSAndroid Build Coastguard Worker
656*15dc779aSAndroid Build Coastguard Worker WORD32 *p_hybrid_re, *p_hybrid_im;
657*15dc779aSAndroid Build Coastguard Worker
658*15dc779aSAndroid Build Coastguard Worker nr_samples_shift_lf = BUFFER_LEN_LF - nr_samples;
659*15dc779aSAndroid Build Coastguard Worker
660*15dc779aSAndroid Build Coastguard Worker nr_qmf_bands_lf = QMF_BANDS_TO_HYBRID;
661*15dc779aSAndroid Build Coastguard Worker loop_cnt = nr_bands - nr_qmf_bands_lf;
662*15dc779aSAndroid Build Coastguard Worker loop_cnt_x4 = (loop_cnt << 2);
663*15dc779aSAndroid Build Coastguard Worker
664*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < nr_qmf_bands_lf; k++) {
665*15dc779aSAndroid Build Coastguard Worker for (n = 0; n < nr_samples_shift_lf; n++) {
666*15dc779aSAndroid Build Coastguard Worker hyb_state->buffer_lf_real[k][n] = hyb_state->buffer_lf_real[k][n + nr_samples];
667*15dc779aSAndroid Build Coastguard Worker hyb_state->buffer_lf_imag[k][n] = hyb_state->buffer_lf_imag[k][n + nr_samples];
668*15dc779aSAndroid Build Coastguard Worker
669*15dc779aSAndroid Build Coastguard Worker hyb_state->qmf_lf_real[k][n] = hyb_state->qmf_lf_real[k][n + nr_samples];
670*15dc779aSAndroid Build Coastguard Worker hyb_state->qmf_lf_imag[k][n] = hyb_state->qmf_lf_imag[k][n + nr_samples];
671*15dc779aSAndroid Build Coastguard Worker }
672*15dc779aSAndroid Build Coastguard Worker }
673*15dc779aSAndroid Build Coastguard Worker
674*15dc779aSAndroid Build Coastguard Worker p_qmf_real = m_qmf_real;
675*15dc779aSAndroid Build Coastguard Worker p_qmf_imag = m_qmf_imag;
676*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < nr_qmf_bands_lf; k++) {
677*15dc779aSAndroid Build Coastguard Worker p_qmf_re = p_qmf_real;
678*15dc779aSAndroid Build Coastguard Worker p_qmf_im = p_qmf_imag;
679*15dc779aSAndroid Build Coastguard Worker
680*15dc779aSAndroid Build Coastguard Worker for (n = 0; n < nr_samples; n++) {
681*15dc779aSAndroid Build Coastguard Worker hyb_state->buffer_lf_real[k][n + nr_samples_shift_lf] = *p_qmf_re;
682*15dc779aSAndroid Build Coastguard Worker hyb_state->buffer_lf_imag[k][n + nr_samples_shift_lf] = *p_qmf_im;
683*15dc779aSAndroid Build Coastguard Worker
684*15dc779aSAndroid Build Coastguard Worker hyb_state->qmf_lf_imag[k][n + nr_samples_shift_lf] = *p_qmf_im;
685*15dc779aSAndroid Build Coastguard Worker hyb_state->qmf_lf_real[k][n + nr_samples_shift_lf] = *p_qmf_re;
686*15dc779aSAndroid Build Coastguard Worker
687*15dc779aSAndroid Build Coastguard Worker p_qmf_re += MAX_HYBRID_BANDS;
688*15dc779aSAndroid Build Coastguard Worker p_qmf_im += MAX_HYBRID_BANDS;
689*15dc779aSAndroid Build Coastguard Worker }
690*15dc779aSAndroid Build Coastguard Worker
691*15dc779aSAndroid Build Coastguard Worker p_qmf_real++;
692*15dc779aSAndroid Build Coastguard Worker p_qmf_imag++;
693*15dc779aSAndroid Build Coastguard Worker }
694*15dc779aSAndroid Build Coastguard Worker
695*15dc779aSAndroid Build Coastguard Worker p_qmf_real = m_qmf_real + nr_qmf_bands_lf + val_xhb;
696*15dc779aSAndroid Build Coastguard Worker p_qmf_imag = m_qmf_imag + nr_qmf_bands_lf + val_xhb;
697*15dc779aSAndroid Build Coastguard Worker
698*15dc779aSAndroid Build Coastguard Worker for (n = 0; n < proto_len; n++) {
699*15dc779aSAndroid Build Coastguard Worker p_qmf_re = p_qmf_real;
700*15dc779aSAndroid Build Coastguard Worker p_qmf_im = p_qmf_imag;
701*15dc779aSAndroid Build Coastguard Worker
702*15dc779aSAndroid Build Coastguard Worker p_hybrid_re = p_hybrid_real;
703*15dc779aSAndroid Build Coastguard Worker p_hybrid_im = p_hybrid_imag;
704*15dc779aSAndroid Build Coastguard Worker
705*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < loop_cnt; k++) {
706*15dc779aSAndroid Build Coastguard Worker *p_hybrid_re++ = hyb_state->buffer_hf_real[k][n];
707*15dc779aSAndroid Build Coastguard Worker *p_hybrid_im++ = hyb_state->buffer_hf_imag[k][n];
708*15dc779aSAndroid Build Coastguard Worker
709*15dc779aSAndroid Build Coastguard Worker hyb_state->buffer_hf_real[k][n] = *p_qmf_re++;
710*15dc779aSAndroid Build Coastguard Worker hyb_state->buffer_hf_imag[k][n] = *p_qmf_im++;
711*15dc779aSAndroid Build Coastguard Worker }
712*15dc779aSAndroid Build Coastguard Worker p_qmf_real += MAX_HYBRID_BANDS;
713*15dc779aSAndroid Build Coastguard Worker p_qmf_imag += MAX_HYBRID_BANDS;
714*15dc779aSAndroid Build Coastguard Worker
715*15dc779aSAndroid Build Coastguard Worker p_hybrid_real += MAX_HYBRID_BANDS;
716*15dc779aSAndroid Build Coastguard Worker p_hybrid_imag += MAX_HYBRID_BANDS;
717*15dc779aSAndroid Build Coastguard Worker }
718*15dc779aSAndroid Build Coastguard Worker
719*15dc779aSAndroid Build Coastguard Worker p_qmf_real = m_qmf_real;
720*15dc779aSAndroid Build Coastguard Worker p_qmf_imag = m_qmf_imag;
721*15dc779aSAndroid Build Coastguard Worker
722*15dc779aSAndroid Build Coastguard Worker p_hybrid_real = m_hybrid_real + 10;
723*15dc779aSAndroid Build Coastguard Worker p_hybrid_imag = m_hybrid_imag + 10;
724*15dc779aSAndroid Build Coastguard Worker
725*15dc779aSAndroid Build Coastguard Worker k = proto_len * MAX_HYBRID_BANDS;
726*15dc779aSAndroid Build Coastguard Worker
727*15dc779aSAndroid Build Coastguard Worker p_hybrid_re = p_hybrid_real + k;
728*15dc779aSAndroid Build Coastguard Worker p_hybrid_im = p_hybrid_imag + k;
729*15dc779aSAndroid Build Coastguard Worker
730*15dc779aSAndroid Build Coastguard Worker p_qmf_re = p_qmf_real + nr_qmf_bands_lf;
731*15dc779aSAndroid Build Coastguard Worker p_qmf_im = p_qmf_imag + nr_qmf_bands_lf;
732*15dc779aSAndroid Build Coastguard Worker
733*15dc779aSAndroid Build Coastguard Worker for (n = 0; n < val; n++) {
734*15dc779aSAndroid Build Coastguard Worker memcpy(p_hybrid_re, p_qmf_re, loop_cnt_x4);
735*15dc779aSAndroid Build Coastguard Worker memcpy(p_hybrid_im, p_qmf_im, loop_cnt_x4);
736*15dc779aSAndroid Build Coastguard Worker
737*15dc779aSAndroid Build Coastguard Worker p_qmf_re += MAX_HYBRID_BANDS;
738*15dc779aSAndroid Build Coastguard Worker p_qmf_im += MAX_HYBRID_BANDS;
739*15dc779aSAndroid Build Coastguard Worker
740*15dc779aSAndroid Build Coastguard Worker p_hybrid_re += MAX_HYBRID_BANDS;
741*15dc779aSAndroid Build Coastguard Worker p_hybrid_im += MAX_HYBRID_BANDS;
742*15dc779aSAndroid Build Coastguard Worker }
743*15dc779aSAndroid Build Coastguard Worker
744*15dc779aSAndroid Build Coastguard Worker p_hybrid_real = m_hybrid_real;
745*15dc779aSAndroid Build Coastguard Worker p_hybrid_imag = m_hybrid_imag;
746*15dc779aSAndroid Build Coastguard Worker
747*15dc779aSAndroid Build Coastguard Worker for (time_slot = 0; time_slot < nr_samples; time_slot++) {
748*15dc779aSAndroid Build Coastguard Worker p_hybrid_re = p_hybrid_real;
749*15dc779aSAndroid Build Coastguard Worker p_hybrid_im = p_hybrid_imag;
750*15dc779aSAndroid Build Coastguard Worker
751*15dc779aSAndroid Build Coastguard Worker ixheaacd_8ch_filtering(
752*15dc779aSAndroid Build Coastguard Worker &(hyb_state->buffer_lf_real[0][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
753*15dc779aSAndroid Build Coastguard Worker &(hyb_state->buffer_lf_imag[0][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
754*15dc779aSAndroid Build Coastguard Worker m_temp_output_real, m_temp_output_imag, hyb_tab_ptr);
755*15dc779aSAndroid Build Coastguard Worker
756*15dc779aSAndroid Build Coastguard Worker *p_hybrid_re++ = m_temp_output_real[6];
757*15dc779aSAndroid Build Coastguard Worker *p_hybrid_re++ = m_temp_output_real[7];
758*15dc779aSAndroid Build Coastguard Worker *p_hybrid_re++ = m_temp_output_real[0];
759*15dc779aSAndroid Build Coastguard Worker *p_hybrid_re++ = m_temp_output_real[1];
760*15dc779aSAndroid Build Coastguard Worker *p_hybrid_re++ = (m_temp_output_real[2] + m_temp_output_real[5]);
761*15dc779aSAndroid Build Coastguard Worker *p_hybrid_re++ = (m_temp_output_real[3] + m_temp_output_real[4]);
762*15dc779aSAndroid Build Coastguard Worker
763*15dc779aSAndroid Build Coastguard Worker *p_hybrid_im++ = m_temp_output_imag[6];
764*15dc779aSAndroid Build Coastguard Worker *p_hybrid_im++ = m_temp_output_imag[7];
765*15dc779aSAndroid Build Coastguard Worker *p_hybrid_im++ = m_temp_output_imag[0];
766*15dc779aSAndroid Build Coastguard Worker *p_hybrid_im++ = m_temp_output_imag[1];
767*15dc779aSAndroid Build Coastguard Worker *p_hybrid_im++ = (m_temp_output_imag[2] + m_temp_output_imag[5]);
768*15dc779aSAndroid Build Coastguard Worker *p_hybrid_im++ = (m_temp_output_imag[3] + m_temp_output_imag[4]);
769*15dc779aSAndroid Build Coastguard Worker
770*15dc779aSAndroid Build Coastguard Worker ixheaacd_2ch_filtering(
771*15dc779aSAndroid Build Coastguard Worker &(hyb_state->buffer_lf_real[1][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
772*15dc779aSAndroid Build Coastguard Worker m_temp_output_real, hyb_tab_ptr);
773*15dc779aSAndroid Build Coastguard Worker
774*15dc779aSAndroid Build Coastguard Worker ixheaacd_2ch_filtering(
775*15dc779aSAndroid Build Coastguard Worker &(hyb_state->buffer_lf_imag[1][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
776*15dc779aSAndroid Build Coastguard Worker m_temp_output_imag, hyb_tab_ptr);
777*15dc779aSAndroid Build Coastguard Worker
778*15dc779aSAndroid Build Coastguard Worker *p_hybrid_re++ = m_temp_output_real[1];
779*15dc779aSAndroid Build Coastguard Worker *p_hybrid_re++ = m_temp_output_real[0];
780*15dc779aSAndroid Build Coastguard Worker
781*15dc779aSAndroid Build Coastguard Worker *p_hybrid_im++ = m_temp_output_imag[1];
782*15dc779aSAndroid Build Coastguard Worker *p_hybrid_im++ = m_temp_output_imag[0];
783*15dc779aSAndroid Build Coastguard Worker
784*15dc779aSAndroid Build Coastguard Worker ixheaacd_2ch_filtering(
785*15dc779aSAndroid Build Coastguard Worker &(hyb_state->buffer_lf_real[2][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
786*15dc779aSAndroid Build Coastguard Worker m_temp_output_real, hyb_tab_ptr);
787*15dc779aSAndroid Build Coastguard Worker
788*15dc779aSAndroid Build Coastguard Worker ixheaacd_2ch_filtering(
789*15dc779aSAndroid Build Coastguard Worker &(hyb_state->buffer_lf_imag[2][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
790*15dc779aSAndroid Build Coastguard Worker m_temp_output_imag, hyb_tab_ptr);
791*15dc779aSAndroid Build Coastguard Worker
792*15dc779aSAndroid Build Coastguard Worker *p_hybrid_re++ = m_temp_output_real[0];
793*15dc779aSAndroid Build Coastguard Worker *p_hybrid_re++ = m_temp_output_real[1];
794*15dc779aSAndroid Build Coastguard Worker
795*15dc779aSAndroid Build Coastguard Worker *p_hybrid_im++ = m_temp_output_imag[0];
796*15dc779aSAndroid Build Coastguard Worker *p_hybrid_im++ = m_temp_output_imag[1];
797*15dc779aSAndroid Build Coastguard Worker
798*15dc779aSAndroid Build Coastguard Worker p_hybrid_real += MAX_HYBRID_BANDS;
799*15dc779aSAndroid Build Coastguard Worker p_hybrid_imag += MAX_HYBRID_BANDS;
800*15dc779aSAndroid Build Coastguard Worker }
801*15dc779aSAndroid Build Coastguard Worker
802*15dc779aSAndroid Build Coastguard Worker p_qmf_real = m_qmf_real;
803*15dc779aSAndroid Build Coastguard Worker p_qmf_imag = m_qmf_imag;
804*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < nr_qmf_bands_lf; k++) {
805*15dc779aSAndroid Build Coastguard Worker p_qmf_re = p_qmf_real;
806*15dc779aSAndroid Build Coastguard Worker p_qmf_im = p_qmf_imag;
807*15dc779aSAndroid Build Coastguard Worker for (n = MAX_TIME_SLOTS; n < nr_samples_shift_lf; n++) {
808*15dc779aSAndroid Build Coastguard Worker hyb_state->buffer_lf_real[k][n] = hyb_state->qmf_lf_real[k][n];
809*15dc779aSAndroid Build Coastguard Worker hyb_state->buffer_lf_imag[k][n] = hyb_state->qmf_lf_imag[k][n];
810*15dc779aSAndroid Build Coastguard Worker }
811*15dc779aSAndroid Build Coastguard Worker for (n = 0; n < nr_samples; n++) {
812*15dc779aSAndroid Build Coastguard Worker hyb_state->buffer_lf_real[k][n + nr_samples_shift_lf] = *p_qmf_re;
813*15dc779aSAndroid Build Coastguard Worker hyb_state->buffer_lf_imag[k][n + nr_samples_shift_lf] = *p_qmf_im;
814*15dc779aSAndroid Build Coastguard Worker
815*15dc779aSAndroid Build Coastguard Worker p_qmf_re += MAX_HYBRID_BANDS;
816*15dc779aSAndroid Build Coastguard Worker p_qmf_im += MAX_HYBRID_BANDS;
817*15dc779aSAndroid Build Coastguard Worker }
818*15dc779aSAndroid Build Coastguard Worker p_qmf_real++;
819*15dc779aSAndroid Build Coastguard Worker p_qmf_imag++;
820*15dc779aSAndroid Build Coastguard Worker }
821*15dc779aSAndroid Build Coastguard Worker }
822*15dc779aSAndroid Build Coastguard Worker
ixheaacd_apply_ana_hyb_filt_bank_merge_res_decor(ia_mps_dec_thyb_filter_state_struct * hyb_state,WORD32 * m_qmf_real,WORD32 * m_qmf_imag,WORD32 nr_bands,WORD32 nr_samples,WORD32 * m_hybrid_real,WORD32 * m_hybrid_imag,const ia_mps_dec_hybrid_tables_struct * hyb_tab_ptr)823*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_apply_ana_hyb_filt_bank_merge_res_decor(
824*15dc779aSAndroid Build Coastguard Worker ia_mps_dec_thyb_filter_state_struct *hyb_state, WORD32 *m_qmf_real, WORD32 *m_qmf_imag,
825*15dc779aSAndroid Build Coastguard Worker WORD32 nr_bands, WORD32 nr_samples, WORD32 *m_hybrid_real, WORD32 *m_hybrid_imag,
826*15dc779aSAndroid Build Coastguard Worker const ia_mps_dec_hybrid_tables_struct *hyb_tab_ptr) {
827*15dc779aSAndroid Build Coastguard Worker WORD32 nr_samples_shift_lf;
828*15dc779aSAndroid Build Coastguard Worker WORD32 nr_qmf_bands_lf;
829*15dc779aSAndroid Build Coastguard Worker WORD32 k, n;
830*15dc779aSAndroid Build Coastguard Worker WORD32 time_slot;
831*15dc779aSAndroid Build Coastguard Worker
832*15dc779aSAndroid Build Coastguard Worker WORD32 m_temp_output_real[MAX_HYBRID_ONLY_BANDS_PER_QMF];
833*15dc779aSAndroid Build Coastguard Worker WORD32 m_temp_output_imag[MAX_HYBRID_ONLY_BANDS_PER_QMF];
834*15dc779aSAndroid Build Coastguard Worker
835*15dc779aSAndroid Build Coastguard Worker WORD32 proto_len = (PROTO_LEN - 1) >> 1;
836*15dc779aSAndroid Build Coastguard Worker WORD32 val = nr_samples - proto_len;
837*15dc779aSAndroid Build Coastguard Worker WORD32 loop_cnt;
838*15dc779aSAndroid Build Coastguard Worker
839*15dc779aSAndroid Build Coastguard Worker WORD32 *p_qmf_real = m_qmf_real;
840*15dc779aSAndroid Build Coastguard Worker WORD32 *p_qmf_imag = m_qmf_imag;
841*15dc779aSAndroid Build Coastguard Worker
842*15dc779aSAndroid Build Coastguard Worker WORD32 *p_hybrid_real = m_hybrid_real + 10;
843*15dc779aSAndroid Build Coastguard Worker WORD32 *p_hybrid_imag = m_hybrid_imag + 10;
844*15dc779aSAndroid Build Coastguard Worker WORD32 *p_buffer_lf_real, *p_buffer_lf_imag;
845*15dc779aSAndroid Build Coastguard Worker
846*15dc779aSAndroid Build Coastguard Worker WORD32 nr_samples_x4 = nr_samples << 2;
847*15dc779aSAndroid Build Coastguard Worker
848*15dc779aSAndroid Build Coastguard Worker nr_samples_shift_lf = BUFFER_LEN_LF - nr_samples;
849*15dc779aSAndroid Build Coastguard Worker
850*15dc779aSAndroid Build Coastguard Worker nr_qmf_bands_lf = QMF_BANDS_TO_HYBRID;
851*15dc779aSAndroid Build Coastguard Worker loop_cnt = nr_bands - nr_qmf_bands_lf;
852*15dc779aSAndroid Build Coastguard Worker
853*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < nr_qmf_bands_lf; k++) {
854*15dc779aSAndroid Build Coastguard Worker for (n = 0; n < nr_samples_shift_lf; n++) {
855*15dc779aSAndroid Build Coastguard Worker hyb_state->buffer_lf_real[k][n] = hyb_state->buffer_lf_real[k][n + nr_samples];
856*15dc779aSAndroid Build Coastguard Worker hyb_state->buffer_lf_imag[k][n] = hyb_state->buffer_lf_imag[k][n + nr_samples];
857*15dc779aSAndroid Build Coastguard Worker
858*15dc779aSAndroid Build Coastguard Worker hyb_state->qmf_lf_real[k][n] = hyb_state->qmf_lf_real[k][n + nr_samples];
859*15dc779aSAndroid Build Coastguard Worker hyb_state->qmf_lf_imag[k][n] = hyb_state->qmf_lf_imag[k][n + nr_samples];
860*15dc779aSAndroid Build Coastguard Worker }
861*15dc779aSAndroid Build Coastguard Worker }
862*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < nr_qmf_bands_lf; k++) {
863*15dc779aSAndroid Build Coastguard Worker WORD32 *qmf_real = p_qmf_real;
864*15dc779aSAndroid Build Coastguard Worker WORD32 *qmf_imag = p_qmf_imag;
865*15dc779aSAndroid Build Coastguard Worker for (n = 0; n < nr_samples; n++) {
866*15dc779aSAndroid Build Coastguard Worker hyb_state->buffer_lf_real[k][n + nr_samples_shift_lf] = *qmf_real;
867*15dc779aSAndroid Build Coastguard Worker hyb_state->buffer_lf_imag[k][n + nr_samples_shift_lf] = *qmf_imag;
868*15dc779aSAndroid Build Coastguard Worker
869*15dc779aSAndroid Build Coastguard Worker hyb_state->qmf_lf_imag[k][n + nr_samples_shift_lf] = *qmf_imag++;
870*15dc779aSAndroid Build Coastguard Worker hyb_state->qmf_lf_real[k][n + nr_samples_shift_lf] = *qmf_real++;
871*15dc779aSAndroid Build Coastguard Worker }
872*15dc779aSAndroid Build Coastguard Worker p_qmf_real += MAX_TIME_SLOTS;
873*15dc779aSAndroid Build Coastguard Worker p_qmf_imag += MAX_TIME_SLOTS;
874*15dc779aSAndroid Build Coastguard Worker }
875*15dc779aSAndroid Build Coastguard Worker
876*15dc779aSAndroid Build Coastguard Worker p_qmf_real = m_qmf_real + nr_qmf_bands_lf * MAX_TIME_SLOTS;
877*15dc779aSAndroid Build Coastguard Worker p_qmf_imag = m_qmf_imag + nr_qmf_bands_lf * MAX_TIME_SLOTS;
878*15dc779aSAndroid Build Coastguard Worker
879*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < loop_cnt; k++) {
880*15dc779aSAndroid Build Coastguard Worker WORD32 *qmf_real = p_qmf_real + val;
881*15dc779aSAndroid Build Coastguard Worker WORD32 *qmf_imag = p_qmf_imag + val;
882*15dc779aSAndroid Build Coastguard Worker
883*15dc779aSAndroid Build Coastguard Worker WORD32 *hybrid_real = p_hybrid_real;
884*15dc779aSAndroid Build Coastguard Worker WORD32 *hybrid_imag = p_hybrid_imag;
885*15dc779aSAndroid Build Coastguard Worker
886*15dc779aSAndroid Build Coastguard Worker for (n = 0; n < proto_len; n++) {
887*15dc779aSAndroid Build Coastguard Worker *hybrid_real = hyb_state->buffer_hf_real[k][n];
888*15dc779aSAndroid Build Coastguard Worker *hybrid_imag = hyb_state->buffer_hf_imag[k][n];
889*15dc779aSAndroid Build Coastguard Worker
890*15dc779aSAndroid Build Coastguard Worker hyb_state->buffer_hf_real[k][n] = *qmf_real++;
891*15dc779aSAndroid Build Coastguard Worker hyb_state->buffer_hf_imag[k][n] = *qmf_imag++;
892*15dc779aSAndroid Build Coastguard Worker
893*15dc779aSAndroid Build Coastguard Worker hybrid_real += MAX_HYBRID_BANDS;
894*15dc779aSAndroid Build Coastguard Worker hybrid_imag += MAX_HYBRID_BANDS;
895*15dc779aSAndroid Build Coastguard Worker }
896*15dc779aSAndroid Build Coastguard Worker
897*15dc779aSAndroid Build Coastguard Worker p_qmf_real += MAX_TIME_SLOTS;
898*15dc779aSAndroid Build Coastguard Worker p_qmf_imag += MAX_TIME_SLOTS;
899*15dc779aSAndroid Build Coastguard Worker
900*15dc779aSAndroid Build Coastguard Worker p_hybrid_real++;
901*15dc779aSAndroid Build Coastguard Worker p_hybrid_imag++;
902*15dc779aSAndroid Build Coastguard Worker }
903*15dc779aSAndroid Build Coastguard Worker
904*15dc779aSAndroid Build Coastguard Worker p_qmf_real = m_qmf_real + NR_QMF_BANDS_LFXTS;
905*15dc779aSAndroid Build Coastguard Worker p_qmf_imag = m_qmf_imag + NR_QMF_BANDS_LFXTS;
906*15dc779aSAndroid Build Coastguard Worker
907*15dc779aSAndroid Build Coastguard Worker p_hybrid_real = m_hybrid_real + 10;
908*15dc779aSAndroid Build Coastguard Worker p_hybrid_imag = m_hybrid_imag + 10;
909*15dc779aSAndroid Build Coastguard Worker
910*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < loop_cnt; k++) {
911*15dc779aSAndroid Build Coastguard Worker WORD32 *qmf_real = p_qmf_real;
912*15dc779aSAndroid Build Coastguard Worker WORD32 *qmf_imag = p_qmf_imag;
913*15dc779aSAndroid Build Coastguard Worker
914*15dc779aSAndroid Build Coastguard Worker WORD32 *hybrid_real = p_hybrid_real + proto_len * MAX_HYBRID_BANDS;
915*15dc779aSAndroid Build Coastguard Worker WORD32 *hybrid_imag = p_hybrid_imag + proto_len * MAX_HYBRID_BANDS;
916*15dc779aSAndroid Build Coastguard Worker
917*15dc779aSAndroid Build Coastguard Worker for (n = 0; n < val; n++) {
918*15dc779aSAndroid Build Coastguard Worker *hybrid_real = *qmf_real++;
919*15dc779aSAndroid Build Coastguard Worker *hybrid_imag = *qmf_imag++;
920*15dc779aSAndroid Build Coastguard Worker
921*15dc779aSAndroid Build Coastguard Worker hybrid_real += MAX_HYBRID_BANDS;
922*15dc779aSAndroid Build Coastguard Worker hybrid_imag += MAX_HYBRID_BANDS;
923*15dc779aSAndroid Build Coastguard Worker }
924*15dc779aSAndroid Build Coastguard Worker
925*15dc779aSAndroid Build Coastguard Worker p_qmf_real += MAX_TIME_SLOTS;
926*15dc779aSAndroid Build Coastguard Worker p_qmf_imag += MAX_TIME_SLOTS;
927*15dc779aSAndroid Build Coastguard Worker
928*15dc779aSAndroid Build Coastguard Worker p_hybrid_real++;
929*15dc779aSAndroid Build Coastguard Worker p_hybrid_imag++;
930*15dc779aSAndroid Build Coastguard Worker }
931*15dc779aSAndroid Build Coastguard Worker
932*15dc779aSAndroid Build Coastguard Worker p_hybrid_real = m_hybrid_real;
933*15dc779aSAndroid Build Coastguard Worker p_hybrid_imag = m_hybrid_imag;
934*15dc779aSAndroid Build Coastguard Worker
935*15dc779aSAndroid Build Coastguard Worker for (time_slot = 0; time_slot < nr_samples; time_slot++) {
936*15dc779aSAndroid Build Coastguard Worker WORD32 *hybrid_real = p_hybrid_real;
937*15dc779aSAndroid Build Coastguard Worker WORD32 *hybrid_imag = p_hybrid_imag;
938*15dc779aSAndroid Build Coastguard Worker
939*15dc779aSAndroid Build Coastguard Worker ixheaacd_8ch_filtering(
940*15dc779aSAndroid Build Coastguard Worker &(hyb_state->buffer_lf_real[0][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
941*15dc779aSAndroid Build Coastguard Worker &(hyb_state->buffer_lf_imag[0][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
942*15dc779aSAndroid Build Coastguard Worker m_temp_output_real, m_temp_output_imag, hyb_tab_ptr);
943*15dc779aSAndroid Build Coastguard Worker
944*15dc779aSAndroid Build Coastguard Worker *hybrid_real++ = m_temp_output_real[6];
945*15dc779aSAndroid Build Coastguard Worker *hybrid_real++ = m_temp_output_real[7];
946*15dc779aSAndroid Build Coastguard Worker *hybrid_real++ = m_temp_output_real[0];
947*15dc779aSAndroid Build Coastguard Worker *hybrid_real++ = m_temp_output_real[1];
948*15dc779aSAndroid Build Coastguard Worker *hybrid_imag++ = (m_temp_output_imag[2] + m_temp_output_imag[5]);
949*15dc779aSAndroid Build Coastguard Worker *hybrid_real++ = (m_temp_output_real[3] + m_temp_output_real[4]);
950*15dc779aSAndroid Build Coastguard Worker
951*15dc779aSAndroid Build Coastguard Worker *hybrid_imag++ = m_temp_output_imag[6];
952*15dc779aSAndroid Build Coastguard Worker *hybrid_imag++ = m_temp_output_imag[7];
953*15dc779aSAndroid Build Coastguard Worker *hybrid_imag++ = m_temp_output_imag[0];
954*15dc779aSAndroid Build Coastguard Worker *hybrid_imag++ = m_temp_output_imag[1];
955*15dc779aSAndroid Build Coastguard Worker *hybrid_real++ = (m_temp_output_real[2] + m_temp_output_real[5]);
956*15dc779aSAndroid Build Coastguard Worker *hybrid_imag++ = (m_temp_output_imag[3] + m_temp_output_imag[4]);
957*15dc779aSAndroid Build Coastguard Worker
958*15dc779aSAndroid Build Coastguard Worker ixheaacd_2ch_filtering(
959*15dc779aSAndroid Build Coastguard Worker &(hyb_state->buffer_lf_real[1][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
960*15dc779aSAndroid Build Coastguard Worker m_temp_output_real, hyb_tab_ptr);
961*15dc779aSAndroid Build Coastguard Worker
962*15dc779aSAndroid Build Coastguard Worker ixheaacd_2ch_filtering(
963*15dc779aSAndroid Build Coastguard Worker &(hyb_state->buffer_lf_imag[1][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
964*15dc779aSAndroid Build Coastguard Worker m_temp_output_imag, hyb_tab_ptr);
965*15dc779aSAndroid Build Coastguard Worker
966*15dc779aSAndroid Build Coastguard Worker *hybrid_real++ = m_temp_output_real[1];
967*15dc779aSAndroid Build Coastguard Worker *hybrid_real++ = m_temp_output_real[0];
968*15dc779aSAndroid Build Coastguard Worker
969*15dc779aSAndroid Build Coastguard Worker *hybrid_imag++ = m_temp_output_imag[0];
970*15dc779aSAndroid Build Coastguard Worker *hybrid_imag++ = m_temp_output_imag[1];
971*15dc779aSAndroid Build Coastguard Worker
972*15dc779aSAndroid Build Coastguard Worker ixheaacd_2ch_filtering(
973*15dc779aSAndroid Build Coastguard Worker &(hyb_state->buffer_lf_real[2][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
974*15dc779aSAndroid Build Coastguard Worker m_temp_output_real, hyb_tab_ptr);
975*15dc779aSAndroid Build Coastguard Worker
976*15dc779aSAndroid Build Coastguard Worker ixheaacd_2ch_filtering(
977*15dc779aSAndroid Build Coastguard Worker &(hyb_state->buffer_lf_imag[2][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
978*15dc779aSAndroid Build Coastguard Worker m_temp_output_imag, hyb_tab_ptr);
979*15dc779aSAndroid Build Coastguard Worker
980*15dc779aSAndroid Build Coastguard Worker *hybrid_real++ = m_temp_output_real[0];
981*15dc779aSAndroid Build Coastguard Worker *hybrid_real++ = m_temp_output_real[1];
982*15dc779aSAndroid Build Coastguard Worker
983*15dc779aSAndroid Build Coastguard Worker *hybrid_imag++ = m_temp_output_imag[0];
984*15dc779aSAndroid Build Coastguard Worker *hybrid_imag++ = m_temp_output_imag[1];
985*15dc779aSAndroid Build Coastguard Worker
986*15dc779aSAndroid Build Coastguard Worker p_hybrid_real += MAX_HYBRID_BANDS;
987*15dc779aSAndroid Build Coastguard Worker p_hybrid_imag += MAX_HYBRID_BANDS;
988*15dc779aSAndroid Build Coastguard Worker }
989*15dc779aSAndroid Build Coastguard Worker
990*15dc779aSAndroid Build Coastguard Worker p_qmf_real = m_qmf_real;
991*15dc779aSAndroid Build Coastguard Worker p_qmf_imag = m_qmf_imag;
992*15dc779aSAndroid Build Coastguard Worker
993*15dc779aSAndroid Build Coastguard Worker p_buffer_lf_real = &hyb_state->buffer_lf_real[0][nr_samples_shift_lf];
994*15dc779aSAndroid Build Coastguard Worker p_buffer_lf_imag = &hyb_state->buffer_lf_imag[0][nr_samples_shift_lf];
995*15dc779aSAndroid Build Coastguard Worker
996*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < nr_qmf_bands_lf; k++) {
997*15dc779aSAndroid Build Coastguard Worker for (n = MAX_TIME_SLOTS; n < nr_samples_shift_lf; n++) {
998*15dc779aSAndroid Build Coastguard Worker hyb_state->buffer_lf_real[k][n] = hyb_state->qmf_lf_real[k][n];
999*15dc779aSAndroid Build Coastguard Worker hyb_state->buffer_lf_imag[k][n] = hyb_state->qmf_lf_imag[k][n];
1000*15dc779aSAndroid Build Coastguard Worker }
1001*15dc779aSAndroid Build Coastguard Worker {
1002*15dc779aSAndroid Build Coastguard Worker memcpy(p_buffer_lf_real, p_qmf_real, nr_samples_x4);
1003*15dc779aSAndroid Build Coastguard Worker memcpy(p_buffer_lf_imag, p_qmf_imag, nr_samples_x4);
1004*15dc779aSAndroid Build Coastguard Worker }
1005*15dc779aSAndroid Build Coastguard Worker p_qmf_real += MAX_TIME_SLOTS;
1006*15dc779aSAndroid Build Coastguard Worker p_qmf_imag += MAX_TIME_SLOTS;
1007*15dc779aSAndroid Build Coastguard Worker
1008*15dc779aSAndroid Build Coastguard Worker p_buffer_lf_real += BUFFER_LEN_LF;
1009*15dc779aSAndroid Build Coastguard Worker p_buffer_lf_imag += BUFFER_LEN_LF;
1010*15dc779aSAndroid Build Coastguard Worker }
1011*15dc779aSAndroid Build Coastguard Worker }
1012*15dc779aSAndroid Build Coastguard Worker
ixheaacd_apply_ana_hyb_filt_bank_create_x_res(ia_mps_dec_thyb_filter_state_struct * hyb_state,WORD32 * m_qmf_real,WORD32 * m_qmf_imag,WORD32 nr_bands,WORD32 nr_samples,WORD32 * m_hybrid_real,WORD32 * m_hybrid_imag,SIZE_T * indx,WORD32 res,WORD32 hyb_bands,WORD32 num_parameter_bands,WORD32 * counter,const ia_mps_dec_hybrid_tables_struct * hyb_tab_ptr)1013*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_apply_ana_hyb_filt_bank_create_x_res(
1014*15dc779aSAndroid Build Coastguard Worker ia_mps_dec_thyb_filter_state_struct *hyb_state, WORD32 *m_qmf_real, WORD32 *m_qmf_imag,
1015*15dc779aSAndroid Build Coastguard Worker WORD32 nr_bands, WORD32 nr_samples, WORD32 *m_hybrid_real, WORD32 *m_hybrid_imag,
1016*15dc779aSAndroid Build Coastguard Worker SIZE_T *indx, WORD32 res, WORD32 hyb_bands, WORD32 num_parameter_bands, WORD32 *counter,
1017*15dc779aSAndroid Build Coastguard Worker const ia_mps_dec_hybrid_tables_struct *hyb_tab_ptr) {
1018*15dc779aSAndroid Build Coastguard Worker WORD32 nr_samples_shift_lf;
1019*15dc779aSAndroid Build Coastguard Worker WORD32 nr_qmf_bands_lf;
1020*15dc779aSAndroid Build Coastguard Worker WORD32 k, n, qs;
1021*15dc779aSAndroid Build Coastguard Worker WORD32 time_slot, ch_off_set;
1022*15dc779aSAndroid Build Coastguard Worker SIZE_T *idx = indx;
1023*15dc779aSAndroid Build Coastguard Worker
1024*15dc779aSAndroid Build Coastguard Worker WORD32 proto_len = (PROTO_LEN - 1) >> 1;
1025*15dc779aSAndroid Build Coastguard Worker WORD32 val = nr_samples - proto_len;
1026*15dc779aSAndroid Build Coastguard Worker
1027*15dc779aSAndroid Build Coastguard Worker WORD32 *p_qmf_real = m_qmf_real;
1028*15dc779aSAndroid Build Coastguard Worker WORD32 *p_qmf_imag = m_qmf_imag;
1029*15dc779aSAndroid Build Coastguard Worker WORD32 loop_cnt;
1030*15dc779aSAndroid Build Coastguard Worker
1031*15dc779aSAndroid Build Coastguard Worker WORD32 m_temp_output_real[MAX_HYBRID_ONLY_BANDS_PER_QMF];
1032*15dc779aSAndroid Build Coastguard Worker WORD32 m_temp_output_imag[MAX_HYBRID_ONLY_BANDS_PER_QMF];
1033*15dc779aSAndroid Build Coastguard Worker
1034*15dc779aSAndroid Build Coastguard Worker WORD32 *p_hybrid_real = m_hybrid_real + 10;
1035*15dc779aSAndroid Build Coastguard Worker WORD32 *p_hybrid_imag = m_hybrid_imag + 10;
1036*15dc779aSAndroid Build Coastguard Worker
1037*15dc779aSAndroid Build Coastguard Worker WORD32 *p_hybrid_re, *p_hybrid_im;
1038*15dc779aSAndroid Build Coastguard Worker
1039*15dc779aSAndroid Build Coastguard Worker WORD32 *p_buffer_lf_real, *p_buffer_lf_imag;
1040*15dc779aSAndroid Build Coastguard Worker
1041*15dc779aSAndroid Build Coastguard Worker WORD32 nr_samples_x4 = nr_samples << 2;
1042*15dc779aSAndroid Build Coastguard Worker
1043*15dc779aSAndroid Build Coastguard Worker nr_samples_shift_lf = BUFFER_LEN_LF - nr_samples;
1044*15dc779aSAndroid Build Coastguard Worker
1045*15dc779aSAndroid Build Coastguard Worker nr_qmf_bands_lf = QMF_BANDS_TO_HYBRID;
1046*15dc779aSAndroid Build Coastguard Worker loop_cnt = nr_bands - nr_qmf_bands_lf;
1047*15dc779aSAndroid Build Coastguard Worker ch_off_set = 0;
1048*15dc779aSAndroid Build Coastguard Worker
1049*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < nr_qmf_bands_lf; k++) {
1050*15dc779aSAndroid Build Coastguard Worker for (n = 0; n < nr_samples_shift_lf; n++) {
1051*15dc779aSAndroid Build Coastguard Worker hyb_state->buffer_lf_real[k][n] = hyb_state->buffer_lf_real[k][n + nr_samples];
1052*15dc779aSAndroid Build Coastguard Worker hyb_state->buffer_lf_imag[k][n] = hyb_state->buffer_lf_imag[k][n + nr_samples];
1053*15dc779aSAndroid Build Coastguard Worker
1054*15dc779aSAndroid Build Coastguard Worker hyb_state->qmf_lf_real[k][n] = hyb_state->qmf_lf_real[k][n + nr_samples];
1055*15dc779aSAndroid Build Coastguard Worker hyb_state->qmf_lf_imag[k][n] = hyb_state->qmf_lf_imag[k][n + nr_samples];
1056*15dc779aSAndroid Build Coastguard Worker }
1057*15dc779aSAndroid Build Coastguard Worker }
1058*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < nr_qmf_bands_lf; k++) {
1059*15dc779aSAndroid Build Coastguard Worker WORD32 *qmf_real = p_qmf_real;
1060*15dc779aSAndroid Build Coastguard Worker WORD32 *qmf_imag = p_qmf_imag;
1061*15dc779aSAndroid Build Coastguard Worker
1062*15dc779aSAndroid Build Coastguard Worker for (n = 0; n < nr_samples; n++) {
1063*15dc779aSAndroid Build Coastguard Worker hyb_state->buffer_lf_real[k][n + nr_samples_shift_lf] = *qmf_real;
1064*15dc779aSAndroid Build Coastguard Worker hyb_state->buffer_lf_imag[k][n + nr_samples_shift_lf] = *qmf_imag;
1065*15dc779aSAndroid Build Coastguard Worker
1066*15dc779aSAndroid Build Coastguard Worker hyb_state->qmf_lf_imag[k][n + nr_samples_shift_lf] = *qmf_imag++;
1067*15dc779aSAndroid Build Coastguard Worker hyb_state->qmf_lf_real[k][n + nr_samples_shift_lf] = *qmf_real++;
1068*15dc779aSAndroid Build Coastguard Worker }
1069*15dc779aSAndroid Build Coastguard Worker p_qmf_real += MAX_TIME_SLOTS;
1070*15dc779aSAndroid Build Coastguard Worker p_qmf_imag += MAX_TIME_SLOTS;
1071*15dc779aSAndroid Build Coastguard Worker }
1072*15dc779aSAndroid Build Coastguard Worker
1073*15dc779aSAndroid Build Coastguard Worker p_qmf_real = m_qmf_real + NR_QMF_BANDS_LFXTS;
1074*15dc779aSAndroid Build Coastguard Worker p_qmf_imag = m_qmf_imag + NR_QMF_BANDS_LFXTS;
1075*15dc779aSAndroid Build Coastguard Worker
1076*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < loop_cnt; k++) {
1077*15dc779aSAndroid Build Coastguard Worker WORD32 *qmf_real = p_qmf_real + val;
1078*15dc779aSAndroid Build Coastguard Worker WORD32 *qmf_imag = p_qmf_imag + val;
1079*15dc779aSAndroid Build Coastguard Worker
1080*15dc779aSAndroid Build Coastguard Worker p_hybrid_re = p_hybrid_real;
1081*15dc779aSAndroid Build Coastguard Worker p_hybrid_im = p_hybrid_imag;
1082*15dc779aSAndroid Build Coastguard Worker
1083*15dc779aSAndroid Build Coastguard Worker for (n = 0; n < proto_len; n++) {
1084*15dc779aSAndroid Build Coastguard Worker *p_hybrid_re = hyb_state->buffer_hf_real[k][n];
1085*15dc779aSAndroid Build Coastguard Worker *p_hybrid_im = hyb_state->buffer_hf_imag[k][n];
1086*15dc779aSAndroid Build Coastguard Worker
1087*15dc779aSAndroid Build Coastguard Worker hyb_state->buffer_hf_real[k][n] = *qmf_real++;
1088*15dc779aSAndroid Build Coastguard Worker hyb_state->buffer_hf_imag[k][n] = *qmf_imag++;
1089*15dc779aSAndroid Build Coastguard Worker
1090*15dc779aSAndroid Build Coastguard Worker p_hybrid_re += MAX_HYBRID_BANDS;
1091*15dc779aSAndroid Build Coastguard Worker p_hybrid_im += MAX_HYBRID_BANDS;
1092*15dc779aSAndroid Build Coastguard Worker }
1093*15dc779aSAndroid Build Coastguard Worker p_qmf_real += MAX_TIME_SLOTS;
1094*15dc779aSAndroid Build Coastguard Worker p_qmf_imag += MAX_TIME_SLOTS;
1095*15dc779aSAndroid Build Coastguard Worker
1096*15dc779aSAndroid Build Coastguard Worker p_hybrid_real++;
1097*15dc779aSAndroid Build Coastguard Worker p_hybrid_imag++;
1098*15dc779aSAndroid Build Coastguard Worker }
1099*15dc779aSAndroid Build Coastguard Worker
1100*15dc779aSAndroid Build Coastguard Worker p_qmf_real = m_qmf_real + NR_QMF_BANDS_LFXTS;
1101*15dc779aSAndroid Build Coastguard Worker p_qmf_imag = m_qmf_imag + NR_QMF_BANDS_LFXTS;
1102*15dc779aSAndroid Build Coastguard Worker
1103*15dc779aSAndroid Build Coastguard Worker p_hybrid_real = m_hybrid_real + 10;
1104*15dc779aSAndroid Build Coastguard Worker p_hybrid_imag = m_hybrid_imag + 10;
1105*15dc779aSAndroid Build Coastguard Worker
1106*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < loop_cnt; k++) {
1107*15dc779aSAndroid Build Coastguard Worker WORD32 *qmf_real = p_qmf_real;
1108*15dc779aSAndroid Build Coastguard Worker WORD32 *qmf_imag = p_qmf_imag;
1109*15dc779aSAndroid Build Coastguard Worker
1110*15dc779aSAndroid Build Coastguard Worker p_hybrid_re = p_hybrid_real + proto_len * MAX_HYBRID_BANDS;
1111*15dc779aSAndroid Build Coastguard Worker p_hybrid_im = p_hybrid_imag + proto_len * MAX_HYBRID_BANDS;
1112*15dc779aSAndroid Build Coastguard Worker
1113*15dc779aSAndroid Build Coastguard Worker for (n = 0; n < val; n++) {
1114*15dc779aSAndroid Build Coastguard Worker *p_hybrid_re = *qmf_real++;
1115*15dc779aSAndroid Build Coastguard Worker *p_hybrid_im = *qmf_imag++;
1116*15dc779aSAndroid Build Coastguard Worker
1117*15dc779aSAndroid Build Coastguard Worker p_hybrid_re += MAX_HYBRID_BANDS;
1118*15dc779aSAndroid Build Coastguard Worker p_hybrid_im += MAX_HYBRID_BANDS;
1119*15dc779aSAndroid Build Coastguard Worker }
1120*15dc779aSAndroid Build Coastguard Worker p_qmf_real += MAX_TIME_SLOTS;
1121*15dc779aSAndroid Build Coastguard Worker p_qmf_imag += MAX_TIME_SLOTS;
1122*15dc779aSAndroid Build Coastguard Worker
1123*15dc779aSAndroid Build Coastguard Worker p_hybrid_real++;
1124*15dc779aSAndroid Build Coastguard Worker p_hybrid_imag++;
1125*15dc779aSAndroid Build Coastguard Worker }
1126*15dc779aSAndroid Build Coastguard Worker
1127*15dc779aSAndroid Build Coastguard Worker if (res == 1 && (num_parameter_bands == 20 || num_parameter_bands == 28))
1128*15dc779aSAndroid Build Coastguard Worker *counter = 3;
1129*15dc779aSAndroid Build Coastguard Worker else {
1130*15dc779aSAndroid Build Coastguard Worker idx = indx;
1131*15dc779aSAndroid Build Coastguard Worker for (qs = 0; qs < hyb_bands; qs++) {
1132*15dc779aSAndroid Build Coastguard Worker if (*idx++ >= (SIZE_T)res) {
1133*15dc779aSAndroid Build Coastguard Worker *counter = qs;
1134*15dc779aSAndroid Build Coastguard Worker qs = hyb_bands;
1135*15dc779aSAndroid Build Coastguard Worker }
1136*15dc779aSAndroid Build Coastguard Worker }
1137*15dc779aSAndroid Build Coastguard Worker }
1138*15dc779aSAndroid Build Coastguard Worker
1139*15dc779aSAndroid Build Coastguard Worker p_hybrid_real = m_hybrid_real;
1140*15dc779aSAndroid Build Coastguard Worker p_hybrid_imag = m_hybrid_imag;
1141*15dc779aSAndroid Build Coastguard Worker for (time_slot = 0; time_slot < nr_samples; time_slot++) {
1142*15dc779aSAndroid Build Coastguard Worker idx = indx;
1143*15dc779aSAndroid Build Coastguard Worker p_hybrid_re = p_hybrid_real;
1144*15dc779aSAndroid Build Coastguard Worker p_hybrid_im = p_hybrid_imag;
1145*15dc779aSAndroid Build Coastguard Worker
1146*15dc779aSAndroid Build Coastguard Worker ixheaacd_8ch_filtering(
1147*15dc779aSAndroid Build Coastguard Worker &(hyb_state->buffer_lf_real[0][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
1148*15dc779aSAndroid Build Coastguard Worker &(hyb_state->buffer_lf_imag[0][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
1149*15dc779aSAndroid Build Coastguard Worker m_temp_output_real, m_temp_output_imag, hyb_tab_ptr);
1150*15dc779aSAndroid Build Coastguard Worker
1151*15dc779aSAndroid Build Coastguard Worker *p_hybrid_re++ = m_temp_output_real[6];
1152*15dc779aSAndroid Build Coastguard Worker *p_hybrid_re++ = m_temp_output_real[7];
1153*15dc779aSAndroid Build Coastguard Worker *p_hybrid_re++ = m_temp_output_real[0];
1154*15dc779aSAndroid Build Coastguard Worker
1155*15dc779aSAndroid Build Coastguard Worker *p_hybrid_re++ = m_temp_output_real[1];
1156*15dc779aSAndroid Build Coastguard Worker
1157*15dc779aSAndroid Build Coastguard Worker *p_hybrid_im++ = m_temp_output_imag[6];
1158*15dc779aSAndroid Build Coastguard Worker *p_hybrid_im++ = m_temp_output_imag[7];
1159*15dc779aSAndroid Build Coastguard Worker *p_hybrid_im++ = m_temp_output_imag[0];
1160*15dc779aSAndroid Build Coastguard Worker *p_hybrid_im++ = m_temp_output_imag[1];
1161*15dc779aSAndroid Build Coastguard Worker
1162*15dc779aSAndroid Build Coastguard Worker if (*counter > 4) {
1163*15dc779aSAndroid Build Coastguard Worker *p_hybrid_re++ = (m_temp_output_real[2] + m_temp_output_real[5]);
1164*15dc779aSAndroid Build Coastguard Worker *p_hybrid_im++ = (m_temp_output_imag[2] + m_temp_output_imag[5]);
1165*15dc779aSAndroid Build Coastguard Worker }
1166*15dc779aSAndroid Build Coastguard Worker
1167*15dc779aSAndroid Build Coastguard Worker if (*counter > 5) {
1168*15dc779aSAndroid Build Coastguard Worker *p_hybrid_re++ = (m_temp_output_real[3] + m_temp_output_real[4]);
1169*15dc779aSAndroid Build Coastguard Worker *p_hybrid_im++ = (m_temp_output_imag[3] + m_temp_output_imag[4]);
1170*15dc779aSAndroid Build Coastguard Worker }
1171*15dc779aSAndroid Build Coastguard Worker
1172*15dc779aSAndroid Build Coastguard Worker ch_off_set = 6;
1173*15dc779aSAndroid Build Coastguard Worker p_hybrid_re = p_hybrid_real + ch_off_set;
1174*15dc779aSAndroid Build Coastguard Worker p_hybrid_im = p_hybrid_imag + ch_off_set;
1175*15dc779aSAndroid Build Coastguard Worker
1176*15dc779aSAndroid Build Coastguard Worker ixheaacd_2ch_filtering(
1177*15dc779aSAndroid Build Coastguard Worker &(hyb_state->buffer_lf_real[1][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
1178*15dc779aSAndroid Build Coastguard Worker m_temp_output_real, hyb_tab_ptr);
1179*15dc779aSAndroid Build Coastguard Worker
1180*15dc779aSAndroid Build Coastguard Worker ixheaacd_2ch_filtering(
1181*15dc779aSAndroid Build Coastguard Worker &(hyb_state->buffer_lf_imag[1][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
1182*15dc779aSAndroid Build Coastguard Worker m_temp_output_imag, hyb_tab_ptr);
1183*15dc779aSAndroid Build Coastguard Worker
1184*15dc779aSAndroid Build Coastguard Worker *p_hybrid_re++ = m_temp_output_real[1];
1185*15dc779aSAndroid Build Coastguard Worker *p_hybrid_re++ = m_temp_output_real[0];
1186*15dc779aSAndroid Build Coastguard Worker
1187*15dc779aSAndroid Build Coastguard Worker *p_hybrid_im++ = m_temp_output_imag[1];
1188*15dc779aSAndroid Build Coastguard Worker *p_hybrid_im++ = m_temp_output_imag[0];
1189*15dc779aSAndroid Build Coastguard Worker
1190*15dc779aSAndroid Build Coastguard Worker ixheaacd_2ch_filtering(
1191*15dc779aSAndroid Build Coastguard Worker &(hyb_state->buffer_lf_real[2][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
1192*15dc779aSAndroid Build Coastguard Worker m_temp_output_real, hyb_tab_ptr);
1193*15dc779aSAndroid Build Coastguard Worker
1194*15dc779aSAndroid Build Coastguard Worker ixheaacd_2ch_filtering(
1195*15dc779aSAndroid Build Coastguard Worker &(hyb_state->buffer_lf_imag[2][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
1196*15dc779aSAndroid Build Coastguard Worker m_temp_output_imag, hyb_tab_ptr);
1197*15dc779aSAndroid Build Coastguard Worker
1198*15dc779aSAndroid Build Coastguard Worker *p_hybrid_re++ = m_temp_output_real[0];
1199*15dc779aSAndroid Build Coastguard Worker *p_hybrid_re++ = m_temp_output_real[1];
1200*15dc779aSAndroid Build Coastguard Worker
1201*15dc779aSAndroid Build Coastguard Worker *p_hybrid_im++ = m_temp_output_imag[0];
1202*15dc779aSAndroid Build Coastguard Worker *p_hybrid_im++ = m_temp_output_imag[1];
1203*15dc779aSAndroid Build Coastguard Worker
1204*15dc779aSAndroid Build Coastguard Worker p_hybrid_real += MAX_HYBRID_BANDS;
1205*15dc779aSAndroid Build Coastguard Worker p_hybrid_imag += MAX_HYBRID_BANDS;
1206*15dc779aSAndroid Build Coastguard Worker }
1207*15dc779aSAndroid Build Coastguard Worker p_qmf_real = m_qmf_real;
1208*15dc779aSAndroid Build Coastguard Worker p_qmf_imag = m_qmf_imag;
1209*15dc779aSAndroid Build Coastguard Worker
1210*15dc779aSAndroid Build Coastguard Worker p_buffer_lf_real = &hyb_state->buffer_lf_real[0][nr_samples_shift_lf];
1211*15dc779aSAndroid Build Coastguard Worker p_buffer_lf_imag = &hyb_state->buffer_lf_imag[0][nr_samples_shift_lf];
1212*15dc779aSAndroid Build Coastguard Worker
1213*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < nr_qmf_bands_lf; k++) {
1214*15dc779aSAndroid Build Coastguard Worker for (n = MAX_TIME_SLOTS; n < nr_samples_shift_lf; n++) {
1215*15dc779aSAndroid Build Coastguard Worker hyb_state->buffer_lf_real[k][n] = hyb_state->qmf_lf_real[k][n];
1216*15dc779aSAndroid Build Coastguard Worker hyb_state->buffer_lf_imag[k][n] = hyb_state->qmf_lf_imag[k][n];
1217*15dc779aSAndroid Build Coastguard Worker }
1218*15dc779aSAndroid Build Coastguard Worker {
1219*15dc779aSAndroid Build Coastguard Worker memcpy(p_buffer_lf_real, p_qmf_real, nr_samples_x4);
1220*15dc779aSAndroid Build Coastguard Worker memcpy(p_buffer_lf_imag, p_qmf_imag, nr_samples_x4);
1221*15dc779aSAndroid Build Coastguard Worker }
1222*15dc779aSAndroid Build Coastguard Worker p_qmf_real += MAX_TIME_SLOTS;
1223*15dc779aSAndroid Build Coastguard Worker p_qmf_imag += MAX_TIME_SLOTS;
1224*15dc779aSAndroid Build Coastguard Worker
1225*15dc779aSAndroid Build Coastguard Worker p_buffer_lf_real += BUFFER_LEN_LF;
1226*15dc779aSAndroid Build Coastguard Worker p_buffer_lf_imag += BUFFER_LEN_LF;
1227*15dc779aSAndroid Build Coastguard Worker }
1228*15dc779aSAndroid Build Coastguard Worker }
1229