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 "ixheaac_type_def.h"
22*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_common_rom.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecsettings.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_scale.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr_part.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_rom.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_config.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_hybrid.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ps_dec.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_qmf_dec.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_polyphase.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_struct_def.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_res_rom.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_aac_struct.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_dec.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_process.h"
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_lpp_tran.h"
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr.h"
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_calc.h"
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_sbr_const.h"
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pvc_dec.h"
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_dec.h"
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_audioobjtypes.h"
46*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
47*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
48*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_bitdec.h"
49*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_macro_def.h"
50*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_get_index.h"
51*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_basic_op.h"
52*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_tp_process.h"
53*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_error_codes.h"
54*15dc779aSAndroid Build Coastguard Worker #define HP_SIZE (9)
55*15dc779aSAndroid Build Coastguard Worker
56*15dc779aSAndroid Build Coastguard Worker #define STP_LPF_COEFF1 (0.950f)
57*15dc779aSAndroid Build Coastguard Worker #define STP_LPF_COEFF2 (0.450f)
58*15dc779aSAndroid Build Coastguard Worker #define STP_UPDATE_ENERGY_RATE (32)
59*15dc779aSAndroid Build Coastguard Worker #define STP_SCALE_LIMIT (2.82f)
60*15dc779aSAndroid Build Coastguard Worker #define STP_DAMP (0.1f)
61*15dc779aSAndroid Build Coastguard Worker
62*15dc779aSAndroid Build Coastguard Worker static const FLOAT32 ixheaacd_bp[BP_SIZE] = {
63*15dc779aSAndroid Build Coastguard Worker 0.0000f, 0.0005f, 0.0092f, 0.0587f, 0.2580f, 0.7392f, 0.9791f,
64*15dc779aSAndroid Build Coastguard Worker 0.9993f, 1.0000f, 1.0000f, 1.0000f, 1.0000f, 0.9999f, 0.9984f,
65*15dc779aSAndroid Build Coastguard Worker 0.9908f, 0.9639f, 0.8952f, 0.7711f, 0.6127f, 0.4609f, 0.3391f,
66*15dc779aSAndroid Build Coastguard Worker 0.2493f, 0.1848f, 0.1387f, 0.1053f};
67*15dc779aSAndroid Build Coastguard Worker
68*15dc779aSAndroid Build Coastguard Worker static const FLOAT32 ixheaacd_gf[BP_SIZE] = {
69*15dc779aSAndroid Build Coastguard Worker 0.f, 0.f, 0.f, 0.f, 0.f,
70*15dc779aSAndroid Build Coastguard Worker 0.f, 1e-008f, 8.1e-007f, 3.61e-006f, 8.41e-006f,
71*15dc779aSAndroid Build Coastguard Worker 1.6e-005f, 2.704e-005f, 3.969e-005f, 5.625e-005f, 7.396e-005f,
72*15dc779aSAndroid Build Coastguard Worker 9.801e-005f, 0.00012321f, 0.00015625f, 0.00019881f, 0.00024964f,
73*15dc779aSAndroid Build Coastguard Worker 0.00032041f, 0.00041209f, 0.00053824f, 0.00070756f, 0.00094249f};
74*15dc779aSAndroid Build Coastguard Worker
75*15dc779aSAndroid Build Coastguard Worker extern const WORD32 ixheaacd_mps_gain_set_indx[29];
76*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_temp_process_scale_calc(ia_mps_dec_state_struct * self,WORD32 ts,FLOAT32 * scale)77*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_mps_temp_process_scale_calc(ia_mps_dec_state_struct* self,
78*15dc779aSAndroid Build Coastguard Worker WORD32 ts, FLOAT32* scale) {
79*15dc779aSAndroid Build Coastguard Worker FLOAT32 dir_energy;
80*15dc779aSAndroid Build Coastguard Worker FLOAT32 diff_energy[2];
81*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp;
82*15dc779aSAndroid Build Coastguard Worker
83*15dc779aSAndroid Build Coastguard Worker WORD32 ch, n;
84*15dc779aSAndroid Build Coastguard Worker WORD32 left_ch = 0, right_ch = 1;
85*15dc779aSAndroid Build Coastguard Worker
86*15dc779aSAndroid Build Coastguard Worker if (self->subband_var.init_flag == 0) {
87*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < 2; ch++) {
88*15dc779aSAndroid Build Coastguard Worker self->subband_var.tp_scale_last[ch] = 1.0f;
89*15dc779aSAndroid Build Coastguard Worker self->subband_var.nrg_diff_prev[ch] = 32768 * 32768;
90*15dc779aSAndroid Build Coastguard Worker }
91*15dc779aSAndroid Build Coastguard Worker
92*15dc779aSAndroid Build Coastguard Worker self->subband_var.nrg_dir_prev = 32768 * 32768;
93*15dc779aSAndroid Build Coastguard Worker self->subband_var.init_flag = 1;
94*15dc779aSAndroid Build Coastguard Worker }
95*15dc779aSAndroid Build Coastguard Worker
96*15dc779aSAndroid Build Coastguard Worker if (self->subband_var.update_old_ener == STP_UPDATE_ENERGY_RATE) {
97*15dc779aSAndroid Build Coastguard Worker self->subband_var.update_old_ener = 1;
98*15dc779aSAndroid Build Coastguard Worker self->subband_var.nrg_dir_prev = self->subband_var.nrg_dir;
99*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < self->out_ch_count; ch++)
100*15dc779aSAndroid Build Coastguard Worker self->subband_var.nrg_diff_prev[ch] = self->subband_var.nrg_diff[ch];
101*15dc779aSAndroid Build Coastguard Worker } else
102*15dc779aSAndroid Build Coastguard Worker self->subband_var.update_old_ener++;
103*15dc779aSAndroid Build Coastguard Worker
104*15dc779aSAndroid Build Coastguard Worker dir_energy = 0;
105*15dc779aSAndroid Build Coastguard Worker
106*15dc779aSAndroid Build Coastguard Worker for (n = 6; n < BP_SIZE; n++) {
107*15dc779aSAndroid Build Coastguard Worker FLOAT32 dir_left_re = self->hyb_dir_out[left_ch][ts][n + 7].re;
108*15dc779aSAndroid Build Coastguard Worker FLOAT32 dir_right_re = self->hyb_dir_out[right_ch][ts][n + 7].re;
109*15dc779aSAndroid Build Coastguard Worker FLOAT32 dir_left_im = self->hyb_dir_out[left_ch][ts][n + 7].im;
110*15dc779aSAndroid Build Coastguard Worker FLOAT32 dir_right_im = self->hyb_dir_out[right_ch][ts][n + 7].im;
111*15dc779aSAndroid Build Coastguard Worker
112*15dc779aSAndroid Build Coastguard Worker temp = ((dir_left_re + dir_right_re) * (dir_left_re + dir_right_re)) +
113*15dc779aSAndroid Build Coastguard Worker ((dir_left_im + dir_right_im) * (dir_left_im + dir_right_im));
114*15dc779aSAndroid Build Coastguard Worker dir_energy += temp * ixheaacd_bp[n] * ixheaacd_bp[n] * ixheaacd_gf[n] *
115*15dc779aSAndroid Build Coastguard Worker ixheaacd_gf[n];
116*15dc779aSAndroid Build Coastguard Worker }
117*15dc779aSAndroid Build Coastguard Worker
118*15dc779aSAndroid Build Coastguard Worker self->subband_var.nrg_dir =
119*15dc779aSAndroid Build Coastguard Worker (FLOAT32)(STP_LPF_COEFF1 * self->subband_var.nrg_dir +
120*15dc779aSAndroid Build Coastguard Worker (1.0 - STP_LPF_COEFF1) * dir_energy);
121*15dc779aSAndroid Build Coastguard Worker
122*15dc779aSAndroid Build Coastguard Worker dir_energy /= (self->subband_var.nrg_dir_prev + ABS_THR);
123*15dc779aSAndroid Build Coastguard Worker
124*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < self->out_ch_count; ch++) {
125*15dc779aSAndroid Build Coastguard Worker diff_energy[ch] = 0;
126*15dc779aSAndroid Build Coastguard Worker for (n = 6; n < BP_SIZE; n++) {
127*15dc779aSAndroid Build Coastguard Worker FLOAT32 diff_re = self->hyb_diff_out[ch][ts][n + 7].re;
128*15dc779aSAndroid Build Coastguard Worker FLOAT32 diff_im = self->hyb_diff_out[ch][ts][n + 7].im;
129*15dc779aSAndroid Build Coastguard Worker
130*15dc779aSAndroid Build Coastguard Worker temp = (diff_re * diff_re) + (diff_im * diff_im);
131*15dc779aSAndroid Build Coastguard Worker diff_energy[ch] += temp * ixheaacd_bp[n] * ixheaacd_bp[n] *
132*15dc779aSAndroid Build Coastguard Worker ixheaacd_gf[n] * ixheaacd_gf[n];
133*15dc779aSAndroid Build Coastguard Worker }
134*15dc779aSAndroid Build Coastguard Worker
135*15dc779aSAndroid Build Coastguard Worker self->subband_var.nrg_diff[ch] =
136*15dc779aSAndroid Build Coastguard Worker (FLOAT32)(STP_LPF_COEFF1 * self->subband_var.nrg_diff[ch] +
137*15dc779aSAndroid Build Coastguard Worker (1.0 - STP_LPF_COEFF1) * diff_energy[ch]);
138*15dc779aSAndroid Build Coastguard Worker diff_energy[ch] /= (self->subband_var.nrg_diff_prev[ch] + ABS_THR);
139*15dc779aSAndroid Build Coastguard Worker }
140*15dc779aSAndroid Build Coastguard Worker
141*15dc779aSAndroid Build Coastguard Worker scale[left_ch] = (FLOAT32)sqrt((dir_energy) / (diff_energy[left_ch] + 1e-9));
142*15dc779aSAndroid Build Coastguard Worker scale[right_ch] =
143*15dc779aSAndroid Build Coastguard Worker (FLOAT32)sqrt((dir_energy) / (diff_energy[right_ch] + 1e-9));
144*15dc779aSAndroid Build Coastguard Worker
145*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < self->out_ch_count; ch++) {
146*15dc779aSAndroid Build Coastguard Worker scale[ch] = STP_DAMP + (1 - STP_DAMP) * scale[ch];
147*15dc779aSAndroid Build Coastguard Worker }
148*15dc779aSAndroid Build Coastguard Worker
149*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < self->out_ch_count; ch++) {
150*15dc779aSAndroid Build Coastguard Worker scale[ch] =
151*15dc779aSAndroid Build Coastguard Worker min(max(scale[ch], (FLOAT32)(1.0 / STP_SCALE_LIMIT)), STP_SCALE_LIMIT);
152*15dc779aSAndroid Build Coastguard Worker }
153*15dc779aSAndroid Build Coastguard Worker
154*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < self->out_ch_count; ch++) {
155*15dc779aSAndroid Build Coastguard Worker scale[ch] =
156*15dc779aSAndroid Build Coastguard Worker (FLOAT32)(STP_LPF_COEFF2 * scale[ch] +
157*15dc779aSAndroid Build Coastguard Worker (1.0 - STP_LPF_COEFF2) * self->subband_var.tp_scale_last[ch]);
158*15dc779aSAndroid Build Coastguard Worker self->subband_var.tp_scale_last[ch] = scale[ch];
159*15dc779aSAndroid Build Coastguard Worker }
160*15dc779aSAndroid Build Coastguard Worker }
161*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_subbandtp(ia_mps_dec_state_struct * self,WORD32 ts)162*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_mps_subbandtp(ia_mps_dec_state_struct* self, WORD32 ts) {
163*15dc779aSAndroid Build Coastguard Worker FLOAT32 scale[2];
164*15dc779aSAndroid Build Coastguard Worker WORD32 ch, n;
165*15dc779aSAndroid Build Coastguard Worker WORD32 no_scaling;
166*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp;
167*15dc779aSAndroid Build Coastguard Worker const WORD32 ixheaacd_hybrid_to_qmf_map[] = {0, 0, 0, 0, 0, 0, 1, 1, 2, 2};
168*15dc779aSAndroid Build Coastguard Worker const WORD32 ixheaacd_hybrid_to_qmf_map_ldmps[] = {0, 1, 2};
169*15dc779aSAndroid Build Coastguard Worker const WORD32* ptr_ixheaacd_hybrid_to_qmf_map;
170*15dc779aSAndroid Build Coastguard Worker WORD32 loop_counter = 0;
171*15dc779aSAndroid Build Coastguard Worker
172*15dc779aSAndroid Build Coastguard Worker if (self->ldmps_config.ldmps_present_flag) {
173*15dc779aSAndroid Build Coastguard Worker ptr_ixheaacd_hybrid_to_qmf_map = ixheaacd_hybrid_to_qmf_map_ldmps;
174*15dc779aSAndroid Build Coastguard Worker loop_counter = 3;
175*15dc779aSAndroid Build Coastguard Worker } else {
176*15dc779aSAndroid Build Coastguard Worker ptr_ixheaacd_hybrid_to_qmf_map = ixheaacd_hybrid_to_qmf_map;
177*15dc779aSAndroid Build Coastguard Worker loop_counter = 10;
178*15dc779aSAndroid Build Coastguard Worker }
179*15dc779aSAndroid Build Coastguard Worker
180*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_temp_process_scale_calc(self, ts, scale);
181*15dc779aSAndroid Build Coastguard Worker
182*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < self->out_ch_count; ch++) {
183*15dc779aSAndroid Build Coastguard Worker no_scaling = 1;
184*15dc779aSAndroid Build Coastguard Worker
185*15dc779aSAndroid Build Coastguard Worker if ((self->config->bs_temp_shape_config == 1) ||
186*15dc779aSAndroid Build Coastguard Worker (self->config->bs_temp_shape_config == 2))
187*15dc779aSAndroid Build Coastguard Worker no_scaling = !self->temp_shape_enable_ch_stp[ch];
188*15dc779aSAndroid Build Coastguard Worker
189*15dc779aSAndroid Build Coastguard Worker if (no_scaling == 1) {
190*15dc779aSAndroid Build Coastguard Worker for (n = 0; n < self->hyb_band_count_max; n++) {
191*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[ch][ts][n].re += self->hyb_diff_out[ch][ts][n].re;
192*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[ch][ts][n].im += self->hyb_diff_out[ch][ts][n].im;
193*15dc779aSAndroid Build Coastguard Worker }
194*15dc779aSAndroid Build Coastguard Worker } else {
195*15dc779aSAndroid Build Coastguard Worker if (self->ldmps_config.ldmps_present_flag) {
196*15dc779aSAndroid Build Coastguard Worker for (n = 0; n < 3; n++) {
197*15dc779aSAndroid Build Coastguard Worker temp = (FLOAT32)(scale[ch] *
198*15dc779aSAndroid Build Coastguard Worker ixheaacd_bp[ptr_ixheaacd_hybrid_to_qmf_map[n]]);
199*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[ch][ts][n].re +=
200*15dc779aSAndroid Build Coastguard Worker (self->hyb_diff_out[ch][ts][n].re * temp);
201*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[ch][ts][n].im +=
202*15dc779aSAndroid Build Coastguard Worker (self->hyb_diff_out[ch][ts][n].im * temp);
203*15dc779aSAndroid Build Coastguard Worker }
204*15dc779aSAndroid Build Coastguard Worker } else {
205*15dc779aSAndroid Build Coastguard Worker for (n = 0; n < loop_counter; n++) {
206*15dc779aSAndroid Build Coastguard Worker temp = (FLOAT32)(scale[ch] *
207*15dc779aSAndroid Build Coastguard Worker ixheaacd_bp[ptr_ixheaacd_hybrid_to_qmf_map[n]]);
208*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[ch][ts][n].re +=
209*15dc779aSAndroid Build Coastguard Worker (self->hyb_diff_out[ch][ts][n].re * temp);
210*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[ch][ts][n].im +=
211*15dc779aSAndroid Build Coastguard Worker (self->hyb_diff_out[ch][ts][n].im * temp);
212*15dc779aSAndroid Build Coastguard Worker }
213*15dc779aSAndroid Build Coastguard Worker }
214*15dc779aSAndroid Build Coastguard Worker for (n = 7; n < HP_SIZE - 3 + 10; n++) {
215*15dc779aSAndroid Build Coastguard Worker temp = (FLOAT32)(scale[ch] * ixheaacd_bp[n + 3 - 10]);
216*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[ch][ts][n].re +=
217*15dc779aSAndroid Build Coastguard Worker (self->hyb_diff_out[ch][ts][n].re * temp);
218*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[ch][ts][n].im +=
219*15dc779aSAndroid Build Coastguard Worker (self->hyb_diff_out[ch][ts][n].im * temp);
220*15dc779aSAndroid Build Coastguard Worker }
221*15dc779aSAndroid Build Coastguard Worker for (; n < self->hyb_band_count_max; n++) {
222*15dc779aSAndroid Build Coastguard Worker temp = (FLOAT32)(scale[ch]);
223*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[ch][ts][n].re +=
224*15dc779aSAndroid Build Coastguard Worker (self->hyb_diff_out[ch][ts][n].re * temp);
225*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[ch][ts][n].im +=
226*15dc779aSAndroid Build Coastguard Worker (self->hyb_diff_out[ch][ts][n].im * temp);
227*15dc779aSAndroid Build Coastguard Worker }
228*15dc779aSAndroid Build Coastguard Worker }
229*15dc779aSAndroid Build Coastguard Worker }
230*15dc779aSAndroid Build Coastguard Worker }
231*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_temp_process(ia_mps_dec_state_struct * self)232*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_mps_temp_process(ia_mps_dec_state_struct* self) {
233*15dc779aSAndroid Build Coastguard Worker WORD32 ch, ts, hyb;
234*15dc779aSAndroid Build Coastguard Worker WORD32 err = 0;
235*15dc779aSAndroid Build Coastguard Worker ia_sbr_frame_info_data_struct* ptr_frame_data =
236*15dc779aSAndroid Build Coastguard Worker (ia_sbr_frame_info_data_struct*)self->p_sbr_frame[0];
237*15dc779aSAndroid Build Coastguard Worker if (self->res_bands != 28) {
238*15dc779aSAndroid Build Coastguard Worker if (self->config->bs_temp_shape_config == 1) {
239*15dc779aSAndroid Build Coastguard Worker WORD32 dif_s = ((self->res_bands == 0)
240*15dc779aSAndroid Build Coastguard Worker ? 0
241*15dc779aSAndroid Build Coastguard Worker : ixheaacd_mps_gain_set_indx[self->res_bands]);
242*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < self->out_ch_count; ch++) {
243*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < self->time_slots; ts++) {
244*15dc779aSAndroid Build Coastguard Worker for (hyb = dif_s; hyb < HYBRID_BAND_BORDER; hyb++) {
245*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[ch][ts][hyb].re +=
246*15dc779aSAndroid Build Coastguard Worker self->hyb_diff_out[ch][ts][hyb].re;
247*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[ch][ts][hyb].im +=
248*15dc779aSAndroid Build Coastguard Worker self->hyb_diff_out[ch][ts][hyb].im;
249*15dc779aSAndroid Build Coastguard Worker self->hyb_diff_out[ch][ts][hyb].re = 0;
250*15dc779aSAndroid Build Coastguard Worker self->hyb_diff_out[ch][ts][hyb].im = 0;
251*15dc779aSAndroid Build Coastguard Worker }
252*15dc779aSAndroid Build Coastguard Worker }
253*15dc779aSAndroid Build Coastguard Worker }
254*15dc779aSAndroid Build Coastguard Worker
255*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < self->time_slots; ts++)
256*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_subbandtp(self, ts);
257*15dc779aSAndroid Build Coastguard Worker
258*15dc779aSAndroid Build Coastguard Worker } else {
259*15dc779aSAndroid Build Coastguard Worker WORD32 dif_s = ((self->res_bands == 0)
260*15dc779aSAndroid Build Coastguard Worker ? 0
261*15dc779aSAndroid Build Coastguard Worker : ixheaacd_mps_gain_set_indx[self->res_bands]);
262*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < self->out_ch_count; ch++) {
263*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < self->time_slots; ts++) {
264*15dc779aSAndroid Build Coastguard Worker for (hyb = dif_s; hyb < self->hyb_band_count_max; hyb++) {
265*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[ch][ts][hyb].re +=
266*15dc779aSAndroid Build Coastguard Worker self->hyb_diff_out[ch][ts][hyb].re;
267*15dc779aSAndroid Build Coastguard Worker self->hyb_dir_out[ch][ts][hyb].im +=
268*15dc779aSAndroid Build Coastguard Worker self->hyb_diff_out[ch][ts][hyb].im;
269*15dc779aSAndroid Build Coastguard Worker }
270*15dc779aSAndroid Build Coastguard Worker }
271*15dc779aSAndroid Build Coastguard Worker }
272*15dc779aSAndroid Build Coastguard Worker }
273*15dc779aSAndroid Build Coastguard Worker }
274*15dc779aSAndroid Build Coastguard Worker
275*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_qmf_hyb_synthesis(self);
276*15dc779aSAndroid Build Coastguard Worker
277*15dc779aSAndroid Build Coastguard Worker if (self->ldmps_config.ldmps_present_flag != 1) {
278*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < self->out_ch_count; ch++) {
279*15dc779aSAndroid Build Coastguard Worker err =
280*15dc779aSAndroid Build Coastguard Worker ixheaacd_sbr_dec_from_mps(&self->qmf_out_dir[ch][0][0].re, self->p_sbr_dec[ch],
281*15dc779aSAndroid Build Coastguard Worker self->p_sbr_frame[ch], self->p_sbr_header[ch], self->ec_flag);
282*15dc779aSAndroid Build Coastguard Worker if (err) return err;
283*15dc779aSAndroid Build Coastguard Worker }
284*15dc779aSAndroid Build Coastguard Worker }
285*15dc779aSAndroid Build Coastguard Worker
286*15dc779aSAndroid Build Coastguard Worker if (self->object_type == AOT_ER_AAC_ELD || self->object_type == AOT_ER_AAC_LD)
287*15dc779aSAndroid Build Coastguard Worker self->synth_count = self->hyb_band_count[0];
288*15dc779aSAndroid Build Coastguard Worker else
289*15dc779aSAndroid Build Coastguard Worker {
290*15dc779aSAndroid Build Coastguard Worker if (ptr_frame_data->mps_sbr_flag) {
291*15dc779aSAndroid Build Coastguard Worker self->synth_count =
292*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->pstr_sbr_header->pstr_freq_band_data->sub_band_end;
293*15dc779aSAndroid Build Coastguard Worker }
294*15dc779aSAndroid Build Coastguard Worker else {
295*15dc779aSAndroid Build Coastguard Worker self->synth_count = self->band_count[0];
296*15dc779aSAndroid Build Coastguard Worker }
297*15dc779aSAndroid Build Coastguard Worker }
298*15dc779aSAndroid Build Coastguard Worker
299*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_synt_calc(self);
300*15dc779aSAndroid Build Coastguard Worker return err;
301*15dc779aSAndroid Build Coastguard Worker }
302*15dc779aSAndroid Build Coastguard Worker
ixheaacd_subband_tp(ia_heaac_mps_state_struct * pstr_mps_state,WORD32 ts)303*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_subband_tp(ia_heaac_mps_state_struct *pstr_mps_state, WORD32 ts) {
304*15dc779aSAndroid Build Coastguard Worker ia_mps_dec_tp_process_tables_struct *tp_process_table_ptr =
305*15dc779aSAndroid Build Coastguard Worker pstr_mps_state->ia_mps_dec_mps_table.tp_process_table_ptr;
306*15dc779aSAndroid Build Coastguard Worker const WORD32 *sqrt_tab =
307*15dc779aSAndroid Build Coastguard Worker pstr_mps_state->ia_mps_dec_mps_table.common_table_ptr->sqrt_tab;
308*15dc779aSAndroid Build Coastguard Worker ia_mps_dec_subband_tp_params_struct *sub_band_tp =
309*15dc779aSAndroid Build Coastguard Worker pstr_mps_state->mps_persistent_mem.sub_band_params;
310*15dc779aSAndroid Build Coastguard Worker ia_mps_dec_reuse_array_struct *p_array_struct = pstr_mps_state->array_struct;
311*15dc779aSAndroid Build Coastguard Worker
312*15dc779aSAndroid Build Coastguard Worker WORD32 temp_1, temp_2;
313*15dc779aSAndroid Build Coastguard Worker WORD16 qtemp1, qtemp2;
314*15dc779aSAndroid Build Coastguard Worker WORD32 *qmf_output_real_dry;
315*15dc779aSAndroid Build Coastguard Worker WORD32 *qmf_output_imag_dry;
316*15dc779aSAndroid Build Coastguard Worker WORD32 *qmf_output_real_wet;
317*15dc779aSAndroid Build Coastguard Worker WORD32 *qmf_output_imag_wet;
318*15dc779aSAndroid Build Coastguard Worker
319*15dc779aSAndroid Build Coastguard Worker WORD32 *dmx_real;
320*15dc779aSAndroid Build Coastguard Worker WORD32 *dmx_imag;
321*15dc779aSAndroid Build Coastguard Worker WORD32 *dry_ener;
322*15dc779aSAndroid Build Coastguard Worker WORD32 *wet_ener;
323*15dc779aSAndroid Build Coastguard Worker WORD16 *q_dry_ener;
324*15dc779aSAndroid Build Coastguard Worker WORD16 *q_wet_ener;
325*15dc779aSAndroid Build Coastguard Worker
326*15dc779aSAndroid Build Coastguard Worker WORD32 *p_buffer_real, *p_buffer_imag, *p_buffer_re, *p_buffer_im;
327*15dc779aSAndroid Build Coastguard Worker WORD32 *p_buf_real, *p_buf_imag, *p_buf_re, *p_buf_im;
328*15dc779aSAndroid Build Coastguard Worker WORD32 *scale;
329*15dc779aSAndroid Build Coastguard Worker WORD16 *q_scale;
330*15dc779aSAndroid Build Coastguard Worker WORD32 damp, one_minus_damp;
331*15dc779aSAndroid Build Coastguard Worker WORD32 temp;
332*15dc779aSAndroid Build Coastguard Worker
333*15dc779aSAndroid Build Coastguard Worker WORD32 *prev_tp_scale = sub_band_tp->prev_tp_scale;
334*15dc779aSAndroid Build Coastguard Worker
335*15dc779aSAndroid Build Coastguard Worker WORD32 *old_wet_ener = sub_band_tp->old_wet_ener;
336*15dc779aSAndroid Build Coastguard Worker WORD16 *q_old_wet_ener = sub_band_tp->q_old_wet_ener;
337*15dc779aSAndroid Build Coastguard Worker
338*15dc779aSAndroid Build Coastguard Worker WORD32 *run_wet_ener = sub_band_tp->run_wet_ener;
339*15dc779aSAndroid Build Coastguard Worker WORD16 *q_run_wet_ener = sub_band_tp->q_run_wet_ener;
340*15dc779aSAndroid Build Coastguard Worker
341*15dc779aSAndroid Build Coastguard Worker WORD32 *old_dry_ener = sub_band_tp->old_dry_ener;
342*15dc779aSAndroid Build Coastguard Worker WORD16 *q_old_dry_ener = sub_band_tp->q_old_dry_ener;
343*15dc779aSAndroid Build Coastguard Worker
344*15dc779aSAndroid Build Coastguard Worker WORD32 *run_dry_ener = sub_band_tp->run_dry_ener;
345*15dc779aSAndroid Build Coastguard Worker WORD16 *q_run_dry_ener = sub_band_tp->q_run_dry_ener;
346*15dc779aSAndroid Build Coastguard Worker
347*15dc779aSAndroid Build Coastguard Worker WORD32 *hyb_output_real_dry, *hyb_output_imag_dry;
348*15dc779aSAndroid Build Coastguard Worker
349*15dc779aSAndroid Build Coastguard Worker WORD32 *p_hyb_out_dry_real, *p_hyb_out_dry_imag;
350*15dc779aSAndroid Build Coastguard Worker
351*15dc779aSAndroid Build Coastguard Worker WORD32 ch, n, no_scaling, i, k = 0, offset;
352*15dc779aSAndroid Build Coastguard Worker WORD32 i_lf = 0, i_rf = 0, i_c = 0, i_lfe = 0, i_ls = 0, i_rs = 0, i_al = 0, i_ar = 0;
353*15dc779aSAndroid Build Coastguard Worker
354*15dc779aSAndroid Build Coastguard Worker WORD32 loop_counter = 0;
355*15dc779aSAndroid Build Coastguard Worker
356*15dc779aSAndroid Build Coastguard Worker WORD32 num_input_channels = pstr_mps_state->num_input_channels;
357*15dc779aSAndroid Build Coastguard Worker WORD32 num_output_channels = pstr_mps_state->num_output_channels;
358*15dc779aSAndroid Build Coastguard Worker WORD32 hybrid_bands = pstr_mps_state->hybrid_bands;
359*15dc779aSAndroid Build Coastguard Worker
360*15dc779aSAndroid Build Coastguard Worker WORD32 tree_config = pstr_mps_state->tree_config;
361*15dc779aSAndroid Build Coastguard Worker
362*15dc779aSAndroid Build Coastguard Worker dry_ener = pstr_mps_state->mps_scratch_mem_v;
363*15dc779aSAndroid Build Coastguard Worker q_dry_ener = (WORD16 *)pstr_mps_state->mps_scratch_mem_v +
364*15dc779aSAndroid Build Coastguard Worker IXHEAAC_GET_SIZE_ALIGNED_TYPE(INPUT_CHX2, sizeof(*q_dry_ener), BYTE_ALIGN_8);
365*15dc779aSAndroid Build Coastguard Worker
366*15dc779aSAndroid Build Coastguard Worker wet_ener =
367*15dc779aSAndroid Build Coastguard Worker dry_ener + IXHEAAC_GET_SIZE_ALIGNED_TYPE(INPUT_CHX1_5, sizeof(*wet_ener), BYTE_ALIGN_8);
368*15dc779aSAndroid Build Coastguard Worker q_wet_ener = q_dry_ener +
369*15dc779aSAndroid Build Coastguard Worker IXHEAAC_GET_SIZE_ALIGNED_TYPE(IN_CH_2XOUT_CH, sizeof(*q_wet_ener), BYTE_ALIGN_8);
370*15dc779aSAndroid Build Coastguard Worker
371*15dc779aSAndroid Build Coastguard Worker scale = wet_ener + IXHEAAC_GET_SIZE_ALIGNED_TYPE(OUTPUT_CHX1_5, sizeof(*scale), BYTE_ALIGN_8);
372*15dc779aSAndroid Build Coastguard Worker q_scale =
373*15dc779aSAndroid Build Coastguard Worker q_wet_ener + IXHEAAC_GET_SIZE_ALIGNED_TYPE(OUTPUT_CHX3, sizeof(*q_scale), BYTE_ALIGN_8);
374*15dc779aSAndroid Build Coastguard Worker
375*15dc779aSAndroid Build Coastguard Worker dmx_real =
376*15dc779aSAndroid Build Coastguard Worker scale + IXHEAAC_GET_SIZE_ALIGNED_TYPE(OUTPUT_CHX1_5, sizeof(*dmx_real), BYTE_ALIGN_8);
377*15dc779aSAndroid Build Coastguard Worker dmx_imag =
378*15dc779aSAndroid Build Coastguard Worker dmx_real + IXHEAAC_GET_SIZE_ALIGNED_TYPE(IN_CHXBP_SIZE, sizeof(*dmx_imag), BYTE_ALIGN_8);
379*15dc779aSAndroid Build Coastguard Worker
380*15dc779aSAndroid Build Coastguard Worker qmf_output_real_dry = dmx_imag + IXHEAAC_GET_SIZE_ALIGNED_TYPE(
381*15dc779aSAndroid Build Coastguard Worker IN_CHXBP_SIZE, sizeof(*qmf_output_real_dry), BYTE_ALIGN_8);
382*15dc779aSAndroid Build Coastguard Worker
383*15dc779aSAndroid Build Coastguard Worker qmf_output_imag_dry =
384*15dc779aSAndroid Build Coastguard Worker qmf_output_real_dry +
385*15dc779aSAndroid Build Coastguard Worker IXHEAAC_GET_SIZE_ALIGNED_TYPE(OUT_CHXQB, sizeof(*qmf_output_imag_dry), BYTE_ALIGN_8);
386*15dc779aSAndroid Build Coastguard Worker
387*15dc779aSAndroid Build Coastguard Worker qmf_output_real_wet =
388*15dc779aSAndroid Build Coastguard Worker qmf_output_imag_dry +
389*15dc779aSAndroid Build Coastguard Worker IXHEAAC_GET_SIZE_ALIGNED_TYPE(OUT_CHXQB, sizeof(*qmf_output_real_wet), BYTE_ALIGN_8);
390*15dc779aSAndroid Build Coastguard Worker
391*15dc779aSAndroid Build Coastguard Worker qmf_output_imag_wet =
392*15dc779aSAndroid Build Coastguard Worker qmf_output_real_wet +
393*15dc779aSAndroid Build Coastguard Worker IXHEAAC_GET_SIZE_ALIGNED_TYPE(OUT_CHXQB, sizeof(*qmf_output_imag_wet), BYTE_ALIGN_8);
394*15dc779aSAndroid Build Coastguard Worker
395*15dc779aSAndroid Build Coastguard Worker if (sub_band_tp->update_old_ener == STP_UPDATE_ENERGY_RATE) {
396*15dc779aSAndroid Build Coastguard Worker sub_band_tp->update_old_ener = 1;
397*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < num_input_channels; ch++) {
398*15dc779aSAndroid Build Coastguard Worker old_dry_ener[ch] = run_dry_ener[ch];
399*15dc779aSAndroid Build Coastguard Worker q_old_dry_ener[ch] = q_run_dry_ener[ch];
400*15dc779aSAndroid Build Coastguard Worker }
401*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < num_output_channels; ch++) {
402*15dc779aSAndroid Build Coastguard Worker old_wet_ener[ch] = run_wet_ener[ch];
403*15dc779aSAndroid Build Coastguard Worker q_old_wet_ener[ch] = q_run_wet_ener[ch];
404*15dc779aSAndroid Build Coastguard Worker }
405*15dc779aSAndroid Build Coastguard Worker } else
406*15dc779aSAndroid Build Coastguard Worker sub_band_tp->update_old_ener++;
407*15dc779aSAndroid Build Coastguard Worker
408*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < MAX_OUTPUT_CHANNELS_MPS; ch++) {
409*15dc779aSAndroid Build Coastguard Worker scale[ch] = ONE_IN_Q15;
410*15dc779aSAndroid Build Coastguard Worker q_scale[ch] = 15;
411*15dc779aSAndroid Build Coastguard Worker }
412*15dc779aSAndroid Build Coastguard Worker
413*15dc779aSAndroid Build Coastguard Worker switch (tree_config) {
414*15dc779aSAndroid Build Coastguard Worker case TREE_5151:
415*15dc779aSAndroid Build Coastguard Worker i_lf = 0;
416*15dc779aSAndroid Build Coastguard Worker i_rf = 1;
417*15dc779aSAndroid Build Coastguard Worker i_c = 2;
418*15dc779aSAndroid Build Coastguard Worker i_lfe = 3;
419*15dc779aSAndroid Build Coastguard Worker i_ls = 4;
420*15dc779aSAndroid Build Coastguard Worker i_rs = 5;
421*15dc779aSAndroid Build Coastguard Worker loop_counter = 6;
422*15dc779aSAndroid Build Coastguard Worker break;
423*15dc779aSAndroid Build Coastguard Worker case TREE_5152:
424*15dc779aSAndroid Build Coastguard Worker i_lf = 0;
425*15dc779aSAndroid Build Coastguard Worker i_rf = 2;
426*15dc779aSAndroid Build Coastguard Worker i_c = 4;
427*15dc779aSAndroid Build Coastguard Worker i_lfe = 5;
428*15dc779aSAndroid Build Coastguard Worker i_ls = 1;
429*15dc779aSAndroid Build Coastguard Worker i_rs = 3;
430*15dc779aSAndroid Build Coastguard Worker loop_counter = 5;
431*15dc779aSAndroid Build Coastguard Worker break;
432*15dc779aSAndroid Build Coastguard Worker case TREE_525:
433*15dc779aSAndroid Build Coastguard Worker i_lf = 0;
434*15dc779aSAndroid Build Coastguard Worker i_rf = 2;
435*15dc779aSAndroid Build Coastguard Worker i_c = 4;
436*15dc779aSAndroid Build Coastguard Worker i_lfe = 5;
437*15dc779aSAndroid Build Coastguard Worker i_ls = 1;
438*15dc779aSAndroid Build Coastguard Worker i_rs = 3;
439*15dc779aSAndroid Build Coastguard Worker loop_counter = 4;
440*15dc779aSAndroid Build Coastguard Worker break;
441*15dc779aSAndroid Build Coastguard Worker case TREE_7271:
442*15dc779aSAndroid Build Coastguard Worker case TREE_7272:
443*15dc779aSAndroid Build Coastguard Worker case TREE_7572:
444*15dc779aSAndroid Build Coastguard Worker i_lf = 0;
445*15dc779aSAndroid Build Coastguard Worker i_rf = 3;
446*15dc779aSAndroid Build Coastguard Worker i_c = 6;
447*15dc779aSAndroid Build Coastguard Worker i_lfe = 7;
448*15dc779aSAndroid Build Coastguard Worker i_ls = 2;
449*15dc779aSAndroid Build Coastguard Worker i_rs = 5;
450*15dc779aSAndroid Build Coastguard Worker i_al = 1;
451*15dc779aSAndroid Build Coastguard Worker i_ar = 4;
452*15dc779aSAndroid Build Coastguard Worker loop_counter = 6;
453*15dc779aSAndroid Build Coastguard Worker break;
454*15dc779aSAndroid Build Coastguard Worker case TREE_7571:
455*15dc779aSAndroid Build Coastguard Worker i_lf = 0;
456*15dc779aSAndroid Build Coastguard Worker i_rf = 3;
457*15dc779aSAndroid Build Coastguard Worker i_c = 6;
458*15dc779aSAndroid Build Coastguard Worker i_lfe = 7;
459*15dc779aSAndroid Build Coastguard Worker i_ls = 2;
460*15dc779aSAndroid Build Coastguard Worker i_rs = 5;
461*15dc779aSAndroid Build Coastguard Worker i_al = 1;
462*15dc779aSAndroid Build Coastguard Worker i_ar = 4;
463*15dc779aSAndroid Build Coastguard Worker loop_counter = 5;
464*15dc779aSAndroid Build Coastguard Worker break;
465*15dc779aSAndroid Build Coastguard Worker default:
466*15dc779aSAndroid Build Coastguard Worker break;
467*15dc779aSAndroid Build Coastguard Worker }
468*15dc779aSAndroid Build Coastguard Worker
469*15dc779aSAndroid Build Coastguard Worker offset = ts * MAX_HYBRID_BANDS;
470*15dc779aSAndroid Build Coastguard Worker p_buffer_real = p_array_struct->buf_real + offset + HYBRID_BAND_BORDER;
471*15dc779aSAndroid Build Coastguard Worker p_buffer_imag = p_array_struct->buf_imag + offset + HYBRID_BAND_BORDER;
472*15dc779aSAndroid Build Coastguard Worker
473*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < num_output_channels; ch++) {
474*15dc779aSAndroid Build Coastguard Worker p_buffer_re = p_buffer_real;
475*15dc779aSAndroid Build Coastguard Worker p_buffer_im = p_buffer_imag;
476*15dc779aSAndroid Build Coastguard Worker
477*15dc779aSAndroid Build Coastguard Worker for (i = QMF_OUT_START_IDX; i < BP_SIZE; i++) {
478*15dc779aSAndroid Build Coastguard Worker *qmf_output_real_wet++ = *p_buffer_re++;
479*15dc779aSAndroid Build Coastguard Worker *qmf_output_imag_wet++ = *p_buffer_im++;
480*15dc779aSAndroid Build Coastguard Worker }
481*15dc779aSAndroid Build Coastguard Worker p_buffer_real += TSXHB;
482*15dc779aSAndroid Build Coastguard Worker p_buffer_imag += TSXHB;
483*15dc779aSAndroid Build Coastguard Worker }
484*15dc779aSAndroid Build Coastguard Worker i = QMF_OUT_OFFSET * num_output_channels;
485*15dc779aSAndroid Build Coastguard Worker qmf_output_real_wet -= i;
486*15dc779aSAndroid Build Coastguard Worker qmf_output_imag_wet -= i;
487*15dc779aSAndroid Build Coastguard Worker
488*15dc779aSAndroid Build Coastguard Worker p_buffer_re = qmf_output_real_dry;
489*15dc779aSAndroid Build Coastguard Worker p_buffer_im = qmf_output_imag_dry;
490*15dc779aSAndroid Build Coastguard Worker
491*15dc779aSAndroid Build Coastguard Worker hyb_output_real_dry =
492*15dc779aSAndroid Build Coastguard Worker p_array_struct->hyb_output_real_dry + ts * MAX_HYBRID_BANDS + 6;
493*15dc779aSAndroid Build Coastguard Worker hyb_output_imag_dry =
494*15dc779aSAndroid Build Coastguard Worker p_array_struct->hyb_output_imag_dry + ts * MAX_HYBRID_BANDS + 6;
495*15dc779aSAndroid Build Coastguard Worker
496*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < loop_counter; ch++) {
497*15dc779aSAndroid Build Coastguard Worker *p_buffer_re++ = hyb_output_real_dry[0] + hyb_output_real_dry[1];
498*15dc779aSAndroid Build Coastguard Worker *p_buffer_im++ = hyb_output_imag_dry[0] + hyb_output_imag_dry[1];
499*15dc779aSAndroid Build Coastguard Worker
500*15dc779aSAndroid Build Coastguard Worker hyb_output_real_dry += TSXHB;
501*15dc779aSAndroid Build Coastguard Worker hyb_output_imag_dry += TSXHB;
502*15dc779aSAndroid Build Coastguard Worker }
503*15dc779aSAndroid Build Coastguard Worker
504*15dc779aSAndroid Build Coastguard Worker hyb_output_real_dry =
505*15dc779aSAndroid Build Coastguard Worker p_array_struct->hyb_output_real_dry + ts * MAX_HYBRID_BANDS + 8;
506*15dc779aSAndroid Build Coastguard Worker hyb_output_imag_dry =
507*15dc779aSAndroid Build Coastguard Worker p_array_struct->hyb_output_imag_dry + ts * MAX_HYBRID_BANDS + 8;
508*15dc779aSAndroid Build Coastguard Worker
509*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < loop_counter; ch++) {
510*15dc779aSAndroid Build Coastguard Worker *p_buffer_re++ = hyb_output_real_dry[0] + hyb_output_real_dry[1];
511*15dc779aSAndroid Build Coastguard Worker *p_buffer_im++ = hyb_output_imag_dry[0] + hyb_output_imag_dry[1];
512*15dc779aSAndroid Build Coastguard Worker
513*15dc779aSAndroid Build Coastguard Worker hyb_output_real_dry += TSXHB;
514*15dc779aSAndroid Build Coastguard Worker hyb_output_imag_dry += TSXHB;
515*15dc779aSAndroid Build Coastguard Worker }
516*15dc779aSAndroid Build Coastguard Worker
517*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_real =
518*15dc779aSAndroid Build Coastguard Worker p_array_struct->hyb_output_real_dry + ts * MAX_HYBRID_BANDS + 10;
519*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_imag =
520*15dc779aSAndroid Build Coastguard Worker p_array_struct->hyb_output_imag_dry + ts * MAX_HYBRID_BANDS + 10;
521*15dc779aSAndroid Build Coastguard Worker
522*15dc779aSAndroid Build Coastguard Worker for (i = 3; i < BP_SIZE; i++) {
523*15dc779aSAndroid Build Coastguard Worker hyb_output_real_dry = p_hyb_out_dry_real;
524*15dc779aSAndroid Build Coastguard Worker hyb_output_imag_dry = p_hyb_out_dry_imag;
525*15dc779aSAndroid Build Coastguard Worker
526*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < loop_counter; ch++) {
527*15dc779aSAndroid Build Coastguard Worker *p_buffer_re++ = *hyb_output_real_dry;
528*15dc779aSAndroid Build Coastguard Worker *p_buffer_im++ = *hyb_output_imag_dry;
529*15dc779aSAndroid Build Coastguard Worker
530*15dc779aSAndroid Build Coastguard Worker hyb_output_real_dry += TSXHB;
531*15dc779aSAndroid Build Coastguard Worker hyb_output_imag_dry += TSXHB;
532*15dc779aSAndroid Build Coastguard Worker }
533*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_real++;
534*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_imag++;
535*15dc779aSAndroid Build Coastguard Worker }
536*15dc779aSAndroid Build Coastguard Worker
537*15dc779aSAndroid Build Coastguard Worker for (n = 1; n < BP_SIZE; n++) {
538*15dc779aSAndroid Build Coastguard Worker switch (tree_config) {
539*15dc779aSAndroid Build Coastguard Worker case TREE_5151:
540*15dc779aSAndroid Build Coastguard Worker *dmx_real = *qmf_output_real_dry++;
541*15dc779aSAndroid Build Coastguard Worker *dmx_real += *qmf_output_real_dry++;
542*15dc779aSAndroid Build Coastguard Worker *dmx_real += *qmf_output_real_dry++;
543*15dc779aSAndroid Build Coastguard Worker qmf_output_real_dry++;
544*15dc779aSAndroid Build Coastguard Worker *dmx_real += *qmf_output_real_dry++;
545*15dc779aSAndroid Build Coastguard Worker *dmx_real += *qmf_output_real_dry++;
546*15dc779aSAndroid Build Coastguard Worker
547*15dc779aSAndroid Build Coastguard Worker *dmx_real = ixheaacd_mps_mult32_shr_30(*dmx_real,
548*15dc779aSAndroid Build Coastguard Worker tp_process_table_ptr->bpxgf[n]);
549*15dc779aSAndroid Build Coastguard Worker dmx_real++;
550*15dc779aSAndroid Build Coastguard Worker dmx_real++;
551*15dc779aSAndroid Build Coastguard Worker
552*15dc779aSAndroid Build Coastguard Worker break;
553*15dc779aSAndroid Build Coastguard Worker case TREE_5152:
554*15dc779aSAndroid Build Coastguard Worker *dmx_real = *qmf_output_real_dry++;
555*15dc779aSAndroid Build Coastguard Worker *dmx_real += *qmf_output_real_dry++;
556*15dc779aSAndroid Build Coastguard Worker *dmx_real += *qmf_output_real_dry++;
557*15dc779aSAndroid Build Coastguard Worker *dmx_real += *qmf_output_real_dry++;
558*15dc779aSAndroid Build Coastguard Worker *dmx_real += *qmf_output_real_dry++;
559*15dc779aSAndroid Build Coastguard Worker
560*15dc779aSAndroid Build Coastguard Worker *dmx_real = ixheaacd_mps_mult32_shr_30(*dmx_real,
561*15dc779aSAndroid Build Coastguard Worker tp_process_table_ptr->bpxgf[n]);
562*15dc779aSAndroid Build Coastguard Worker dmx_real++;
563*15dc779aSAndroid Build Coastguard Worker dmx_real++;
564*15dc779aSAndroid Build Coastguard Worker
565*15dc779aSAndroid Build Coastguard Worker break;
566*15dc779aSAndroid Build Coastguard Worker case TREE_525:
567*15dc779aSAndroid Build Coastguard Worker *dmx_real = *qmf_output_real_dry++;
568*15dc779aSAndroid Build Coastguard Worker *dmx_real += *qmf_output_real_dry++;
569*15dc779aSAndroid Build Coastguard Worker *dmx_real = ixheaacd_mps_mult32_shr_30(*dmx_real,
570*15dc779aSAndroid Build Coastguard Worker tp_process_table_ptr->bpxgf[n]);
571*15dc779aSAndroid Build Coastguard Worker dmx_real++;
572*15dc779aSAndroid Build Coastguard Worker
573*15dc779aSAndroid Build Coastguard Worker *dmx_real = *qmf_output_real_dry++;
574*15dc779aSAndroid Build Coastguard Worker *dmx_real += *qmf_output_real_dry++;
575*15dc779aSAndroid Build Coastguard Worker *dmx_real = ixheaacd_mps_mult32_shr_30(*dmx_real,
576*15dc779aSAndroid Build Coastguard Worker tp_process_table_ptr->bpxgf[n]);
577*15dc779aSAndroid Build Coastguard Worker dmx_real++;
578*15dc779aSAndroid Build Coastguard Worker
579*15dc779aSAndroid Build Coastguard Worker break;
580*15dc779aSAndroid Build Coastguard Worker case TREE_7271:
581*15dc779aSAndroid Build Coastguard Worker case TREE_7272:
582*15dc779aSAndroid Build Coastguard Worker *dmx_real = *qmf_output_real_dry++;
583*15dc779aSAndroid Build Coastguard Worker *dmx_real += *qmf_output_real_dry++;
584*15dc779aSAndroid Build Coastguard Worker *dmx_real += *qmf_output_real_dry++;
585*15dc779aSAndroid Build Coastguard Worker
586*15dc779aSAndroid Build Coastguard Worker *dmx_real = ixheaacd_mps_mult32_shr_30(*dmx_real,
587*15dc779aSAndroid Build Coastguard Worker tp_process_table_ptr->bpxgf[n]);
588*15dc779aSAndroid Build Coastguard Worker dmx_real++;
589*15dc779aSAndroid Build Coastguard Worker
590*15dc779aSAndroid Build Coastguard Worker *dmx_real = *qmf_output_real_dry++;
591*15dc779aSAndroid Build Coastguard Worker *dmx_real += *qmf_output_real_dry++;
592*15dc779aSAndroid Build Coastguard Worker *dmx_real += *qmf_output_real_dry++;
593*15dc779aSAndroid Build Coastguard Worker
594*15dc779aSAndroid Build Coastguard Worker *dmx_real = ixheaacd_mps_mult32_shr_30(*dmx_real,
595*15dc779aSAndroid Build Coastguard Worker tp_process_table_ptr->bpxgf[n]);
596*15dc779aSAndroid Build Coastguard Worker dmx_real++;
597*15dc779aSAndroid Build Coastguard Worker
598*15dc779aSAndroid Build Coastguard Worker break;
599*15dc779aSAndroid Build Coastguard Worker case TREE_7571:
600*15dc779aSAndroid Build Coastguard Worker
601*15dc779aSAndroid Build Coastguard Worker *dmx_real = *qmf_output_real_dry++;
602*15dc779aSAndroid Build Coastguard Worker *dmx_real += *qmf_output_real_dry++;
603*15dc779aSAndroid Build Coastguard Worker
604*15dc779aSAndroid Build Coastguard Worker qmf_output_real_dry++;
605*15dc779aSAndroid Build Coastguard Worker
606*15dc779aSAndroid Build Coastguard Worker *dmx_real = ixheaacd_mps_mult32_shr_30(*dmx_real,
607*15dc779aSAndroid Build Coastguard Worker tp_process_table_ptr->bpxgf[n]);
608*15dc779aSAndroid Build Coastguard Worker dmx_real++;
609*15dc779aSAndroid Build Coastguard Worker
610*15dc779aSAndroid Build Coastguard Worker *dmx_real = *qmf_output_real_dry++;
611*15dc779aSAndroid Build Coastguard Worker *dmx_real += *qmf_output_real_dry++;
612*15dc779aSAndroid Build Coastguard Worker
613*15dc779aSAndroid Build Coastguard Worker *dmx_real = ixheaacd_mps_mult32_shr_30(*dmx_real,
614*15dc779aSAndroid Build Coastguard Worker tp_process_table_ptr->bpxgf[n]);
615*15dc779aSAndroid Build Coastguard Worker dmx_real++;
616*15dc779aSAndroid Build Coastguard Worker
617*15dc779aSAndroid Build Coastguard Worker break;
618*15dc779aSAndroid Build Coastguard Worker case TREE_7572:
619*15dc779aSAndroid Build Coastguard Worker qmf_output_real_dry++;
620*15dc779aSAndroid Build Coastguard Worker *dmx_real = *qmf_output_real_dry++;
621*15dc779aSAndroid Build Coastguard Worker *dmx_real += *qmf_output_real_dry++;
622*15dc779aSAndroid Build Coastguard Worker
623*15dc779aSAndroid Build Coastguard Worker qmf_output_real_dry++;
624*15dc779aSAndroid Build Coastguard Worker *dmx_real = ixheaacd_mps_mult32_shr_30(*dmx_real,
625*15dc779aSAndroid Build Coastguard Worker tp_process_table_ptr->bpxgf[n]);
626*15dc779aSAndroid Build Coastguard Worker dmx_real++;
627*15dc779aSAndroid Build Coastguard Worker
628*15dc779aSAndroid Build Coastguard Worker *dmx_real = *qmf_output_real_dry++;
629*15dc779aSAndroid Build Coastguard Worker *dmx_real += *qmf_output_real_dry++;
630*15dc779aSAndroid Build Coastguard Worker
631*15dc779aSAndroid Build Coastguard Worker *dmx_real = ixheaacd_mps_mult32_shr_30(*dmx_real,
632*15dc779aSAndroid Build Coastguard Worker tp_process_table_ptr->bpxgf[n]);
633*15dc779aSAndroid Build Coastguard Worker dmx_real++;
634*15dc779aSAndroid Build Coastguard Worker
635*15dc779aSAndroid Build Coastguard Worker break;
636*15dc779aSAndroid Build Coastguard Worker default:
637*15dc779aSAndroid Build Coastguard Worker break;
638*15dc779aSAndroid Build Coastguard Worker }
639*15dc779aSAndroid Build Coastguard Worker }
640*15dc779aSAndroid Build Coastguard Worker dmx_real -= DMX_OFFSET;
641*15dc779aSAndroid Build Coastguard Worker
642*15dc779aSAndroid Build Coastguard Worker for (n = 1; n < BP_SIZE; n++) {
643*15dc779aSAndroid Build Coastguard Worker switch (tree_config) {
644*15dc779aSAndroid Build Coastguard Worker case TREE_5151:
645*15dc779aSAndroid Build Coastguard Worker *dmx_imag = *qmf_output_imag_dry++;
646*15dc779aSAndroid Build Coastguard Worker *dmx_imag += *qmf_output_imag_dry++;
647*15dc779aSAndroid Build Coastguard Worker *dmx_imag += *qmf_output_imag_dry++;
648*15dc779aSAndroid Build Coastguard Worker
649*15dc779aSAndroid Build Coastguard Worker qmf_output_imag_dry++;
650*15dc779aSAndroid Build Coastguard Worker
651*15dc779aSAndroid Build Coastguard Worker *dmx_imag += *qmf_output_imag_dry++;
652*15dc779aSAndroid Build Coastguard Worker *dmx_imag++ += *qmf_output_imag_dry++;
653*15dc779aSAndroid Build Coastguard Worker
654*15dc779aSAndroid Build Coastguard Worker dmx_imag++;
655*15dc779aSAndroid Build Coastguard Worker
656*15dc779aSAndroid Build Coastguard Worker dmx_imag[0] = ixheaacd_mps_mult32_shr_30(
657*15dc779aSAndroid Build Coastguard Worker dmx_imag[0], tp_process_table_ptr->bpxgf[n]);
658*15dc779aSAndroid Build Coastguard Worker break;
659*15dc779aSAndroid Build Coastguard Worker case TREE_5152:
660*15dc779aSAndroid Build Coastguard Worker
661*15dc779aSAndroid Build Coastguard Worker *dmx_imag = *qmf_output_imag_dry++;
662*15dc779aSAndroid Build Coastguard Worker *dmx_imag += *qmf_output_imag_dry++;
663*15dc779aSAndroid Build Coastguard Worker *dmx_imag += *qmf_output_imag_dry++;
664*15dc779aSAndroid Build Coastguard Worker
665*15dc779aSAndroid Build Coastguard Worker *dmx_imag += *qmf_output_imag_dry++;
666*15dc779aSAndroid Build Coastguard Worker *dmx_imag++ += *qmf_output_imag_dry++;
667*15dc779aSAndroid Build Coastguard Worker
668*15dc779aSAndroid Build Coastguard Worker dmx_imag++;
669*15dc779aSAndroid Build Coastguard Worker
670*15dc779aSAndroid Build Coastguard Worker dmx_imag[0] = ixheaacd_mps_mult32_shr_30(
671*15dc779aSAndroid Build Coastguard Worker dmx_imag[0], tp_process_table_ptr->bpxgf[n]);
672*15dc779aSAndroid Build Coastguard Worker break;
673*15dc779aSAndroid Build Coastguard Worker case TREE_525:
674*15dc779aSAndroid Build Coastguard Worker *dmx_imag = *qmf_output_imag_dry++;
675*15dc779aSAndroid Build Coastguard Worker *dmx_imag += *qmf_output_imag_dry++;
676*15dc779aSAndroid Build Coastguard Worker *dmx_imag = ixheaacd_mps_mult32_shr_30(dmx_imag[0],
677*15dc779aSAndroid Build Coastguard Worker tp_process_table_ptr->bpxgf[n]);
678*15dc779aSAndroid Build Coastguard Worker dmx_imag++;
679*15dc779aSAndroid Build Coastguard Worker
680*15dc779aSAndroid Build Coastguard Worker *dmx_imag = *qmf_output_imag_dry++;
681*15dc779aSAndroid Build Coastguard Worker *dmx_imag += *qmf_output_imag_dry++;
682*15dc779aSAndroid Build Coastguard Worker *dmx_imag = ixheaacd_mps_mult32_shr_30(*dmx_imag,
683*15dc779aSAndroid Build Coastguard Worker tp_process_table_ptr->bpxgf[n]);
684*15dc779aSAndroid Build Coastguard Worker dmx_imag++;
685*15dc779aSAndroid Build Coastguard Worker break;
686*15dc779aSAndroid Build Coastguard Worker case TREE_7271:
687*15dc779aSAndroid Build Coastguard Worker case TREE_7272:
688*15dc779aSAndroid Build Coastguard Worker *dmx_imag = *qmf_output_imag_dry++;
689*15dc779aSAndroid Build Coastguard Worker *dmx_imag += *qmf_output_imag_dry++;
690*15dc779aSAndroid Build Coastguard Worker *dmx_imag += *qmf_output_imag_dry++;
691*15dc779aSAndroid Build Coastguard Worker *dmx_imag = ixheaacd_mps_mult32_shr_30(*dmx_imag,
692*15dc779aSAndroid Build Coastguard Worker tp_process_table_ptr->bpxgf[n]);
693*15dc779aSAndroid Build Coastguard Worker dmx_imag++;
694*15dc779aSAndroid Build Coastguard Worker
695*15dc779aSAndroid Build Coastguard Worker *dmx_imag = *qmf_output_imag_dry++;
696*15dc779aSAndroid Build Coastguard Worker *dmx_imag += *qmf_output_imag_dry++;
697*15dc779aSAndroid Build Coastguard Worker *dmx_imag += *qmf_output_imag_dry++;
698*15dc779aSAndroid Build Coastguard Worker
699*15dc779aSAndroid Build Coastguard Worker *dmx_imag = ixheaacd_mps_mult32_shr_30(*dmx_imag,
700*15dc779aSAndroid Build Coastguard Worker tp_process_table_ptr->bpxgf[n]);
701*15dc779aSAndroid Build Coastguard Worker dmx_imag++;
702*15dc779aSAndroid Build Coastguard Worker
703*15dc779aSAndroid Build Coastguard Worker break;
704*15dc779aSAndroid Build Coastguard Worker case TREE_7571:
705*15dc779aSAndroid Build Coastguard Worker *dmx_imag = *qmf_output_imag_dry++;
706*15dc779aSAndroid Build Coastguard Worker *dmx_imag += *qmf_output_imag_dry++;
707*15dc779aSAndroid Build Coastguard Worker qmf_output_imag_dry++;
708*15dc779aSAndroid Build Coastguard Worker *dmx_imag = ixheaacd_mps_mult32_shr_30(*dmx_imag,
709*15dc779aSAndroid Build Coastguard Worker tp_process_table_ptr->bpxgf[n]);
710*15dc779aSAndroid Build Coastguard Worker dmx_imag++;
711*15dc779aSAndroid Build Coastguard Worker
712*15dc779aSAndroid Build Coastguard Worker *dmx_imag = *qmf_output_imag_dry++;
713*15dc779aSAndroid Build Coastguard Worker *dmx_imag += *qmf_output_imag_dry++;
714*15dc779aSAndroid Build Coastguard Worker *dmx_imag = ixheaacd_mps_mult32_shr_30(*dmx_imag,
715*15dc779aSAndroid Build Coastguard Worker tp_process_table_ptr->bpxgf[n]);
716*15dc779aSAndroid Build Coastguard Worker dmx_imag++;
717*15dc779aSAndroid Build Coastguard Worker
718*15dc779aSAndroid Build Coastguard Worker break;
719*15dc779aSAndroid Build Coastguard Worker case TREE_7572:
720*15dc779aSAndroid Build Coastguard Worker qmf_output_imag_dry++;
721*15dc779aSAndroid Build Coastguard Worker
722*15dc779aSAndroid Build Coastguard Worker *dmx_imag = *qmf_output_imag_dry++;
723*15dc779aSAndroid Build Coastguard Worker *dmx_imag += *qmf_output_imag_dry++;
724*15dc779aSAndroid Build Coastguard Worker
725*15dc779aSAndroid Build Coastguard Worker qmf_output_imag_dry++;
726*15dc779aSAndroid Build Coastguard Worker
727*15dc779aSAndroid Build Coastguard Worker *dmx_imag = ixheaacd_mps_mult32_shr_30(*dmx_imag,
728*15dc779aSAndroid Build Coastguard Worker tp_process_table_ptr->bpxgf[n]);
729*15dc779aSAndroid Build Coastguard Worker dmx_imag++;
730*15dc779aSAndroid Build Coastguard Worker
731*15dc779aSAndroid Build Coastguard Worker *dmx_imag = *qmf_output_imag_dry++;
732*15dc779aSAndroid Build Coastguard Worker *dmx_imag += *qmf_output_imag_dry++;
733*15dc779aSAndroid Build Coastguard Worker *dmx_imag = ixheaacd_mps_mult32_shr_30(*dmx_imag,
734*15dc779aSAndroid Build Coastguard Worker tp_process_table_ptr->bpxgf[n]);
735*15dc779aSAndroid Build Coastguard Worker dmx_imag++;
736*15dc779aSAndroid Build Coastguard Worker
737*15dc779aSAndroid Build Coastguard Worker break;
738*15dc779aSAndroid Build Coastguard Worker default:
739*15dc779aSAndroid Build Coastguard Worker break;
740*15dc779aSAndroid Build Coastguard Worker }
741*15dc779aSAndroid Build Coastguard Worker }
742*15dc779aSAndroid Build Coastguard Worker dmx_imag -= DMX_OFFSET;
743*15dc779aSAndroid Build Coastguard Worker
744*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < min(2, num_input_channels); ch++) {
745*15dc779aSAndroid Build Coastguard Worker dry_ener[ch] = 0;
746*15dc779aSAndroid Build Coastguard Worker q_dry_ener[ch] = 15;
747*15dc779aSAndroid Build Coastguard Worker
748*15dc779aSAndroid Build Coastguard Worker for (n = 1; n < BP_SIZE; n++) {
749*15dc779aSAndroid Build Coastguard Worker qtemp1 = 10;
750*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32(*dmx_real, *dmx_real, &qtemp1, qtemp1);
751*15dc779aSAndroid Build Coastguard Worker dmx_real += 2;
752*15dc779aSAndroid Build Coastguard Worker dry_ener[ch] =
753*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_add32(dry_ener[ch], temp_1, &q_dry_ener[ch], qtemp1);
754*15dc779aSAndroid Build Coastguard Worker
755*15dc779aSAndroid Build Coastguard Worker qtemp1 = 10;
756*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32(*dmx_imag, *dmx_imag, &qtemp1, qtemp1);
757*15dc779aSAndroid Build Coastguard Worker dmx_imag += 2;
758*15dc779aSAndroid Build Coastguard Worker dry_ener[ch] =
759*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_add32(dry_ener[ch], temp_1, &q_dry_ener[ch], qtemp1);
760*15dc779aSAndroid Build Coastguard Worker }
761*15dc779aSAndroid Build Coastguard Worker dmx_real -= DMX_OFFSET_MINUS_ONE;
762*15dc779aSAndroid Build Coastguard Worker dmx_imag -= DMX_OFFSET_MINUS_ONE;
763*15dc779aSAndroid Build Coastguard Worker
764*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32_shr_15(run_dry_ener[ch], STP_LPF_COEFF1_FIX);
765*15dc779aSAndroid Build Coastguard Worker
766*15dc779aSAndroid Build Coastguard Worker temp_2 = ONE_IN_Q15 - STP_LPF_COEFF1_FIX;
767*15dc779aSAndroid Build Coastguard Worker temp_2 = ixheaacd_mps_mult32_shr_15(temp_2, dry_ener[ch]);
768*15dc779aSAndroid Build Coastguard Worker
769*15dc779aSAndroid Build Coastguard Worker run_dry_ener[ch] = ixheaacd_mps_add32(temp_1, temp_2, &(q_run_dry_ener[ch]),
770*15dc779aSAndroid Build Coastguard Worker q_dry_ener[ch]);
771*15dc779aSAndroid Build Coastguard Worker
772*15dc779aSAndroid Build Coastguard Worker qtemp1 = q_old_dry_ener[ch];
773*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_add32(old_dry_ener[ch], ABS_THR_FIX, &qtemp1, 15);
774*15dc779aSAndroid Build Coastguard Worker ;
775*15dc779aSAndroid Build Coastguard Worker
776*15dc779aSAndroid Build Coastguard Worker dry_ener[ch] = ixheaacd_mps_div_32(dry_ener[ch], temp_1, &qtemp2);
777*15dc779aSAndroid Build Coastguard Worker q_dry_ener[ch] = qtemp2 + q_dry_ener[ch] - qtemp1;
778*15dc779aSAndroid Build Coastguard Worker }
779*15dc779aSAndroid Build Coastguard Worker
780*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < num_output_channels; ch++) {
781*15dc779aSAndroid Build Coastguard Worker if (ch == i_lfe) continue;
782*15dc779aSAndroid Build Coastguard Worker if ((tree_config >= TREE_525) && (ch == i_c)) continue;
783*15dc779aSAndroid Build Coastguard Worker if ((tree_config == TREE_7571) && ((ch == i_ls) || (ch == i_rs))) continue;
784*15dc779aSAndroid Build Coastguard Worker if ((tree_config == TREE_7572) && ((ch == i_lf) || (ch == i_rf))) continue;
785*15dc779aSAndroid Build Coastguard Worker
786*15dc779aSAndroid Build Coastguard Worker wet_ener[ch] = 0;
787*15dc779aSAndroid Build Coastguard Worker q_wet_ener[ch] = 15;
788*15dc779aSAndroid Build Coastguard Worker
789*15dc779aSAndroid Build Coastguard Worker wet_ener[ch] = 0;
790*15dc779aSAndroid Build Coastguard Worker q_wet_ener[ch] = 15;
791*15dc779aSAndroid Build Coastguard Worker for (n = FIVE; n < BP_SIZE; n++) {
792*15dc779aSAndroid Build Coastguard Worker qtemp1 = 10;
793*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32(*qmf_output_real_wet, *qmf_output_real_wet,
794*15dc779aSAndroid Build Coastguard Worker &qtemp1, qtemp1);
795*15dc779aSAndroid Build Coastguard Worker qmf_output_real_wet++;
796*15dc779aSAndroid Build Coastguard Worker
797*15dc779aSAndroid Build Coastguard Worker qtemp2 = 10;
798*15dc779aSAndroid Build Coastguard Worker temp_2 = ixheaacd_mps_mult32(*qmf_output_imag_wet, *qmf_output_imag_wet,
799*15dc779aSAndroid Build Coastguard Worker &qtemp2, qtemp2);
800*15dc779aSAndroid Build Coastguard Worker qmf_output_imag_wet++;
801*15dc779aSAndroid Build Coastguard Worker
802*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_add32(temp_1, temp_2, &qtemp1, qtemp2);
803*15dc779aSAndroid Build Coastguard Worker
804*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32(temp_1, tp_process_table_ptr->bp2xgf2[n],
805*15dc779aSAndroid Build Coastguard Worker &qtemp1, 57);
806*15dc779aSAndroid Build Coastguard Worker
807*15dc779aSAndroid Build Coastguard Worker wet_ener[ch] =
808*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_add32(wet_ener[ch], temp_1, &q_wet_ener[ch], qtemp1);
809*15dc779aSAndroid Build Coastguard Worker }
810*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32_shr_15(run_wet_ener[ch], STP_LPF_COEFF1_FIX);
811*15dc779aSAndroid Build Coastguard Worker
812*15dc779aSAndroid Build Coastguard Worker temp_2 = ONE_IN_Q15 - STP_LPF_COEFF1_FIX;
813*15dc779aSAndroid Build Coastguard Worker
814*15dc779aSAndroid Build Coastguard Worker temp_2 = ixheaacd_mps_mult32_shr_15(temp_2, wet_ener[ch]);
815*15dc779aSAndroid Build Coastguard Worker
816*15dc779aSAndroid Build Coastguard Worker run_wet_ener[ch] =
817*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_add32(temp_1, temp_2, &q_run_wet_ener[ch], q_wet_ener[ch]);
818*15dc779aSAndroid Build Coastguard Worker
819*15dc779aSAndroid Build Coastguard Worker qtemp1 = q_old_wet_ener[ch];
820*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_add32(old_wet_ener[ch], ABS_THR_FIX, &qtemp1, 15);
821*15dc779aSAndroid Build Coastguard Worker
822*15dc779aSAndroid Build Coastguard Worker wet_ener[ch] = ixheaacd_mps_div_32(wet_ener[ch], temp_1, &qtemp2);
823*15dc779aSAndroid Build Coastguard Worker q_wet_ener[ch] = qtemp2 + q_wet_ener[ch] - qtemp1;
824*15dc779aSAndroid Build Coastguard Worker }
825*15dc779aSAndroid Build Coastguard Worker
826*15dc779aSAndroid Build Coastguard Worker damp = POINT_ONE_Q15;
827*15dc779aSAndroid Build Coastguard Worker one_minus_damp = POINT_NINE_Q15;
828*15dc779aSAndroid Build Coastguard Worker switch (tree_config) {
829*15dc779aSAndroid Build Coastguard Worker case TREE_5151:
830*15dc779aSAndroid Build Coastguard Worker case TREE_5152:
831*15dc779aSAndroid Build Coastguard Worker if (wet_ener[i_lf] != 0) {
832*15dc779aSAndroid Build Coastguard Worker scale[i_lf] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_lf], &qtemp2);
833*15dc779aSAndroid Build Coastguard Worker q_scale[i_lf] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_lf];
834*15dc779aSAndroid Build Coastguard Worker } else {
835*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaac_norm32(dry_ener[0]);
836*15dc779aSAndroid Build Coastguard Worker scale[i_lf] = dry_ener[0] << temp_1;
837*15dc779aSAndroid Build Coastguard Worker q_scale[i_lf] = q_dry_ener[0] + temp_1 - 30;
838*15dc779aSAndroid Build Coastguard Worker }
839*15dc779aSAndroid Build Coastguard Worker scale[i_lf] = ixheaacd_mps_sqrt(scale[i_lf], &(q_scale[i_lf]), sqrt_tab);
840*15dc779aSAndroid Build Coastguard Worker
841*15dc779aSAndroid Build Coastguard Worker if (wet_ener[i_rf] != 0) {
842*15dc779aSAndroid Build Coastguard Worker scale[i_rf] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_rf], &qtemp2);
843*15dc779aSAndroid Build Coastguard Worker q_scale[i_rf] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_rf];
844*15dc779aSAndroid Build Coastguard Worker } else {
845*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaac_norm32(dry_ener[0]);
846*15dc779aSAndroid Build Coastguard Worker scale[i_rf] = dry_ener[0] << temp_1;
847*15dc779aSAndroid Build Coastguard Worker q_scale[i_rf] = q_dry_ener[0] + temp_1 - 30;
848*15dc779aSAndroid Build Coastguard Worker }
849*15dc779aSAndroid Build Coastguard Worker scale[i_rf] = ixheaacd_mps_sqrt(scale[i_rf], &(q_scale[i_rf]), sqrt_tab);
850*15dc779aSAndroid Build Coastguard Worker
851*15dc779aSAndroid Build Coastguard Worker if (wet_ener[i_c] != 0) {
852*15dc779aSAndroid Build Coastguard Worker scale[i_c] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_c], &qtemp2);
853*15dc779aSAndroid Build Coastguard Worker q_scale[i_c] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_c];
854*15dc779aSAndroid Build Coastguard Worker } else {
855*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaac_norm32(dry_ener[0]);
856*15dc779aSAndroid Build Coastguard Worker scale[i_c] = dry_ener[0] << temp_1;
857*15dc779aSAndroid Build Coastguard Worker q_scale[i_c] = q_dry_ener[0] + temp_1 - 30;
858*15dc779aSAndroid Build Coastguard Worker }
859*15dc779aSAndroid Build Coastguard Worker scale[i_c] = ixheaacd_mps_sqrt(scale[i_c], &(q_scale[i_c]), sqrt_tab);
860*15dc779aSAndroid Build Coastguard Worker
861*15dc779aSAndroid Build Coastguard Worker if (wet_ener[i_ls] != 0) {
862*15dc779aSAndroid Build Coastguard Worker scale[i_ls] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_ls], &qtemp2);
863*15dc779aSAndroid Build Coastguard Worker q_scale[i_ls] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_ls];
864*15dc779aSAndroid Build Coastguard Worker } else {
865*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaac_norm32(dry_ener[0]);
866*15dc779aSAndroid Build Coastguard Worker scale[i_ls] = dry_ener[0] << temp_1;
867*15dc779aSAndroid Build Coastguard Worker q_scale[i_ls] = q_dry_ener[0] + temp_1 - 30;
868*15dc779aSAndroid Build Coastguard Worker }
869*15dc779aSAndroid Build Coastguard Worker scale[i_ls] = ixheaacd_mps_sqrt(scale[i_ls], &(q_scale[i_ls]), sqrt_tab);
870*15dc779aSAndroid Build Coastguard Worker
871*15dc779aSAndroid Build Coastguard Worker if (wet_ener[i_rs] != 0) {
872*15dc779aSAndroid Build Coastguard Worker scale[i_rs] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_rs], &qtemp2);
873*15dc779aSAndroid Build Coastguard Worker q_scale[i_rs] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_rs];
874*15dc779aSAndroid Build Coastguard Worker } else {
875*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaac_norm32(dry_ener[0]);
876*15dc779aSAndroid Build Coastguard Worker scale[i_rs] = dry_ener[0] << temp_1;
877*15dc779aSAndroid Build Coastguard Worker q_scale[i_rs] = q_dry_ener[0] + temp_1 - 30;
878*15dc779aSAndroid Build Coastguard Worker }
879*15dc779aSAndroid Build Coastguard Worker scale[i_rs] = ixheaacd_mps_sqrt(scale[i_rs], &(q_scale[i_rs]), sqrt_tab);
880*15dc779aSAndroid Build Coastguard Worker
881*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < 6; ch++) {
882*15dc779aSAndroid Build Coastguard Worker if (ch == 3 && tree_config == 0) continue;
883*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32_shr_15(scale[ch], one_minus_damp);
884*15dc779aSAndroid Build Coastguard Worker scale[ch] = ixheaacd_mps_add32(temp_1, damp, &(q_scale[ch]), 15);
885*15dc779aSAndroid Build Coastguard Worker scale[ch] = ixheaacd_mps_convert_to_qn(scale[ch], q_scale[ch], 15);
886*15dc779aSAndroid Build Coastguard Worker if (scale[ch] > STP_SCALE_LIMIT_FIX) scale[ch] = STP_SCALE_LIMIT_FIX;
887*15dc779aSAndroid Build Coastguard Worker if (scale[ch] < ONE_BY_STP_SCALE_LIMIT)
888*15dc779aSAndroid Build Coastguard Worker scale[ch] = ONE_BY_STP_SCALE_LIMIT;
889*15dc779aSAndroid Build Coastguard Worker }
890*15dc779aSAndroid Build Coastguard Worker
891*15dc779aSAndroid Build Coastguard Worker break;
892*15dc779aSAndroid Build Coastguard Worker case TREE_525:
893*15dc779aSAndroid Build Coastguard Worker if (wet_ener[i_lf] != 0) {
894*15dc779aSAndroid Build Coastguard Worker scale[i_lf] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_lf], &qtemp2);
895*15dc779aSAndroid Build Coastguard Worker q_scale[i_lf] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_lf];
896*15dc779aSAndroid Build Coastguard Worker } else {
897*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaac_norm32(dry_ener[0]);
898*15dc779aSAndroid Build Coastguard Worker scale[i_lf] = dry_ener[0] << temp_1;
899*15dc779aSAndroid Build Coastguard Worker q_scale[i_lf] = q_dry_ener[0] + temp_1 - 30;
900*15dc779aSAndroid Build Coastguard Worker }
901*15dc779aSAndroid Build Coastguard Worker scale[i_lf] = ixheaacd_mps_sqrt(scale[i_lf], &(q_scale[i_lf]), sqrt_tab);
902*15dc779aSAndroid Build Coastguard Worker
903*15dc779aSAndroid Build Coastguard Worker if (wet_ener[i_rf] != 0) {
904*15dc779aSAndroid Build Coastguard Worker scale[i_rf] = ixheaacd_mps_div_32(dry_ener[1], wet_ener[i_rf], &qtemp2);
905*15dc779aSAndroid Build Coastguard Worker q_scale[i_rf] = qtemp2 + q_dry_ener[1] - q_wet_ener[i_rf];
906*15dc779aSAndroid Build Coastguard Worker } else {
907*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaac_norm32(dry_ener[1]);
908*15dc779aSAndroid Build Coastguard Worker scale[i_rf] = dry_ener[1] << temp_1;
909*15dc779aSAndroid Build Coastguard Worker q_scale[i_rf] = q_dry_ener[1] + temp_1 - 30;
910*15dc779aSAndroid Build Coastguard Worker }
911*15dc779aSAndroid Build Coastguard Worker scale[i_rf] = ixheaacd_mps_sqrt(scale[i_rf], &(q_scale[i_rf]), sqrt_tab);
912*15dc779aSAndroid Build Coastguard Worker
913*15dc779aSAndroid Build Coastguard Worker if (wet_ener[i_ls] != 0) {
914*15dc779aSAndroid Build Coastguard Worker scale[i_ls] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_ls], &qtemp2);
915*15dc779aSAndroid Build Coastguard Worker q_scale[i_ls] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_ls];
916*15dc779aSAndroid Build Coastguard Worker } else {
917*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaac_norm32(dry_ener[0]);
918*15dc779aSAndroid Build Coastguard Worker scale[i_ls] = dry_ener[0] << temp_1;
919*15dc779aSAndroid Build Coastguard Worker q_scale[i_ls] = q_dry_ener[0] + temp_1 - 30;
920*15dc779aSAndroid Build Coastguard Worker }
921*15dc779aSAndroid Build Coastguard Worker scale[i_ls] = ixheaacd_mps_sqrt(scale[i_ls], &(q_scale[i_ls]), sqrt_tab);
922*15dc779aSAndroid Build Coastguard Worker
923*15dc779aSAndroid Build Coastguard Worker if (wet_ener[i_rs] != 0) {
924*15dc779aSAndroid Build Coastguard Worker scale[i_rs] = ixheaacd_mps_div_32(dry_ener[1], wet_ener[i_rs], &qtemp2);
925*15dc779aSAndroid Build Coastguard Worker q_scale[i_rs] = qtemp2 + q_dry_ener[1] - q_wet_ener[i_rs];
926*15dc779aSAndroid Build Coastguard Worker } else {
927*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaac_norm32(dry_ener[1]);
928*15dc779aSAndroid Build Coastguard Worker scale[i_rs] = dry_ener[1] << temp_1;
929*15dc779aSAndroid Build Coastguard Worker q_scale[i_rs] = q_dry_ener[1] + temp_1 - 30;
930*15dc779aSAndroid Build Coastguard Worker }
931*15dc779aSAndroid Build Coastguard Worker scale[i_rs] = ixheaacd_mps_sqrt(scale[i_rs], &(q_scale[i_rs]), sqrt_tab);
932*15dc779aSAndroid Build Coastguard Worker
933*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < 4; ch++) {
934*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32_shr_15(scale[ch], one_minus_damp);
935*15dc779aSAndroid Build Coastguard Worker scale[ch] = ixheaacd_mps_add32(temp_1, damp, &(q_scale[ch]), 15);
936*15dc779aSAndroid Build Coastguard Worker scale[ch] = ixheaacd_mps_convert_to_qn(scale[ch], q_scale[ch], 15);
937*15dc779aSAndroid Build Coastguard Worker if (scale[ch] > STP_SCALE_LIMIT_FIX) scale[ch] = STP_SCALE_LIMIT_FIX;
938*15dc779aSAndroid Build Coastguard Worker if (scale[ch] < ONE_BY_STP_SCALE_LIMIT)
939*15dc779aSAndroid Build Coastguard Worker scale[ch] = ONE_BY_STP_SCALE_LIMIT;
940*15dc779aSAndroid Build Coastguard Worker }
941*15dc779aSAndroid Build Coastguard Worker break;
942*15dc779aSAndroid Build Coastguard Worker case TREE_7271:
943*15dc779aSAndroid Build Coastguard Worker case TREE_7272:
944*15dc779aSAndroid Build Coastguard Worker if (wet_ener[i_lf] != 0) {
945*15dc779aSAndroid Build Coastguard Worker scale[i_lf] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_lf], &qtemp2);
946*15dc779aSAndroid Build Coastguard Worker q_scale[i_lf] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_lf];
947*15dc779aSAndroid Build Coastguard Worker } else {
948*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaac_norm32(dry_ener[0]);
949*15dc779aSAndroid Build Coastguard Worker scale[i_lf] = dry_ener[0] << temp_1;
950*15dc779aSAndroid Build Coastguard Worker q_scale[i_lf] = q_dry_ener[0] + temp_1 - 30;
951*15dc779aSAndroid Build Coastguard Worker }
952*15dc779aSAndroid Build Coastguard Worker scale[i_lf] = ixheaacd_mps_sqrt(scale[i_lf], &(q_scale[i_lf]), sqrt_tab);
953*15dc779aSAndroid Build Coastguard Worker
954*15dc779aSAndroid Build Coastguard Worker if (wet_ener[i_rf] != 0) {
955*15dc779aSAndroid Build Coastguard Worker scale[i_rf] = ixheaacd_mps_div_32(dry_ener[1], wet_ener[i_rf], &qtemp2);
956*15dc779aSAndroid Build Coastguard Worker q_scale[i_rf] = qtemp2 + q_dry_ener[1] - q_wet_ener[i_rf];
957*15dc779aSAndroid Build Coastguard Worker } else {
958*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaac_norm32(dry_ener[1]);
959*15dc779aSAndroid Build Coastguard Worker scale[i_rf] = dry_ener[1] << temp_1;
960*15dc779aSAndroid Build Coastguard Worker q_scale[i_rf] = q_dry_ener[1] + temp_1 - 30;
961*15dc779aSAndroid Build Coastguard Worker }
962*15dc779aSAndroid Build Coastguard Worker scale[i_rf] = ixheaacd_mps_sqrt(scale[i_rf], &(q_scale[i_rf]), sqrt_tab);
963*15dc779aSAndroid Build Coastguard Worker
964*15dc779aSAndroid Build Coastguard Worker if (wet_ener[i_ls] != 0) {
965*15dc779aSAndroid Build Coastguard Worker scale[i_ls] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_ls], &qtemp2);
966*15dc779aSAndroid Build Coastguard Worker q_scale[i_ls] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_ls];
967*15dc779aSAndroid Build Coastguard Worker } else {
968*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaac_norm32(dry_ener[0]);
969*15dc779aSAndroid Build Coastguard Worker scale[i_ls] = dry_ener[0] << temp_1;
970*15dc779aSAndroid Build Coastguard Worker q_scale[i_ls] = q_dry_ener[0] + temp_1 - 30;
971*15dc779aSAndroid Build Coastguard Worker }
972*15dc779aSAndroid Build Coastguard Worker scale[i_ls] = ixheaacd_mps_sqrt(scale[i_ls], &(q_scale[i_ls]), sqrt_tab);
973*15dc779aSAndroid Build Coastguard Worker
974*15dc779aSAndroid Build Coastguard Worker if (wet_ener[i_rs] != 0) {
975*15dc779aSAndroid Build Coastguard Worker scale[i_rs] = ixheaacd_mps_div_32(dry_ener[1], wet_ener[i_rs], &qtemp2);
976*15dc779aSAndroid Build Coastguard Worker q_scale[i_rs] = qtemp2 + q_dry_ener[1] - q_wet_ener[i_rs];
977*15dc779aSAndroid Build Coastguard Worker } else {
978*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaac_norm32(dry_ener[1]);
979*15dc779aSAndroid Build Coastguard Worker scale[i_rs] = dry_ener[1] << temp_1;
980*15dc779aSAndroid Build Coastguard Worker q_scale[i_rs] = q_dry_ener[1] + temp_1 - 30;
981*15dc779aSAndroid Build Coastguard Worker }
982*15dc779aSAndroid Build Coastguard Worker scale[i_rs] = ixheaacd_mps_sqrt(scale[i_rs], &(q_scale[i_rs]), sqrt_tab);
983*15dc779aSAndroid Build Coastguard Worker
984*15dc779aSAndroid Build Coastguard Worker if (wet_ener[i_al] != 0) {
985*15dc779aSAndroid Build Coastguard Worker scale[i_al] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_al], &qtemp2);
986*15dc779aSAndroid Build Coastguard Worker q_scale[i_al] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_al];
987*15dc779aSAndroid Build Coastguard Worker } else {
988*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaac_norm32(dry_ener[0]);
989*15dc779aSAndroid Build Coastguard Worker scale[i_al] = dry_ener[0] << temp_1;
990*15dc779aSAndroid Build Coastguard Worker q_scale[i_al] = q_dry_ener[0] + temp_1 - 30;
991*15dc779aSAndroid Build Coastguard Worker }
992*15dc779aSAndroid Build Coastguard Worker scale[i_al] = ixheaacd_mps_sqrt(scale[i_al], &(q_scale[i_al]), sqrt_tab);
993*15dc779aSAndroid Build Coastguard Worker
994*15dc779aSAndroid Build Coastguard Worker if (wet_ener[i_ar] != 0) {
995*15dc779aSAndroid Build Coastguard Worker scale[i_ar] = ixheaacd_mps_div_32(dry_ener[1], wet_ener[i_ar], &qtemp2);
996*15dc779aSAndroid Build Coastguard Worker q_scale[i_ar] = qtemp2 + q_dry_ener[1] - q_wet_ener[i_ar];
997*15dc779aSAndroid Build Coastguard Worker } else {
998*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaac_norm32(dry_ener[1]);
999*15dc779aSAndroid Build Coastguard Worker scale[i_ar] = dry_ener[1] << temp_1;
1000*15dc779aSAndroid Build Coastguard Worker q_scale[i_ar] = q_dry_ener[1] + temp_1 - 30;
1001*15dc779aSAndroid Build Coastguard Worker }
1002*15dc779aSAndroid Build Coastguard Worker scale[i_ar] = ixheaacd_mps_sqrt(scale[i_ar], &(q_scale[i_ar]), sqrt_tab);
1003*15dc779aSAndroid Build Coastguard Worker
1004*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < 6; ch++) {
1005*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32_shr_15(scale[ch], one_minus_damp);
1006*15dc779aSAndroid Build Coastguard Worker scale[ch] = ixheaacd_mps_add32(temp_1, damp, &(q_scale[ch]), 15);
1007*15dc779aSAndroid Build Coastguard Worker scale[ch] = ixheaacd_mps_convert_to_qn(scale[ch], q_scale[ch], 15);
1008*15dc779aSAndroid Build Coastguard Worker if (scale[ch] > STP_SCALE_LIMIT_FIX) scale[ch] = STP_SCALE_LIMIT_FIX;
1009*15dc779aSAndroid Build Coastguard Worker if (scale[ch] < ONE_BY_STP_SCALE_LIMIT)
1010*15dc779aSAndroid Build Coastguard Worker scale[ch] = ONE_BY_STP_SCALE_LIMIT;
1011*15dc779aSAndroid Build Coastguard Worker }
1012*15dc779aSAndroid Build Coastguard Worker
1013*15dc779aSAndroid Build Coastguard Worker break;
1014*15dc779aSAndroid Build Coastguard Worker case TREE_7571:
1015*15dc779aSAndroid Build Coastguard Worker if (wet_ener[i_lf] != 0) {
1016*15dc779aSAndroid Build Coastguard Worker scale[i_lf] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_lf], &qtemp2);
1017*15dc779aSAndroid Build Coastguard Worker q_scale[i_lf] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_lf];
1018*15dc779aSAndroid Build Coastguard Worker } else {
1019*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaac_norm32(dry_ener[0]);
1020*15dc779aSAndroid Build Coastguard Worker scale[i_lf] = dry_ener[0] << temp_1;
1021*15dc779aSAndroid Build Coastguard Worker q_scale[i_lf] = q_dry_ener[0] + temp_1 - 30;
1022*15dc779aSAndroid Build Coastguard Worker }
1023*15dc779aSAndroid Build Coastguard Worker scale[i_lf] = ixheaacd_mps_sqrt(scale[i_lf], &(q_scale[i_lf]), sqrt_tab);
1024*15dc779aSAndroid Build Coastguard Worker
1025*15dc779aSAndroid Build Coastguard Worker if (wet_ener[i_rf] != 0) {
1026*15dc779aSAndroid Build Coastguard Worker scale[i_rf] = ixheaacd_mps_div_32(dry_ener[1], wet_ener[i_rf], &qtemp2);
1027*15dc779aSAndroid Build Coastguard Worker q_scale[i_rf] = qtemp2 + q_dry_ener[1] - q_wet_ener[i_rf];
1028*15dc779aSAndroid Build Coastguard Worker } else {
1029*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaac_norm32(dry_ener[1]);
1030*15dc779aSAndroid Build Coastguard Worker scale[i_rf] = dry_ener[1] << temp_1;
1031*15dc779aSAndroid Build Coastguard Worker q_scale[i_rf] = q_dry_ener[1] + temp_1 - 30;
1032*15dc779aSAndroid Build Coastguard Worker }
1033*15dc779aSAndroid Build Coastguard Worker scale[i_rf] = ixheaacd_mps_sqrt(scale[i_rf], &(q_scale[i_rf]), sqrt_tab);
1034*15dc779aSAndroid Build Coastguard Worker
1035*15dc779aSAndroid Build Coastguard Worker if (wet_ener[i_al] != 0) {
1036*15dc779aSAndroid Build Coastguard Worker scale[i_al] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_al], &qtemp2);
1037*15dc779aSAndroid Build Coastguard Worker q_scale[i_al] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_al];
1038*15dc779aSAndroid Build Coastguard Worker } else {
1039*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaac_norm32(dry_ener[0]);
1040*15dc779aSAndroid Build Coastguard Worker scale[i_al] = dry_ener[0] << temp_1;
1041*15dc779aSAndroid Build Coastguard Worker q_scale[i_al] = q_dry_ener[0] + temp_1 - 30;
1042*15dc779aSAndroid Build Coastguard Worker }
1043*15dc779aSAndroid Build Coastguard Worker scale[i_al] = ixheaacd_mps_sqrt(scale[i_al], &(q_scale[i_al]), sqrt_tab);
1044*15dc779aSAndroid Build Coastguard Worker
1045*15dc779aSAndroid Build Coastguard Worker if (wet_ener[i_ar] != 0) {
1046*15dc779aSAndroid Build Coastguard Worker scale[i_ar] = ixheaacd_mps_div_32(dry_ener[1], wet_ener[i_ar], &qtemp2);
1047*15dc779aSAndroid Build Coastguard Worker q_scale[i_ar] = qtemp2 + q_dry_ener[1] - q_wet_ener[i_ar];
1048*15dc779aSAndroid Build Coastguard Worker } else {
1049*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaac_norm32(dry_ener[1]);
1050*15dc779aSAndroid Build Coastguard Worker scale[i_ar] = dry_ener[1] << temp_1;
1051*15dc779aSAndroid Build Coastguard Worker q_scale[i_ar] = q_dry_ener[1] + temp_1 - 30;
1052*15dc779aSAndroid Build Coastguard Worker }
1053*15dc779aSAndroid Build Coastguard Worker scale[i_ar] = ixheaacd_mps_sqrt(scale[i_ar], &(q_scale[i_ar]), sqrt_tab);
1054*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < FIVE; ch++) {
1055*15dc779aSAndroid Build Coastguard Worker if (ch == 2) continue;
1056*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32_shr_15(scale[ch], one_minus_damp);
1057*15dc779aSAndroid Build Coastguard Worker scale[ch] = ixheaacd_mps_add32(temp_1, damp, &(q_scale[ch]), 15);
1058*15dc779aSAndroid Build Coastguard Worker scale[ch] = ixheaacd_mps_convert_to_qn(scale[ch], q_scale[ch], 15);
1059*15dc779aSAndroid Build Coastguard Worker if (scale[ch] > STP_SCALE_LIMIT_FIX) scale[ch] = STP_SCALE_LIMIT_FIX;
1060*15dc779aSAndroid Build Coastguard Worker if (scale[ch] < ONE_BY_STP_SCALE_LIMIT)
1061*15dc779aSAndroid Build Coastguard Worker scale[ch] = ONE_BY_STP_SCALE_LIMIT;
1062*15dc779aSAndroid Build Coastguard Worker }
1063*15dc779aSAndroid Build Coastguard Worker
1064*15dc779aSAndroid Build Coastguard Worker break;
1065*15dc779aSAndroid Build Coastguard Worker case TREE_7572:
1066*15dc779aSAndroid Build Coastguard Worker if (wet_ener[i_ls] != 0) {
1067*15dc779aSAndroid Build Coastguard Worker scale[i_ls] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_ls], &qtemp2);
1068*15dc779aSAndroid Build Coastguard Worker q_scale[i_ls] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_ls];
1069*15dc779aSAndroid Build Coastguard Worker } else {
1070*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaac_norm32(dry_ener[0]);
1071*15dc779aSAndroid Build Coastguard Worker scale[i_ls] = dry_ener[0] << temp_1;
1072*15dc779aSAndroid Build Coastguard Worker q_scale[i_ls] = q_dry_ener[0] + temp_1 - 30;
1073*15dc779aSAndroid Build Coastguard Worker }
1074*15dc779aSAndroid Build Coastguard Worker scale[i_ls] = ixheaacd_mps_sqrt(scale[i_ls], &(q_scale[i_ls]), sqrt_tab);
1075*15dc779aSAndroid Build Coastguard Worker
1076*15dc779aSAndroid Build Coastguard Worker if (wet_ener[i_rs] != 0) {
1077*15dc779aSAndroid Build Coastguard Worker scale[i_rs] = ixheaacd_mps_div_32(dry_ener[1], wet_ener[i_rs], &qtemp2);
1078*15dc779aSAndroid Build Coastguard Worker q_scale[i_rs] = qtemp2 + q_dry_ener[1] - q_wet_ener[i_rs];
1079*15dc779aSAndroid Build Coastguard Worker } else {
1080*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaac_norm32(dry_ener[1]);
1081*15dc779aSAndroid Build Coastguard Worker scale[i_rs] = dry_ener[1] << temp_1;
1082*15dc779aSAndroid Build Coastguard Worker q_scale[i_rs] = q_dry_ener[1] + temp_1 - 30;
1083*15dc779aSAndroid Build Coastguard Worker }
1084*15dc779aSAndroid Build Coastguard Worker scale[i_rs] = ixheaacd_mps_sqrt(scale[i_rs], &(q_scale[i_rs]), sqrt_tab);
1085*15dc779aSAndroid Build Coastguard Worker
1086*15dc779aSAndroid Build Coastguard Worker if (wet_ener[i_al] != 0) {
1087*15dc779aSAndroid Build Coastguard Worker scale[i_al] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_al], &qtemp2);
1088*15dc779aSAndroid Build Coastguard Worker q_scale[i_al] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_al];
1089*15dc779aSAndroid Build Coastguard Worker } else {
1090*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaac_norm32(dry_ener[0]);
1091*15dc779aSAndroid Build Coastguard Worker scale[i_al] = dry_ener[0] << temp_1;
1092*15dc779aSAndroid Build Coastguard Worker q_scale[i_al] = q_dry_ener[0] + temp_1 - 30;
1093*15dc779aSAndroid Build Coastguard Worker }
1094*15dc779aSAndroid Build Coastguard Worker scale[i_al] = ixheaacd_mps_sqrt(scale[i_al], &(q_scale[i_al]), sqrt_tab);
1095*15dc779aSAndroid Build Coastguard Worker
1096*15dc779aSAndroid Build Coastguard Worker if (wet_ener[i_ar] != 0) {
1097*15dc779aSAndroid Build Coastguard Worker scale[i_ar] = ixheaacd_mps_div_32(dry_ener[1], wet_ener[i_ar], &qtemp2);
1098*15dc779aSAndroid Build Coastguard Worker q_scale[i_ar] = qtemp2 + q_dry_ener[1] - q_wet_ener[i_ar];
1099*15dc779aSAndroid Build Coastguard Worker } else {
1100*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaac_norm32(dry_ener[1]);
1101*15dc779aSAndroid Build Coastguard Worker scale[i_ar] = dry_ener[1] << temp_1;
1102*15dc779aSAndroid Build Coastguard Worker q_scale[i_ar] = q_dry_ener[1] + temp_1 - 30;
1103*15dc779aSAndroid Build Coastguard Worker }
1104*15dc779aSAndroid Build Coastguard Worker scale[i_ar] = ixheaacd_mps_sqrt(scale[i_ar], &(q_scale[i_ar]), sqrt_tab);
1105*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < 6; ch++) {
1106*15dc779aSAndroid Build Coastguard Worker if (ch == 3 || ch == 0) continue;
1107*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32_shr_15(scale[ch], one_minus_damp);
1108*15dc779aSAndroid Build Coastguard Worker scale[ch] = ixheaacd_mps_add32(temp_1, damp, &(q_scale[ch]), 15);
1109*15dc779aSAndroid Build Coastguard Worker scale[ch] = ixheaacd_mps_convert_to_qn(scale[ch], q_scale[ch], 15);
1110*15dc779aSAndroid Build Coastguard Worker if (scale[ch] > STP_SCALE_LIMIT_FIX) scale[ch] = STP_SCALE_LIMIT_FIX;
1111*15dc779aSAndroid Build Coastguard Worker if (scale[ch] < ONE_BY_STP_SCALE_LIMIT)
1112*15dc779aSAndroid Build Coastguard Worker scale[ch] = ONE_BY_STP_SCALE_LIMIT;
1113*15dc779aSAndroid Build Coastguard Worker }
1114*15dc779aSAndroid Build Coastguard Worker
1115*15dc779aSAndroid Build Coastguard Worker break;
1116*15dc779aSAndroid Build Coastguard Worker default:
1117*15dc779aSAndroid Build Coastguard Worker break;
1118*15dc779aSAndroid Build Coastguard Worker }
1119*15dc779aSAndroid Build Coastguard Worker
1120*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < num_output_channels; ch++) {
1121*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32_shr_15(STP_LPF_COEFF2_FIX, scale[ch]);
1122*15dc779aSAndroid Build Coastguard Worker temp_2 =
1123*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_mult32_shr_15(ONE_MINUS_STP_LPF_COEFF2, prev_tp_scale[ch]);
1124*15dc779aSAndroid Build Coastguard Worker scale[ch] = temp_1 + temp_2;
1125*15dc779aSAndroid Build Coastguard Worker prev_tp_scale[ch] = scale[ch];
1126*15dc779aSAndroid Build Coastguard Worker }
1127*15dc779aSAndroid Build Coastguard Worker
1128*15dc779aSAndroid Build Coastguard Worker offset = ts * MAX_HYBRID_BANDS;
1129*15dc779aSAndroid Build Coastguard Worker p_buffer_real = p_array_struct->buf_real + offset + HYBRID_BAND_BORDER;
1130*15dc779aSAndroid Build Coastguard Worker p_buffer_imag = p_array_struct->buf_imag + offset + HYBRID_BAND_BORDER;
1131*15dc779aSAndroid Build Coastguard Worker
1132*15dc779aSAndroid Build Coastguard Worker p_buf_real = p_array_struct->buffer_real + offset + FIVE;
1133*15dc779aSAndroid Build Coastguard Worker p_buf_imag = p_array_struct->buffer_imag + offset + FIVE;
1134*15dc779aSAndroid Build Coastguard Worker
1135*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_real = p_array_struct->hyb_output_real_dry +
1136*15dc779aSAndroid Build Coastguard Worker ts * MAX_HYBRID_BANDS + HYBRID_BAND_BORDER;
1137*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_imag = p_array_struct->hyb_output_imag_dry +
1138*15dc779aSAndroid Build Coastguard Worker ts * MAX_HYBRID_BANDS + HYBRID_BAND_BORDER;
1139*15dc779aSAndroid Build Coastguard Worker
1140*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < num_output_channels; ch++) {
1141*15dc779aSAndroid Build Coastguard Worker no_scaling = 1;
1142*15dc779aSAndroid Build Coastguard Worker
1143*15dc779aSAndroid Build Coastguard Worker ixheaacd_get_ch_idx(pstr_mps_state, ch, &i);
1144*15dc779aSAndroid Build Coastguard Worker if (i != -1) {
1145*15dc779aSAndroid Build Coastguard Worker no_scaling = !pstr_mps_state->aux_struct->temp_shape_enable_channel_stp[i];
1146*15dc779aSAndroid Build Coastguard Worker }
1147*15dc779aSAndroid Build Coastguard Worker p_buffer_re = p_buffer_real;
1148*15dc779aSAndroid Build Coastguard Worker p_buffer_im = p_buffer_imag;
1149*15dc779aSAndroid Build Coastguard Worker
1150*15dc779aSAndroid Build Coastguard Worker p_buf_re = p_buf_real;
1151*15dc779aSAndroid Build Coastguard Worker p_buf_im = p_buf_imag;
1152*15dc779aSAndroid Build Coastguard Worker
1153*15dc779aSAndroid Build Coastguard Worker hyb_output_real_dry = p_hyb_out_dry_real;
1154*15dc779aSAndroid Build Coastguard Worker hyb_output_imag_dry = p_hyb_out_dry_imag;
1155*15dc779aSAndroid Build Coastguard Worker
1156*15dc779aSAndroid Build Coastguard Worker if (no_scaling == 1) {
1157*15dc779aSAndroid Build Coastguard Worker for (n = HYBRID_BAND_BORDER; n < (HP_SIZE + QMF_TO_HYB_OFFSET); n++) {
1158*15dc779aSAndroid Build Coastguard Worker *p_buf_re++ = *hyb_output_real_dry++ + *p_buffer_re++;
1159*15dc779aSAndroid Build Coastguard Worker
1160*15dc779aSAndroid Build Coastguard Worker *p_buf_im++ = *hyb_output_imag_dry++ + *p_buffer_im++;
1161*15dc779aSAndroid Build Coastguard Worker }
1162*15dc779aSAndroid Build Coastguard Worker
1163*15dc779aSAndroid Build Coastguard Worker for (; n < hybrid_bands; n++, k++) {
1164*15dc779aSAndroid Build Coastguard Worker temp = (no_scaling ? ONE_IN_Q15 : scale[ch]);
1165*15dc779aSAndroid Build Coastguard Worker
1166*15dc779aSAndroid Build Coastguard Worker *p_buf_re++ = *hyb_output_real_dry++ + *p_buffer_re++;
1167*15dc779aSAndroid Build Coastguard Worker
1168*15dc779aSAndroid Build Coastguard Worker *p_buf_im++ = *hyb_output_imag_dry++ + *p_buffer_im++;
1169*15dc779aSAndroid Build Coastguard Worker }
1170*15dc779aSAndroid Build Coastguard Worker } else {
1171*15dc779aSAndroid Build Coastguard Worker for (n = HYBRID_BAND_BORDER; n < (HP_SIZE + QMF_TO_HYB_OFFSET); n++) {
1172*15dc779aSAndroid Build Coastguard Worker temp = ixheaacd_mps_mult32_shr_30(
1173*15dc779aSAndroid Build Coastguard Worker scale[ch], tp_process_table_ptr->bp[n - QMF_TO_HYB_OFFSET]);
1174*15dc779aSAndroid Build Coastguard Worker
1175*15dc779aSAndroid Build Coastguard Worker *p_buf_re++ = *hyb_output_real_dry++ +
1176*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_mult32_shr_15(temp, *p_buffer_re);
1177*15dc779aSAndroid Build Coastguard Worker p_buffer_re++;
1178*15dc779aSAndroid Build Coastguard Worker
1179*15dc779aSAndroid Build Coastguard Worker *p_buf_im++ = *hyb_output_imag_dry++ +
1180*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_mult32_shr_15(temp, *p_buffer_im);
1181*15dc779aSAndroid Build Coastguard Worker p_buffer_im++;
1182*15dc779aSAndroid Build Coastguard Worker }
1183*15dc779aSAndroid Build Coastguard Worker
1184*15dc779aSAndroid Build Coastguard Worker for (; n < hybrid_bands; n++, k++) {
1185*15dc779aSAndroid Build Coastguard Worker temp = (no_scaling ? ONE_IN_Q15 : scale[ch]);
1186*15dc779aSAndroid Build Coastguard Worker
1187*15dc779aSAndroid Build Coastguard Worker *p_buf_re++ = *hyb_output_real_dry++ +
1188*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_mult32_shr_15(temp, *p_buffer_re);
1189*15dc779aSAndroid Build Coastguard Worker p_buffer_re++;
1190*15dc779aSAndroid Build Coastguard Worker
1191*15dc779aSAndroid Build Coastguard Worker *p_buf_im++ = *hyb_output_imag_dry++ +
1192*15dc779aSAndroid Build Coastguard Worker ixheaacd_mps_mult32_shr_15(temp, *p_buffer_im);
1193*15dc779aSAndroid Build Coastguard Worker p_buffer_im++;
1194*15dc779aSAndroid Build Coastguard Worker }
1195*15dc779aSAndroid Build Coastguard Worker }
1196*15dc779aSAndroid Build Coastguard Worker
1197*15dc779aSAndroid Build Coastguard Worker p_buffer_real += TSXHB;
1198*15dc779aSAndroid Build Coastguard Worker p_buffer_imag += TSXHB;
1199*15dc779aSAndroid Build Coastguard Worker
1200*15dc779aSAndroid Build Coastguard Worker p_buf_real += TSXHB;
1201*15dc779aSAndroid Build Coastguard Worker p_buf_imag += TSXHB;
1202*15dc779aSAndroid Build Coastguard Worker
1203*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_real += TSXHB;
1204*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_imag += TSXHB;
1205*15dc779aSAndroid Build Coastguard Worker }
1206*15dc779aSAndroid Build Coastguard Worker
1207*15dc779aSAndroid Build Coastguard Worker return;
1208*15dc779aSAndroid Build Coastguard Worker }
1209*15dc779aSAndroid Build Coastguard Worker
ixheaacd_tp_process(ia_heaac_mps_state_struct * pstr_mps_state)1210*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_tp_process(ia_heaac_mps_state_struct *pstr_mps_state) {
1211*15dc779aSAndroid Build Coastguard Worker WORD32 ch, ts, hyb, n;
1212*15dc779aSAndroid Build Coastguard Worker WORD32 temp, temp_1, temp_2;
1213*15dc779aSAndroid Build Coastguard Worker ia_mps_dec_synthesis_interface *syn = pstr_mps_state->syn;
1214*15dc779aSAndroid Build Coastguard Worker WORD32 *hyb_output_real_wet, *hyb_output_imag_wet;
1215*15dc779aSAndroid Build Coastguard Worker WORD32 *hyb_output_real_dry, *hyb_output_imag_dry;
1216*15dc779aSAndroid Build Coastguard Worker
1217*15dc779aSAndroid Build Coastguard Worker WORD32 *p_buffer_real, *p_buffer_imag, *p_buffer_re, *p_buffer_im;
1218*15dc779aSAndroid Build Coastguard Worker WORD32 *p_buf_real, *p_buf_imag, *p_buf_re, *p_buf_im;
1219*15dc779aSAndroid Build Coastguard Worker WORD32 *buf_real, *buf_imag;
1220*15dc779aSAndroid Build Coastguard Worker
1221*15dc779aSAndroid Build Coastguard Worker WORD32 num_output_channels = pstr_mps_state->num_output_channels;
1222*15dc779aSAndroid Build Coastguard Worker WORD32 time_slots = pstr_mps_state->time_slots;
1223*15dc779aSAndroid Build Coastguard Worker WORD32 qmf_bands = pstr_mps_state->qmf_bands;
1224*15dc779aSAndroid Build Coastguard Worker WORD32 num_output_channels_at = pstr_mps_state->num_output_channels_at;
1225*15dc779aSAndroid Build Coastguard Worker WORD32 tree_config = pstr_mps_state->tree_config;
1226*15dc779aSAndroid Build Coastguard Worker WORD32 up_mix_type = pstr_mps_state->up_mix_type;
1227*15dc779aSAndroid Build Coastguard Worker WORD32 tp_hyb_band_border = pstr_mps_state->tp_hyb_band_border;
1228*15dc779aSAndroid Build Coastguard Worker
1229*15dc779aSAndroid Build Coastguard Worker ia_mps_dec_reuse_array_struct *p_array_struct = pstr_mps_state->array_struct;
1230*15dc779aSAndroid Build Coastguard Worker WORD32 *p_hyb_out_dry_real = p_array_struct->hyb_output_real_dry;
1231*15dc779aSAndroid Build Coastguard Worker WORD32 *p_hyb_out_dry_imag = p_array_struct->hyb_output_imag_dry;
1232*15dc779aSAndroid Build Coastguard Worker WORD32 *p_hyb_out_dry_re, *p_hyb_out_dry_im;
1233*15dc779aSAndroid Build Coastguard Worker
1234*15dc779aSAndroid Build Coastguard Worker WORD32 *p_time_out;
1235*15dc779aSAndroid Build Coastguard Worker
1236*15dc779aSAndroid Build Coastguard Worker p_buffer_real = p_array_struct->buf_real;
1237*15dc779aSAndroid Build Coastguard Worker p_buffer_imag = p_array_struct->buf_imag;
1238*15dc779aSAndroid Build Coastguard Worker
1239*15dc779aSAndroid Build Coastguard Worker p_buf_real = p_array_struct->buffer_real;
1240*15dc779aSAndroid Build Coastguard Worker p_buf_imag = p_array_struct->buffer_imag;
1241*15dc779aSAndroid Build Coastguard Worker
1242*15dc779aSAndroid Build Coastguard Worker if (!pstr_mps_state->scaling_enable) {
1243*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < num_output_channels; ch++) {
1244*15dc779aSAndroid Build Coastguard Worker p_buffer_re = p_buffer_real;
1245*15dc779aSAndroid Build Coastguard Worker p_buffer_im = p_buffer_imag;
1246*15dc779aSAndroid Build Coastguard Worker
1247*15dc779aSAndroid Build Coastguard Worker p_buf_re = p_buf_real;
1248*15dc779aSAndroid Build Coastguard Worker p_buf_im = p_buf_imag;
1249*15dc779aSAndroid Build Coastguard Worker
1250*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_re = p_hyb_out_dry_real;
1251*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_im = p_hyb_out_dry_imag;
1252*15dc779aSAndroid Build Coastguard Worker
1253*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < time_slots; ts++) {
1254*15dc779aSAndroid Build Coastguard Worker hyb_output_real_wet = p_buffer_re;
1255*15dc779aSAndroid Build Coastguard Worker hyb_output_imag_wet = p_buffer_im;
1256*15dc779aSAndroid Build Coastguard Worker hyb_output_real_dry = p_hyb_out_dry_re;
1257*15dc779aSAndroid Build Coastguard Worker hyb_output_imag_dry = p_hyb_out_dry_im;
1258*15dc779aSAndroid Build Coastguard Worker
1259*15dc779aSAndroid Build Coastguard Worker buf_real = p_buf_re;
1260*15dc779aSAndroid Build Coastguard Worker buf_imag = p_buf_im;
1261*15dc779aSAndroid Build Coastguard Worker
1262*15dc779aSAndroid Build Coastguard Worker temp_1 = *hyb_output_real_dry++ + *hyb_output_real_wet++;
1263*15dc779aSAndroid Build Coastguard Worker temp_2 = *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
1264*15dc779aSAndroid Build Coastguard Worker for (n = 1; n < 6; n++) {
1265*15dc779aSAndroid Build Coastguard Worker temp_1 += *hyb_output_real_dry++ + *hyb_output_real_wet++;
1266*15dc779aSAndroid Build Coastguard Worker temp_2 += *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
1267*15dc779aSAndroid Build Coastguard Worker }
1268*15dc779aSAndroid Build Coastguard Worker
1269*15dc779aSAndroid Build Coastguard Worker *buf_real++ = temp_1;
1270*15dc779aSAndroid Build Coastguard Worker *buf_imag++ = temp_2;
1271*15dc779aSAndroid Build Coastguard Worker
1272*15dc779aSAndroid Build Coastguard Worker temp = *hyb_output_real_dry++ + *hyb_output_real_wet++;
1273*15dc779aSAndroid Build Coastguard Worker *buf_real = temp + *hyb_output_real_dry++ + *hyb_output_real_wet++;
1274*15dc779aSAndroid Build Coastguard Worker temp = *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
1275*15dc779aSAndroid Build Coastguard Worker *buf_imag = temp + *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
1276*15dc779aSAndroid Build Coastguard Worker
1277*15dc779aSAndroid Build Coastguard Worker buf_real++;
1278*15dc779aSAndroid Build Coastguard Worker buf_imag++;
1279*15dc779aSAndroid Build Coastguard Worker
1280*15dc779aSAndroid Build Coastguard Worker temp = *hyb_output_real_dry++ + *hyb_output_real_wet++;
1281*15dc779aSAndroid Build Coastguard Worker *buf_real = temp + *hyb_output_real_dry++ + *hyb_output_real_wet++;
1282*15dc779aSAndroid Build Coastguard Worker temp = *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
1283*15dc779aSAndroid Build Coastguard Worker *buf_imag = temp + *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
1284*15dc779aSAndroid Build Coastguard Worker
1285*15dc779aSAndroid Build Coastguard Worker buf_real++;
1286*15dc779aSAndroid Build Coastguard Worker buf_imag++;
1287*15dc779aSAndroid Build Coastguard Worker
1288*15dc779aSAndroid Build Coastguard Worker for (n = 0; n < qmf_bands; n++) {
1289*15dc779aSAndroid Build Coastguard Worker *buf_real++ = *hyb_output_real_dry++ + *hyb_output_real_wet++;
1290*15dc779aSAndroid Build Coastguard Worker *buf_imag++ = *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
1291*15dc779aSAndroid Build Coastguard Worker }
1292*15dc779aSAndroid Build Coastguard Worker
1293*15dc779aSAndroid Build Coastguard Worker p_buffer_re += MAX_HYBRID_BANDS;
1294*15dc779aSAndroid Build Coastguard Worker p_buffer_im += MAX_HYBRID_BANDS;
1295*15dc779aSAndroid Build Coastguard Worker
1296*15dc779aSAndroid Build Coastguard Worker p_buf_re += MAX_HYBRID_BANDS;
1297*15dc779aSAndroid Build Coastguard Worker p_buf_im += MAX_HYBRID_BANDS;
1298*15dc779aSAndroid Build Coastguard Worker
1299*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_re += MAX_HYBRID_BANDS;
1300*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_im += MAX_HYBRID_BANDS;
1301*15dc779aSAndroid Build Coastguard Worker }
1302*15dc779aSAndroid Build Coastguard Worker p_buffer_real += TSXHB;
1303*15dc779aSAndroid Build Coastguard Worker p_buffer_imag += TSXHB;
1304*15dc779aSAndroid Build Coastguard Worker
1305*15dc779aSAndroid Build Coastguard Worker p_buf_real += TSXHB;
1306*15dc779aSAndroid Build Coastguard Worker p_buf_imag += TSXHB;
1307*15dc779aSAndroid Build Coastguard Worker
1308*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_real += TSXHB;
1309*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_imag += TSXHB;
1310*15dc779aSAndroid Build Coastguard Worker }
1311*15dc779aSAndroid Build Coastguard Worker } else {
1312*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < num_output_channels; ch++) {
1313*15dc779aSAndroid Build Coastguard Worker p_buffer_re = p_buffer_real;
1314*15dc779aSAndroid Build Coastguard Worker p_buffer_im = p_buffer_imag;
1315*15dc779aSAndroid Build Coastguard Worker
1316*15dc779aSAndroid Build Coastguard Worker p_buf_re = p_buf_real;
1317*15dc779aSAndroid Build Coastguard Worker p_buf_im = p_buf_imag;
1318*15dc779aSAndroid Build Coastguard Worker
1319*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_re = p_hyb_out_dry_real;
1320*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_im = p_hyb_out_dry_imag;
1321*15dc779aSAndroid Build Coastguard Worker
1322*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < time_slots; ts++) {
1323*15dc779aSAndroid Build Coastguard Worker hyb_output_real_wet = p_buffer_re;
1324*15dc779aSAndroid Build Coastguard Worker hyb_output_imag_wet = p_buffer_im;
1325*15dc779aSAndroid Build Coastguard Worker hyb_output_real_dry = p_hyb_out_dry_re;
1326*15dc779aSAndroid Build Coastguard Worker hyb_output_imag_dry = p_hyb_out_dry_im;
1327*15dc779aSAndroid Build Coastguard Worker
1328*15dc779aSAndroid Build Coastguard Worker buf_real = p_buf_re;
1329*15dc779aSAndroid Build Coastguard Worker buf_imag = p_buf_im;
1330*15dc779aSAndroid Build Coastguard Worker
1331*15dc779aSAndroid Build Coastguard Worker temp_1 = *hyb_output_real_dry++ + *hyb_output_real_wet++;
1332*15dc779aSAndroid Build Coastguard Worker temp_2 = *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
1333*15dc779aSAndroid Build Coastguard Worker for (n = 1; n < 6; n++) {
1334*15dc779aSAndroid Build Coastguard Worker temp_1 += *hyb_output_real_dry++ + *hyb_output_real_wet++;
1335*15dc779aSAndroid Build Coastguard Worker temp_2 += *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
1336*15dc779aSAndroid Build Coastguard Worker }
1337*15dc779aSAndroid Build Coastguard Worker
1338*15dc779aSAndroid Build Coastguard Worker *buf_real++ = temp_1;
1339*15dc779aSAndroid Build Coastguard Worker *buf_imag++ = temp_2;
1340*15dc779aSAndroid Build Coastguard Worker
1341*15dc779aSAndroid Build Coastguard Worker *buf_real = *hyb_output_real_dry++ + *hyb_output_real_wet++;
1342*15dc779aSAndroid Build Coastguard Worker *buf_real += *hyb_output_real_dry++ + *hyb_output_real_wet++;
1343*15dc779aSAndroid Build Coastguard Worker
1344*15dc779aSAndroid Build Coastguard Worker *buf_imag = *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
1345*15dc779aSAndroid Build Coastguard Worker *buf_imag += *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
1346*15dc779aSAndroid Build Coastguard Worker
1347*15dc779aSAndroid Build Coastguard Worker buf_real++;
1348*15dc779aSAndroid Build Coastguard Worker buf_imag++;
1349*15dc779aSAndroid Build Coastguard Worker
1350*15dc779aSAndroid Build Coastguard Worker *buf_real = *hyb_output_real_dry++ + *hyb_output_real_wet++;
1351*15dc779aSAndroid Build Coastguard Worker *buf_real += *hyb_output_real_dry++ + *hyb_output_real_wet++;
1352*15dc779aSAndroid Build Coastguard Worker *buf_imag = *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
1353*15dc779aSAndroid Build Coastguard Worker *buf_imag += *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
1354*15dc779aSAndroid Build Coastguard Worker
1355*15dc779aSAndroid Build Coastguard Worker buf_real++;
1356*15dc779aSAndroid Build Coastguard Worker buf_imag++;
1357*15dc779aSAndroid Build Coastguard Worker
1358*15dc779aSAndroid Build Coastguard Worker for (hyb = 3; hyb < tp_hyb_band_border - QMF_TO_HYB_OFFSET; hyb++) {
1359*15dc779aSAndroid Build Coastguard Worker *buf_real++ = *hyb_output_real_dry++ + *hyb_output_real_wet++;
1360*15dc779aSAndroid Build Coastguard Worker *buf_imag++ = *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
1361*15dc779aSAndroid Build Coastguard Worker }
1362*15dc779aSAndroid Build Coastguard Worker p_buffer_re += MAX_HYBRID_BANDS;
1363*15dc779aSAndroid Build Coastguard Worker p_buffer_im += MAX_HYBRID_BANDS;
1364*15dc779aSAndroid Build Coastguard Worker
1365*15dc779aSAndroid Build Coastguard Worker p_buf_re += MAX_HYBRID_BANDS;
1366*15dc779aSAndroid Build Coastguard Worker p_buf_im += MAX_HYBRID_BANDS;
1367*15dc779aSAndroid Build Coastguard Worker
1368*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_re += MAX_HYBRID_BANDS;
1369*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_im += MAX_HYBRID_BANDS;
1370*15dc779aSAndroid Build Coastguard Worker }
1371*15dc779aSAndroid Build Coastguard Worker p_buffer_real += TSXHB;
1372*15dc779aSAndroid Build Coastguard Worker p_buffer_imag += TSXHB;
1373*15dc779aSAndroid Build Coastguard Worker
1374*15dc779aSAndroid Build Coastguard Worker p_buf_real += TSXHB;
1375*15dc779aSAndroid Build Coastguard Worker p_buf_imag += TSXHB;
1376*15dc779aSAndroid Build Coastguard Worker
1377*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_real += TSXHB;
1378*15dc779aSAndroid Build Coastguard Worker p_hyb_out_dry_imag += TSXHB;
1379*15dc779aSAndroid Build Coastguard Worker }
1380*15dc779aSAndroid Build Coastguard Worker
1381*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < time_slots; ts++) {
1382*15dc779aSAndroid Build Coastguard Worker ixheaacd_subband_tp(pstr_mps_state, ts);
1383*15dc779aSAndroid Build Coastguard Worker }
1384*15dc779aSAndroid Build Coastguard Worker }
1385*15dc779aSAndroid Build Coastguard Worker
1386*15dc779aSAndroid Build Coastguard Worker if ((!pstr_mps_state->bs_config.arbitrary_tree) &&
1387*15dc779aSAndroid Build Coastguard Worker ((up_mix_type != 2) && (up_mix_type != 3))) {
1388*15dc779aSAndroid Build Coastguard Worker WORD32 *time_out_5xxx =
1389*15dc779aSAndroid Build Coastguard Worker pstr_mps_state->ia_mps_dec_mps_table.tp_process_table_ptr->time_out_idx_5xxx;
1390*15dc779aSAndroid Build Coastguard Worker WORD32 *time_out_7xxx =
1391*15dc779aSAndroid Build Coastguard Worker pstr_mps_state->ia_mps_dec_mps_table.tp_process_table_ptr->time_out_idx_7xxx;
1392*15dc779aSAndroid Build Coastguard Worker
1393*15dc779aSAndroid Build Coastguard Worker p_buf_real = p_array_struct->buffer_real;
1394*15dc779aSAndroid Build Coastguard Worker p_buf_imag = p_array_struct->buffer_imag;
1395*15dc779aSAndroid Build Coastguard Worker
1396*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < num_output_channels_at; ch++) {
1397*15dc779aSAndroid Build Coastguard Worker WORD32 tempch = 0;
1398*15dc779aSAndroid Build Coastguard Worker switch (tree_config) {
1399*15dc779aSAndroid Build Coastguard Worker case TREE_5151:
1400*15dc779aSAndroid Build Coastguard Worker tempch = ch;
1401*15dc779aSAndroid Build Coastguard Worker break;
1402*15dc779aSAndroid Build Coastguard Worker case TREE_5152:
1403*15dc779aSAndroid Build Coastguard Worker case TREE_525:
1404*15dc779aSAndroid Build Coastguard Worker tempch = time_out_5xxx[ch];
1405*15dc779aSAndroid Build Coastguard Worker break;
1406*15dc779aSAndroid Build Coastguard Worker case TREE_7271:
1407*15dc779aSAndroid Build Coastguard Worker case TREE_7272:
1408*15dc779aSAndroid Build Coastguard Worker case TREE_7571:
1409*15dc779aSAndroid Build Coastguard Worker case TREE_7572:
1410*15dc779aSAndroid Build Coastguard Worker tempch = time_out_7xxx[ch];
1411*15dc779aSAndroid Build Coastguard Worker break;
1412*15dc779aSAndroid Build Coastguard Worker default:
1413*15dc779aSAndroid Build Coastguard Worker break;
1414*15dc779aSAndroid Build Coastguard Worker }
1415*15dc779aSAndroid Build Coastguard Worker p_time_out = p_array_struct->time_out + tempch * QBXTS;
1416*15dc779aSAndroid Build Coastguard Worker syn->syn_filter_bank(&pstr_mps_state->syn_qmf_bank, p_buf_real, p_buf_imag,
1417*15dc779aSAndroid Build Coastguard Worker p_time_out, ch, qmf_bands, time_slots,
1418*15dc779aSAndroid Build Coastguard Worker pstr_mps_state->ia_mps_dec_mps_table.qmf_table_ptr);
1419*15dc779aSAndroid Build Coastguard Worker
1420*15dc779aSAndroid Build Coastguard Worker p_buf_real += TSXHB;
1421*15dc779aSAndroid Build Coastguard Worker p_buf_imag += TSXHB;
1422*15dc779aSAndroid Build Coastguard Worker }
1423*15dc779aSAndroid Build Coastguard Worker } else {
1424*15dc779aSAndroid Build Coastguard Worker p_time_out = p_array_struct->time_out;
1425*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < num_output_channels_at; ch++) {
1426*15dc779aSAndroid Build Coastguard Worker syn->syn_filter_bank(&pstr_mps_state->syn_qmf_bank, p_buf_real, p_buf_imag,
1427*15dc779aSAndroid Build Coastguard Worker p_time_out, ch, qmf_bands, time_slots,
1428*15dc779aSAndroid Build Coastguard Worker pstr_mps_state->ia_mps_dec_mps_table.qmf_table_ptr);
1429*15dc779aSAndroid Build Coastguard Worker
1430*15dc779aSAndroid Build Coastguard Worker p_buf_real += TSXHB;
1431*15dc779aSAndroid Build Coastguard Worker p_buf_imag += TSXHB;
1432*15dc779aSAndroid Build Coastguard Worker p_time_out += QBXTS;
1433*15dc779aSAndroid Build Coastguard Worker }
1434*15dc779aSAndroid Build Coastguard Worker }
1435*15dc779aSAndroid Build Coastguard Worker
1436*15dc779aSAndroid Build Coastguard Worker return;
1437*15dc779aSAndroid Build Coastguard Worker }
1438