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 <math.h>
21*15dc779aSAndroid Build Coastguard Worker #include <string.h>
22*15dc779aSAndroid Build Coastguard Worker
23*15dc779aSAndroid Build Coastguard Worker #include <assert.h>
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_common_rom.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecsettings.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_scale.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr_part.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_rom.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_hybrid.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ps_dec.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_config.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_qmf_dec.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_polyphase.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_struct_def.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_res_rom.h"
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_aac_struct.h"
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_dec.h"
41*15dc779aSAndroid Build Coastguard Worker
42*15dc779aSAndroid Build Coastguard Worker #define ONE_IN_Q28 (268435456)
43*15dc779aSAndroid Build Coastguard Worker #define PI_BY_8_Q28 (105414352)
44*15dc779aSAndroid Build Coastguard Worker #define P_PI 3.1415926535897932
45*15dc779aSAndroid Build Coastguard Worker #define PI_IN_Q28 843314880
46*15dc779aSAndroid Build Coastguard Worker #define MULT(a, b) (a * b)
47*15dc779aSAndroid Build Coastguard Worker #define Q28_FLOAT_VAL ((FLOAT32)(1 << 28))
48*15dc779aSAndroid Build Coastguard Worker #define ONE_BY_Q28_FLOAT_VAL (1.0f / Q28_FLOAT_VAL)
49*15dc779aSAndroid Build Coastguard Worker
50*15dc779aSAndroid Build Coastguard Worker extern const WORD32 ixheaacd_atan_table_Q28[16][8][31];
51*15dc779aSAndroid Build Coastguard Worker extern const WORD32 ixheaacd_ipd_de_quant_table_q28[16];
52*15dc779aSAndroid Build Coastguard Worker
53*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 ixheaacd_im_weight[16][8][31];
54*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 ixheaacd_re_weight[16][8][31];
55*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 ixheaacd_beta[16][8][31];
56*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 ixheaacd_weight[16][8][31];
57*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 ixheaacd_c_l_table[31];
58*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 ixheaacd_sin_table[8][31];
59*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 ixheaacd_cos_table[8][31];
60*15dc779aSAndroid Build Coastguard Worker
61*15dc779aSAndroid Build Coastguard Worker extern const WORD32 ixheaacd_mps_gain_set_indx[29];
62*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_phase_wraping(WORD32 phase)63*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaacd_mps_phase_wraping(WORD32 phase) {
64*15dc779aSAndroid Build Coastguard Worker const WORD32 pi_2 = 2 * PI_IN_Q28;
65*15dc779aSAndroid Build Coastguard Worker
66*15dc779aSAndroid Build Coastguard Worker while (phase < 0) phase += pi_2;
67*15dc779aSAndroid Build Coastguard Worker while (phase >= pi_2) phase -= pi_2;
68*15dc779aSAndroid Build Coastguard Worker assert((phase >= 0) && (phase < pi_2));
69*15dc779aSAndroid Build Coastguard Worker
70*15dc779aSAndroid Build Coastguard Worker return phase;
71*15dc779aSAndroid Build Coastguard Worker }
72*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_buffer_pre_and_mix_matrix(ia_mps_dec_state_struct * self)73*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_mps_buffer_pre_and_mix_matrix(
74*15dc779aSAndroid Build Coastguard Worker ia_mps_dec_state_struct *self) {
75*15dc779aSAndroid Build Coastguard Worker WORD32 pb, row, col;
76*15dc779aSAndroid Build Coastguard Worker
77*15dc779aSAndroid Build Coastguard Worker for (pb = 0; pb < self->bs_param_bands; pb++) {
78*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < MAX_M_INPUT; row++) {
79*15dc779aSAndroid Build Coastguard Worker for (col = 0; col < MAX_M_OUTPUT; col++) {
80*15dc779aSAndroid Build Coastguard Worker self->m1_param_re_prev[pb][row][col] =
81*15dc779aSAndroid Build Coastguard Worker self->m1_param_re[self->num_parameter_sets_prev - 1][pb][row][col];
82*15dc779aSAndroid Build Coastguard Worker self->m1_param_im_prev[pb][row][col] =
83*15dc779aSAndroid Build Coastguard Worker self->m1_param_im[self->num_parameter_sets_prev - 1][pb][row][col];
84*15dc779aSAndroid Build Coastguard Worker self->m2_decor_re_prev[pb][row][col] =
85*15dc779aSAndroid Build Coastguard Worker self->m2_decor_re[self->num_parameter_sets_prev - 1][pb][row][col];
86*15dc779aSAndroid Build Coastguard Worker self->m2_decor_im_prev[pb][row][col] =
87*15dc779aSAndroid Build Coastguard Worker self->m2_decor_im[self->num_parameter_sets_prev - 1][pb][row][col];
88*15dc779aSAndroid Build Coastguard Worker self->m2_resid_re_prev[pb][row][col] =
89*15dc779aSAndroid Build Coastguard Worker self->m2_resid_re[self->num_parameter_sets_prev - 1][pb][row][col];
90*15dc779aSAndroid Build Coastguard Worker self->m2_resid_im_prev[pb][row][col] =
91*15dc779aSAndroid Build Coastguard Worker self->m2_resid_im[self->num_parameter_sets_prev - 1][pb][row][col];
92*15dc779aSAndroid Build Coastguard Worker }
93*15dc779aSAndroid Build Coastguard Worker }
94*15dc779aSAndroid Build Coastguard Worker }
95*15dc779aSAndroid Build Coastguard Worker
96*15dc779aSAndroid Build Coastguard Worker for (pb = 0; pb < self->bs_param_bands; pb++) {
97*15dc779aSAndroid Build Coastguard Worker self->phase_l_prev[pb] =
98*15dc779aSAndroid Build Coastguard Worker self->phase_l[self->num_parameter_sets_prev - 1][pb];
99*15dc779aSAndroid Build Coastguard Worker self->phase_r_prev[pb] =
100*15dc779aSAndroid Build Coastguard Worker self->phase_r[self->num_parameter_sets_prev - 1][pb];
101*15dc779aSAndroid Build Coastguard Worker }
102*15dc779aSAndroid Build Coastguard Worker }
103*15dc779aSAndroid Build Coastguard Worker
ixheaacd_pre_and_mix_matrix_calculation(ia_mps_dec_state_struct * self)104*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_pre_and_mix_matrix_calculation(ia_mps_dec_state_struct *self) {
105*15dc779aSAndroid Build Coastguard Worker WORD32 ps, pb;
106*15dc779aSAndroid Build Coastguard Worker ia_mps_bs_frame *curr_bit_stream = &(self->bs_frame);
107*15dc779aSAndroid Build Coastguard Worker FLOAT32 h_imag[2 * MAX_PARAMETER_BANDS];
108*15dc779aSAndroid Build Coastguard Worker FLOAT32 h_real[6 * MAX_PARAMETER_BANDS];
109*15dc779aSAndroid Build Coastguard Worker
110*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_buffer_pre_and_mix_matrix(self);
111*15dc779aSAndroid Build Coastguard Worker
112*15dc779aSAndroid Build Coastguard Worker for (ps = 0; ps < self->num_parameter_sets; ps++) {
113*15dc779aSAndroid Build Coastguard Worker FLOAT32 *h_im = &h_imag[0];
114*15dc779aSAndroid Build Coastguard Worker FLOAT32 *h_re = &h_real[0];
115*15dc779aSAndroid Build Coastguard Worker
116*15dc779aSAndroid Build Coastguard Worker memset(h_real, 0, 6 * MAX_PARAMETER_BANDS * sizeof(FLOAT32));
117*15dc779aSAndroid Build Coastguard Worker memset(h_imag, 0, 2 * MAX_PARAMETER_BANDS * sizeof(FLOAT32));
118*15dc779aSAndroid Build Coastguard Worker
119*15dc779aSAndroid Build Coastguard Worker switch (self->config->bs_phase_coding) {
120*15dc779aSAndroid Build Coastguard Worker case 0:
121*15dc779aSAndroid Build Coastguard Worker if (self->residual_coding) {
122*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_par2umx_pred(self, curr_bit_stream, h_imag, h_real, ps,
123*15dc779aSAndroid Build Coastguard Worker self->res_bands);
124*15dc779aSAndroid Build Coastguard Worker } else {
125*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_par2umx_ps(self, curr_bit_stream, h_real, ps);
126*15dc779aSAndroid Build Coastguard Worker }
127*15dc779aSAndroid Build Coastguard Worker
128*15dc779aSAndroid Build Coastguard Worker break;
129*15dc779aSAndroid Build Coastguard Worker case 1:
130*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_par2umx_ps_ipd_opd(self, curr_bit_stream, h_real, ps);
131*15dc779aSAndroid Build Coastguard Worker break;
132*15dc779aSAndroid Build Coastguard Worker case 2:
133*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_par2umx_pred(self, curr_bit_stream, h_imag, h_real, ps,
134*15dc779aSAndroid Build Coastguard Worker self->res_bands);
135*15dc779aSAndroid Build Coastguard Worker break;
136*15dc779aSAndroid Build Coastguard Worker }
137*15dc779aSAndroid Build Coastguard Worker
138*15dc779aSAndroid Build Coastguard Worker for (pb = 0; pb < self->bs_param_bands; pb++) {
139*15dc779aSAndroid Build Coastguard Worker self->m1_param_re[ps][pb][0][0] = 1.0f;
140*15dc779aSAndroid Build Coastguard Worker self->m1_param_re[ps][pb][1][0] = 1.0f;
141*15dc779aSAndroid Build Coastguard Worker
142*15dc779aSAndroid Build Coastguard Worker self->m1_param_im[ps][pb][0][0] = 0;
143*15dc779aSAndroid Build Coastguard Worker self->m1_param_im[ps][pb][1][0] = 0;
144*15dc779aSAndroid Build Coastguard Worker
145*15dc779aSAndroid Build Coastguard Worker self->m2_resid_re[ps][pb][0][0] = *h_re++;
146*15dc779aSAndroid Build Coastguard Worker self->m2_resid_im[ps][pb][0][0] = *h_im++;
147*15dc779aSAndroid Build Coastguard Worker self->m2_resid_im[ps][pb][0][1] = 0;
148*15dc779aSAndroid Build Coastguard Worker
149*15dc779aSAndroid Build Coastguard Worker self->m2_resid_re[ps][pb][1][0] = *h_re++;
150*15dc779aSAndroid Build Coastguard Worker self->m2_resid_im[ps][pb][1][0] = *h_im++;
151*15dc779aSAndroid Build Coastguard Worker self->m2_resid_im[ps][pb][1][1] = 0;
152*15dc779aSAndroid Build Coastguard Worker
153*15dc779aSAndroid Build Coastguard Worker self->m2_decor_re[ps][pb][0][0] = 0;
154*15dc779aSAndroid Build Coastguard Worker self->m2_decor_im[ps][pb][0][0] = 0;
155*15dc779aSAndroid Build Coastguard Worker self->m2_decor_re[ps][pb][0][1] = *h_re++;
156*15dc779aSAndroid Build Coastguard Worker self->m2_decor_im[ps][pb][0][1] = 0;
157*15dc779aSAndroid Build Coastguard Worker
158*15dc779aSAndroid Build Coastguard Worker self->m2_decor_re[ps][pb][1][0] = 0;
159*15dc779aSAndroid Build Coastguard Worker self->m2_decor_im[ps][pb][1][0] = 0;
160*15dc779aSAndroid Build Coastguard Worker self->m2_decor_re[ps][pb][1][1] = *h_re++;
161*15dc779aSAndroid Build Coastguard Worker self->m2_decor_im[ps][pb][1][1] = 0;
162*15dc779aSAndroid Build Coastguard Worker
163*15dc779aSAndroid Build Coastguard Worker self->m2_resid_re[ps][pb][0][1] = *h_re++;
164*15dc779aSAndroid Build Coastguard Worker self->m2_resid_re[ps][pb][1][1] = *h_re++;
165*15dc779aSAndroid Build Coastguard Worker }
166*15dc779aSAndroid Build Coastguard Worker }
167*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_smoothing_opd(self);
168*15dc779aSAndroid Build Coastguard Worker }
169*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_par2umx_ps_core(WORD32 cld[MAX_PARAMETER_BANDS],WORD32 icc[MAX_PARAMETER_BANDS],WORD32 ott_band_count,FLOAT32 * h_real)170*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_mps_par2umx_ps_core(WORD32 cld[MAX_PARAMETER_BANDS],
171*15dc779aSAndroid Build Coastguard Worker WORD32 icc[MAX_PARAMETER_BANDS],
172*15dc779aSAndroid Build Coastguard Worker WORD32 ott_band_count,
173*15dc779aSAndroid Build Coastguard Worker FLOAT32 *h_real) {
174*15dc779aSAndroid Build Coastguard Worker WORD32 band;
175*15dc779aSAndroid Build Coastguard Worker FLOAT32 c_l_temp, c_r_temp, temp;
176*15dc779aSAndroid Build Coastguard Worker WORD32 cld_idx, icc_idx;
177*15dc779aSAndroid Build Coastguard Worker
178*15dc779aSAndroid Build Coastguard Worker for (band = 0; band < ott_band_count; band++) {
179*15dc779aSAndroid Build Coastguard Worker cld_idx = *cld++ + 15;
180*15dc779aSAndroid Build Coastguard Worker icc_idx = *icc++;
181*15dc779aSAndroid Build Coastguard Worker
182*15dc779aSAndroid Build Coastguard Worker icc_idx = icc_idx & 7;
183*15dc779aSAndroid Build Coastguard Worker
184*15dc779aSAndroid Build Coastguard Worker c_l_temp = (ixheaacd_c_l_table[cld_idx]);
185*15dc779aSAndroid Build Coastguard Worker c_r_temp = (ixheaacd_c_l_table[30 - cld_idx]);
186*15dc779aSAndroid Build Coastguard Worker
187*15dc779aSAndroid Build Coastguard Worker temp = ixheaacd_cos_table[icc_idx][cld_idx];
188*15dc779aSAndroid Build Coastguard Worker *h_real++ = MULT(temp, c_l_temp);
189*15dc779aSAndroid Build Coastguard Worker
190*15dc779aSAndroid Build Coastguard Worker temp = ixheaacd_cos_table[icc_idx][30 - cld_idx];
191*15dc779aSAndroid Build Coastguard Worker *h_real++ = MULT(temp, c_r_temp);
192*15dc779aSAndroid Build Coastguard Worker
193*15dc779aSAndroid Build Coastguard Worker temp = ixheaacd_sin_table[icc_idx][cld_idx];
194*15dc779aSAndroid Build Coastguard Worker *h_real++ = MULT(temp, c_l_temp);
195*15dc779aSAndroid Build Coastguard Worker
196*15dc779aSAndroid Build Coastguard Worker temp = -ixheaacd_sin_table[icc_idx][30 - cld_idx];
197*15dc779aSAndroid Build Coastguard Worker *h_real++ = MULT(temp, c_r_temp);
198*15dc779aSAndroid Build Coastguard Worker
199*15dc779aSAndroid Build Coastguard Worker h_real += 2;
200*15dc779aSAndroid Build Coastguard Worker }
201*15dc779aSAndroid Build Coastguard Worker }
202*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_par2umx_ps(ia_mps_dec_state_struct * self,ia_mps_bs_frame * curr_bit_stream,FLOAT32 * h_real,WORD32 param_set_idx)203*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_mps_par2umx_ps(ia_mps_dec_state_struct *self,
204*15dc779aSAndroid Build Coastguard Worker ia_mps_bs_frame *curr_bit_stream, FLOAT32 *h_real,
205*15dc779aSAndroid Build Coastguard Worker WORD32 param_set_idx) {
206*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_par2umx_ps_core(curr_bit_stream->cld_idx[param_set_idx],
207*15dc779aSAndroid Build Coastguard Worker curr_bit_stream->icc_idx[param_set_idx],
208*15dc779aSAndroid Build Coastguard Worker self->bs_param_bands, h_real);
209*15dc779aSAndroid Build Coastguard Worker }
210*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_opd_calc(ia_mps_dec_state_struct * self,ia_mps_bs_frame * curr_bit_stream,WORD32 param_set_idx,WORD32 opd[MAX_PARAMETER_BANDS])211*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_mps_opd_calc(ia_mps_dec_state_struct *self,
212*15dc779aSAndroid Build Coastguard Worker ia_mps_bs_frame *curr_bit_stream,
213*15dc779aSAndroid Build Coastguard Worker WORD32 param_set_idx,
214*15dc779aSAndroid Build Coastguard Worker WORD32 opd[MAX_PARAMETER_BANDS]) {
215*15dc779aSAndroid Build Coastguard Worker WORD32 band;
216*15dc779aSAndroid Build Coastguard Worker
217*15dc779aSAndroid Build Coastguard Worker for (band = 0; band < self->num_bands_ipd; band++) {
218*15dc779aSAndroid Build Coastguard Worker WORD32 cld_idx = curr_bit_stream->cld_idx[param_set_idx][band] + 15;
219*15dc779aSAndroid Build Coastguard Worker WORD32 ipd_idx = (curr_bit_stream->ipd_idx[param_set_idx][band]) & 15;
220*15dc779aSAndroid Build Coastguard Worker WORD32 icc_idx = curr_bit_stream->icc_idx[param_set_idx][band];
221*15dc779aSAndroid Build Coastguard Worker
222*15dc779aSAndroid Build Coastguard Worker if ((cld_idx == 15) && (ipd_idx == 8))
223*15dc779aSAndroid Build Coastguard Worker opd[band] = 0;
224*15dc779aSAndroid Build Coastguard Worker else
225*15dc779aSAndroid Build Coastguard Worker opd[band] = ixheaacd_atan_table_Q28[ipd_idx][icc_idx][cld_idx];
226*15dc779aSAndroid Build Coastguard Worker }
227*15dc779aSAndroid Build Coastguard Worker }
228*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_par2umx_ps_ipd_opd(ia_mps_dec_state_struct * self,ia_mps_bs_frame * curr_bit_stream,FLOAT32 * h_real,WORD32 param_set_idx)229*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_mps_par2umx_ps_ipd_opd(ia_mps_dec_state_struct *self,
230*15dc779aSAndroid Build Coastguard Worker ia_mps_bs_frame *curr_bit_stream,
231*15dc779aSAndroid Build Coastguard Worker FLOAT32 *h_real, WORD32 param_set_idx) {
232*15dc779aSAndroid Build Coastguard Worker WORD32 opd[MAX_PARAMETER_BANDS];
233*15dc779aSAndroid Build Coastguard Worker WORD32 ott_band_count = self->bs_param_bands;
234*15dc779aSAndroid Build Coastguard Worker WORD32 num_bands_ipd = self->num_bands_ipd;
235*15dc779aSAndroid Build Coastguard Worker WORD32 band;
236*15dc779aSAndroid Build Coastguard Worker
237*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_par2umx_ps_core(curr_bit_stream->cld_idx[param_set_idx],
238*15dc779aSAndroid Build Coastguard Worker curr_bit_stream->icc_idx[param_set_idx],
239*15dc779aSAndroid Build Coastguard Worker ott_band_count, h_real);
240*15dc779aSAndroid Build Coastguard Worker
241*15dc779aSAndroid Build Coastguard Worker if (self->bs_phase_mode) {
242*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_opd_calc(self, curr_bit_stream, param_set_idx, opd);
243*15dc779aSAndroid Build Coastguard Worker
244*15dc779aSAndroid Build Coastguard Worker for (band = 0; band < num_bands_ipd; band++) {
245*15dc779aSAndroid Build Coastguard Worker WORD32 ipd_idx = curr_bit_stream->ipd_idx[param_set_idx][band] & 15;
246*15dc779aSAndroid Build Coastguard Worker WORD32 ipd = ixheaacd_ipd_de_quant_table_q28[ipd_idx];
247*15dc779aSAndroid Build Coastguard Worker
248*15dc779aSAndroid Build Coastguard Worker self->phase_l[param_set_idx][band] =
249*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_phase_wraping(opd[band]) * ONE_BY_Q28_FLOAT_VAL;
250*15dc779aSAndroid Build Coastguard Worker self->phase_r[param_set_idx][band] =
251*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_phase_wraping(opd[band] - ipd) * ONE_BY_Q28_FLOAT_VAL;
252*15dc779aSAndroid Build Coastguard Worker }
253*15dc779aSAndroid Build Coastguard Worker } else {
254*15dc779aSAndroid Build Coastguard Worker num_bands_ipd = 0;
255*15dc779aSAndroid Build Coastguard Worker }
256*15dc779aSAndroid Build Coastguard Worker
257*15dc779aSAndroid Build Coastguard Worker for (band = num_bands_ipd; band < ott_band_count; band++) {
258*15dc779aSAndroid Build Coastguard Worker self->phase_l[param_set_idx][band] = 0;
259*15dc779aSAndroid Build Coastguard Worker self->phase_r[param_set_idx][band] = 0;
260*15dc779aSAndroid Build Coastguard Worker }
261*15dc779aSAndroid Build Coastguard Worker }
262*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_par2umx_pred(ia_mps_dec_state_struct * self,ia_mps_bs_frame * curr_bit_stream,FLOAT32 * h_imag,FLOAT32 * h_real,WORD32 param_set_idx,WORD32 res_bands)263*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_mps_par2umx_pred(ia_mps_dec_state_struct *self,
264*15dc779aSAndroid Build Coastguard Worker ia_mps_bs_frame *curr_bit_stream,
265*15dc779aSAndroid Build Coastguard Worker FLOAT32 *h_imag, FLOAT32 *h_real,
266*15dc779aSAndroid Build Coastguard Worker WORD32 param_set_idx, WORD32 res_bands) {
267*15dc779aSAndroid Build Coastguard Worker WORD32 band;
268*15dc779aSAndroid Build Coastguard Worker
269*15dc779aSAndroid Build Coastguard Worker for (band = 0; band < self->bs_param_bands; band++) {
270*15dc779aSAndroid Build Coastguard Worker WORD32 cld_idx = curr_bit_stream->cld_idx[param_set_idx][band] + 15;
271*15dc779aSAndroid Build Coastguard Worker WORD32 icc_idx = curr_bit_stream->icc_idx[param_set_idx][band];
272*15dc779aSAndroid Build Coastguard Worker WORD32 ipd_idx = curr_bit_stream->ipd_idx[param_set_idx][band] & 15;
273*15dc779aSAndroid Build Coastguard Worker
274*15dc779aSAndroid Build Coastguard Worker if ((band < self->num_bands_ipd) && (cld_idx == 15) && (icc_idx == 0) &&
275*15dc779aSAndroid Build Coastguard Worker (ipd_idx == 8)) {
276*15dc779aSAndroid Build Coastguard Worker FLOAT32 gain = 0.416666667f;
277*15dc779aSAndroid Build Coastguard Worker *h_imag++ = 0;
278*15dc779aSAndroid Build Coastguard Worker *h_imag++ = 0;
279*15dc779aSAndroid Build Coastguard Worker
280*15dc779aSAndroid Build Coastguard Worker if (band < res_bands) {
281*15dc779aSAndroid Build Coastguard Worker *h_real++ = gain;
282*15dc779aSAndroid Build Coastguard Worker *h_real++ = gain;
283*15dc779aSAndroid Build Coastguard Worker h_real += 2;
284*15dc779aSAndroid Build Coastguard Worker
285*15dc779aSAndroid Build Coastguard Worker *h_real++ = gain;
286*15dc779aSAndroid Build Coastguard Worker *h_real++ = -gain;
287*15dc779aSAndroid Build Coastguard Worker } else {
288*15dc779aSAndroid Build Coastguard Worker *h_real++ = gain;
289*15dc779aSAndroid Build Coastguard Worker *h_real++ = -gain;
290*15dc779aSAndroid Build Coastguard Worker
291*15dc779aSAndroid Build Coastguard Worker h_real += 4;
292*15dc779aSAndroid Build Coastguard Worker }
293*15dc779aSAndroid Build Coastguard Worker } else {
294*15dc779aSAndroid Build Coastguard Worker FLOAT32 weight, re_weight, im_weight;
295*15dc779aSAndroid Build Coastguard Worker
296*15dc779aSAndroid Build Coastguard Worker weight = ixheaacd_weight[ipd_idx][icc_idx][cld_idx];
297*15dc779aSAndroid Build Coastguard Worker re_weight = ixheaacd_re_weight[ipd_idx][icc_idx][cld_idx];
298*15dc779aSAndroid Build Coastguard Worker im_weight = ixheaacd_im_weight[ipd_idx][icc_idx][cld_idx];
299*15dc779aSAndroid Build Coastguard Worker
300*15dc779aSAndroid Build Coastguard Worker if (band < self->num_bands_ipd) {
301*15dc779aSAndroid Build Coastguard Worker weight = ixheaacd_weight[ipd_idx][icc_idx][cld_idx];
302*15dc779aSAndroid Build Coastguard Worker re_weight = ixheaacd_re_weight[ipd_idx][icc_idx][cld_idx];
303*15dc779aSAndroid Build Coastguard Worker im_weight = ixheaacd_im_weight[ipd_idx][icc_idx][cld_idx];
304*15dc779aSAndroid Build Coastguard Worker } else {
305*15dc779aSAndroid Build Coastguard Worker weight = ixheaacd_weight[0][icc_idx][cld_idx];
306*15dc779aSAndroid Build Coastguard Worker re_weight = ixheaacd_re_weight[0][icc_idx][cld_idx];
307*15dc779aSAndroid Build Coastguard Worker im_weight = ixheaacd_im_weight[0][icc_idx][cld_idx];
308*15dc779aSAndroid Build Coastguard Worker }
309*15dc779aSAndroid Build Coastguard Worker
310*15dc779aSAndroid Build Coastguard Worker *h_real++ = weight - re_weight;
311*15dc779aSAndroid Build Coastguard Worker *h_imag++ = -im_weight;
312*15dc779aSAndroid Build Coastguard Worker *h_real++ = weight + re_weight;
313*15dc779aSAndroid Build Coastguard Worker *h_imag++ = im_weight;
314*15dc779aSAndroid Build Coastguard Worker
315*15dc779aSAndroid Build Coastguard Worker if (band < res_bands) {
316*15dc779aSAndroid Build Coastguard Worker h_real += 2;
317*15dc779aSAndroid Build Coastguard Worker
318*15dc779aSAndroid Build Coastguard Worker *h_real++ = weight;
319*15dc779aSAndroid Build Coastguard Worker *h_real++ = -weight;
320*15dc779aSAndroid Build Coastguard Worker } else {
321*15dc779aSAndroid Build Coastguard Worker FLOAT32 beta = ixheaacd_beta[ipd_idx][icc_idx][cld_idx];
322*15dc779aSAndroid Build Coastguard Worker
323*15dc779aSAndroid Build Coastguard Worker *h_real++ = beta;
324*15dc779aSAndroid Build Coastguard Worker *h_real++ = -beta;
325*15dc779aSAndroid Build Coastguard Worker h_real += 2;
326*15dc779aSAndroid Build Coastguard Worker }
327*15dc779aSAndroid Build Coastguard Worker }
328*15dc779aSAndroid Build Coastguard Worker }
329*15dc779aSAndroid Build Coastguard Worker }
330*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_apply_pre_matrix(ia_mps_dec_state_struct * self)331*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_mps_apply_pre_matrix(ia_mps_dec_state_struct *self) {
332*15dc779aSAndroid Build Coastguard Worker WORD32 ts, qs, row;
333*15dc779aSAndroid Build Coastguard Worker if (self->pre_mix_req) {
334*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_upmix_interp_type1(
335*15dc779aSAndroid Build Coastguard Worker self->m1_param_re, self->r_out_re_in_m1, self->m1_param_re_prev,
336*15dc779aSAndroid Build Coastguard Worker (self->dir_sig_count + self->decor_sig_count), 1, self, self->bs_high_rate_mode);
337*15dc779aSAndroid Build Coastguard Worker
338*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < self->time_slots; ts++) {
339*15dc779aSAndroid Build Coastguard Worker for (qs = 0; qs < 2; qs++) {
340*15dc779aSAndroid Build Coastguard Worker WORD32 indx = self->hyb_band_to_processing_band_table[qs];
341*15dc779aSAndroid Build Coastguard Worker
342*15dc779aSAndroid Build Coastguard Worker FLOAT32 real =
343*15dc779aSAndroid Build Coastguard Worker self->hyb_in[0][qs][ts].re * self->r_out_re_in_m1[ts][indx][0][0];
344*15dc779aSAndroid Build Coastguard Worker FLOAT32 imag =
345*15dc779aSAndroid Build Coastguard Worker self->hyb_in[0][qs][ts].im * self->r_out_re_in_m1[ts][indx][0][0];
346*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < (self->dir_sig_count + self->decor_sig_count);
347*15dc779aSAndroid Build Coastguard Worker row++) {
348*15dc779aSAndroid Build Coastguard Worker self->v[row][ts][qs].re = real;
349*15dc779aSAndroid Build Coastguard Worker self->v[row][ts][qs].im = imag;
350*15dc779aSAndroid Build Coastguard Worker }
351*15dc779aSAndroid Build Coastguard Worker }
352*15dc779aSAndroid Build Coastguard Worker for (qs = 2; qs < self->hyb_band_count[0]; qs++) {
353*15dc779aSAndroid Build Coastguard Worker WORD32 indx = self->hyb_band_to_processing_band_table[qs];
354*15dc779aSAndroid Build Coastguard Worker FLOAT32 real =
355*15dc779aSAndroid Build Coastguard Worker self->hyb_in[0][qs][ts].re * self->r_out_re_in_m1[ts][indx][0][0];
356*15dc779aSAndroid Build Coastguard Worker FLOAT32 imag =
357*15dc779aSAndroid Build Coastguard Worker self->hyb_in[0][qs][ts].im * self->r_out_re_in_m1[ts][indx][0][0];
358*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < (self->dir_sig_count + self->decor_sig_count);
359*15dc779aSAndroid Build Coastguard Worker row++) {
360*15dc779aSAndroid Build Coastguard Worker self->v[row][ts][qs].re = real;
361*15dc779aSAndroid Build Coastguard Worker self->v[row][ts][qs].im = imag;
362*15dc779aSAndroid Build Coastguard Worker }
363*15dc779aSAndroid Build Coastguard Worker }
364*15dc779aSAndroid Build Coastguard Worker }
365*15dc779aSAndroid Build Coastguard Worker } else {
366*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < self->time_slots; ts++) {
367*15dc779aSAndroid Build Coastguard Worker for (qs = 0; qs < self->hyb_band_count[0]; qs++) {
368*15dc779aSAndroid Build Coastguard Worker FLOAT32 real = self->hyb_in[0][qs][ts].re;
369*15dc779aSAndroid Build Coastguard Worker FLOAT32 imag = self->hyb_in[0][qs][ts].im;
370*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < (self->dir_sig_count + self->decor_sig_count);
371*15dc779aSAndroid Build Coastguard Worker row++) {
372*15dc779aSAndroid Build Coastguard Worker self->v[row][ts][qs].re = real;
373*15dc779aSAndroid Build Coastguard Worker self->v[row][ts][qs].im = imag;
374*15dc779aSAndroid Build Coastguard Worker }
375*15dc779aSAndroid Build Coastguard Worker }
376*15dc779aSAndroid Build Coastguard Worker }
377*15dc779aSAndroid Build Coastguard Worker }
378*15dc779aSAndroid Build Coastguard Worker return;
379*15dc779aSAndroid Build Coastguard Worker }
380*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_apply_mix_matrix(ia_mps_dec_state_struct * self)381*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_mps_apply_mix_matrix(ia_mps_dec_state_struct *self) {
382*15dc779aSAndroid Build Coastguard Worker WORD32 ts, qs, row, col;
383*15dc779aSAndroid Build Coastguard Worker WORD32 complex_m2 = ((self->config->bs_phase_coding != 0));
384*15dc779aSAndroid Build Coastguard Worker WORD32 phase_interpolation = (self->config->bs_phase_coding == 1);
385*15dc779aSAndroid Build Coastguard Worker WORD32 num_col_iters = 0;
386*15dc779aSAndroid Build Coastguard Worker
387*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_upmix_interp(self->m2_decor_re, self->r_out_diff_re_in_m2, self->m2_decor_re_prev,
388*15dc779aSAndroid Build Coastguard Worker self->out_ch_count, (self->dir_sig_count + self->decor_sig_count),
389*15dc779aSAndroid Build Coastguard Worker self, 1);
390*15dc779aSAndroid Build Coastguard Worker
391*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_upmix_interp(self->m2_resid_re, self->r_out_re_in_m2, self->m2_resid_re_prev,
392*15dc779aSAndroid Build Coastguard Worker self->out_ch_count, (self->dir_sig_count + self->decor_sig_count),
393*15dc779aSAndroid Build Coastguard Worker self, 1);
394*15dc779aSAndroid Build Coastguard Worker
395*15dc779aSAndroid Build Coastguard Worker if (complex_m2 && !phase_interpolation) {
396*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_upmix_interp(self->m2_decor_im, self->r_out_diff_im_in_m2,
397*15dc779aSAndroid Build Coastguard Worker self->m2_decor_im_prev, self->out_ch_count,
398*15dc779aSAndroid Build Coastguard Worker (self->dir_sig_count + self->decor_sig_count), self, 1);
399*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_upmix_interp(self->m2_resid_im, self->r_out_im_in_m2, self->m2_resid_im_prev,
400*15dc779aSAndroid Build Coastguard Worker self->out_ch_count, (self->dir_sig_count + self->decor_sig_count),
401*15dc779aSAndroid Build Coastguard Worker self, 1);
402*15dc779aSAndroid Build Coastguard Worker }
403*15dc779aSAndroid Build Coastguard Worker
404*15dc779aSAndroid Build Coastguard Worker if (phase_interpolation) {
405*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_phase_interpolation(
406*15dc779aSAndroid Build Coastguard Worker self->phase_l, self->phase_r, self->phase_l_prev, self->phase_r_prev,
407*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_re_in_m2, self->r_out_ph_im_in_m2, self);
408*15dc779aSAndroid Build Coastguard Worker
409*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < self->time_slots; ts++) {
410*15dc779aSAndroid Build Coastguard Worker WORD32 pb;
411*15dc779aSAndroid Build Coastguard Worker for (pb = 0; pb < self->bs_param_bands; pb++) {
412*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][pb][0][0] =
413*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][0][0] *
414*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_im_in_m2[ts][pb][0];
415*15dc779aSAndroid Build Coastguard Worker
416*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][pb][0][1] =
417*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][0][1] *
418*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_im_in_m2[ts][pb][0];
419*15dc779aSAndroid Build Coastguard Worker
420*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][pb][1][0] =
421*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][1][0] *
422*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_im_in_m2[ts][pb][1];
423*15dc779aSAndroid Build Coastguard Worker
424*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][pb][1][1] =
425*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][1][1] *
426*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_im_in_m2[ts][pb][1];
427*15dc779aSAndroid Build Coastguard Worker
428*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][0][0] =
429*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][0][0] *
430*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_re_in_m2[ts][pb][0];
431*15dc779aSAndroid Build Coastguard Worker
432*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][0][1] =
433*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][0][1] *
434*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_re_in_m2[ts][pb][0];
435*15dc779aSAndroid Build Coastguard Worker
436*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][1][0] =
437*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][1][0] *
438*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_re_in_m2[ts][pb][1];
439*15dc779aSAndroid Build Coastguard Worker
440*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][1][1] =
441*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][1][1] *
442*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_re_in_m2[ts][pb][1];
443*15dc779aSAndroid Build Coastguard Worker
444*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_im_in_m2[ts][pb][0][0] = 0;
445*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_im_in_m2[ts][pb][0][1] =
446*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][pb][0][1] *
447*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_im_in_m2[ts][pb][0];
448*15dc779aSAndroid Build Coastguard Worker
449*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_im_in_m2[ts][pb][1][0] = 0;
450*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_im_in_m2[ts][pb][1][1] =
451*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][pb][1][1] *
452*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_im_in_m2[ts][pb][1];
453*15dc779aSAndroid Build Coastguard Worker
454*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][pb][0][0] = 0;
455*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][pb][0][1] =
456*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][pb][0][1] *
457*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_re_in_m2[ts][pb][0];
458*15dc779aSAndroid Build Coastguard Worker
459*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][pb][1][0] = 0;
460*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][pb][1][1] =
461*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][pb][1][1] *
462*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_re_in_m2[ts][pb][1];
463*15dc779aSAndroid Build Coastguard Worker }
464*15dc779aSAndroid Build Coastguard Worker }
465*15dc779aSAndroid Build Coastguard Worker }
466*15dc779aSAndroid Build Coastguard Worker if (self->res_bands == 0) {
467*15dc779aSAndroid Build Coastguard Worker num_col_iters = self->dir_sig_count;
468*15dc779aSAndroid Build Coastguard Worker }
469*15dc779aSAndroid Build Coastguard Worker else {
470*15dc779aSAndroid Build Coastguard Worker num_col_iters = (self->dir_sig_count + self->decor_sig_count);
471*15dc779aSAndroid Build Coastguard Worker }
472*15dc779aSAndroid Build Coastguard Worker
473*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < self->time_slots; ts++) {
474*15dc779aSAndroid Build Coastguard Worker for (qs = 0; qs < self->hyb_band_count_max; qs++) {
475*15dc779aSAndroid Build Coastguard Worker WORD32 indx = self->hyb_band_to_processing_band_table[qs];
476*15dc779aSAndroid Build Coastguard Worker
477*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < self->out_ch_count; row++) {
478*15dc779aSAndroid Build Coastguard Worker FLOAT32 sum_re_dir = 0;
479*15dc779aSAndroid Build Coastguard Worker FLOAT32 sum_im_dir = 0;
480*15dc779aSAndroid Build Coastguard Worker for (col = 0; col < num_col_iters; col++) {
481*15dc779aSAndroid Build Coastguard Worker sum_re_dir += self->w_dir[col][ts][qs].re *
482*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][indx][row][col];
483*15dc779aSAndroid Build Coastguard Worker sum_im_dir += self->w_dir[col][ts][qs].im *
484*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][indx][row][col];
485*15dc779aSAndroid Build Coastguard Worker }
486*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
487*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
488*15dc779aSAndroid Build Coastguard Worker
489*15dc779aSAndroid Build Coastguard Worker self->hyb_diff_out[row][ts][qs].re =
490*15dc779aSAndroid Build Coastguard Worker self->w_diff[1][ts][qs].re *
491*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][indx][row][1];
492*15dc779aSAndroid Build Coastguard Worker self->hyb_diff_out[row][ts][qs].im =
493*15dc779aSAndroid Build Coastguard Worker self->w_diff[1][ts][qs].im *
494*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][indx][row][1];
495*15dc779aSAndroid Build Coastguard Worker }
496*15dc779aSAndroid Build Coastguard Worker }
497*15dc779aSAndroid Build Coastguard Worker }
498*15dc779aSAndroid Build Coastguard Worker
499*15dc779aSAndroid Build Coastguard Worker if (complex_m2) {
500*15dc779aSAndroid Build Coastguard Worker if (phase_interpolation) {
501*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < self->time_slots; ts++) {
502*15dc779aSAndroid Build Coastguard Worker for (qs = 0; qs < 2; qs++) {
503*15dc779aSAndroid Build Coastguard Worker WORD32 indx = self->hyb_band_to_processing_band_table[qs];
504*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < self->out_ch_count; row++) {
505*15dc779aSAndroid Build Coastguard Worker FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
506*15dc779aSAndroid Build Coastguard Worker FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
507*15dc779aSAndroid Build Coastguard Worker for (col = 0; col < num_col_iters; col++) {
508*15dc779aSAndroid Build Coastguard Worker sum_re_dir += self->w_dir[col][ts][qs].im *
509*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][indx][row][col];
510*15dc779aSAndroid Build Coastguard Worker sum_im_dir -= self->w_dir[col][ts][qs].re *
511*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][indx][row][col];
512*15dc779aSAndroid Build Coastguard Worker }
513*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
514*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
515*15dc779aSAndroid Build Coastguard Worker self->hyb_diff_out[row][ts][qs].re +=
516*15dc779aSAndroid Build Coastguard Worker self->w_diff[1][ts][qs].im *
517*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_im_in_m2[ts][indx][row][1];
518*15dc779aSAndroid Build Coastguard Worker self->hyb_diff_out[row][ts][qs].im -=
519*15dc779aSAndroid Build Coastguard Worker self->w_diff[1][ts][qs].re *
520*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_im_in_m2[ts][indx][row][1];
521*15dc779aSAndroid Build Coastguard Worker }
522*15dc779aSAndroid Build Coastguard Worker }
523*15dc779aSAndroid Build Coastguard Worker for (qs = 2; qs < self->hyb_band_count_max; qs++) {
524*15dc779aSAndroid Build Coastguard Worker WORD32 indx = self->hyb_band_to_processing_band_table[qs];
525*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < self->out_ch_count; row++) {
526*15dc779aSAndroid Build Coastguard Worker FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
527*15dc779aSAndroid Build Coastguard Worker FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
528*15dc779aSAndroid Build Coastguard Worker for (col = 0; col < num_col_iters; col++) {
529*15dc779aSAndroid Build Coastguard Worker sum_re_dir -= self->w_dir[col][ts][qs].im *
530*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][indx][row][col];
531*15dc779aSAndroid Build Coastguard Worker sum_im_dir += self->w_dir[col][ts][qs].re *
532*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][indx][row][col];
533*15dc779aSAndroid Build Coastguard Worker }
534*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
535*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
536*15dc779aSAndroid Build Coastguard Worker self->hyb_diff_out[row][ts][qs].re -=
537*15dc779aSAndroid Build Coastguard Worker self->w_diff[1][ts][qs].im *
538*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_im_in_m2[ts][indx][row][1];
539*15dc779aSAndroid Build Coastguard Worker self->hyb_diff_out[row][ts][qs].im +=
540*15dc779aSAndroid Build Coastguard Worker self->w_diff[1][ts][qs].re *
541*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_im_in_m2[ts][indx][row][1];
542*15dc779aSAndroid Build Coastguard Worker }
543*15dc779aSAndroid Build Coastguard Worker }
544*15dc779aSAndroid Build Coastguard Worker }
545*15dc779aSAndroid Build Coastguard Worker }
546*15dc779aSAndroid Build Coastguard Worker else {
547*15dc779aSAndroid Build Coastguard Worker WORD32 num_cols = (self->dir_sig_count + self->decor_sig_count) > 1
548*15dc779aSAndroid Build Coastguard Worker ? 1
549*15dc779aSAndroid Build Coastguard Worker : (self->dir_sig_count + self->decor_sig_count);
550*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < self->time_slots; ts++) {
551*15dc779aSAndroid Build Coastguard Worker for (qs = 0; qs < 2; qs++) {
552*15dc779aSAndroid Build Coastguard Worker WORD32 indx = self->hyb_band_to_processing_band_table[qs];
553*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < self->out_ch_count; row++) {
554*15dc779aSAndroid Build Coastguard Worker FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
555*15dc779aSAndroid Build Coastguard Worker FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
556*15dc779aSAndroid Build Coastguard Worker if (num_cols > 0) {
557*15dc779aSAndroid Build Coastguard Worker sum_re_dir += self->w_dir[0][ts][qs].im *
558*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][indx][row][0];
559*15dc779aSAndroid Build Coastguard Worker sum_im_dir -= self->w_dir[0][ts][qs].re *
560*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][indx][row][0];
561*15dc779aSAndroid Build Coastguard Worker }
562*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
563*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
564*15dc779aSAndroid Build Coastguard Worker }
565*15dc779aSAndroid Build Coastguard Worker }
566*15dc779aSAndroid Build Coastguard Worker for (qs = 2; qs < self->hyb_band_count_max; qs++) {
567*15dc779aSAndroid Build Coastguard Worker WORD32 indx = self->hyb_band_to_processing_band_table[qs];
568*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < self->out_ch_count; row++) {
569*15dc779aSAndroid Build Coastguard Worker FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
570*15dc779aSAndroid Build Coastguard Worker FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
571*15dc779aSAndroid Build Coastguard Worker if (num_cols > 0) {
572*15dc779aSAndroid Build Coastguard Worker sum_re_dir -= self->w_dir[0][ts][qs].im *
573*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][indx][row][0];
574*15dc779aSAndroid Build Coastguard Worker sum_im_dir += self->w_dir[0][ts][qs].re *
575*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][indx][row][0];
576*15dc779aSAndroid Build Coastguard Worker }
577*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
578*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
579*15dc779aSAndroid Build Coastguard Worker }
580*15dc779aSAndroid Build Coastguard Worker }
581*15dc779aSAndroid Build Coastguard Worker }
582*15dc779aSAndroid Build Coastguard Worker }
583*15dc779aSAndroid Build Coastguard Worker }
584*15dc779aSAndroid Build Coastguard Worker return;
585*15dc779aSAndroid Build Coastguard Worker }
586*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_apply_mix_matrix_type1(ia_mps_dec_state_struct * self)587*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_mps_apply_mix_matrix_type1(ia_mps_dec_state_struct *self) {
588*15dc779aSAndroid Build Coastguard Worker WORD32 ts, qs, row;
589*15dc779aSAndroid Build Coastguard Worker
590*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_upmix_interp_type2(self->m2_decor_re, self->r_out_diff_re_in_m2,
591*15dc779aSAndroid Build Coastguard Worker self->m2_decor_re_prev, self->out_ch_count, self, 1);
592*15dc779aSAndroid Build Coastguard Worker
593*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_upmix_interp_type2(self->m2_resid_re, self->r_out_re_in_m2, self->m2_resid_re_prev,
594*15dc779aSAndroid Build Coastguard Worker self->out_ch_count, self, 0);
595*15dc779aSAndroid Build Coastguard Worker
596*15dc779aSAndroid Build Coastguard Worker for (qs = 0; qs < self->hyb_band_count[0]; qs++) {
597*15dc779aSAndroid Build Coastguard Worker WORD32 indx = self->hyb_band_to_processing_band_table[qs];
598*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < self->time_slots; ts++) {
599*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < self->out_ch_count; row++) {
600*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].re =
601*15dc779aSAndroid Build Coastguard Worker self->w_dir[0][ts][qs].re * self->r_out_re_in_m2[ts][indx][row][0];
602*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].im =
603*15dc779aSAndroid Build Coastguard Worker self->w_dir[0][ts][qs].im * self->r_out_re_in_m2[ts][indx][row][0];
604*15dc779aSAndroid Build Coastguard Worker self->hyb_diff_out[row][ts][qs].re =
605*15dc779aSAndroid Build Coastguard Worker self->w_diff[1][ts][qs].re *
606*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][indx][row][1];
607*15dc779aSAndroid Build Coastguard Worker self->hyb_diff_out[row][ts][qs].im =
608*15dc779aSAndroid Build Coastguard Worker self->w_diff[1][ts][qs].im *
609*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][indx][row][1];
610*15dc779aSAndroid Build Coastguard Worker }
611*15dc779aSAndroid Build Coastguard Worker }
612*15dc779aSAndroid Build Coastguard Worker }
613*15dc779aSAndroid Build Coastguard Worker return;
614*15dc779aSAndroid Build Coastguard Worker }
615*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_apply_mix_matrix_type2(ia_mps_dec_state_struct * self)616*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_mps_apply_mix_matrix_type2(ia_mps_dec_state_struct *self) {
617*15dc779aSAndroid Build Coastguard Worker WORD32 ts, qs, row, col;
618*15dc779aSAndroid Build Coastguard Worker WORD32 complex_m2 = ((self->config->bs_phase_coding != 0));
619*15dc779aSAndroid Build Coastguard Worker WORD32 phase_interpolation = (self->config->bs_phase_coding == 1);
620*15dc779aSAndroid Build Coastguard Worker WORD32 num_col_iters = 0;
621*15dc779aSAndroid Build Coastguard Worker
622*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_upmix_interp_type1(self->m2_decor_re, self->r_out_diff_re_in_m2,
623*15dc779aSAndroid Build Coastguard Worker self->m2_decor_re_prev, self->out_ch_count,
624*15dc779aSAndroid Build Coastguard Worker (self->dir_sig_count + self->decor_sig_count), self, 1);
625*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_upmix_interp_type1(self->m2_resid_re, self->r_out_re_in_m2, self->m2_resid_re_prev,
626*15dc779aSAndroid Build Coastguard Worker self->out_ch_count,
627*15dc779aSAndroid Build Coastguard Worker (self->dir_sig_count + self->decor_sig_count), self, 1);
628*15dc779aSAndroid Build Coastguard Worker
629*15dc779aSAndroid Build Coastguard Worker if (complex_m2 && !phase_interpolation) {
630*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_upmix_interp_type1(self->m2_decor_im, self->r_out_diff_im_in_m2,
631*15dc779aSAndroid Build Coastguard Worker self->m2_decor_im_prev, self->out_ch_count,
632*15dc779aSAndroid Build Coastguard Worker (self->dir_sig_count + self->decor_sig_count), self, 1);
633*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_upmix_interp_type1(self->m2_resid_im, self->r_out_im_in_m2,
634*15dc779aSAndroid Build Coastguard Worker self->m2_resid_im_prev, self->out_ch_count,
635*15dc779aSAndroid Build Coastguard Worker (self->dir_sig_count + self->decor_sig_count), self, 1);
636*15dc779aSAndroid Build Coastguard Worker }
637*15dc779aSAndroid Build Coastguard Worker
638*15dc779aSAndroid Build Coastguard Worker if (phase_interpolation) {
639*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_phase_interpolation(
640*15dc779aSAndroid Build Coastguard Worker self->phase_l, self->phase_r, self->phase_l_prev, self->phase_r_prev,
641*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_re_in_m2, self->r_out_ph_im_in_m2, self);
642*15dc779aSAndroid Build Coastguard Worker
643*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < self->time_slots; ts++) {
644*15dc779aSAndroid Build Coastguard Worker WORD32 pb;
645*15dc779aSAndroid Build Coastguard Worker for (pb = 0; pb < self->bs_param_bands; pb++) {
646*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][pb][0][0] =
647*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][0][0] *
648*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_im_in_m2[ts][pb][0];
649*15dc779aSAndroid Build Coastguard Worker
650*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][pb][0][1] =
651*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][0][1] *
652*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_im_in_m2[ts][pb][0];
653*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][pb][1][0] =
654*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][1][0] *
655*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_im_in_m2[ts][pb][1];
656*15dc779aSAndroid Build Coastguard Worker
657*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][pb][1][1] =
658*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][1][1] *
659*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_im_in_m2[ts][pb][1];
660*15dc779aSAndroid Build Coastguard Worker
661*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][0][0] =
662*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][0][0] *
663*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_re_in_m2[ts][pb][0];
664*15dc779aSAndroid Build Coastguard Worker
665*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][0][1] =
666*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][0][1] *
667*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_re_in_m2[ts][pb][0];
668*15dc779aSAndroid Build Coastguard Worker
669*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][1][0] =
670*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][1][0] *
671*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_re_in_m2[ts][pb][1];
672*15dc779aSAndroid Build Coastguard Worker
673*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][1][1] =
674*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][1][1] *
675*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_re_in_m2[ts][pb][1];
676*15dc779aSAndroid Build Coastguard Worker
677*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_im_in_m2[ts][pb][0][0] = 0;
678*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_im_in_m2[ts][pb][0][1] =
679*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][pb][0][1] *
680*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_im_in_m2[ts][pb][0];
681*15dc779aSAndroid Build Coastguard Worker
682*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_im_in_m2[ts][pb][1][0] = 0;
683*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_im_in_m2[ts][pb][1][1] =
684*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][pb][1][1] *
685*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_im_in_m2[ts][pb][1];
686*15dc779aSAndroid Build Coastguard Worker
687*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][pb][0][0] = 0;
688*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][pb][0][1] =
689*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][pb][0][1] *
690*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_re_in_m2[ts][pb][0];
691*15dc779aSAndroid Build Coastguard Worker
692*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][pb][1][0] = 0;
693*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][pb][1][1] =
694*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][pb][1][1] *
695*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_re_in_m2[ts][pb][1];
696*15dc779aSAndroid Build Coastguard Worker }
697*15dc779aSAndroid Build Coastguard Worker }
698*15dc779aSAndroid Build Coastguard Worker }
699*15dc779aSAndroid Build Coastguard Worker if (self->res_bands == 0) {
700*15dc779aSAndroid Build Coastguard Worker num_col_iters = self->dir_sig_count;
701*15dc779aSAndroid Build Coastguard Worker } else {
702*15dc779aSAndroid Build Coastguard Worker num_col_iters = (self->dir_sig_count + self->decor_sig_count);
703*15dc779aSAndroid Build Coastguard Worker }
704*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < self->time_slots; ts++) {
705*15dc779aSAndroid Build Coastguard Worker for (qs = 0; qs < self->hyb_band_count_max; qs++) {
706*15dc779aSAndroid Build Coastguard Worker WORD32 indx = self->hyb_band_to_processing_band_table[qs];
707*15dc779aSAndroid Build Coastguard Worker
708*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < self->out_ch_count; row++) {
709*15dc779aSAndroid Build Coastguard Worker FLOAT32 sum_re_dir = 0;
710*15dc779aSAndroid Build Coastguard Worker FLOAT32 sum_im_dir = 0;
711*15dc779aSAndroid Build Coastguard Worker for (col = 0; col < num_col_iters; col++) {
712*15dc779aSAndroid Build Coastguard Worker sum_re_dir += self->w_dir[col][ts][qs].re *
713*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][indx][row][col];
714*15dc779aSAndroid Build Coastguard Worker sum_im_dir += self->w_dir[col][ts][qs].im *
715*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][indx][row][col];
716*15dc779aSAndroid Build Coastguard Worker }
717*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
718*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
719*15dc779aSAndroid Build Coastguard Worker
720*15dc779aSAndroid Build Coastguard Worker self->hyb_diff_out[row][ts][qs].re =
721*15dc779aSAndroid Build Coastguard Worker self->w_diff[1][ts][qs].re *
722*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][indx][row][1];
723*15dc779aSAndroid Build Coastguard Worker self->hyb_diff_out[row][ts][qs].im =
724*15dc779aSAndroid Build Coastguard Worker self->w_diff[1][ts][qs].im *
725*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][indx][row][1];
726*15dc779aSAndroid Build Coastguard Worker }
727*15dc779aSAndroid Build Coastguard Worker }
728*15dc779aSAndroid Build Coastguard Worker }
729*15dc779aSAndroid Build Coastguard Worker
730*15dc779aSAndroid Build Coastguard Worker if (complex_m2) {
731*15dc779aSAndroid Build Coastguard Worker if (phase_interpolation) {
732*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < self->time_slots; ts++) {
733*15dc779aSAndroid Build Coastguard Worker for (qs = 0; qs < 2; qs++) {
734*15dc779aSAndroid Build Coastguard Worker WORD32 indx = self->hyb_band_to_processing_band_table[qs];
735*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < self->out_ch_count; row++) {
736*15dc779aSAndroid Build Coastguard Worker FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
737*15dc779aSAndroid Build Coastguard Worker FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
738*15dc779aSAndroid Build Coastguard Worker for (col = 0; col < num_col_iters; col++) {
739*15dc779aSAndroid Build Coastguard Worker sum_re_dir += self->w_dir[col][ts][qs].im *
740*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][indx][row][col];
741*15dc779aSAndroid Build Coastguard Worker sum_im_dir -= self->w_dir[col][ts][qs].re *
742*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][indx][row][col];
743*15dc779aSAndroid Build Coastguard Worker }
744*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
745*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
746*15dc779aSAndroid Build Coastguard Worker self->hyb_diff_out[row][ts][qs].re +=
747*15dc779aSAndroid Build Coastguard Worker self->w_diff[1][ts][qs].im *
748*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_im_in_m2[ts][indx][row][1];
749*15dc779aSAndroid Build Coastguard Worker self->hyb_diff_out[row][ts][qs].im -=
750*15dc779aSAndroid Build Coastguard Worker self->w_diff[1][ts][qs].re *
751*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_im_in_m2[ts][indx][row][1];
752*15dc779aSAndroid Build Coastguard Worker }
753*15dc779aSAndroid Build Coastguard Worker }
754*15dc779aSAndroid Build Coastguard Worker for (qs = 2; qs < self->hyb_band_count_max; qs++) {
755*15dc779aSAndroid Build Coastguard Worker WORD32 indx = self->hyb_band_to_processing_band_table[qs];
756*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < self->out_ch_count; row++) {
757*15dc779aSAndroid Build Coastguard Worker FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
758*15dc779aSAndroid Build Coastguard Worker FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
759*15dc779aSAndroid Build Coastguard Worker for (col = 0; col < num_col_iters; col++) {
760*15dc779aSAndroid Build Coastguard Worker sum_re_dir -= self->w_dir[col][ts][qs].im *
761*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][indx][row][col];
762*15dc779aSAndroid Build Coastguard Worker sum_im_dir += self->w_dir[col][ts][qs].re *
763*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][indx][row][col];
764*15dc779aSAndroid Build Coastguard Worker }
765*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
766*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
767*15dc779aSAndroid Build Coastguard Worker self->hyb_diff_out[row][ts][qs].re -=
768*15dc779aSAndroid Build Coastguard Worker self->w_diff[1][ts][qs].im *
769*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_im_in_m2[ts][indx][row][1];
770*15dc779aSAndroid Build Coastguard Worker self->hyb_diff_out[row][ts][qs].im +=
771*15dc779aSAndroid Build Coastguard Worker self->w_diff[1][ts][qs].re *
772*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_im_in_m2[ts][indx][row][1];
773*15dc779aSAndroid Build Coastguard Worker }
774*15dc779aSAndroid Build Coastguard Worker }
775*15dc779aSAndroid Build Coastguard Worker }
776*15dc779aSAndroid Build Coastguard Worker } else {
777*15dc779aSAndroid Build Coastguard Worker WORD32 num_cols = (self->dir_sig_count + self->decor_sig_count) > 1
778*15dc779aSAndroid Build Coastguard Worker ? 1
779*15dc779aSAndroid Build Coastguard Worker : (self->dir_sig_count + self->decor_sig_count);
780*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < self->time_slots; ts++) {
781*15dc779aSAndroid Build Coastguard Worker for (qs = 0; qs < 2; qs++) {
782*15dc779aSAndroid Build Coastguard Worker WORD32 indx = self->hyb_band_to_processing_band_table[qs];
783*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < self->out_ch_count; row++) {
784*15dc779aSAndroid Build Coastguard Worker FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
785*15dc779aSAndroid Build Coastguard Worker FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
786*15dc779aSAndroid Build Coastguard Worker if (num_cols > 0) {
787*15dc779aSAndroid Build Coastguard Worker sum_re_dir += self->w_dir[0][ts][qs].im *
788*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][indx][row][0];
789*15dc779aSAndroid Build Coastguard Worker sum_im_dir -= self->w_dir[0][ts][qs].re *
790*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][indx][row][0];
791*15dc779aSAndroid Build Coastguard Worker }
792*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
793*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
794*15dc779aSAndroid Build Coastguard Worker }
795*15dc779aSAndroid Build Coastguard Worker }
796*15dc779aSAndroid Build Coastguard Worker for (qs = 2; qs < self->hyb_band_count_max; qs++) {
797*15dc779aSAndroid Build Coastguard Worker WORD32 indx = self->hyb_band_to_processing_band_table[qs];
798*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < self->out_ch_count; row++) {
799*15dc779aSAndroid Build Coastguard Worker FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
800*15dc779aSAndroid Build Coastguard Worker FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
801*15dc779aSAndroid Build Coastguard Worker if (num_cols > 0) {
802*15dc779aSAndroid Build Coastguard Worker sum_re_dir -= self->w_dir[0][ts][qs].im *
803*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][indx][row][0];
804*15dc779aSAndroid Build Coastguard Worker sum_im_dir += self->w_dir[0][ts][qs].re *
805*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][indx][row][0];
806*15dc779aSAndroid Build Coastguard Worker }
807*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
808*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
809*15dc779aSAndroid Build Coastguard Worker }
810*15dc779aSAndroid Build Coastguard Worker }
811*15dc779aSAndroid Build Coastguard Worker }
812*15dc779aSAndroid Build Coastguard Worker }
813*15dc779aSAndroid Build Coastguard Worker }
814*15dc779aSAndroid Build Coastguard Worker return;
815*15dc779aSAndroid Build Coastguard Worker }
816*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_apply_mix_matrix_type3(ia_mps_dec_state_struct * self)817*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_mps_apply_mix_matrix_type3(ia_mps_dec_state_struct *self) {
818*15dc779aSAndroid Build Coastguard Worker WORD32 ts, qs, row, col;
819*15dc779aSAndroid Build Coastguard Worker WORD32 complex_m2 = ((self->config->bs_phase_coding != 0));
820*15dc779aSAndroid Build Coastguard Worker WORD32 phase_interpolation = (self->config->bs_phase_coding == 1);
821*15dc779aSAndroid Build Coastguard Worker WORD32 num_col_iters = 0;
822*15dc779aSAndroid Build Coastguard Worker
823*15dc779aSAndroid Build Coastguard Worker if (self->res_bands != 28) {
824*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_upmix_interp_type2(self->m2_decor_re, self->r_out_diff_re_in_m2,
825*15dc779aSAndroid Build Coastguard Worker self->m2_decor_re_prev, self->out_ch_count, self, 1);
826*15dc779aSAndroid Build Coastguard Worker }
827*15dc779aSAndroid Build Coastguard Worker if (self->res_bands == 0) {
828*15dc779aSAndroid Build Coastguard Worker num_col_iters = self->dir_sig_count;
829*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_upmix_interp_type2(self->m2_resid_re, self->r_out_re_in_m2,
830*15dc779aSAndroid Build Coastguard Worker self->m2_resid_re_prev, self->out_ch_count, self, 0);
831*15dc779aSAndroid Build Coastguard Worker } else {
832*15dc779aSAndroid Build Coastguard Worker num_col_iters = (self->dir_sig_count + self->decor_sig_count);
833*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_upmix_interp_type1(self->m2_resid_re, self->r_out_re_in_m2,
834*15dc779aSAndroid Build Coastguard Worker self->m2_resid_re_prev, self->out_ch_count,
835*15dc779aSAndroid Build Coastguard Worker (self->dir_sig_count + self->decor_sig_count), self, 1);
836*15dc779aSAndroid Build Coastguard Worker }
837*15dc779aSAndroid Build Coastguard Worker
838*15dc779aSAndroid Build Coastguard Worker if (complex_m2 && !phase_interpolation) {
839*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_upmix_interp_type2(self->m2_resid_im, self->r_out_im_in_m2,
840*15dc779aSAndroid Build Coastguard Worker self->m2_resid_im_prev, self->out_ch_count, self, 0);
841*15dc779aSAndroid Build Coastguard Worker }
842*15dc779aSAndroid Build Coastguard Worker
843*15dc779aSAndroid Build Coastguard Worker if (phase_interpolation) {
844*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_phase_interpolation(
845*15dc779aSAndroid Build Coastguard Worker self->phase_l, self->phase_r, self->phase_l_prev, self->phase_r_prev,
846*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_re_in_m2, self->r_out_ph_im_in_m2, self);
847*15dc779aSAndroid Build Coastguard Worker
848*15dc779aSAndroid Build Coastguard Worker if (self->res_bands == 0) {
849*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < self->time_slots; ts++) {
850*15dc779aSAndroid Build Coastguard Worker WORD32 pb;
851*15dc779aSAndroid Build Coastguard Worker for (pb = 0; pb < self->bs_param_bands; pb++) {
852*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][pb][0][0] =
853*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][0][0] *
854*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_im_in_m2[ts][pb][0];
855*15dc779aSAndroid Build Coastguard Worker
856*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][pb][1][0] =
857*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][1][0] *
858*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_im_in_m2[ts][pb][1];
859*15dc779aSAndroid Build Coastguard Worker
860*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][0][0] =
861*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][0][0] *
862*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_re_in_m2[ts][pb][0];
863*15dc779aSAndroid Build Coastguard Worker
864*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][1][0] =
865*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][1][0] *
866*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_re_in_m2[ts][pb][1];
867*15dc779aSAndroid Build Coastguard Worker
868*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_im_in_m2[ts][pb][0][1] =
869*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][pb][0][1] *
870*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_im_in_m2[ts][pb][0];
871*15dc779aSAndroid Build Coastguard Worker
872*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_im_in_m2[ts][pb][1][1] =
873*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][pb][1][1] *
874*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_im_in_m2[ts][pb][1];
875*15dc779aSAndroid Build Coastguard Worker
876*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][pb][0][1] =
877*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][pb][0][1] *
878*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_re_in_m2[ts][pb][0];
879*15dc779aSAndroid Build Coastguard Worker
880*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][pb][1][1] =
881*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][pb][1][1] *
882*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_re_in_m2[ts][pb][1];
883*15dc779aSAndroid Build Coastguard Worker }
884*15dc779aSAndroid Build Coastguard Worker }
885*15dc779aSAndroid Build Coastguard Worker } else if (self->res_bands == 28) {
886*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < self->time_slots; ts++) {
887*15dc779aSAndroid Build Coastguard Worker WORD32 pb;
888*15dc779aSAndroid Build Coastguard Worker for (pb = 0; pb < self->bs_param_bands; pb++) {
889*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][pb][0][0] =
890*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][0][0] *
891*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_im_in_m2[ts][pb][0];
892*15dc779aSAndroid Build Coastguard Worker
893*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][pb][0][1] =
894*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][0][1] *
895*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_im_in_m2[ts][pb][0];
896*15dc779aSAndroid Build Coastguard Worker
897*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][pb][1][0] =
898*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][1][0] *
899*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_im_in_m2[ts][pb][1];
900*15dc779aSAndroid Build Coastguard Worker
901*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][pb][1][1] =
902*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][1][1] *
903*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_im_in_m2[ts][pb][1];
904*15dc779aSAndroid Build Coastguard Worker
905*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][0][0] =
906*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][0][0] *
907*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_re_in_m2[ts][pb][0];
908*15dc779aSAndroid Build Coastguard Worker
909*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][0][1] =
910*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][0][1] *
911*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_re_in_m2[ts][pb][0];
912*15dc779aSAndroid Build Coastguard Worker
913*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][1][0] =
914*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][1][0] *
915*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_re_in_m2[ts][pb][1];
916*15dc779aSAndroid Build Coastguard Worker
917*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][1][1] =
918*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][1][1] *
919*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_re_in_m2[ts][pb][1];
920*15dc779aSAndroid Build Coastguard Worker }
921*15dc779aSAndroid Build Coastguard Worker }
922*15dc779aSAndroid Build Coastguard Worker } else {
923*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < self->time_slots; ts++) {
924*15dc779aSAndroid Build Coastguard Worker WORD32 pb;
925*15dc779aSAndroid Build Coastguard Worker for (pb = 0; pb < self->bs_param_bands; pb++) {
926*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][pb][0][0] =
927*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][0][0] *
928*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_im_in_m2[ts][pb][0];
929*15dc779aSAndroid Build Coastguard Worker
930*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][pb][0][1] =
931*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][0][1] *
932*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_im_in_m2[ts][pb][0];
933*15dc779aSAndroid Build Coastguard Worker
934*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][pb][1][0] =
935*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][1][0] *
936*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_im_in_m2[ts][pb][1];
937*15dc779aSAndroid Build Coastguard Worker
938*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][pb][1][1] =
939*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][1][1] *
940*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_im_in_m2[ts][pb][1];
941*15dc779aSAndroid Build Coastguard Worker
942*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][0][0] =
943*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][0][0] *
944*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_re_in_m2[ts][pb][0];
945*15dc779aSAndroid Build Coastguard Worker
946*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][0][1] =
947*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][0][1] *
948*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_re_in_m2[ts][pb][0];
949*15dc779aSAndroid Build Coastguard Worker
950*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][1][0] =
951*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][1][0] *
952*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_re_in_m2[ts][pb][1];
953*15dc779aSAndroid Build Coastguard Worker
954*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][1][1] =
955*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][pb][1][1] *
956*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_re_in_m2[ts][pb][1];
957*15dc779aSAndroid Build Coastguard Worker
958*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_im_in_m2[ts][pb][0][1] =
959*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][pb][0][1] *
960*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_im_in_m2[ts][pb][0];
961*15dc779aSAndroid Build Coastguard Worker
962*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_im_in_m2[ts][pb][1][1] =
963*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][pb][1][1] *
964*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_im_in_m2[ts][pb][1];
965*15dc779aSAndroid Build Coastguard Worker
966*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][pb][0][1] =
967*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][pb][0][1] *
968*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_re_in_m2[ts][pb][0];
969*15dc779aSAndroid Build Coastguard Worker
970*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][pb][1][1] =
971*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][pb][1][1] *
972*15dc779aSAndroid Build Coastguard Worker self->r_out_ph_re_in_m2[ts][pb][1];
973*15dc779aSAndroid Build Coastguard Worker }
974*15dc779aSAndroid Build Coastguard Worker }
975*15dc779aSAndroid Build Coastguard Worker }
976*15dc779aSAndroid Build Coastguard Worker }
977*15dc779aSAndroid Build Coastguard Worker if (self->res_bands == 0) {
978*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < self->time_slots; ts++) {
979*15dc779aSAndroid Build Coastguard Worker for (qs = 0; qs < self->hyb_band_count[0]; qs++) {
980*15dc779aSAndroid Build Coastguard Worker WORD32 indx = self->hyb_band_to_processing_band_table[qs];
981*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < self->out_ch_count; row++) {
982*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].re =
983*15dc779aSAndroid Build Coastguard Worker self->w_dir[0][ts][qs].re *
984*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][indx][row][0];
985*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].im =
986*15dc779aSAndroid Build Coastguard Worker self->w_dir[0][ts][qs].im *
987*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][indx][row][0];
988*15dc779aSAndroid Build Coastguard Worker self->hyb_diff_out[row][ts][qs].re =
989*15dc779aSAndroid Build Coastguard Worker self->w_diff[1][ts][qs].re *
990*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][indx][row][1];
991*15dc779aSAndroid Build Coastguard Worker self->hyb_diff_out[row][ts][qs].im =
992*15dc779aSAndroid Build Coastguard Worker self->w_diff[1][ts][qs].im *
993*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][indx][row][1];
994*15dc779aSAndroid Build Coastguard Worker }
995*15dc779aSAndroid Build Coastguard Worker }
996*15dc779aSAndroid Build Coastguard Worker }
997*15dc779aSAndroid Build Coastguard Worker } else if (self->res_bands == 28) {
998*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < self->time_slots; ts++) {
999*15dc779aSAndroid Build Coastguard Worker for (qs = 0; qs < self->hyb_band_count[1]; qs++) {
1000*15dc779aSAndroid Build Coastguard Worker WORD32 indx = self->hyb_band_to_processing_band_table[qs];
1001*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < self->out_ch_count; row++) {
1002*15dc779aSAndroid Build Coastguard Worker FLOAT32 sum_re_dir = 0;
1003*15dc779aSAndroid Build Coastguard Worker FLOAT32 sum_im_dir = 0;
1004*15dc779aSAndroid Build Coastguard Worker for (col = 0; col < num_col_iters; col++) {
1005*15dc779aSAndroid Build Coastguard Worker sum_re_dir += self->w_dir[col][ts][qs].re *
1006*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][indx][row][col];
1007*15dc779aSAndroid Build Coastguard Worker sum_im_dir += self->w_dir[col][ts][qs].im *
1008*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][indx][row][col];
1009*15dc779aSAndroid Build Coastguard Worker }
1010*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
1011*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
1012*15dc779aSAndroid Build Coastguard Worker }
1013*15dc779aSAndroid Build Coastguard Worker }
1014*15dc779aSAndroid Build Coastguard Worker for (; qs < self->hyb_band_count[0]; qs++) {
1015*15dc779aSAndroid Build Coastguard Worker WORD32 indx = self->hyb_band_to_processing_band_table[qs];
1016*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < self->out_ch_count; row++) {
1017*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].re =
1018*15dc779aSAndroid Build Coastguard Worker self->w_dir[0][ts][qs].re *
1019*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][indx][row][0];
1020*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].im =
1021*15dc779aSAndroid Build Coastguard Worker self->w_dir[0][ts][qs].im *
1022*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][indx][row][0];
1023*15dc779aSAndroid Build Coastguard Worker }
1024*15dc779aSAndroid Build Coastguard Worker }
1025*15dc779aSAndroid Build Coastguard Worker }
1026*15dc779aSAndroid Build Coastguard Worker } else {
1027*15dc779aSAndroid Build Coastguard Worker WORD32 dif_s = ixheaacd_mps_gain_set_indx[self->res_bands];
1028*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < self->time_slots; ts++) {
1029*15dc779aSAndroid Build Coastguard Worker for (qs = 0; qs < dif_s; qs++) {
1030*15dc779aSAndroid Build Coastguard Worker WORD32 indx = self->hyb_band_to_processing_band_table[qs];
1031*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < self->out_ch_count; row++) {
1032*15dc779aSAndroid Build Coastguard Worker FLOAT32 sum_re_dir = 0;
1033*15dc779aSAndroid Build Coastguard Worker FLOAT32 sum_im_dir = 0;
1034*15dc779aSAndroid Build Coastguard Worker for (col = 0; col < num_col_iters; col++) {
1035*15dc779aSAndroid Build Coastguard Worker sum_re_dir += self->w_dir[col][ts][qs].re *
1036*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][indx][row][col];
1037*15dc779aSAndroid Build Coastguard Worker sum_im_dir += self->w_dir[col][ts][qs].im *
1038*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][indx][row][col];
1039*15dc779aSAndroid Build Coastguard Worker }
1040*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
1041*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
1042*15dc779aSAndroid Build Coastguard Worker }
1043*15dc779aSAndroid Build Coastguard Worker }
1044*15dc779aSAndroid Build Coastguard Worker for (; qs < self->hyb_band_count[1]; qs++) {
1045*15dc779aSAndroid Build Coastguard Worker WORD32 indx = self->hyb_band_to_processing_band_table[qs];
1046*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < self->out_ch_count; row++) {
1047*15dc779aSAndroid Build Coastguard Worker FLOAT32 sum_re_dir = 0;
1048*15dc779aSAndroid Build Coastguard Worker FLOAT32 sum_im_dir = 0;
1049*15dc779aSAndroid Build Coastguard Worker for (col = 0; col < num_col_iters; col++) {
1050*15dc779aSAndroid Build Coastguard Worker sum_re_dir += self->w_dir[col][ts][qs].re *
1051*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][indx][row][col];
1052*15dc779aSAndroid Build Coastguard Worker sum_im_dir += self->w_dir[col][ts][qs].im *
1053*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][indx][row][col];
1054*15dc779aSAndroid Build Coastguard Worker }
1055*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
1056*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
1057*15dc779aSAndroid Build Coastguard Worker self->hyb_diff_out[row][ts][qs].re =
1058*15dc779aSAndroid Build Coastguard Worker self->w_diff[1][ts][qs].re *
1059*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][indx][row][1];
1060*15dc779aSAndroid Build Coastguard Worker self->hyb_diff_out[row][ts][qs].im =
1061*15dc779aSAndroid Build Coastguard Worker self->w_diff[1][ts][qs].im *
1062*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][indx][row][1];
1063*15dc779aSAndroid Build Coastguard Worker }
1064*15dc779aSAndroid Build Coastguard Worker }
1065*15dc779aSAndroid Build Coastguard Worker for (; qs < self->hyb_band_count[0]; qs++) {
1066*15dc779aSAndroid Build Coastguard Worker WORD32 indx = self->hyb_band_to_processing_band_table[qs];
1067*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < self->out_ch_count; row++) {
1068*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].re =
1069*15dc779aSAndroid Build Coastguard Worker self->w_dir[0][ts][qs].re *
1070*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][indx][row][0];
1071*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].im =
1072*15dc779aSAndroid Build Coastguard Worker self->w_dir[0][ts][qs].im *
1073*15dc779aSAndroid Build Coastguard Worker self->r_out_re_in_m2[ts][indx][row][0];
1074*15dc779aSAndroid Build Coastguard Worker self->hyb_diff_out[row][ts][qs].re =
1075*15dc779aSAndroid Build Coastguard Worker self->w_diff[1][ts][qs].re *
1076*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][indx][row][1];
1077*15dc779aSAndroid Build Coastguard Worker self->hyb_diff_out[row][ts][qs].im =
1078*15dc779aSAndroid Build Coastguard Worker self->w_diff[1][ts][qs].im *
1079*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_re_in_m2[ts][indx][row][1];
1080*15dc779aSAndroid Build Coastguard Worker }
1081*15dc779aSAndroid Build Coastguard Worker }
1082*15dc779aSAndroid Build Coastguard Worker }
1083*15dc779aSAndroid Build Coastguard Worker }
1084*15dc779aSAndroid Build Coastguard Worker
1085*15dc779aSAndroid Build Coastguard Worker if (complex_m2) {
1086*15dc779aSAndroid Build Coastguard Worker if (phase_interpolation) {
1087*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < self->time_slots; ts++) {
1088*15dc779aSAndroid Build Coastguard Worker for (qs = 0; qs < 2; qs++) {
1089*15dc779aSAndroid Build Coastguard Worker WORD32 indx = self->hyb_band_to_processing_band_table[qs];
1090*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < self->out_ch_count; row++) {
1091*15dc779aSAndroid Build Coastguard Worker FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
1092*15dc779aSAndroid Build Coastguard Worker FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
1093*15dc779aSAndroid Build Coastguard Worker for (col = 0; col < num_col_iters; col++) {
1094*15dc779aSAndroid Build Coastguard Worker sum_re_dir += self->w_dir[col][ts][qs].im *
1095*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][indx][row][col];
1096*15dc779aSAndroid Build Coastguard Worker sum_im_dir -= self->w_dir[col][ts][qs].re *
1097*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][indx][row][col];
1098*15dc779aSAndroid Build Coastguard Worker }
1099*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
1100*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
1101*15dc779aSAndroid Build Coastguard Worker self->hyb_diff_out[row][ts][qs].re +=
1102*15dc779aSAndroid Build Coastguard Worker self->w_diff[1][ts][qs].im *
1103*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_im_in_m2[ts][indx][row][1];
1104*15dc779aSAndroid Build Coastguard Worker self->hyb_diff_out[row][ts][qs].im -=
1105*15dc779aSAndroid Build Coastguard Worker self->w_diff[1][ts][qs].re *
1106*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_im_in_m2[ts][indx][row][1];
1107*15dc779aSAndroid Build Coastguard Worker }
1108*15dc779aSAndroid Build Coastguard Worker }
1109*15dc779aSAndroid Build Coastguard Worker for (qs = 2; qs < self->hyb_band_count_max; qs++) {
1110*15dc779aSAndroid Build Coastguard Worker WORD32 indx = self->hyb_band_to_processing_band_table[qs];
1111*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < self->out_ch_count; row++) {
1112*15dc779aSAndroid Build Coastguard Worker FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
1113*15dc779aSAndroid Build Coastguard Worker FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
1114*15dc779aSAndroid Build Coastguard Worker for (col = 0; col < num_col_iters; col++) {
1115*15dc779aSAndroid Build Coastguard Worker sum_re_dir -= self->w_dir[col][ts][qs].im *
1116*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][indx][row][col];
1117*15dc779aSAndroid Build Coastguard Worker sum_im_dir += self->w_dir[col][ts][qs].re *
1118*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][indx][row][col];
1119*15dc779aSAndroid Build Coastguard Worker }
1120*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
1121*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
1122*15dc779aSAndroid Build Coastguard Worker self->hyb_diff_out[row][ts][qs].re -=
1123*15dc779aSAndroid Build Coastguard Worker self->w_diff[1][ts][qs].im *
1124*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_im_in_m2[ts][indx][row][1];
1125*15dc779aSAndroid Build Coastguard Worker self->hyb_diff_out[row][ts][qs].im +=
1126*15dc779aSAndroid Build Coastguard Worker self->w_diff[1][ts][qs].re *
1127*15dc779aSAndroid Build Coastguard Worker self->r_out_diff_im_in_m2[ts][indx][row][1];
1128*15dc779aSAndroid Build Coastguard Worker }
1129*15dc779aSAndroid Build Coastguard Worker }
1130*15dc779aSAndroid Build Coastguard Worker }
1131*15dc779aSAndroid Build Coastguard Worker } else {
1132*15dc779aSAndroid Build Coastguard Worker WORD32 num_cols = (self->dir_sig_count + self->decor_sig_count) > 1
1133*15dc779aSAndroid Build Coastguard Worker ? 1
1134*15dc779aSAndroid Build Coastguard Worker : (self->dir_sig_count + self->decor_sig_count);
1135*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < self->time_slots; ts++) {
1136*15dc779aSAndroid Build Coastguard Worker for (qs = 0; qs < 2; qs++) {
1137*15dc779aSAndroid Build Coastguard Worker WORD32 indx = self->hyb_band_to_processing_band_table[qs];
1138*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < self->out_ch_count; row++) {
1139*15dc779aSAndroid Build Coastguard Worker FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
1140*15dc779aSAndroid Build Coastguard Worker FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
1141*15dc779aSAndroid Build Coastguard Worker if (num_cols > 0) {
1142*15dc779aSAndroid Build Coastguard Worker sum_re_dir += self->w_dir[0][ts][qs].im *
1143*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][indx][row][0];
1144*15dc779aSAndroid Build Coastguard Worker sum_im_dir -= self->w_dir[0][ts][qs].re *
1145*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][indx][row][0];
1146*15dc779aSAndroid Build Coastguard Worker }
1147*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
1148*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
1149*15dc779aSAndroid Build Coastguard Worker }
1150*15dc779aSAndroid Build Coastguard Worker }
1151*15dc779aSAndroid Build Coastguard Worker for (qs = 2; qs < self->hyb_band_count_max; qs++) {
1152*15dc779aSAndroid Build Coastguard Worker WORD32 indx = self->hyb_band_to_processing_band_table[qs];
1153*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < self->out_ch_count; row++) {
1154*15dc779aSAndroid Build Coastguard Worker FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
1155*15dc779aSAndroid Build Coastguard Worker FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
1156*15dc779aSAndroid Build Coastguard Worker if (num_cols > 0) {
1157*15dc779aSAndroid Build Coastguard Worker sum_re_dir -= self->w_dir[0][ts][qs].im *
1158*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][indx][row][0];
1159*15dc779aSAndroid Build Coastguard Worker sum_im_dir += self->w_dir[0][ts][qs].re *
1160*15dc779aSAndroid Build Coastguard Worker self->r_out_im_in_m2[ts][indx][row][0];
1161*15dc779aSAndroid Build Coastguard Worker }
1162*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
1163*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
1164*15dc779aSAndroid Build Coastguard Worker }
1165*15dc779aSAndroid Build Coastguard Worker }
1166*15dc779aSAndroid Build Coastguard Worker }
1167*15dc779aSAndroid Build Coastguard Worker }
1168*15dc779aSAndroid Build Coastguard Worker }
1169*15dc779aSAndroid Build Coastguard Worker return;
1170*15dc779aSAndroid Build Coastguard Worker }
1171*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_upmix_interp(FLOAT32 m_matrix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT],FLOAT32 r_matrix_float[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT],FLOAT32 m_matrix_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT],WORD32 num_rows,WORD32 num_cols,ia_mps_dec_state_struct * self,WORD32 bs_high_rate_mode)1172*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_mps_upmix_interp(
1173*15dc779aSAndroid Build Coastguard Worker FLOAT32 m_matrix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT],
1174*15dc779aSAndroid Build Coastguard Worker FLOAT32 r_matrix_float[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT],
1175*15dc779aSAndroid Build Coastguard Worker FLOAT32 m_matrix_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT], WORD32 num_rows,
1176*15dc779aSAndroid Build Coastguard Worker WORD32 num_cols, ia_mps_dec_state_struct *self, WORD32 bs_high_rate_mode) {
1177*15dc779aSAndroid Build Coastguard Worker WORD32 ts, ps, pb, row, col, i;
1178*15dc779aSAndroid Build Coastguard Worker FLOAT32 ks, ms, ls;
1179*15dc779aSAndroid Build Coastguard Worker FLOAT32 fl_step, fl_base;
1180*15dc779aSAndroid Build Coastguard Worker
1181*15dc779aSAndroid Build Coastguard Worker for (pb = 0; pb < self->bs_param_bands; pb++) {
1182*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < num_rows; row++) {
1183*15dc779aSAndroid Build Coastguard Worker for (col = 0; col < num_cols; col++) {
1184*15dc779aSAndroid Build Coastguard Worker ts = 0;
1185*15dc779aSAndroid Build Coastguard Worker ps = 0;
1186*15dc779aSAndroid Build Coastguard Worker ks = self->inv_param_slot_diff[ps];
1187*15dc779aSAndroid Build Coastguard Worker ms = m_matrix[ps][pb][row][col];
1188*15dc779aSAndroid Build Coastguard Worker ls = m_matrix_prev[pb][row][col];
1189*15dc779aSAndroid Build Coastguard Worker fl_step = ks * (ms - ls);
1190*15dc779aSAndroid Build Coastguard Worker fl_base = ls + fl_step;
1191*15dc779aSAndroid Build Coastguard Worker
1192*15dc779aSAndroid Build Coastguard Worker for (i = 1; i <= (WORD32)self->param_slot_diff[0]; i++) {
1193*15dc779aSAndroid Build Coastguard Worker r_matrix_float[ts][pb][row][col] = fl_base;
1194*15dc779aSAndroid Build Coastguard Worker fl_base += fl_step;
1195*15dc779aSAndroid Build Coastguard Worker ts++;
1196*15dc779aSAndroid Build Coastguard Worker }
1197*15dc779aSAndroid Build Coastguard Worker if (bs_high_rate_mode) {
1198*15dc779aSAndroid Build Coastguard Worker for (ps = 1; ps < self->num_parameter_sets; ps++) {
1199*15dc779aSAndroid Build Coastguard Worker ks = self->inv_param_slot_diff[ps];
1200*15dc779aSAndroid Build Coastguard Worker ms = m_matrix[ps][pb][row][col];
1201*15dc779aSAndroid Build Coastguard Worker ls = m_matrix[ps - 1][pb][row][col];
1202*15dc779aSAndroid Build Coastguard Worker fl_step = ks * (ms - ls);
1203*15dc779aSAndroid Build Coastguard Worker fl_base = ls + fl_step;
1204*15dc779aSAndroid Build Coastguard Worker
1205*15dc779aSAndroid Build Coastguard Worker for (i = 1; i <= (WORD32)self->param_slot_diff[ps]; i++) {
1206*15dc779aSAndroid Build Coastguard Worker r_matrix_float[ts][pb][row][col] = fl_base;
1207*15dc779aSAndroid Build Coastguard Worker fl_base += fl_step;
1208*15dc779aSAndroid Build Coastguard Worker ts++;
1209*15dc779aSAndroid Build Coastguard Worker }
1210*15dc779aSAndroid Build Coastguard Worker }
1211*15dc779aSAndroid Build Coastguard Worker }
1212*15dc779aSAndroid Build Coastguard Worker }
1213*15dc779aSAndroid Build Coastguard Worker }
1214*15dc779aSAndroid Build Coastguard Worker }
1215*15dc779aSAndroid Build Coastguard Worker return;
1216*15dc779aSAndroid Build Coastguard Worker }
1217*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_upmix_interp_type1(FLOAT32 m_matrix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT],FLOAT32 r_matrix_float[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT],FLOAT32 m_matrix_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT],WORD32 num_rows,WORD32 num_cols,ia_mps_dec_state_struct * self,WORD32 bs_high_rate_mode)1218*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_mps_upmix_interp_type1(
1219*15dc779aSAndroid Build Coastguard Worker FLOAT32 m_matrix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT],
1220*15dc779aSAndroid Build Coastguard Worker FLOAT32 r_matrix_float[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT],
1221*15dc779aSAndroid Build Coastguard Worker FLOAT32 m_matrix_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT], WORD32 num_rows,
1222*15dc779aSAndroid Build Coastguard Worker WORD32 num_cols, ia_mps_dec_state_struct *self, WORD32 bs_high_rate_mode) {
1223*15dc779aSAndroid Build Coastguard Worker WORD32 ts, ps, pb, row, col, i;
1224*15dc779aSAndroid Build Coastguard Worker FLOAT32 ks, ms, ls;
1225*15dc779aSAndroid Build Coastguard Worker FLOAT32 fl_step, fl_base;
1226*15dc779aSAndroid Build Coastguard Worker
1227*15dc779aSAndroid Build Coastguard Worker for (pb = 0; pb < self->bs_param_bands; pb++) {
1228*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < num_rows; row++) {
1229*15dc779aSAndroid Build Coastguard Worker for (col = 0; col < num_cols; col++) {
1230*15dc779aSAndroid Build Coastguard Worker ts = 0;
1231*15dc779aSAndroid Build Coastguard Worker ps = 0;
1232*15dc779aSAndroid Build Coastguard Worker ks = self->inv_param_slot_diff[ps];
1233*15dc779aSAndroid Build Coastguard Worker ms = m_matrix[ps][pb][row][col];
1234*15dc779aSAndroid Build Coastguard Worker ls = m_matrix_prev[pb][row][col];
1235*15dc779aSAndroid Build Coastguard Worker fl_step = ks * (ms - ls);
1236*15dc779aSAndroid Build Coastguard Worker fl_base = ls + fl_step;
1237*15dc779aSAndroid Build Coastguard Worker
1238*15dc779aSAndroid Build Coastguard Worker for (i = 1; i <= (WORD32)self->param_slot_diff[0]; i++) {
1239*15dc779aSAndroid Build Coastguard Worker r_matrix_float[ts][pb][row][col] = fl_base;
1240*15dc779aSAndroid Build Coastguard Worker fl_base += fl_step;
1241*15dc779aSAndroid Build Coastguard Worker ts++;
1242*15dc779aSAndroid Build Coastguard Worker }
1243*15dc779aSAndroid Build Coastguard Worker if (bs_high_rate_mode) {
1244*15dc779aSAndroid Build Coastguard Worker for (ps = 1; ps < self->num_parameter_sets; ps++) {
1245*15dc779aSAndroid Build Coastguard Worker ks = self->inv_param_slot_diff[ps];
1246*15dc779aSAndroid Build Coastguard Worker ms = m_matrix[ps][pb][row][col];
1247*15dc779aSAndroid Build Coastguard Worker ls = m_matrix[ps - 1][pb][row][col];
1248*15dc779aSAndroid Build Coastguard Worker fl_step = ks * (ms - ls);
1249*15dc779aSAndroid Build Coastguard Worker fl_base = ls + fl_step;
1250*15dc779aSAndroid Build Coastguard Worker
1251*15dc779aSAndroid Build Coastguard Worker for (i = 1; i <= self->param_slot_diff[ps]; i++) {
1252*15dc779aSAndroid Build Coastguard Worker r_matrix_float[ts][pb][row][col] = fl_base;
1253*15dc779aSAndroid Build Coastguard Worker fl_base += fl_step;
1254*15dc779aSAndroid Build Coastguard Worker ts++;
1255*15dc779aSAndroid Build Coastguard Worker }
1256*15dc779aSAndroid Build Coastguard Worker }
1257*15dc779aSAndroid Build Coastguard Worker }
1258*15dc779aSAndroid Build Coastguard Worker }
1259*15dc779aSAndroid Build Coastguard Worker }
1260*15dc779aSAndroid Build Coastguard Worker }
1261*15dc779aSAndroid Build Coastguard Worker return;
1262*15dc779aSAndroid Build Coastguard Worker }
1263*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_upmix_interp_type2(FLOAT32 m_matrix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT],FLOAT32 r_matrix_float[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT],FLOAT32 m_matrix_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT],WORD32 num_rows,ia_mps_dec_state_struct * self,WORD32 col)1264*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_mps_upmix_interp_type2(
1265*15dc779aSAndroid Build Coastguard Worker FLOAT32 m_matrix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT],
1266*15dc779aSAndroid Build Coastguard Worker FLOAT32 r_matrix_float[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT],
1267*15dc779aSAndroid Build Coastguard Worker FLOAT32 m_matrix_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT], WORD32 num_rows,
1268*15dc779aSAndroid Build Coastguard Worker ia_mps_dec_state_struct *self, WORD32 col) {
1269*15dc779aSAndroid Build Coastguard Worker WORD32 ts, ps, pb, row, i;
1270*15dc779aSAndroid Build Coastguard Worker FLOAT32 ks, ms, ls;
1271*15dc779aSAndroid Build Coastguard Worker FLOAT32 fl_step, fl_base;
1272*15dc779aSAndroid Build Coastguard Worker
1273*15dc779aSAndroid Build Coastguard Worker for (pb = 0; pb < self->bs_param_bands; pb++) {
1274*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < num_rows; row++) {
1275*15dc779aSAndroid Build Coastguard Worker ts = 0;
1276*15dc779aSAndroid Build Coastguard Worker ps = 0;
1277*15dc779aSAndroid Build Coastguard Worker ks = self->inv_param_slot_diff[ps];
1278*15dc779aSAndroid Build Coastguard Worker ms = m_matrix[ps][pb][row][col];
1279*15dc779aSAndroid Build Coastguard Worker ls = m_matrix_prev[pb][row][col];
1280*15dc779aSAndroid Build Coastguard Worker fl_step = ks * (ms - ls);
1281*15dc779aSAndroid Build Coastguard Worker fl_base = ls + fl_step;
1282*15dc779aSAndroid Build Coastguard Worker
1283*15dc779aSAndroid Build Coastguard Worker for (i = 1; i <= (WORD32)self->param_slot_diff[0]; i++) {
1284*15dc779aSAndroid Build Coastguard Worker r_matrix_float[ts][pb][row][col] = fl_base;
1285*15dc779aSAndroid Build Coastguard Worker fl_base += fl_step;
1286*15dc779aSAndroid Build Coastguard Worker ts++;
1287*15dc779aSAndroid Build Coastguard Worker }
1288*15dc779aSAndroid Build Coastguard Worker for (ps = 1; ps < self->num_parameter_sets; ps++) {
1289*15dc779aSAndroid Build Coastguard Worker ks = self->inv_param_slot_diff[ps];
1290*15dc779aSAndroid Build Coastguard Worker ms = m_matrix[ps][pb][row][col];
1291*15dc779aSAndroid Build Coastguard Worker ls = m_matrix[ps - 1][pb][row][col];
1292*15dc779aSAndroid Build Coastguard Worker fl_step = ks * (ms - ls);
1293*15dc779aSAndroid Build Coastguard Worker fl_base = ls + fl_step;
1294*15dc779aSAndroid Build Coastguard Worker
1295*15dc779aSAndroid Build Coastguard Worker for (i = 1; i <= (WORD32)self->param_slot_diff[ps]; i++) {
1296*15dc779aSAndroid Build Coastguard Worker r_matrix_float[ts][pb][row][col] = fl_base;
1297*15dc779aSAndroid Build Coastguard Worker fl_base += fl_step;
1298*15dc779aSAndroid Build Coastguard Worker ts++;
1299*15dc779aSAndroid Build Coastguard Worker }
1300*15dc779aSAndroid Build Coastguard Worker }
1301*15dc779aSAndroid Build Coastguard Worker }
1302*15dc779aSAndroid Build Coastguard Worker }
1303*15dc779aSAndroid Build Coastguard Worker return;
1304*15dc779aSAndroid Build Coastguard Worker }
1305*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_angle_interpolation(FLOAT32 angle1,FLOAT32 angle2,FLOAT32 alpha,FLOAT32 * step)1306*15dc779aSAndroid Build Coastguard Worker static FLOAT32 ixheaacd_mps_angle_interpolation(FLOAT32 angle1, FLOAT32 angle2,
1307*15dc779aSAndroid Build Coastguard Worker FLOAT32 alpha, FLOAT32 *step) {
1308*15dc779aSAndroid Build Coastguard Worker while (angle2 - angle1 > (FLOAT32)P_PI) {
1309*15dc779aSAndroid Build Coastguard Worker angle1 = angle1 + 2.0f * (FLOAT32)P_PI;
1310*15dc779aSAndroid Build Coastguard Worker }
1311*15dc779aSAndroid Build Coastguard Worker while (angle1 - angle2 > (FLOAT32)P_PI) {
1312*15dc779aSAndroid Build Coastguard Worker angle2 = angle2 + 2.0f * (FLOAT32)P_PI;
1313*15dc779aSAndroid Build Coastguard Worker }
1314*15dc779aSAndroid Build Coastguard Worker *step = angle2 - angle1;
1315*15dc779aSAndroid Build Coastguard Worker return (1 - alpha) * angle1 + alpha * angle2;
1316*15dc779aSAndroid Build Coastguard Worker }
1317*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_phase_interpolation(FLOAT32 pl[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS],FLOAT32 pr[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS],FLOAT32 pl_prev[MAX_PARAMETER_BANDS],FLOAT32 pr_prev[MAX_PARAMETER_BANDS],FLOAT32 r_re[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][2],FLOAT32 r_im[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][2],ia_mps_dec_state_struct * self)1318*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_mps_phase_interpolation(
1319*15dc779aSAndroid Build Coastguard Worker FLOAT32 pl[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS],
1320*15dc779aSAndroid Build Coastguard Worker FLOAT32 pr[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS],
1321*15dc779aSAndroid Build Coastguard Worker FLOAT32 pl_prev[MAX_PARAMETER_BANDS], FLOAT32 pr_prev[MAX_PARAMETER_BANDS],
1322*15dc779aSAndroid Build Coastguard Worker FLOAT32 r_re[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][2],
1323*15dc779aSAndroid Build Coastguard Worker FLOAT32 r_im[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][2],
1324*15dc779aSAndroid Build Coastguard Worker ia_mps_dec_state_struct *self) {
1325*15dc779aSAndroid Build Coastguard Worker WORD32 i, ts, ps, pb;
1326*15dc779aSAndroid Build Coastguard Worker FLOAT32 step_l, step_r, alpha, tl, tr;
1327*15dc779aSAndroid Build Coastguard Worker for (pb = 0; pb < self->bs_param_bands; pb++) {
1328*15dc779aSAndroid Build Coastguard Worker ps = 0;
1329*15dc779aSAndroid Build Coastguard Worker ts = 0;
1330*15dc779aSAndroid Build Coastguard Worker alpha = (FLOAT32)self->inv_param_slot_diff[ps];
1331*15dc779aSAndroid Build Coastguard Worker tl = ixheaacd_mps_angle_interpolation(pl_prev[pb], pl[ps][pb], alpha,
1332*15dc779aSAndroid Build Coastguard Worker &step_l);
1333*15dc779aSAndroid Build Coastguard Worker tr = ixheaacd_mps_angle_interpolation(pr_prev[pb], pr[ps][pb], alpha,
1334*15dc779aSAndroid Build Coastguard Worker &step_r);
1335*15dc779aSAndroid Build Coastguard Worker step_l *= alpha;
1336*15dc779aSAndroid Build Coastguard Worker step_r *= alpha;
1337*15dc779aSAndroid Build Coastguard Worker
1338*15dc779aSAndroid Build Coastguard Worker for (i = 1; i <= self->param_slot_diff[ps]; i++) {
1339*15dc779aSAndroid Build Coastguard Worker r_re[ts][pb][0] = (FLOAT32)cos(tl);
1340*15dc779aSAndroid Build Coastguard Worker r_im[ts][pb][0] = (FLOAT32)sin(tl);
1341*15dc779aSAndroid Build Coastguard Worker tl += step_l;
1342*15dc779aSAndroid Build Coastguard Worker
1343*15dc779aSAndroid Build Coastguard Worker r_re[ts][pb][1] = (FLOAT32)cos(tr);
1344*15dc779aSAndroid Build Coastguard Worker r_im[ts][pb][1] = (FLOAT32)sin(tr);
1345*15dc779aSAndroid Build Coastguard Worker tr += step_r;
1346*15dc779aSAndroid Build Coastguard Worker ts++;
1347*15dc779aSAndroid Build Coastguard Worker }
1348*15dc779aSAndroid Build Coastguard Worker
1349*15dc779aSAndroid Build Coastguard Worker for (ps = 1; ps < self->num_parameter_sets; ps++) {
1350*15dc779aSAndroid Build Coastguard Worker FLOAT32 alpha = self->inv_param_slot_diff[ps];
1351*15dc779aSAndroid Build Coastguard Worker tl = ixheaacd_mps_angle_interpolation(pl[ps - 1][pb], pl[ps][pb], alpha,
1352*15dc779aSAndroid Build Coastguard Worker &step_l);
1353*15dc779aSAndroid Build Coastguard Worker tr = ixheaacd_mps_angle_interpolation(pr[ps - 1][pb], pr[ps][pb], alpha,
1354*15dc779aSAndroid Build Coastguard Worker &step_r);
1355*15dc779aSAndroid Build Coastguard Worker step_l *= alpha;
1356*15dc779aSAndroid Build Coastguard Worker step_r *= alpha;
1357*15dc779aSAndroid Build Coastguard Worker for (i = 1; i <= self->param_slot_diff[ps]; i++) {
1358*15dc779aSAndroid Build Coastguard Worker if (ts < 72 && pb < 28) {
1359*15dc779aSAndroid Build Coastguard Worker r_re[ts][pb][0] = (FLOAT32)cos(tl);
1360*15dc779aSAndroid Build Coastguard Worker r_im[ts][pb][0] = (FLOAT32)sin(tl);
1361*15dc779aSAndroid Build Coastguard Worker tl += step_l;
1362*15dc779aSAndroid Build Coastguard Worker
1363*15dc779aSAndroid Build Coastguard Worker r_re[ts][pb][1] = (FLOAT32)cos(tr);
1364*15dc779aSAndroid Build Coastguard Worker r_im[ts][pb][1] = (FLOAT32)sin(tr);
1365*15dc779aSAndroid Build Coastguard Worker tr += step_r;
1366*15dc779aSAndroid Build Coastguard Worker }
1367*15dc779aSAndroid Build Coastguard Worker ts++;
1368*15dc779aSAndroid Build Coastguard Worker
1369*15dc779aSAndroid Build Coastguard Worker if (ts > 71) {
1370*15dc779aSAndroid Build Coastguard Worker ts = 0;
1371*15dc779aSAndroid Build Coastguard Worker break;
1372*15dc779aSAndroid Build Coastguard Worker }
1373*15dc779aSAndroid Build Coastguard Worker if (pb > 27) {
1374*15dc779aSAndroid Build Coastguard Worker pb = 0;
1375*15dc779aSAndroid Build Coastguard Worker break;
1376*15dc779aSAndroid Build Coastguard Worker }
1377*15dc779aSAndroid Build Coastguard Worker }
1378*15dc779aSAndroid Build Coastguard Worker }
1379*15dc779aSAndroid Build Coastguard Worker }
1380*15dc779aSAndroid Build Coastguard Worker }
1381*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_init_pre_and_post_matrix(ia_mps_dec_state_struct * self)1382*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_mps_init_pre_and_post_matrix(ia_mps_dec_state_struct *self) {
1383*15dc779aSAndroid Build Coastguard Worker memset(self->m1_param_re_prev, 0,
1384*15dc779aSAndroid Build Coastguard Worker MAX_PARAMETER_BANDS * MAX_M_OUTPUT * MAX_M_INPUT * sizeof(WORD32));
1385*15dc779aSAndroid Build Coastguard Worker memset(self->m1_param_im_prev, 0,
1386*15dc779aSAndroid Build Coastguard Worker MAX_PARAMETER_BANDS * MAX_M_OUTPUT * MAX_M_INPUT * sizeof(WORD32));
1387*15dc779aSAndroid Build Coastguard Worker memset(self->m1_param_re_prev, 0,
1388*15dc779aSAndroid Build Coastguard Worker MAX_PARAMETER_BANDS * MAX_M_OUTPUT * MAX_M_INPUT * sizeof(WORD32));
1389*15dc779aSAndroid Build Coastguard Worker memset(self->m2_decor_re_prev, 0,
1390*15dc779aSAndroid Build Coastguard Worker MAX_PARAMETER_BANDS * MAX_M_OUTPUT * MAX_M_INPUT * sizeof(WORD32));
1391*15dc779aSAndroid Build Coastguard Worker memset(self->m2_resid_re_prev, 0,
1392*15dc779aSAndroid Build Coastguard Worker MAX_PARAMETER_BANDS * MAX_M_OUTPUT * MAX_M_INPUT * sizeof(WORD32));
1393*15dc779aSAndroid Build Coastguard Worker memset(self->m2_resid_im_prev, 0,
1394*15dc779aSAndroid Build Coastguard Worker MAX_PARAMETER_BANDS * MAX_M_OUTPUT * MAX_M_INPUT * sizeof(WORD32));
1395*15dc779aSAndroid Build Coastguard Worker }
1396