1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker *
3*15dc779aSAndroid Build Coastguard Worker * Copyright (C) 2023 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_mps_struct_def.h"
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_res_rom.h"
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_aac_struct.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_common_rom.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecsettings.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_scale.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr_part.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_rom.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_hybrid.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ps_dec.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_polyphase.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_config.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_qmf_dec.h"
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_dec.h"
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_macro_def.h"
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_apply_common.h"
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_basic_op.h"
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_get_index.h"
44*15dc779aSAndroid Build Coastguard Worker
ixheaacd_apply_m2(ia_heaac_mps_state_struct * pstr_mps_state)45*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_apply_m2(ia_heaac_mps_state_struct *pstr_mps_state) {
46*15dc779aSAndroid Build Coastguard Worker WORD32 ts, qs, row, col;
47*15dc779aSAndroid Build Coastguard Worker ia_heaac_mps_state_struct *curr_state = pstr_mps_state;
48*15dc779aSAndroid Build Coastguard Worker ia_mps_persistent_mem *persistent_mem = &curr_state->mps_persistent_mem;
49*15dc779aSAndroid Build Coastguard Worker ia_mps_dec_reuse_array_struct *p_array_struct = pstr_mps_state->array_struct;
50*15dc779aSAndroid Build Coastguard Worker ia_mps_dec_m2_param_struct *p_m2_param = pstr_mps_state->aux_struct->m2_param;
51*15dc779aSAndroid Build Coastguard Worker
52*15dc779aSAndroid Build Coastguard Worker WORD32 num_direct_signals = curr_state->num_direct_signals;
53*15dc779aSAndroid Build Coastguard Worker WORD32 temp_1, loop_counter, col_counter = num_direct_signals + curr_state->num_decor_signals;
54*15dc779aSAndroid Build Coastguard Worker
55*15dc779aSAndroid Build Coastguard Worker WORD32 *rout_ptr, *rout_kernel_ptr;
56*15dc779aSAndroid Build Coastguard Worker
57*15dc779aSAndroid Build Coastguard Worker WORD32 *hyb_output_real_dry, *hyb_output_imag_dry, *hyb_output_real_wet, *hyb_output_imag_wet;
58*15dc779aSAndroid Build Coastguard Worker
59*15dc779aSAndroid Build Coastguard Worker WORD32 *p_hyb_out_dry_real, *p_hyb_out_dry_imag, *p_hyb_out_dry_re, *p_hyb_out_dry_im;
60*15dc779aSAndroid Build Coastguard Worker
61*15dc779aSAndroid Build Coastguard Worker WORD32 *w_wet_real, *w_wet_imag, *w_dry_real, *w_dry_imag;
62*15dc779aSAndroid Build Coastguard Worker
63*15dc779aSAndroid Build Coastguard Worker WORD32 *m2_decor_real_prev = persistent_mem->m2_decor_real_prev;
64*15dc779aSAndroid Build Coastguard Worker WORD32 *m2_decor_imag_prev = persistent_mem->m2_decor_imag_prev;
65*15dc779aSAndroid Build Coastguard Worker
66*15dc779aSAndroid Build Coastguard Worker WORD32 *p_buffer_real, *p_buffer_imag, *p_buffer_re, *p_buffer_im;
67*15dc779aSAndroid Build Coastguard Worker WORD32 *p_buf_real, *p_buf_imag, *p_buf_re, *p_buf_im;
68*15dc779aSAndroid Build Coastguard Worker
69*15dc779aSAndroid Build Coastguard Worker WORD32 *m2_resid_real_prev = persistent_mem->m2_resid_real_prev;
70*15dc779aSAndroid Build Coastguard Worker WORD32 *m2_resid_imag_prev = persistent_mem->m2_resid_imag_prev;
71*15dc779aSAndroid Build Coastguard Worker
72*15dc779aSAndroid Build Coastguard Worker WORD32 idx = 0;
73*15dc779aSAndroid Build Coastguard Worker WORD32 w_wet_offset = num_direct_signals * TSXHB;
74*15dc779aSAndroid Build Coastguard Worker
75*15dc779aSAndroid Build Coastguard Worker WORD32 num_output_channels = curr_state->num_output_channels;
76*15dc779aSAndroid Build Coastguard Worker WORD32 time_slots = curr_state->time_slots;
77*15dc779aSAndroid Build Coastguard Worker WORD32 hybrid_bands = curr_state->hybrid_bands;
78*15dc779aSAndroid Build Coastguard Worker WORD32 m2_param_imag_present = curr_state->m2_param_imag_present;
79*15dc779aSAndroid Build Coastguard Worker WORD32 num_parameter_bands = curr_state->num_parameter_bands;
80*15dc779aSAndroid Build Coastguard Worker WORD32 up_mix_type = curr_state->up_mix_type;
81*15dc779aSAndroid Build Coastguard Worker WORD32 residual_coding = curr_state->residual_coding;
82*15dc779aSAndroid Build Coastguard Worker WORD32 *index_ptr = curr_state->index;
83*15dc779aSAndroid Build Coastguard Worker
84*15dc779aSAndroid Build Coastguard Worker SIZE_T params[4];
85*15dc779aSAndroid Build Coastguard Worker
86*15dc779aSAndroid Build Coastguard Worker params[0] = (SIZE_T)(&curr_state->kernels[0]);
87*15dc779aSAndroid Build Coastguard Worker params[1] = time_slots;
88*15dc779aSAndroid Build Coastguard Worker params[2] = num_parameter_bands;
89*15dc779aSAndroid Build Coastguard Worker params[3] = hybrid_bands;
90*15dc779aSAndroid Build Coastguard Worker
91*15dc779aSAndroid Build Coastguard Worker rout_ptr = pstr_mps_state->mps_scratch_mem_v;
92*15dc779aSAndroid Build Coastguard Worker rout_kernel_ptr =
93*15dc779aSAndroid Build Coastguard Worker rout_ptr + IXHEAAC_GET_SIZE_ALIGNED_TYPE(TSXHB, sizeof(*rout_kernel_ptr), BYTE_ALIGN_8);
94*15dc779aSAndroid Build Coastguard Worker
95*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_real = p_array_struct->hyb_output_real_dry;
96*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_imag = p_array_struct->hyb_output_imag_dry;
97*15dc779aSAndroid Build Coastguard Worker
98*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < num_output_channels; row++) {
99*15dc779aSAndroid Build Coastguard Worker hyb_output_real_dry = p_hyb_out_dry_real;
100*15dc779aSAndroid Build Coastguard Worker hyb_output_imag_dry = p_hyb_out_dry_imag;
101*15dc779aSAndroid Build Coastguard Worker
102*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < time_slots; ts++) {
103*15dc779aSAndroid Build Coastguard Worker memset(hyb_output_real_dry, 0, (hybrid_bands) * sizeof(hyb_output_real_dry[0]));
104*15dc779aSAndroid Build Coastguard Worker memset(hyb_output_imag_dry, 0, (hybrid_bands) * sizeof(hyb_output_imag_dry[0]));
105*15dc779aSAndroid Build Coastguard Worker
106*15dc779aSAndroid Build Coastguard Worker hyb_output_real_dry += MAX_HYBRID_BANDS;
107*15dc779aSAndroid Build Coastguard Worker hyb_output_imag_dry += MAX_HYBRID_BANDS;
108*15dc779aSAndroid Build Coastguard Worker }
109*15dc779aSAndroid Build Coastguard Worker
110*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_real += TSXHB;
111*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_imag += TSXHB;
112*15dc779aSAndroid Build Coastguard Worker }
113*15dc779aSAndroid Build Coastguard Worker
114*15dc779aSAndroid Build Coastguard Worker if (residual_coding)
115*15dc779aSAndroid Build Coastguard Worker loop_counter = col_counter;
116*15dc779aSAndroid Build Coastguard Worker else
117*15dc779aSAndroid Build Coastguard Worker loop_counter = num_direct_signals;
118*15dc779aSAndroid Build Coastguard Worker
119*15dc779aSAndroid Build Coastguard Worker idx = 0;
120*15dc779aSAndroid Build Coastguard Worker
121*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_real = p_array_struct->hyb_output_real_dry;
122*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_imag = p_array_struct->hyb_output_imag_dry;
123*15dc779aSAndroid Build Coastguard Worker
124*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < num_output_channels; row++) {
125*15dc779aSAndroid Build Coastguard Worker p_buffer_real = p_array_struct->buf_real;
126*15dc779aSAndroid Build Coastguard Worker p_buffer_imag = p_array_struct->buf_imag;
127*15dc779aSAndroid Build Coastguard Worker
128*15dc779aSAndroid Build Coastguard Worker for (col = 0; col < num_direct_signals; col++) {
129*15dc779aSAndroid Build Coastguard Worker p_buffer_re = p_buffer_real;
130*15dc779aSAndroid Build Coastguard Worker p_buffer_im = p_buffer_imag;
131*15dc779aSAndroid Build Coastguard Worker
132*15dc779aSAndroid Build Coastguard Worker if (curr_state->m2_param_present[row][col] & 2) {
133*15dc779aSAndroid Build Coastguard Worker ixheaacd_dec_interp_umx(p_m2_param->m2_resid_real[idx++], rout_ptr, m2_resid_real_prev,
134*15dc779aSAndroid Build Coastguard Worker pstr_mps_state);
135*15dc779aSAndroid Build Coastguard Worker ixheaacd_apply_abs_kernels(rout_ptr, rout_kernel_ptr, params);
136*15dc779aSAndroid Build Coastguard Worker
137*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_re = p_hyb_out_dry_real;
138*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_im = p_hyb_out_dry_imag;
139*15dc779aSAndroid Build Coastguard Worker
140*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < time_slots; ts++) {
141*15dc779aSAndroid Build Coastguard Worker hyb_output_real_dry = p_hyb_out_dry_re;
142*15dc779aSAndroid Build Coastguard Worker hyb_output_imag_dry = p_hyb_out_dry_im;
143*15dc779aSAndroid Build Coastguard Worker
144*15dc779aSAndroid Build Coastguard Worker w_dry_real = p_buffer_re;
145*15dc779aSAndroid Build Coastguard Worker w_dry_imag = p_buffer_im;
146*15dc779aSAndroid Build Coastguard Worker
147*15dc779aSAndroid Build Coastguard Worker for (qs = 0; qs < hybrid_bands; qs++) {
148*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32_shr_15(*w_dry_real, *rout_kernel_ptr);
149*15dc779aSAndroid Build Coastguard Worker w_dry_real++;
150*15dc779aSAndroid Build Coastguard Worker *hyb_output_real_dry = *hyb_output_real_dry + temp_1;
151*15dc779aSAndroid Build Coastguard Worker hyb_output_real_dry++;
152*15dc779aSAndroid Build Coastguard Worker
153*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32_shr_15(*w_dry_imag, *rout_kernel_ptr);
154*15dc779aSAndroid Build Coastguard Worker w_dry_imag++;
155*15dc779aSAndroid Build Coastguard Worker rout_kernel_ptr++;
156*15dc779aSAndroid Build Coastguard Worker *hyb_output_imag_dry = *hyb_output_imag_dry + temp_1;
157*15dc779aSAndroid Build Coastguard Worker hyb_output_imag_dry++;
158*15dc779aSAndroid Build Coastguard Worker }
159*15dc779aSAndroid Build Coastguard Worker p_buffer_re += MAX_HYBRID_BANDS;
160*15dc779aSAndroid Build Coastguard Worker p_buffer_im += MAX_HYBRID_BANDS;
161*15dc779aSAndroid Build Coastguard Worker
162*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_re += MAX_HYBRID_BANDS;
163*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_im += MAX_HYBRID_BANDS;
164*15dc779aSAndroid Build Coastguard Worker }
165*15dc779aSAndroid Build Coastguard Worker m2_resid_real_prev += num_parameter_bands;
166*15dc779aSAndroid Build Coastguard Worker }
167*15dc779aSAndroid Build Coastguard Worker p_buffer_real += TSXHB;
168*15dc779aSAndroid Build Coastguard Worker p_buffer_imag += TSXHB;
169*15dc779aSAndroid Build Coastguard Worker }
170*15dc779aSAndroid Build Coastguard Worker
171*15dc779aSAndroid Build Coastguard Worker for (; col < loop_counter; col++) {
172*15dc779aSAndroid Build Coastguard Worker WORD32 index;
173*15dc779aSAndroid Build Coastguard Worker WORD32 res = ixheaacd_get_res_idx(pstr_mps_state, col);
174*15dc779aSAndroid Build Coastguard Worker index = index_ptr[res];
175*15dc779aSAndroid Build Coastguard Worker
176*15dc779aSAndroid Build Coastguard Worker if (curr_state->m2_param_present[row][col] & 2) {
177*15dc779aSAndroid Build Coastguard Worker WORD32 *p_dry_real = p_array_struct->w_dry_real + res * TSXHB;
178*15dc779aSAndroid Build Coastguard Worker WORD32 *p_dry_imag = p_array_struct->w_dry_imag + res * TSXHB;
179*15dc779aSAndroid Build Coastguard Worker
180*15dc779aSAndroid Build Coastguard Worker ixheaacd_dec_interp_umx(p_m2_param->m2_resid_real[idx++], rout_ptr, m2_resid_real_prev,
181*15dc779aSAndroid Build Coastguard Worker pstr_mps_state);
182*15dc779aSAndroid Build Coastguard Worker ixheaacd_apply_abs_kernels(rout_ptr, rout_kernel_ptr, params);
183*15dc779aSAndroid Build Coastguard Worker
184*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_re = p_hyb_out_dry_real;
185*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_im = p_hyb_out_dry_imag;
186*15dc779aSAndroid Build Coastguard Worker
187*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < time_slots; ts++) {
188*15dc779aSAndroid Build Coastguard Worker hyb_output_real_dry = p_hyb_out_dry_re;
189*15dc779aSAndroid Build Coastguard Worker hyb_output_imag_dry = p_hyb_out_dry_im;
190*15dc779aSAndroid Build Coastguard Worker
191*15dc779aSAndroid Build Coastguard Worker w_dry_real = p_dry_real;
192*15dc779aSAndroid Build Coastguard Worker w_dry_imag = p_dry_imag;
193*15dc779aSAndroid Build Coastguard Worker
194*15dc779aSAndroid Build Coastguard Worker for (qs = 0; qs < index; qs++) {
195*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32_shr_15(*w_dry_real, *rout_kernel_ptr);
196*15dc779aSAndroid Build Coastguard Worker w_dry_real++;
197*15dc779aSAndroid Build Coastguard Worker *hyb_output_real_dry = *hyb_output_real_dry + temp_1;
198*15dc779aSAndroid Build Coastguard Worker hyb_output_real_dry++;
199*15dc779aSAndroid Build Coastguard Worker
200*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32_shr_15(*w_dry_imag, *rout_kernel_ptr);
201*15dc779aSAndroid Build Coastguard Worker w_dry_imag++;
202*15dc779aSAndroid Build Coastguard Worker rout_kernel_ptr++;
203*15dc779aSAndroid Build Coastguard Worker *hyb_output_imag_dry = *hyb_output_imag_dry + temp_1;
204*15dc779aSAndroid Build Coastguard Worker hyb_output_imag_dry++;
205*15dc779aSAndroid Build Coastguard Worker }
206*15dc779aSAndroid Build Coastguard Worker rout_kernel_ptr += hybrid_bands - index;
207*15dc779aSAndroid Build Coastguard Worker
208*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_re += MAX_HYBRID_BANDS;
209*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_im += MAX_HYBRID_BANDS;
210*15dc779aSAndroid Build Coastguard Worker
211*15dc779aSAndroid Build Coastguard Worker p_dry_real += MAX_HYBRID_BANDS;
212*15dc779aSAndroid Build Coastguard Worker p_dry_imag += MAX_HYBRID_BANDS;
213*15dc779aSAndroid Build Coastguard Worker }
214*15dc779aSAndroid Build Coastguard Worker m2_resid_real_prev += num_parameter_bands;
215*15dc779aSAndroid Build Coastguard Worker }
216*15dc779aSAndroid Build Coastguard Worker }
217*15dc779aSAndroid Build Coastguard Worker
218*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_real += TSXHB;
219*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_imag += TSXHB;
220*15dc779aSAndroid Build Coastguard Worker }
221*15dc779aSAndroid Build Coastguard Worker
222*15dc779aSAndroid Build Coastguard Worker if (up_mix_type == 2) {
223*15dc779aSAndroid Build Coastguard Worker if (m2_param_imag_present) {
224*15dc779aSAndroid Build Coastguard Worker if (residual_coding)
225*15dc779aSAndroid Build Coastguard Worker loop_counter = col_counter;
226*15dc779aSAndroid Build Coastguard Worker else
227*15dc779aSAndroid Build Coastguard Worker loop_counter = num_direct_signals;
228*15dc779aSAndroid Build Coastguard Worker
229*15dc779aSAndroid Build Coastguard Worker idx = 0;
230*15dc779aSAndroid Build Coastguard Worker
231*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_real = p_array_struct->hyb_output_real_dry;
232*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_imag = p_array_struct->hyb_output_imag_dry;
233*15dc779aSAndroid Build Coastguard Worker
234*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < num_output_channels; row++) {
235*15dc779aSAndroid Build Coastguard Worker p_buffer_real = p_array_struct->buf_real;
236*15dc779aSAndroid Build Coastguard Worker p_buffer_imag = p_array_struct->buf_imag;
237*15dc779aSAndroid Build Coastguard Worker
238*15dc779aSAndroid Build Coastguard Worker for (col = 0; col < num_direct_signals; col++) {
239*15dc779aSAndroid Build Coastguard Worker p_buffer_re = p_buffer_real;
240*15dc779aSAndroid Build Coastguard Worker p_buffer_im = p_buffer_imag;
241*15dc779aSAndroid Build Coastguard Worker
242*15dc779aSAndroid Build Coastguard Worker if (curr_state->m2_param_present[row][col] & 2) {
243*15dc779aSAndroid Build Coastguard Worker ixheaacd_dec_interp_umx(p_m2_param->m2_resid_imag[idx++], rout_ptr,
244*15dc779aSAndroid Build Coastguard Worker m2_resid_imag_prev, pstr_mps_state);
245*15dc779aSAndroid Build Coastguard Worker ixheaacd_apply_abs_kernels(rout_ptr, rout_kernel_ptr, params);
246*15dc779aSAndroid Build Coastguard Worker
247*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_re = p_hyb_out_dry_real;
248*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_im = p_hyb_out_dry_imag;
249*15dc779aSAndroid Build Coastguard Worker
250*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < time_slots; ts++) {
251*15dc779aSAndroid Build Coastguard Worker hyb_output_real_dry = p_hyb_out_dry_re;
252*15dc779aSAndroid Build Coastguard Worker hyb_output_imag_dry = p_hyb_out_dry_im;
253*15dc779aSAndroid Build Coastguard Worker
254*15dc779aSAndroid Build Coastguard Worker w_dry_real = p_buffer_re;
255*15dc779aSAndroid Build Coastguard Worker w_dry_imag = p_buffer_im;
256*15dc779aSAndroid Build Coastguard Worker
257*15dc779aSAndroid Build Coastguard Worker for (qs = 0; qs < 2; qs++) {
258*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32_shr_15(*w_dry_imag, *rout_kernel_ptr);
259*15dc779aSAndroid Build Coastguard Worker w_dry_imag++;
260*15dc779aSAndroid Build Coastguard Worker *hyb_output_real_dry = *hyb_output_real_dry + temp_1;
261*15dc779aSAndroid Build Coastguard Worker hyb_output_real_dry++;
262*15dc779aSAndroid Build Coastguard Worker
263*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32_shr_15(*w_dry_real, *rout_kernel_ptr);
264*15dc779aSAndroid Build Coastguard Worker w_dry_real++;
265*15dc779aSAndroid Build Coastguard Worker rout_kernel_ptr++;
266*15dc779aSAndroid Build Coastguard Worker *hyb_output_imag_dry = *hyb_output_imag_dry - temp_1;
267*15dc779aSAndroid Build Coastguard Worker hyb_output_imag_dry++;
268*15dc779aSAndroid Build Coastguard Worker }
269*15dc779aSAndroid Build Coastguard Worker
270*15dc779aSAndroid Build Coastguard Worker for (; qs < hybrid_bands; qs++) {
271*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32_shr_15(*w_dry_imag, *rout_kernel_ptr);
272*15dc779aSAndroid Build Coastguard Worker w_dry_imag++;
273*15dc779aSAndroid Build Coastguard Worker *hyb_output_real_dry = *hyb_output_real_dry - temp_1;
274*15dc779aSAndroid Build Coastguard Worker hyb_output_real_dry++;
275*15dc779aSAndroid Build Coastguard Worker
276*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32_shr_15(*w_dry_real, *rout_kernel_ptr);
277*15dc779aSAndroid Build Coastguard Worker w_dry_real++;
278*15dc779aSAndroid Build Coastguard Worker rout_kernel_ptr++;
279*15dc779aSAndroid Build Coastguard Worker *hyb_output_imag_dry = *hyb_output_imag_dry + temp_1;
280*15dc779aSAndroid Build Coastguard Worker hyb_output_imag_dry++;
281*15dc779aSAndroid Build Coastguard Worker }
282*15dc779aSAndroid Build Coastguard Worker p_buffer_re += MAX_HYBRID_BANDS;
283*15dc779aSAndroid Build Coastguard Worker p_buffer_im += MAX_HYBRID_BANDS;
284*15dc779aSAndroid Build Coastguard Worker
285*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_re += MAX_HYBRID_BANDS;
286*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_im += MAX_HYBRID_BANDS;
287*15dc779aSAndroid Build Coastguard Worker }
288*15dc779aSAndroid Build Coastguard Worker m2_resid_imag_prev += num_parameter_bands;
289*15dc779aSAndroid Build Coastguard Worker }
290*15dc779aSAndroid Build Coastguard Worker p_buffer_real += TSXHB;
291*15dc779aSAndroid Build Coastguard Worker p_buffer_imag += TSXHB;
292*15dc779aSAndroid Build Coastguard Worker }
293*15dc779aSAndroid Build Coastguard Worker
294*15dc779aSAndroid Build Coastguard Worker for (; col < loop_counter; col++) {
295*15dc779aSAndroid Build Coastguard Worker WORD32 index;
296*15dc779aSAndroid Build Coastguard Worker WORD32 res = ixheaacd_get_res_idx(pstr_mps_state, col);
297*15dc779aSAndroid Build Coastguard Worker index = index_ptr[res];
298*15dc779aSAndroid Build Coastguard Worker
299*15dc779aSAndroid Build Coastguard Worker if (curr_state->m2_param_present[row][col] & 2) {
300*15dc779aSAndroid Build Coastguard Worker WORD32 *p_dry_real = p_array_struct->w_dry_real + res * TSXHB;
301*15dc779aSAndroid Build Coastguard Worker WORD32 *p_dry_imag = p_array_struct->w_dry_imag + res * TSXHB;
302*15dc779aSAndroid Build Coastguard Worker ixheaacd_dec_interp_umx(p_m2_param->m2_resid_imag[idx++], rout_ptr,
303*15dc779aSAndroid Build Coastguard Worker m2_resid_imag_prev, pstr_mps_state);
304*15dc779aSAndroid Build Coastguard Worker ixheaacd_apply_abs_kernels(rout_ptr, rout_kernel_ptr, params);
305*15dc779aSAndroid Build Coastguard Worker
306*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_re = p_hyb_out_dry_real;
307*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_im = p_hyb_out_dry_imag;
308*15dc779aSAndroid Build Coastguard Worker
309*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < time_slots; ts++) {
310*15dc779aSAndroid Build Coastguard Worker hyb_output_real_dry = p_hyb_out_dry_re;
311*15dc779aSAndroid Build Coastguard Worker hyb_output_imag_dry = p_hyb_out_dry_im;
312*15dc779aSAndroid Build Coastguard Worker
313*15dc779aSAndroid Build Coastguard Worker w_dry_real = p_dry_real;
314*15dc779aSAndroid Build Coastguard Worker w_dry_imag = p_dry_imag;
315*15dc779aSAndroid Build Coastguard Worker
316*15dc779aSAndroid Build Coastguard Worker for (qs = 0; qs < 2; qs++) {
317*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32_shr_15(*w_dry_imag, *rout_kernel_ptr);
318*15dc779aSAndroid Build Coastguard Worker w_dry_imag++;
319*15dc779aSAndroid Build Coastguard Worker *hyb_output_real_dry = *hyb_output_real_dry + temp_1;
320*15dc779aSAndroid Build Coastguard Worker hyb_output_real_dry++;
321*15dc779aSAndroid Build Coastguard Worker
322*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32_shr_15(*w_dry_real, *rout_kernel_ptr);
323*15dc779aSAndroid Build Coastguard Worker w_dry_real++;
324*15dc779aSAndroid Build Coastguard Worker rout_kernel_ptr++;
325*15dc779aSAndroid Build Coastguard Worker *hyb_output_imag_dry = *hyb_output_imag_dry - temp_1;
326*15dc779aSAndroid Build Coastguard Worker hyb_output_imag_dry++;
327*15dc779aSAndroid Build Coastguard Worker }
328*15dc779aSAndroid Build Coastguard Worker
329*15dc779aSAndroid Build Coastguard Worker for (; qs < index; qs++) {
330*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32_shr_15(*w_dry_imag, *rout_kernel_ptr);
331*15dc779aSAndroid Build Coastguard Worker w_dry_imag++;
332*15dc779aSAndroid Build Coastguard Worker *hyb_output_real_dry = *hyb_output_real_dry - temp_1;
333*15dc779aSAndroid Build Coastguard Worker hyb_output_real_dry++;
334*15dc779aSAndroid Build Coastguard Worker
335*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32_shr_15(*w_dry_real, *rout_kernel_ptr);
336*15dc779aSAndroid Build Coastguard Worker w_dry_real++;
337*15dc779aSAndroid Build Coastguard Worker rout_kernel_ptr++;
338*15dc779aSAndroid Build Coastguard Worker *hyb_output_imag_dry = *hyb_output_imag_dry + temp_1;
339*15dc779aSAndroid Build Coastguard Worker hyb_output_imag_dry++;
340*15dc779aSAndroid Build Coastguard Worker }
341*15dc779aSAndroid Build Coastguard Worker rout_kernel_ptr += hybrid_bands - index;
342*15dc779aSAndroid Build Coastguard Worker
343*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_re += MAX_HYBRID_BANDS;
344*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_im += MAX_HYBRID_BANDS;
345*15dc779aSAndroid Build Coastguard Worker
346*15dc779aSAndroid Build Coastguard Worker p_dry_real += MAX_HYBRID_BANDS;
347*15dc779aSAndroid Build Coastguard Worker p_dry_imag += MAX_HYBRID_BANDS;
348*15dc779aSAndroid Build Coastguard Worker }
349*15dc779aSAndroid Build Coastguard Worker m2_resid_imag_prev += num_parameter_bands;
350*15dc779aSAndroid Build Coastguard Worker }
351*15dc779aSAndroid Build Coastguard Worker }
352*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_real += TSXHB;
353*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_imag += TSXHB;
354*15dc779aSAndroid Build Coastguard Worker }
355*15dc779aSAndroid Build Coastguard Worker }
356*15dc779aSAndroid Build Coastguard Worker }
357*15dc779aSAndroid Build Coastguard Worker p_buffer_real = p_array_struct->buf_real;
358*15dc779aSAndroid Build Coastguard Worker p_buffer_imag = p_array_struct->buf_imag;
359*15dc779aSAndroid Build Coastguard Worker
360*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < num_output_channels; row++) {
361*15dc779aSAndroid Build Coastguard Worker hyb_output_real_wet = p_buffer_real;
362*15dc779aSAndroid Build Coastguard Worker hyb_output_imag_wet = p_buffer_imag;
363*15dc779aSAndroid Build Coastguard Worker
364*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < time_slots; ts++) {
365*15dc779aSAndroid Build Coastguard Worker memset(hyb_output_real_wet, 0, (hybrid_bands) * sizeof(*hyb_output_real_wet));
366*15dc779aSAndroid Build Coastguard Worker memset(hyb_output_imag_wet, 0, (hybrid_bands) * sizeof(*hyb_output_imag_wet));
367*15dc779aSAndroid Build Coastguard Worker
368*15dc779aSAndroid Build Coastguard Worker hyb_output_real_wet += MAX_HYBRID_BANDS;
369*15dc779aSAndroid Build Coastguard Worker hyb_output_imag_wet += MAX_HYBRID_BANDS;
370*15dc779aSAndroid Build Coastguard Worker }
371*15dc779aSAndroid Build Coastguard Worker p_buffer_real += TSXHB;
372*15dc779aSAndroid Build Coastguard Worker p_buffer_imag += TSXHB;
373*15dc779aSAndroid Build Coastguard Worker }
374*15dc779aSAndroid Build Coastguard Worker idx = 0;
375*15dc779aSAndroid Build Coastguard Worker
376*15dc779aSAndroid Build Coastguard Worker p_buffer_real = p_array_struct->buf_real;
377*15dc779aSAndroid Build Coastguard Worker p_buffer_imag = p_array_struct->buf_imag;
378*15dc779aSAndroid Build Coastguard Worker
379*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < num_output_channels; row++) {
380*15dc779aSAndroid Build Coastguard Worker p_buf_real = p_array_struct->buffer_real + w_wet_offset;
381*15dc779aSAndroid Build Coastguard Worker p_buf_imag = p_array_struct->buffer_imag + w_wet_offset;
382*15dc779aSAndroid Build Coastguard Worker for (col = num_direct_signals; col < col_counter; col++) {
383*15dc779aSAndroid Build Coastguard Worker if (curr_state->m2_param_present[row][col] & 1) {
384*15dc779aSAndroid Build Coastguard Worker ixheaacd_dec_interp_umx(p_m2_param->m2_decor_real[idx++], rout_ptr, m2_decor_real_prev,
385*15dc779aSAndroid Build Coastguard Worker pstr_mps_state);
386*15dc779aSAndroid Build Coastguard Worker
387*15dc779aSAndroid Build Coastguard Worker ixheaacd_apply_abs_kernels(rout_ptr, rout_kernel_ptr, params);
388*15dc779aSAndroid Build Coastguard Worker p_buffer_re = p_buffer_real;
389*15dc779aSAndroid Build Coastguard Worker p_buffer_im = p_buffer_imag;
390*15dc779aSAndroid Build Coastguard Worker
391*15dc779aSAndroid Build Coastguard Worker p_buf_re = p_buf_real;
392*15dc779aSAndroid Build Coastguard Worker p_buf_im = p_buf_imag;
393*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < time_slots; ts++) {
394*15dc779aSAndroid Build Coastguard Worker hyb_output_real_wet = p_buffer_re;
395*15dc779aSAndroid Build Coastguard Worker hyb_output_imag_wet = p_buffer_im;
396*15dc779aSAndroid Build Coastguard Worker
397*15dc779aSAndroid Build Coastguard Worker w_wet_real = p_buf_re;
398*15dc779aSAndroid Build Coastguard Worker w_wet_imag = p_buf_im;
399*15dc779aSAndroid Build Coastguard Worker
400*15dc779aSAndroid Build Coastguard Worker for (qs = 0; qs < hybrid_bands; qs++) {
401*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32_shr_15(*w_wet_real, *rout_kernel_ptr);
402*15dc779aSAndroid Build Coastguard Worker w_wet_real++;
403*15dc779aSAndroid Build Coastguard Worker *hyb_output_real_wet = *hyb_output_real_wet + temp_1;
404*15dc779aSAndroid Build Coastguard Worker hyb_output_real_wet++;
405*15dc779aSAndroid Build Coastguard Worker
406*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32_shr_15(*w_wet_imag, *rout_kernel_ptr);
407*15dc779aSAndroid Build Coastguard Worker w_wet_imag++;
408*15dc779aSAndroid Build Coastguard Worker rout_kernel_ptr++;
409*15dc779aSAndroid Build Coastguard Worker *hyb_output_imag_wet = *hyb_output_imag_wet + temp_1;
410*15dc779aSAndroid Build Coastguard Worker hyb_output_imag_wet++;
411*15dc779aSAndroid Build Coastguard Worker }
412*15dc779aSAndroid Build Coastguard Worker p_buffer_re += MAX_HYBRID_BANDS;
413*15dc779aSAndroid Build Coastguard Worker p_buffer_im += MAX_HYBRID_BANDS;
414*15dc779aSAndroid Build Coastguard Worker
415*15dc779aSAndroid Build Coastguard Worker p_buf_re += MAX_HYBRID_BANDS;
416*15dc779aSAndroid Build Coastguard Worker p_buf_im += MAX_HYBRID_BANDS;
417*15dc779aSAndroid Build Coastguard Worker }
418*15dc779aSAndroid Build Coastguard Worker m2_decor_real_prev += num_parameter_bands;
419*15dc779aSAndroid Build Coastguard Worker }
420*15dc779aSAndroid Build Coastguard Worker p_buf_real += TSXHB;
421*15dc779aSAndroid Build Coastguard Worker p_buf_imag += TSXHB;
422*15dc779aSAndroid Build Coastguard Worker }
423*15dc779aSAndroid Build Coastguard Worker p_buffer_real += TSXHB;
424*15dc779aSAndroid Build Coastguard Worker p_buffer_imag += TSXHB;
425*15dc779aSAndroid Build Coastguard Worker }
426*15dc779aSAndroid Build Coastguard Worker
427*15dc779aSAndroid Build Coastguard Worker if (up_mix_type == 2) {
428*15dc779aSAndroid Build Coastguard Worker if (m2_param_imag_present) {
429*15dc779aSAndroid Build Coastguard Worker idx = 0;
430*15dc779aSAndroid Build Coastguard Worker
431*15dc779aSAndroid Build Coastguard Worker p_buffer_real = p_array_struct->buf_real;
432*15dc779aSAndroid Build Coastguard Worker p_buffer_imag = p_array_struct->buf_imag;
433*15dc779aSAndroid Build Coastguard Worker
434*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < num_output_channels; row++) {
435*15dc779aSAndroid Build Coastguard Worker m2_decor_imag_prev += num_parameter_bands * num_direct_signals;
436*15dc779aSAndroid Build Coastguard Worker p_buf_real = p_array_struct->buffer_real + w_wet_offset;
437*15dc779aSAndroid Build Coastguard Worker p_buf_imag = p_array_struct->buffer_imag + w_wet_offset;
438*15dc779aSAndroid Build Coastguard Worker for (col = num_direct_signals; col < col_counter; col++) {
439*15dc779aSAndroid Build Coastguard Worker if (curr_state->m2_param_present[row][col] & 1) {
440*15dc779aSAndroid Build Coastguard Worker ixheaacd_dec_interp_umx(p_m2_param->m2_decor_imag[idx++], rout_ptr,
441*15dc779aSAndroid Build Coastguard Worker m2_decor_imag_prev, pstr_mps_state);
442*15dc779aSAndroid Build Coastguard Worker ixheaacd_apply_abs_kernels(rout_ptr, rout_kernel_ptr, params);
443*15dc779aSAndroid Build Coastguard Worker
444*15dc779aSAndroid Build Coastguard Worker p_buffer_re = p_buffer_real;
445*15dc779aSAndroid Build Coastguard Worker p_buffer_im = p_buffer_imag;
446*15dc779aSAndroid Build Coastguard Worker
447*15dc779aSAndroid Build Coastguard Worker p_buf_re = p_buf_real;
448*15dc779aSAndroid Build Coastguard Worker p_buf_im = p_buf_imag;
449*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < time_slots; ts++) {
450*15dc779aSAndroid Build Coastguard Worker hyb_output_real_wet = p_buffer_re;
451*15dc779aSAndroid Build Coastguard Worker hyb_output_imag_wet = p_buffer_im;
452*15dc779aSAndroid Build Coastguard Worker
453*15dc779aSAndroid Build Coastguard Worker w_wet_real = p_buf_re;
454*15dc779aSAndroid Build Coastguard Worker w_wet_imag = p_buf_im;
455*15dc779aSAndroid Build Coastguard Worker
456*15dc779aSAndroid Build Coastguard Worker for (qs = 0; qs < 2; qs++) {
457*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32_shr_15(*w_wet_imag, *rout_kernel_ptr);
458*15dc779aSAndroid Build Coastguard Worker w_wet_imag++;
459*15dc779aSAndroid Build Coastguard Worker *hyb_output_real_wet = *hyb_output_real_wet + temp_1;
460*15dc779aSAndroid Build Coastguard Worker hyb_output_real_wet++;
461*15dc779aSAndroid Build Coastguard Worker
462*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32_shr_15(*w_wet_real, *rout_kernel_ptr);
463*15dc779aSAndroid Build Coastguard Worker w_wet_real++;
464*15dc779aSAndroid Build Coastguard Worker rout_kernel_ptr++;
465*15dc779aSAndroid Build Coastguard Worker *hyb_output_imag_wet = *hyb_output_imag_wet - temp_1;
466*15dc779aSAndroid Build Coastguard Worker hyb_output_imag_wet++;
467*15dc779aSAndroid Build Coastguard Worker }
468*15dc779aSAndroid Build Coastguard Worker
469*15dc779aSAndroid Build Coastguard Worker for (; qs < hybrid_bands; qs++) {
470*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32_shr_15(*w_wet_imag, *rout_kernel_ptr);
471*15dc779aSAndroid Build Coastguard Worker w_wet_imag++;
472*15dc779aSAndroid Build Coastguard Worker *hyb_output_real_wet = *hyb_output_real_wet - temp_1;
473*15dc779aSAndroid Build Coastguard Worker hyb_output_real_wet++;
474*15dc779aSAndroid Build Coastguard Worker
475*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32_shr_15(*w_wet_real, *rout_kernel_ptr);
476*15dc779aSAndroid Build Coastguard Worker w_wet_real++;
477*15dc779aSAndroid Build Coastguard Worker rout_kernel_ptr++;
478*15dc779aSAndroid Build Coastguard Worker *hyb_output_imag_wet = *hyb_output_imag_wet + temp_1;
479*15dc779aSAndroid Build Coastguard Worker hyb_output_imag_wet++;
480*15dc779aSAndroid Build Coastguard Worker }
481*15dc779aSAndroid Build Coastguard Worker p_buffer_re += MAX_HYBRID_BANDS;
482*15dc779aSAndroid Build Coastguard Worker p_buffer_im += MAX_HYBRID_BANDS;
483*15dc779aSAndroid Build Coastguard Worker
484*15dc779aSAndroid Build Coastguard Worker p_buf_re += MAX_HYBRID_BANDS;
485*15dc779aSAndroid Build Coastguard Worker p_buf_im += MAX_HYBRID_BANDS;
486*15dc779aSAndroid Build Coastguard Worker }
487*15dc779aSAndroid Build Coastguard Worker m2_decor_imag_prev += num_parameter_bands;
488*15dc779aSAndroid Build Coastguard Worker }
489*15dc779aSAndroid Build Coastguard Worker p_buf_real += TSXHB;
490*15dc779aSAndroid Build Coastguard Worker p_buf_imag += TSXHB;
491*15dc779aSAndroid Build Coastguard Worker }
492*15dc779aSAndroid Build Coastguard Worker p_buffer_real += TSXHB;
493*15dc779aSAndroid Build Coastguard Worker p_buffer_imag += TSXHB;
494*15dc779aSAndroid Build Coastguard Worker }
495*15dc779aSAndroid Build Coastguard Worker }
496*15dc779aSAndroid Build Coastguard Worker }
497*15dc779aSAndroid Build Coastguard Worker return;
498*15dc779aSAndroid Build Coastguard Worker }
499