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 "ixheaacd_sbr_common.h"
21*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
22*15dc779aSAndroid Build Coastguard Worker
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops16.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops.h"
28*15dc779aSAndroid Build Coastguard Worker
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_intrinsics.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecsettings.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_defines.h"
33*15dc779aSAndroid Build Coastguard Worker
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pns.h"
35*15dc779aSAndroid Build Coastguard Worker
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aac_rom.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pulsedata.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_data_struct.h"
39*15dc779aSAndroid Build Coastguard Worker
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_lt_predict.h"
41*15dc779aSAndroid Build Coastguard Worker
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_cnst.h"
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_defines.h"
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_struct_def.h"
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_channelinfo.h"
46*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_dec.h"
47*15dc779aSAndroid Build Coastguard Worker
48*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecoder.h"
49*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_scale.h"
50*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_lpp_tran.h"
51*15dc779aSAndroid Build Coastguard Worker
52*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr_part.h"
53*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_rom.h"
54*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_hybrid.h"
55*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ps_dec.h"
56*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr.h"
57*15dc779aSAndroid Build Coastguard Worker
58*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_sbr_const.h"
59*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_common_rom.h"
60*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_freq_sca.h"
61*15dc779aSAndroid Build Coastguard Worker
62*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_basic_funcs.h"
63*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr.h"
64*15dc779aSAndroid Build Coastguard Worker
65*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_calc.h"
66*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_op.h"
67*15dc779aSAndroid Build Coastguard Worker
68*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_qmf_dec.h"
69*15dc779aSAndroid Build Coastguard Worker
70*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pvc_dec.h"
71*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_dec.h"
72*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_function_selector.h"
73*15dc779aSAndroid Build Coastguard Worker
74*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_audioobjtypes.h"
75*15dc779aSAndroid Build Coastguard Worker
76*15dc779aSAndroid Build Coastguard Worker #define FACTOR 0x010b0000 * 2
77*15dc779aSAndroid Build Coastguard Worker
ixheaacd_alias_reduction(WORD16 * deg_patched,WORD16 * nrg_gain,WORD16 * nrg_est,WORD8 * alias_red_buf,WORD32 num_sub_bands,ixheaacd_misc_tables * pstr_common_tables)78*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_alias_reduction(WORD16 *deg_patched, WORD16 *nrg_gain,
79*15dc779aSAndroid Build Coastguard Worker WORD16 *nrg_est, WORD8 *alias_red_buf,
80*15dc779aSAndroid Build Coastguard Worker WORD32 num_sub_bands,
81*15dc779aSAndroid Build Coastguard Worker ixheaacd_misc_tables *pstr_common_tables) {
82*15dc779aSAndroid Build Coastguard Worker WORD32 group, grouping, i, num_groups, k;
83*15dc779aSAndroid Build Coastguard Worker WORD16 f_group_vec[MAX_FREQ_COEFFS], *ptr_f_group_vec;
84*15dc779aSAndroid Build Coastguard Worker
85*15dc779aSAndroid Build Coastguard Worker grouping = 0;
86*15dc779aSAndroid Build Coastguard Worker i = 0;
87*15dc779aSAndroid Build Coastguard Worker
88*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < num_sub_bands - 1; k++) {
89*15dc779aSAndroid Build Coastguard Worker if ((deg_patched[k + 1] != 0) && alias_red_buf[k]) {
90*15dc779aSAndroid Build Coastguard Worker if (grouping == 0) {
91*15dc779aSAndroid Build Coastguard Worker f_group_vec[i] = k;
92*15dc779aSAndroid Build Coastguard Worker grouping = 1;
93*15dc779aSAndroid Build Coastguard Worker i++;
94*15dc779aSAndroid Build Coastguard Worker } else {
95*15dc779aSAndroid Build Coastguard Worker if ((f_group_vec[i - 1] + 3) == k) {
96*15dc779aSAndroid Build Coastguard Worker f_group_vec[i] = (k + 1);
97*15dc779aSAndroid Build Coastguard Worker grouping = 0;
98*15dc779aSAndroid Build Coastguard Worker i++;
99*15dc779aSAndroid Build Coastguard Worker }
100*15dc779aSAndroid Build Coastguard Worker }
101*15dc779aSAndroid Build Coastguard Worker } else {
102*15dc779aSAndroid Build Coastguard Worker if (grouping) {
103*15dc779aSAndroid Build Coastguard Worker grouping = 0;
104*15dc779aSAndroid Build Coastguard Worker f_group_vec[i] = k;
105*15dc779aSAndroid Build Coastguard Worker
106*15dc779aSAndroid Build Coastguard Worker if (alias_red_buf[k]) f_group_vec[i] = k + 1;
107*15dc779aSAndroid Build Coastguard Worker
108*15dc779aSAndroid Build Coastguard Worker i++;
109*15dc779aSAndroid Build Coastguard Worker }
110*15dc779aSAndroid Build Coastguard Worker }
111*15dc779aSAndroid Build Coastguard Worker }
112*15dc779aSAndroid Build Coastguard Worker
113*15dc779aSAndroid Build Coastguard Worker if (grouping) {
114*15dc779aSAndroid Build Coastguard Worker f_group_vec[i] = num_sub_bands;
115*15dc779aSAndroid Build Coastguard Worker i++;
116*15dc779aSAndroid Build Coastguard Worker }
117*15dc779aSAndroid Build Coastguard Worker num_groups = (i >> 1);
118*15dc779aSAndroid Build Coastguard Worker
119*15dc779aSAndroid Build Coastguard Worker ptr_f_group_vec = f_group_vec;
120*15dc779aSAndroid Build Coastguard Worker
121*15dc779aSAndroid Build Coastguard Worker for (group = num_groups; group != 0; group--) {
122*15dc779aSAndroid Build Coastguard Worker WORD16 nrg_amp_mant;
123*15dc779aSAndroid Build Coastguard Worker WORD16 nrg_amp_exp;
124*15dc779aSAndroid Build Coastguard Worker WORD16 nrgMod_m;
125*15dc779aSAndroid Build Coastguard Worker WORD16 nrgMod_e;
126*15dc779aSAndroid Build Coastguard Worker WORD16 grp_gain_mant;
127*15dc779aSAndroid Build Coastguard Worker WORD16 grp_gain_exp;
128*15dc779aSAndroid Build Coastguard Worker WORD16 compensation_m;
129*15dc779aSAndroid Build Coastguard Worker WORD16 compensation_e;
130*15dc779aSAndroid Build Coastguard Worker WORD32 nrg_mod_mant;
131*15dc779aSAndroid Build Coastguard Worker WORD32 nrg_mod_exp;
132*15dc779aSAndroid Build Coastguard Worker
133*15dc779aSAndroid Build Coastguard Worker WORD32 start_grp = *ptr_f_group_vec++;
134*15dc779aSAndroid Build Coastguard Worker WORD32 stop_grp = *ptr_f_group_vec++;
135*15dc779aSAndroid Build Coastguard Worker
136*15dc779aSAndroid Build Coastguard Worker ixheaacd_avggain_calc(nrg_est, nrg_gain, start_grp, stop_grp, &nrg_amp_mant,
137*15dc779aSAndroid Build Coastguard Worker &nrg_amp_exp, &grp_gain_mant, &grp_gain_exp,
138*15dc779aSAndroid Build Coastguard Worker pstr_common_tables, 1);
139*15dc779aSAndroid Build Coastguard Worker
140*15dc779aSAndroid Build Coastguard Worker nrg_mod_mant = 0;
141*15dc779aSAndroid Build Coastguard Worker nrg_mod_exp = 0;
142*15dc779aSAndroid Build Coastguard Worker {
143*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_nrg_gain_mant = &nrg_gain[2 * start_grp];
144*15dc779aSAndroid Build Coastguard Worker
145*15dc779aSAndroid Build Coastguard Worker for (k = start_grp; k < stop_grp; k++) {
146*15dc779aSAndroid Build Coastguard Worker WORD32 tmp_mant, tmp_gain_mant, gain_m;
147*15dc779aSAndroid Build Coastguard Worker WORD32 tmp_e, tmp_gain_exp;
148*15dc779aSAndroid Build Coastguard Worker WORD16 one_minus_alpha, alpha = deg_patched[k];
149*15dc779aSAndroid Build Coastguard Worker
150*15dc779aSAndroid Build Coastguard Worker if (k < (num_sub_bands - 1)) {
151*15dc779aSAndroid Build Coastguard Worker alpha = ixheaac_max16(deg_patched[k + 1], alpha);
152*15dc779aSAndroid Build Coastguard Worker }
153*15dc779aSAndroid Build Coastguard Worker gain_m = (alpha * grp_gain_mant);
154*15dc779aSAndroid Build Coastguard Worker one_minus_alpha = 0x7fff - alpha;
155*15dc779aSAndroid Build Coastguard Worker
156*15dc779aSAndroid Build Coastguard Worker tmp_gain_mant = *ptr_nrg_gain_mant;
157*15dc779aSAndroid Build Coastguard Worker tmp_gain_exp = *(ptr_nrg_gain_mant + 1);
158*15dc779aSAndroid Build Coastguard Worker
159*15dc779aSAndroid Build Coastguard Worker {
160*15dc779aSAndroid Build Coastguard Worker WORD32 exp_diff;
161*15dc779aSAndroid Build Coastguard Worker
162*15dc779aSAndroid Build Coastguard Worker tmp_gain_mant = (one_minus_alpha * tmp_gain_mant) >> 15;
163*15dc779aSAndroid Build Coastguard Worker
164*15dc779aSAndroid Build Coastguard Worker exp_diff = (grp_gain_exp - tmp_gain_exp);
165*15dc779aSAndroid Build Coastguard Worker
166*15dc779aSAndroid Build Coastguard Worker if (exp_diff >= 0) {
167*15dc779aSAndroid Build Coastguard Worker tmp_gain_exp = grp_gain_exp;
168*15dc779aSAndroid Build Coastguard Worker tmp_gain_mant = ixheaac_shr32(tmp_gain_mant, exp_diff);
169*15dc779aSAndroid Build Coastguard Worker
170*15dc779aSAndroid Build Coastguard Worker tmp_gain_mant = (gain_m >> 15) + tmp_gain_mant;
171*15dc779aSAndroid Build Coastguard Worker
172*15dc779aSAndroid Build Coastguard Worker } else {
173*15dc779aSAndroid Build Coastguard Worker tmp_gain_mant =
174*15dc779aSAndroid Build Coastguard Worker (ixheaac_shr32(gain_m, (15 - exp_diff))) + tmp_gain_mant;
175*15dc779aSAndroid Build Coastguard Worker }
176*15dc779aSAndroid Build Coastguard Worker }
177*15dc779aSAndroid Build Coastguard Worker *ptr_nrg_gain_mant++ = tmp_gain_mant;
178*15dc779aSAndroid Build Coastguard Worker *ptr_nrg_gain_mant++ = tmp_gain_exp;
179*15dc779aSAndroid Build Coastguard Worker
180*15dc779aSAndroid Build Coastguard Worker tmp_mant = (tmp_gain_mant * (nrg_est[2 * k])) >> 16;
181*15dc779aSAndroid Build Coastguard Worker tmp_e = (tmp_gain_exp + (nrg_est[2 * k + 1]) + 1);
182*15dc779aSAndroid Build Coastguard Worker
183*15dc779aSAndroid Build Coastguard Worker {
184*15dc779aSAndroid Build Coastguard Worker WORD32 exp_diff;
185*15dc779aSAndroid Build Coastguard Worker exp_diff = tmp_e - nrg_mod_exp;
186*15dc779aSAndroid Build Coastguard Worker if (exp_diff >= 0) {
187*15dc779aSAndroid Build Coastguard Worker nrg_mod_mant = tmp_mant + (ixheaac_shr32(nrg_mod_mant, exp_diff));
188*15dc779aSAndroid Build Coastguard Worker nrg_mod_exp = tmp_e;
189*15dc779aSAndroid Build Coastguard Worker } else {
190*15dc779aSAndroid Build Coastguard Worker exp_diff = -exp_diff;
191*15dc779aSAndroid Build Coastguard Worker nrg_mod_mant = (ixheaac_shr32(tmp_mant, exp_diff)) + nrg_mod_mant;
192*15dc779aSAndroid Build Coastguard Worker }
193*15dc779aSAndroid Build Coastguard Worker }
194*15dc779aSAndroid Build Coastguard Worker }
195*15dc779aSAndroid Build Coastguard Worker }
196*15dc779aSAndroid Build Coastguard Worker
197*15dc779aSAndroid Build Coastguard Worker {
198*15dc779aSAndroid Build Coastguard Worker WORD32 norm_val;
199*15dc779aSAndroid Build Coastguard Worker norm_val = 16 - ixheaac_pnorm32(nrg_mod_mant);
200*15dc779aSAndroid Build Coastguard Worker if (norm_val > 0) {
201*15dc779aSAndroid Build Coastguard Worker nrg_mod_mant >>= norm_val;
202*15dc779aSAndroid Build Coastguard Worker nrg_mod_exp += norm_val;
203*15dc779aSAndroid Build Coastguard Worker }
204*15dc779aSAndroid Build Coastguard Worker }
205*15dc779aSAndroid Build Coastguard Worker
206*15dc779aSAndroid Build Coastguard Worker nrgMod_m = (WORD16)nrg_mod_mant;
207*15dc779aSAndroid Build Coastguard Worker nrgMod_e = (WORD16)nrg_mod_exp;
208*15dc779aSAndroid Build Coastguard Worker
209*15dc779aSAndroid Build Coastguard Worker compensation_e = ixheaacd_fix_mant_div(nrg_amp_mant, nrgMod_m,
210*15dc779aSAndroid Build Coastguard Worker &compensation_m, pstr_common_tables);
211*15dc779aSAndroid Build Coastguard Worker compensation_e += nrg_amp_exp - nrgMod_e + 1 + 1;
212*15dc779aSAndroid Build Coastguard Worker
213*15dc779aSAndroid Build Coastguard Worker {
214*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_nrg_gain_mant = &nrg_gain[2 * start_grp];
215*15dc779aSAndroid Build Coastguard Worker
216*15dc779aSAndroid Build Coastguard Worker for (k = stop_grp - start_grp; k != 0; k--) {
217*15dc779aSAndroid Build Coastguard Worker WORD16 temp1, temp2;
218*15dc779aSAndroid Build Coastguard Worker temp1 = *ptr_nrg_gain_mant;
219*15dc779aSAndroid Build Coastguard Worker temp2 = *(ptr_nrg_gain_mant + 1);
220*15dc779aSAndroid Build Coastguard Worker temp1 = (temp1 * compensation_m) >> 16;
221*15dc779aSAndroid Build Coastguard Worker temp2 = (temp2 + compensation_e);
222*15dc779aSAndroid Build Coastguard Worker *ptr_nrg_gain_mant++ = temp1;
223*15dc779aSAndroid Build Coastguard Worker *ptr_nrg_gain_mant++ = temp2;
224*15dc779aSAndroid Build Coastguard Worker }
225*15dc779aSAndroid Build Coastguard Worker }
226*15dc779aSAndroid Build Coastguard Worker }
227*15dc779aSAndroid Build Coastguard Worker }
228*15dc779aSAndroid Build Coastguard Worker
ixheaacd_noiselimiting(ia_freq_band_data_struct * pstr_freq_band_data,WORD32 skip_bands,WORD16 * ptr_enrg_orig,WORD16 * nrg_est,WORD16 * nrg_gain,WORD16 * noise_level_mant,WORD16 * nrg_sine,WORD16 * ptr_limit_gain_table,FLAG noise_absc_flag,ixheaacd_misc_tables * pstr_common_tables)229*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_noiselimiting(ia_freq_band_data_struct *pstr_freq_band_data,
230*15dc779aSAndroid Build Coastguard Worker WORD32 skip_bands, WORD16 *ptr_enrg_orig,
231*15dc779aSAndroid Build Coastguard Worker WORD16 *nrg_est, WORD16 *nrg_gain,
232*15dc779aSAndroid Build Coastguard Worker WORD16 *noise_level_mant, WORD16 *nrg_sine,
233*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_limit_gain_table, FLAG noise_absc_flag,
234*15dc779aSAndroid Build Coastguard Worker ixheaacd_misc_tables *pstr_common_tables) {
235*15dc779aSAndroid Build Coastguard Worker WORD32 c, k;
236*15dc779aSAndroid Build Coastguard Worker WORD32 temp_val;
237*15dc779aSAndroid Build Coastguard Worker WORD16 limit_gain_mant = *ptr_limit_gain_table++;
238*15dc779aSAndroid Build Coastguard Worker WORD16 limit_gain_exp = *ptr_limit_gain_table;
239*15dc779aSAndroid Build Coastguard Worker for (c = 0; c < pstr_freq_band_data->num_lf_bands; c++) {
240*15dc779aSAndroid Build Coastguard Worker WORD16 max_gain_mant;
241*15dc779aSAndroid Build Coastguard Worker WORD16 sum_orig_mant, sum_orig_exp;
242*15dc779aSAndroid Build Coastguard Worker WORD16 max_gain_exp;
243*15dc779aSAndroid Build Coastguard Worker WORD32 max_temp;
244*15dc779aSAndroid Build Coastguard Worker WORD32 start_band = 0;
245*15dc779aSAndroid Build Coastguard Worker WORD32 stop_band = 0;
246*15dc779aSAndroid Build Coastguard Worker
247*15dc779aSAndroid Build Coastguard Worker if ((pstr_freq_band_data->freq_band_tbl_lim[c] > skip_bands)) {
248*15dc779aSAndroid Build Coastguard Worker start_band = (pstr_freq_band_data->freq_band_tbl_lim[c] - skip_bands);
249*15dc779aSAndroid Build Coastguard Worker }
250*15dc779aSAndroid Build Coastguard Worker
251*15dc779aSAndroid Build Coastguard Worker if ((pstr_freq_band_data->freq_band_tbl_lim[c + 1] > skip_bands)) {
252*15dc779aSAndroid Build Coastguard Worker stop_band = (pstr_freq_band_data->freq_band_tbl_lim[c + 1] - skip_bands);
253*15dc779aSAndroid Build Coastguard Worker }
254*15dc779aSAndroid Build Coastguard Worker
255*15dc779aSAndroid Build Coastguard Worker if ((start_band < stop_band)) {
256*15dc779aSAndroid Build Coastguard Worker ixheaacd_avggain_calc(ptr_enrg_orig, nrg_est, start_band, stop_band,
257*15dc779aSAndroid Build Coastguard Worker &sum_orig_mant, &sum_orig_exp, &max_gain_mant,
258*15dc779aSAndroid Build Coastguard Worker &max_gain_exp, pstr_common_tables, 0);
259*15dc779aSAndroid Build Coastguard Worker
260*15dc779aSAndroid Build Coastguard Worker max_temp = ixheaac_mult16x16in32_shl(max_gain_mant, limit_gain_mant);
261*15dc779aSAndroid Build Coastguard Worker max_gain_exp = (max_gain_exp + limit_gain_exp);
262*15dc779aSAndroid Build Coastguard Worker
263*15dc779aSAndroid Build Coastguard Worker temp_val = ixheaac_norm32(max_temp);
264*15dc779aSAndroid Build Coastguard Worker
265*15dc779aSAndroid Build Coastguard Worker max_gain_exp = (WORD16)(max_gain_exp - temp_val);
266*15dc779aSAndroid Build Coastguard Worker max_gain_mant = (WORD16)((max_temp << temp_val) >> 16);
267*15dc779aSAndroid Build Coastguard Worker
268*15dc779aSAndroid Build Coastguard Worker if ((max_gain_exp >= MAX_GAIN_EXP)) {
269*15dc779aSAndroid Build Coastguard Worker max_gain_mant = 0x3000;
270*15dc779aSAndroid Build Coastguard Worker max_gain_exp = MAX_GAIN_EXP;
271*15dc779aSAndroid Build Coastguard Worker }
272*15dc779aSAndroid Build Coastguard Worker
273*15dc779aSAndroid Build Coastguard Worker {
274*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_nrg_gain = &nrg_gain[2 * start_band];
275*15dc779aSAndroid Build Coastguard Worker WORD16 *p_noise_level = &noise_level_mant[2 * start_band];
276*15dc779aSAndroid Build Coastguard Worker
277*15dc779aSAndroid Build Coastguard Worker for (k = stop_band - start_band; k != 0; k--) {
278*15dc779aSAndroid Build Coastguard Worker WORD16 noise_amp_mant;
279*15dc779aSAndroid Build Coastguard Worker WORD16 noise_amp_exp;
280*15dc779aSAndroid Build Coastguard Worker
281*15dc779aSAndroid Build Coastguard Worker WORD16 t_gain_mant = *(ptr_nrg_gain);
282*15dc779aSAndroid Build Coastguard Worker WORD16 t_gain_exp = *(ptr_nrg_gain + 1);
283*15dc779aSAndroid Build Coastguard Worker
284*15dc779aSAndroid Build Coastguard Worker if (((t_gain_exp > max_gain_exp)) ||
285*15dc779aSAndroid Build Coastguard Worker ((t_gain_exp == max_gain_exp) && (t_gain_mant > max_gain_mant))) {
286*15dc779aSAndroid Build Coastguard Worker noise_amp_exp =
287*15dc779aSAndroid Build Coastguard Worker ixheaacd_fix_mant_div(max_gain_mant, t_gain_mant,
288*15dc779aSAndroid Build Coastguard Worker &noise_amp_mant, pstr_common_tables);
289*15dc779aSAndroid Build Coastguard Worker noise_amp_exp += (max_gain_exp - t_gain_exp) + 1;
290*15dc779aSAndroid Build Coastguard Worker
291*15dc779aSAndroid Build Coastguard Worker *p_noise_level = ixheaac_extract16h(ixheaac_shl32_dir_sat_limit(
292*15dc779aSAndroid Build Coastguard Worker ixheaac_mult16x16in32_shl(*p_noise_level, noise_amp_mant),
293*15dc779aSAndroid Build Coastguard Worker noise_amp_exp));
294*15dc779aSAndroid Build Coastguard Worker
295*15dc779aSAndroid Build Coastguard Worker *ptr_nrg_gain = max_gain_mant;
296*15dc779aSAndroid Build Coastguard Worker *(ptr_nrg_gain + 1) = max_gain_exp;
297*15dc779aSAndroid Build Coastguard Worker }
298*15dc779aSAndroid Build Coastguard Worker ptr_nrg_gain += 2;
299*15dc779aSAndroid Build Coastguard Worker p_noise_level += 2;
300*15dc779aSAndroid Build Coastguard Worker }
301*15dc779aSAndroid Build Coastguard Worker }
302*15dc779aSAndroid Build Coastguard Worker
303*15dc779aSAndroid Build Coastguard Worker {
304*15dc779aSAndroid Build Coastguard Worker WORD16 boost_gain_mant;
305*15dc779aSAndroid Build Coastguard Worker WORD16 boost_gain_exp;
306*15dc779aSAndroid Build Coastguard Worker WORD16 accu_m;
307*15dc779aSAndroid Build Coastguard Worker WORD16 accu_e;
308*15dc779aSAndroid Build Coastguard Worker WORD32 accu_m_t;
309*15dc779aSAndroid Build Coastguard Worker WORD32 accu_e_t;
310*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_nrg_gain = &nrg_gain[2 * start_band];
311*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_enrg_est_buf = &nrg_est[2 * start_band];
312*15dc779aSAndroid Build Coastguard Worker WORD16 *p_noise_level = &noise_level_mant[2 * start_band];
313*15dc779aSAndroid Build Coastguard Worker WORD16 *p_nrg_sine = &nrg_sine[2 * start_band];
314*15dc779aSAndroid Build Coastguard Worker
315*15dc779aSAndroid Build Coastguard Worker accu_m_t = 0;
316*15dc779aSAndroid Build Coastguard Worker accu_e_t = 0;
317*15dc779aSAndroid Build Coastguard Worker
318*15dc779aSAndroid Build Coastguard Worker for (k = stop_band - start_band; k != 0; k--) {
319*15dc779aSAndroid Build Coastguard Worker WORD32 tmp_mant, tmp_e;
320*15dc779aSAndroid Build Coastguard Worker
321*15dc779aSAndroid Build Coastguard Worker tmp_mant = *ptr_nrg_gain++;
322*15dc779aSAndroid Build Coastguard Worker tmp_e = *ptr_nrg_gain++;
323*15dc779aSAndroid Build Coastguard Worker tmp_mant = (tmp_mant * (*ptr_enrg_est_buf++));
324*15dc779aSAndroid Build Coastguard Worker tmp_e = (tmp_e + (*ptr_enrg_est_buf++));
325*15dc779aSAndroid Build Coastguard Worker tmp_mant = tmp_mant >> 15;
326*15dc779aSAndroid Build Coastguard Worker {
327*15dc779aSAndroid Build Coastguard Worker WORD32 exp_diff;
328*15dc779aSAndroid Build Coastguard Worker exp_diff = tmp_e - accu_e_t;
329*15dc779aSAndroid Build Coastguard Worker if (exp_diff >= 0) {
330*15dc779aSAndroid Build Coastguard Worker accu_m_t = tmp_mant + ixheaac_shr32(accu_m_t, exp_diff);
331*15dc779aSAndroid Build Coastguard Worker accu_e_t = tmp_e;
332*15dc779aSAndroid Build Coastguard Worker } else {
333*15dc779aSAndroid Build Coastguard Worker exp_diff = -exp_diff;
334*15dc779aSAndroid Build Coastguard Worker accu_m_t = ixheaac_shr32(tmp_mant, exp_diff) + accu_m_t;
335*15dc779aSAndroid Build Coastguard Worker }
336*15dc779aSAndroid Build Coastguard Worker }
337*15dc779aSAndroid Build Coastguard Worker
338*15dc779aSAndroid Build Coastguard Worker if (p_nrg_sine[0] != 0) {
339*15dc779aSAndroid Build Coastguard Worker WORD32 exp_diff = p_nrg_sine[1] - accu_e_t;
340*15dc779aSAndroid Build Coastguard Worker if (exp_diff >= 0) {
341*15dc779aSAndroid Build Coastguard Worker accu_m_t = p_nrg_sine[0] + ixheaac_shr32(accu_m_t, exp_diff);
342*15dc779aSAndroid Build Coastguard Worker accu_e_t = p_nrg_sine[1];
343*15dc779aSAndroid Build Coastguard Worker } else {
344*15dc779aSAndroid Build Coastguard Worker exp_diff = -exp_diff;
345*15dc779aSAndroid Build Coastguard Worker accu_m_t = accu_m_t + ixheaac_shr32(p_nrg_sine[0], exp_diff);
346*15dc779aSAndroid Build Coastguard Worker }
347*15dc779aSAndroid Build Coastguard Worker
348*15dc779aSAndroid Build Coastguard Worker } else {
349*15dc779aSAndroid Build Coastguard Worker if (noise_absc_flag == 0) {
350*15dc779aSAndroid Build Coastguard Worker WORD32 exp_diff = p_noise_level[1] - accu_e_t;
351*15dc779aSAndroid Build Coastguard Worker if (exp_diff >= 0) {
352*15dc779aSAndroid Build Coastguard Worker accu_m_t =
353*15dc779aSAndroid Build Coastguard Worker p_noise_level[0] + ixheaac_shr32(accu_m_t, exp_diff);
354*15dc779aSAndroid Build Coastguard Worker accu_e_t = p_noise_level[1];
355*15dc779aSAndroid Build Coastguard Worker } else {
356*15dc779aSAndroid Build Coastguard Worker exp_diff = -exp_diff;
357*15dc779aSAndroid Build Coastguard Worker accu_m_t =
358*15dc779aSAndroid Build Coastguard Worker accu_m_t + ixheaac_shr32(p_noise_level[0], exp_diff);
359*15dc779aSAndroid Build Coastguard Worker }
360*15dc779aSAndroid Build Coastguard Worker }
361*15dc779aSAndroid Build Coastguard Worker }
362*15dc779aSAndroid Build Coastguard Worker p_noise_level += 2;
363*15dc779aSAndroid Build Coastguard Worker p_nrg_sine += 2;
364*15dc779aSAndroid Build Coastguard Worker }
365*15dc779aSAndroid Build Coastguard Worker
366*15dc779aSAndroid Build Coastguard Worker {
367*15dc779aSAndroid Build Coastguard Worker WORD32 norm_val;
368*15dc779aSAndroid Build Coastguard Worker norm_val = 16 - ixheaac_norm32(accu_m_t);
369*15dc779aSAndroid Build Coastguard Worker if (norm_val > 0) {
370*15dc779aSAndroid Build Coastguard Worker accu_m_t >>= norm_val;
371*15dc779aSAndroid Build Coastguard Worker accu_e_t += norm_val;
372*15dc779aSAndroid Build Coastguard Worker }
373*15dc779aSAndroid Build Coastguard Worker }
374*15dc779aSAndroid Build Coastguard Worker
375*15dc779aSAndroid Build Coastguard Worker accu_m = (WORD16)accu_m_t;
376*15dc779aSAndroid Build Coastguard Worker accu_e = (WORD16)accu_e_t;
377*15dc779aSAndroid Build Coastguard Worker
378*15dc779aSAndroid Build Coastguard Worker boost_gain_exp = ixheaacd_fix_mant_div(
379*15dc779aSAndroid Build Coastguard Worker sum_orig_mant, accu_m, &boost_gain_mant, pstr_common_tables);
380*15dc779aSAndroid Build Coastguard Worker
381*15dc779aSAndroid Build Coastguard Worker boost_gain_exp += (sum_orig_exp - accu_e) + 1;
382*15dc779aSAndroid Build Coastguard Worker
383*15dc779aSAndroid Build Coastguard Worker if ((boost_gain_exp > 2) ||
384*15dc779aSAndroid Build Coastguard Worker ((boost_gain_exp == 2) && (boost_gain_mant > 0x5061))) {
385*15dc779aSAndroid Build Coastguard Worker boost_gain_mant = 0x5061;
386*15dc779aSAndroid Build Coastguard Worker boost_gain_exp = 2;
387*15dc779aSAndroid Build Coastguard Worker }
388*15dc779aSAndroid Build Coastguard Worker
389*15dc779aSAndroid Build Coastguard Worker ptr_nrg_gain = &nrg_gain[2 * start_band];
390*15dc779aSAndroid Build Coastguard Worker p_noise_level = &noise_level_mant[2 * start_band];
391*15dc779aSAndroid Build Coastguard Worker p_nrg_sine = &nrg_sine[2 * start_band];
392*15dc779aSAndroid Build Coastguard Worker
393*15dc779aSAndroid Build Coastguard Worker for (k = stop_band - start_band; k != 0; k--) {
394*15dc779aSAndroid Build Coastguard Worker WORD16 temp1, temp2, temp3;
395*15dc779aSAndroid Build Coastguard Worker
396*15dc779aSAndroid Build Coastguard Worker temp1 = *ptr_nrg_gain;
397*15dc779aSAndroid Build Coastguard Worker temp2 = *p_nrg_sine;
398*15dc779aSAndroid Build Coastguard Worker temp3 = *p_noise_level;
399*15dc779aSAndroid Build Coastguard Worker
400*15dc779aSAndroid Build Coastguard Worker temp1 = ixheaac_mult16_shl(temp1, boost_gain_mant);
401*15dc779aSAndroid Build Coastguard Worker temp2 = ixheaac_mult16_shl(temp2, boost_gain_mant);
402*15dc779aSAndroid Build Coastguard Worker temp3 = ixheaac_mult16_shl(temp3, boost_gain_mant);
403*15dc779aSAndroid Build Coastguard Worker *ptr_nrg_gain++ = temp1;
404*15dc779aSAndroid Build Coastguard Worker *p_nrg_sine++ = temp2;
405*15dc779aSAndroid Build Coastguard Worker *p_noise_level++ = temp3;
406*15dc779aSAndroid Build Coastguard Worker
407*15dc779aSAndroid Build Coastguard Worker temp1 = *ptr_nrg_gain;
408*15dc779aSAndroid Build Coastguard Worker temp2 = *p_nrg_sine;
409*15dc779aSAndroid Build Coastguard Worker temp3 = *p_noise_level;
410*15dc779aSAndroid Build Coastguard Worker
411*15dc779aSAndroid Build Coastguard Worker temp1 = (temp1 + boost_gain_exp);
412*15dc779aSAndroid Build Coastguard Worker temp2 = (temp2 + boost_gain_exp);
413*15dc779aSAndroid Build Coastguard Worker temp3 = (temp3 + boost_gain_exp);
414*15dc779aSAndroid Build Coastguard Worker *ptr_nrg_gain++ = (temp1);
415*15dc779aSAndroid Build Coastguard Worker *p_nrg_sine++ = (temp2);
416*15dc779aSAndroid Build Coastguard Worker *p_noise_level++ = (temp3);
417*15dc779aSAndroid Build Coastguard Worker }
418*15dc779aSAndroid Build Coastguard Worker }
419*15dc779aSAndroid Build Coastguard Worker }
420*15dc779aSAndroid Build Coastguard Worker }
421*15dc779aSAndroid Build Coastguard Worker }
422*15dc779aSAndroid Build Coastguard Worker
ixheaacd_conv_ergtoamplitudelp_dec(WORD32 bands,WORD16 noise_e,WORD16 * nrg_sine,WORD16 * nrg_gain,WORD16 * noise_level_mant,WORD16 * sqrt_table)423*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_conv_ergtoamplitudelp_dec(WORD32 bands, WORD16 noise_e,
424*15dc779aSAndroid Build Coastguard Worker WORD16 *nrg_sine, WORD16 *nrg_gain,
425*15dc779aSAndroid Build Coastguard Worker WORD16 *noise_level_mant,
426*15dc779aSAndroid Build Coastguard Worker WORD16 *sqrt_table) {
427*15dc779aSAndroid Build Coastguard Worker WORD32 k;
428*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < bands; k++) {
429*15dc779aSAndroid Build Coastguard Worker WORD32 shift;
430*15dc779aSAndroid Build Coastguard Worker ixheaacd_fix_mant_exp_sqrt(&nrg_sine[2 * k], sqrt_table);
431*15dc779aSAndroid Build Coastguard Worker ixheaacd_fix_mant_exp_sqrt(&nrg_gain[2 * k], sqrt_table);
432*15dc779aSAndroid Build Coastguard Worker ixheaacd_fix_mant_exp_sqrt(&noise_level_mant[2 * k], sqrt_table);
433*15dc779aSAndroid Build Coastguard Worker
434*15dc779aSAndroid Build Coastguard Worker shift = (noise_e - noise_level_mant[2 * k + 1]);
435*15dc779aSAndroid Build Coastguard Worker
436*15dc779aSAndroid Build Coastguard Worker shift = (shift - 4);
437*15dc779aSAndroid Build Coastguard Worker if (shift > 0)
438*15dc779aSAndroid Build Coastguard Worker noise_level_mant[2 * k] = (noise_level_mant[2 * k] >> shift);
439*15dc779aSAndroid Build Coastguard Worker else
440*15dc779aSAndroid Build Coastguard Worker noise_level_mant[2 * k] = (noise_level_mant[2 * k] << -shift);
441*15dc779aSAndroid Build Coastguard Worker
442*15dc779aSAndroid Build Coastguard Worker shift = (nrg_sine[2 * k + 1] - noise_e);
443*15dc779aSAndroid Build Coastguard Worker if (shift > 0)
444*15dc779aSAndroid Build Coastguard Worker nrg_sine[2 * k] = ixheaac_shl16_sat(nrg_sine[2 * k], (WORD16)shift);
445*15dc779aSAndroid Build Coastguard Worker else
446*15dc779aSAndroid Build Coastguard Worker nrg_sine[2 * k] = ixheaac_shr16(nrg_sine[2 * k], (WORD16)-shift);
447*15dc779aSAndroid Build Coastguard Worker }
448*15dc779aSAndroid Build Coastguard Worker }
449*15dc779aSAndroid Build Coastguard Worker
ixheaacd_conv_ergtoamplitude_dec(WORD32 bands,WORD16 noise_e,WORD16 * nrg_sine,WORD16 * nrg_gain,WORD16 * noise_level_mant,WORD16 * sqrt_table)450*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_conv_ergtoamplitude_dec(WORD32 bands, WORD16 noise_e,
451*15dc779aSAndroid Build Coastguard Worker WORD16 *nrg_sine, WORD16 *nrg_gain,
452*15dc779aSAndroid Build Coastguard Worker WORD16 *noise_level_mant,
453*15dc779aSAndroid Build Coastguard Worker WORD16 *sqrt_table) {
454*15dc779aSAndroid Build Coastguard Worker WORD32 k;
455*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < bands; k++) {
456*15dc779aSAndroid Build Coastguard Worker WORD32 shift;
457*15dc779aSAndroid Build Coastguard Worker
458*15dc779aSAndroid Build Coastguard Worker ixheaacd_fix_mant_exp_sqrt(&nrg_sine[2 * k], sqrt_table);
459*15dc779aSAndroid Build Coastguard Worker ixheaacd_fix_mant_exp_sqrt(&nrg_gain[2 * k], sqrt_table);
460*15dc779aSAndroid Build Coastguard Worker ixheaacd_fix_mant_exp_sqrt(&noise_level_mant[2 * k], sqrt_table);
461*15dc779aSAndroid Build Coastguard Worker
462*15dc779aSAndroid Build Coastguard Worker shift = (noise_e - noise_level_mant[2 * k + 1]);
463*15dc779aSAndroid Build Coastguard Worker
464*15dc779aSAndroid Build Coastguard Worker shift = (shift - 4);
465*15dc779aSAndroid Build Coastguard Worker if (shift > 0) {
466*15dc779aSAndroid Build Coastguard Worker if (shift > 31) {
467*15dc779aSAndroid Build Coastguard Worker shift = 31;
468*15dc779aSAndroid Build Coastguard Worker }
469*15dc779aSAndroid Build Coastguard Worker noise_level_mant[2 * k] = (noise_level_mant[2 * k] >> shift);
470*15dc779aSAndroid Build Coastguard Worker } else {
471*15dc779aSAndroid Build Coastguard Worker if (shift < -31) {
472*15dc779aSAndroid Build Coastguard Worker shift = -31;
473*15dc779aSAndroid Build Coastguard Worker }
474*15dc779aSAndroid Build Coastguard Worker noise_level_mant[2 * k] = (noise_level_mant[2 * k] << -shift);
475*15dc779aSAndroid Build Coastguard Worker }
476*15dc779aSAndroid Build Coastguard Worker }
477*15dc779aSAndroid Build Coastguard Worker }
478*15dc779aSAndroid Build Coastguard Worker
ixheaacd_adapt_noise_gain_calc(ia_sbr_calc_env_struct * ptr_sbr_calc_env,WORD32 noise_e,WORD32 num_sub_bands,WORD32 skip_bands,WORD16 * nrg_gain,WORD16 * noise_level_mant,WORD16 * nrg_sine,WORD32 start_pos,WORD32 end_pos,WORD32 input_e,WORD32 adj_e,WORD32 final_e,WORD32 sub_band_start,WORD32 lb_scale,FLAG noise_absc_flag,WORD32 smooth_length,WORD32 ** anal_buf_real_mant,WORD32 ** anal_buf_imag_mant,WORD32 low_pow_flag,ia_sbr_tables_struct * ptr_sbr_tables,WORD16 max_cols)479*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE VOID ixheaacd_adapt_noise_gain_calc(
480*15dc779aSAndroid Build Coastguard Worker ia_sbr_calc_env_struct *ptr_sbr_calc_env, WORD32 noise_e,
481*15dc779aSAndroid Build Coastguard Worker WORD32 num_sub_bands, WORD32 skip_bands, WORD16 *nrg_gain,
482*15dc779aSAndroid Build Coastguard Worker WORD16 *noise_level_mant, WORD16 *nrg_sine, WORD32 start_pos,
483*15dc779aSAndroid Build Coastguard Worker WORD32 end_pos, WORD32 input_e, WORD32 adj_e, WORD32 final_e,
484*15dc779aSAndroid Build Coastguard Worker WORD32 sub_band_start, WORD32 lb_scale, FLAG noise_absc_flag,
485*15dc779aSAndroid Build Coastguard Worker WORD32 smooth_length, WORD32 **anal_buf_real_mant,
486*15dc779aSAndroid Build Coastguard Worker WORD32 **anal_buf_imag_mant, WORD32 low_pow_flag,
487*15dc779aSAndroid Build Coastguard Worker ia_sbr_tables_struct *ptr_sbr_tables, WORD16 max_cols) {
488*15dc779aSAndroid Build Coastguard Worker WORD32 l, k;
489*15dc779aSAndroid Build Coastguard Worker WORD32 scale_change;
490*15dc779aSAndroid Build Coastguard Worker WORD32 bands = num_sub_bands - skip_bands;
491*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_filt_buf;
492*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_filt_buf_noise;
493*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_gain = &nrg_gain[0];
494*15dc779aSAndroid Build Coastguard Worker
495*15dc779aSAndroid Build Coastguard Worker if (ptr_sbr_calc_env->start_up) {
496*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_noise = noise_level_mant;
497*15dc779aSAndroid Build Coastguard Worker ptr_sbr_calc_env->start_up = 0;
498*15dc779aSAndroid Build Coastguard Worker
499*15dc779aSAndroid Build Coastguard Worker ptr_sbr_calc_env->filt_buf_noise_e = noise_e;
500*15dc779aSAndroid Build Coastguard Worker ptr_filt_buf = &ptr_sbr_calc_env->filt_buf_me[skip_bands * 2];
501*15dc779aSAndroid Build Coastguard Worker ptr_filt_buf_noise = &ptr_sbr_calc_env->filt_buf_noise_m[skip_bands];
502*15dc779aSAndroid Build Coastguard Worker
503*15dc779aSAndroid Build Coastguard Worker for (k = bands; k != 0; k--) {
504*15dc779aSAndroid Build Coastguard Worker WORD16 temp1 = *ptr_gain++;
505*15dc779aSAndroid Build Coastguard Worker WORD16 temp2 = *ptr_gain++;
506*15dc779aSAndroid Build Coastguard Worker WORD16 temp3 = *ptr_noise;
507*15dc779aSAndroid Build Coastguard Worker ptr_noise += 2;
508*15dc779aSAndroid Build Coastguard Worker
509*15dc779aSAndroid Build Coastguard Worker *ptr_filt_buf++ = temp1;
510*15dc779aSAndroid Build Coastguard Worker *ptr_filt_buf++ = temp2;
511*15dc779aSAndroid Build Coastguard Worker *ptr_filt_buf_noise++ = temp3;
512*15dc779aSAndroid Build Coastguard Worker }
513*15dc779aSAndroid Build Coastguard Worker } else {
514*15dc779aSAndroid Build Coastguard Worker ixheaacd_equalize_filt_buff_exp(
515*15dc779aSAndroid Build Coastguard Worker &ptr_sbr_calc_env->filt_buf_me[2 * skip_bands], nrg_gain, bands);
516*15dc779aSAndroid Build Coastguard Worker }
517*15dc779aSAndroid Build Coastguard Worker
518*15dc779aSAndroid Build Coastguard Worker for (l = start_pos; l < end_pos; l++) {
519*15dc779aSAndroid Build Coastguard Worker
520*15dc779aSAndroid Build Coastguard Worker if (max_cols != 30) {
521*15dc779aSAndroid Build Coastguard Worker if ((l < MAX_COLS)) {
522*15dc779aSAndroid Build Coastguard Worker scale_change = (adj_e - input_e);
523*15dc779aSAndroid Build Coastguard Worker } else {
524*15dc779aSAndroid Build Coastguard Worker scale_change = (final_e - input_e);
525*15dc779aSAndroid Build Coastguard Worker
526*15dc779aSAndroid Build Coastguard Worker if (((l == MAX_COLS)) && ((start_pos < MAX_COLS))) {
527*15dc779aSAndroid Build Coastguard Worker WORD32 diff = final_e - noise_e;
528*15dc779aSAndroid Build Coastguard Worker noise_e = final_e;
529*15dc779aSAndroid Build Coastguard Worker ixheaacd_noise_level_rescaling(noise_level_mant, diff, bands, 2);
530*15dc779aSAndroid Build Coastguard Worker }
531*15dc779aSAndroid Build Coastguard Worker }
532*15dc779aSAndroid Build Coastguard Worker } else {
533*15dc779aSAndroid Build Coastguard Worker if ((l < max_cols)) {
534*15dc779aSAndroid Build Coastguard Worker scale_change = (adj_e - input_e);
535*15dc779aSAndroid Build Coastguard Worker } else {
536*15dc779aSAndroid Build Coastguard Worker scale_change = (final_e - input_e);
537*15dc779aSAndroid Build Coastguard Worker
538*15dc779aSAndroid Build Coastguard Worker if (((l == max_cols)) && ((start_pos < max_cols))) {
539*15dc779aSAndroid Build Coastguard Worker WORD32 diff = final_e - noise_e;
540*15dc779aSAndroid Build Coastguard Worker noise_e = final_e;
541*15dc779aSAndroid Build Coastguard Worker ixheaacd_noise_level_rescaling(noise_level_mant, diff, bands, 2);
542*15dc779aSAndroid Build Coastguard Worker }
543*15dc779aSAndroid Build Coastguard Worker }
544*15dc779aSAndroid Build Coastguard Worker }
545*15dc779aSAndroid Build Coastguard Worker
546*15dc779aSAndroid Build Coastguard Worker ixheaacd_noise_level_rescaling(ptr_sbr_calc_env->filt_buf_noise_m,
547*15dc779aSAndroid Build Coastguard Worker ptr_sbr_calc_env->filt_buf_noise_e - noise_e,
548*15dc779aSAndroid Build Coastguard Worker num_sub_bands, 1);
549*15dc779aSAndroid Build Coastguard Worker
550*15dc779aSAndroid Build Coastguard Worker ptr_sbr_calc_env->filt_buf_noise_e = noise_e;
551*15dc779aSAndroid Build Coastguard Worker
552*15dc779aSAndroid Build Coastguard Worker {
553*15dc779aSAndroid Build Coastguard Worker WORD32 *anal_buf_real_m_l;
554*15dc779aSAndroid Build Coastguard Worker anal_buf_real_m_l = anal_buf_real_mant[l];
555*15dc779aSAndroid Build Coastguard Worker
556*15dc779aSAndroid Build Coastguard Worker if (low_pow_flag) {
557*15dc779aSAndroid Build Coastguard Worker WORD32 index = ptr_sbr_calc_env->ph_index;
558*15dc779aSAndroid Build Coastguard Worker WORD32 harm_index = ptr_sbr_calc_env->harm_index;
559*15dc779aSAndroid Build Coastguard Worker WORD32 freq_inv_flag = (sub_band_start & 1);
560*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr_real_buf = &anal_buf_real_m_l[sub_band_start];
561*15dc779aSAndroid Build Coastguard Worker
562*15dc779aSAndroid Build Coastguard Worker const WORD32 *ptr_rand_ph = &ptr_sbr_tables->sbr_rand_ph[index + 1];
563*15dc779aSAndroid Build Coastguard Worker
564*15dc779aSAndroid Build Coastguard Worker ptr_sbr_calc_env->ph_index =
565*15dc779aSAndroid Build Coastguard Worker (WORD16)((index + num_sub_bands) & (SBR_NF_NO_RANDOM_VAL - 1));
566*15dc779aSAndroid Build Coastguard Worker ptr_sbr_calc_env->harm_index = (WORD16)(((harm_index + 1)) & 3);
567*15dc779aSAndroid Build Coastguard Worker
568*15dc779aSAndroid Build Coastguard Worker if (!(harm_index & 0x1)) {
569*15dc779aSAndroid Build Coastguard Worker (*ixheaacd_harm_idx_zerotwolp)(
570*15dc779aSAndroid Build Coastguard Worker ptr_real_buf, nrg_gain, scale_change, nrg_sine, ptr_rand_ph,
571*15dc779aSAndroid Build Coastguard Worker noise_level_mant, num_sub_bands, noise_absc_flag, harm_index);
572*15dc779aSAndroid Build Coastguard Worker } else {
573*15dc779aSAndroid Build Coastguard Worker WORD32 noise = (noise_e - 16) - lb_scale;
574*15dc779aSAndroid Build Coastguard Worker
575*15dc779aSAndroid Build Coastguard Worker freq_inv_flag = (!freq_inv_flag);
576*15dc779aSAndroid Build Coastguard Worker freq_inv_flag = (freq_inv_flag << 1) - 1;
577*15dc779aSAndroid Build Coastguard Worker
578*15dc779aSAndroid Build Coastguard Worker if (harm_index == 3) freq_inv_flag = -freq_inv_flag;
579*15dc779aSAndroid Build Coastguard Worker
580*15dc779aSAndroid Build Coastguard Worker ixheaacd_harm_idx_onethreelp(ptr_real_buf, nrg_gain, scale_change,
581*15dc779aSAndroid Build Coastguard Worker nrg_sine, ptr_rand_ph, noise_level_mant,
582*15dc779aSAndroid Build Coastguard Worker num_sub_bands, noise_absc_flag,
583*15dc779aSAndroid Build Coastguard Worker freq_inv_flag, noise, sub_band_start);
584*15dc779aSAndroid Build Coastguard Worker }
585*15dc779aSAndroid Build Coastguard Worker
586*15dc779aSAndroid Build Coastguard Worker } else {
587*15dc779aSAndroid Build Coastguard Worker WORD16 smooth_ratio;
588*15dc779aSAndroid Build Coastguard Worker WORD32 *anal_buf_imag_m_l;
589*15dc779aSAndroid Build Coastguard Worker anal_buf_imag_m_l = anal_buf_imag_mant[l];
590*15dc779aSAndroid Build Coastguard Worker
591*15dc779aSAndroid Build Coastguard Worker if (((l - start_pos) < smooth_length)) {
592*15dc779aSAndroid Build Coastguard Worker smooth_ratio = ptr_sbr_tables->env_calc_tables_ptr
593*15dc779aSAndroid Build Coastguard Worker ->sbr_smooth_filter[(l - start_pos)];
594*15dc779aSAndroid Build Coastguard Worker } else {
595*15dc779aSAndroid Build Coastguard Worker smooth_ratio = 0;
596*15dc779aSAndroid Build Coastguard Worker }
597*15dc779aSAndroid Build Coastguard Worker
598*15dc779aSAndroid Build Coastguard Worker ixheaacd_adj_timeslot(
599*15dc779aSAndroid Build Coastguard Worker &anal_buf_real_m_l[sub_band_start],
600*15dc779aSAndroid Build Coastguard Worker &anal_buf_imag_m_l[sub_band_start],
601*15dc779aSAndroid Build Coastguard Worker &ptr_sbr_calc_env->filt_buf_me[2 * skip_bands],
602*15dc779aSAndroid Build Coastguard Worker &ptr_sbr_calc_env->filt_buf_noise_m[skip_bands], nrg_gain,
603*15dc779aSAndroid Build Coastguard Worker noise_level_mant, nrg_sine, (WORD16)(noise_e - 16),
604*15dc779aSAndroid Build Coastguard Worker &ptr_sbr_calc_env->harm_index, (WORD16)sub_band_start,
605*15dc779aSAndroid Build Coastguard Worker (WORD16)(bands), (WORD16)scale_change, smooth_ratio,
606*15dc779aSAndroid Build Coastguard Worker noise_absc_flag, &ptr_sbr_calc_env->ph_index, ptr_sbr_tables);
607*15dc779aSAndroid Build Coastguard Worker }
608*15dc779aSAndroid Build Coastguard Worker }
609*15dc779aSAndroid Build Coastguard Worker }
610*15dc779aSAndroid Build Coastguard Worker
611*15dc779aSAndroid Build Coastguard Worker ixheaacd_filt_buf_update(ptr_sbr_calc_env->filt_buf_me + 2 * skip_bands,
612*15dc779aSAndroid Build Coastguard Worker ptr_sbr_calc_env->filt_buf_noise_m + skip_bands,
613*15dc779aSAndroid Build Coastguard Worker nrg_gain, noise_level_mant, bands);
614*15dc779aSAndroid Build Coastguard Worker }
615*15dc779aSAndroid Build Coastguard Worker
ixheaacd_calc_subband_gains(ia_freq_band_data_struct * pstr_freq_band_data,ia_sbr_frame_info_data_struct * ptr_frame_data,WORD32 freq_res,WORD16 * ptr_noise_floor,WORD32 num_sf_bands,WORD32 mvalue,WORD32 env,WORD8 * sine_mapped_matrix,WORD8 * alias_red_buf,WORD16 * ptr_enrg_orig,WORD16 * nrg_sine,WORD16 * nrg_est,WORD16 * nrg_gain,WORD16 * noise_level_mant,FLAG noise_absc_flag,ixheaacd_misc_tables * pstr_common_tables)616*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_calc_subband_gains(ia_freq_band_data_struct *pstr_freq_band_data,
617*15dc779aSAndroid Build Coastguard Worker ia_sbr_frame_info_data_struct *ptr_frame_data,
618*15dc779aSAndroid Build Coastguard Worker WORD32 freq_res, WORD16 *ptr_noise_floor,
619*15dc779aSAndroid Build Coastguard Worker WORD32 num_sf_bands, WORD32 mvalue, WORD32 env,
620*15dc779aSAndroid Build Coastguard Worker WORD8 *sine_mapped_matrix,
621*15dc779aSAndroid Build Coastguard Worker WORD8 *alias_red_buf, WORD16 *ptr_enrg_orig,
622*15dc779aSAndroid Build Coastguard Worker WORD16 *nrg_sine, WORD16 *nrg_est,
623*15dc779aSAndroid Build Coastguard Worker WORD16 *nrg_gain, WORD16 *noise_level_mant,
624*15dc779aSAndroid Build Coastguard Worker FLAG noise_absc_flag,
625*15dc779aSAndroid Build Coastguard Worker ixheaacd_misc_tables *pstr_common_tables) {
626*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_freq_band_tbl = pstr_freq_band_data->freq_band_table[freq_res];
627*15dc779aSAndroid Build Coastguard Worker WORD32 ui_noise = pstr_freq_band_data->freq_band_tbl_noise[1];
628*15dc779aSAndroid Build Coastguard Worker WORD32 nb_idx = 0;
629*15dc779aSAndroid Build Coastguard Worker WORD16 tmp_noise_mant;
630*15dc779aSAndroid Build Coastguard Worker WORD16 tmp_noise_exp;
631*15dc779aSAndroid Build Coastguard Worker WORD8 *ptr_sine_mapped = sine_mapped_matrix;
632*15dc779aSAndroid Build Coastguard Worker WORD32 sub_band_start = pstr_freq_band_data->sub_band_start;
633*15dc779aSAndroid Build Coastguard Worker WORD32 skip_bands = (ptr_frame_data->max_qmf_subband_aac - sub_band_start);
634*15dc779aSAndroid Build Coastguard Worker WORD8 *ptr_sine_mapped_1 = &sine_mapped_matrix[skip_bands];
635*15dc779aSAndroid Build Coastguard Worker WORD32 k, c = 0, j;
636*15dc779aSAndroid Build Coastguard Worker
637*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_env_sf_arr = &ptr_frame_data->int_env_sf_arr[mvalue];
638*15dc779aSAndroid Build Coastguard Worker WORD8 *ptr_alias_red_buf =
639*15dc779aSAndroid Build Coastguard Worker &alias_red_buf[ptr_freq_band_tbl[0] - sub_band_start];
640*15dc779aSAndroid Build Coastguard Worker
641*15dc779aSAndroid Build Coastguard Worker tmp_noise_mant = (WORD16)(ptr_noise_floor[nb_idx] & MASK_M);
642*15dc779aSAndroid Build Coastguard Worker tmp_noise_exp =
643*15dc779aSAndroid Build Coastguard Worker (WORD16)(ptr_noise_floor[nb_idx] & MASK_FOR_EXP) - NOISE_EXP_OFFSET;
644*15dc779aSAndroid Build Coastguard Worker
645*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < num_sf_bands; j++) {
646*15dc779aSAndroid Build Coastguard Worker WORD8 sine_present_flag;
647*15dc779aSAndroid Build Coastguard Worker WORD16 tmp_nrg_ref_exp, tmp_nrg_ref_mant;
648*15dc779aSAndroid Build Coastguard Worker WORD16 li = *ptr_freq_band_tbl++;
649*15dc779aSAndroid Build Coastguard Worker WORD16 ui = *ptr_freq_band_tbl;
650*15dc779aSAndroid Build Coastguard Worker WORD16 env_sf_val = *ptr_env_sf_arr++;
651*15dc779aSAndroid Build Coastguard Worker
652*15dc779aSAndroid Build Coastguard Worker tmp_nrg_ref_exp =
653*15dc779aSAndroid Build Coastguard Worker (WORD16)((env_sf_val & (WORD16)MASK_FOR_EXP) - NRG_EXP_OFFSET);
654*15dc779aSAndroid Build Coastguard Worker tmp_nrg_ref_mant = (WORD16)(env_sf_val & MASK_M);
655*15dc779aSAndroid Build Coastguard Worker
656*15dc779aSAndroid Build Coastguard Worker sine_present_flag = 0;
657*15dc779aSAndroid Build Coastguard Worker for (k = li; k < ui; k++) {
658*15dc779aSAndroid Build Coastguard Worker if ((env >= *ptr_sine_mapped++)) sine_present_flag = 1;
659*15dc779aSAndroid Build Coastguard Worker }
660*15dc779aSAndroid Build Coastguard Worker for (k = li; k < ui; k++) {
661*15dc779aSAndroid Build Coastguard Worker *ptr_alias_red_buf++ = !sine_present_flag;
662*15dc779aSAndroid Build Coastguard Worker
663*15dc779aSAndroid Build Coastguard Worker if ((k >= ui_noise)) {
664*15dc779aSAndroid Build Coastguard Worker nb_idx++;
665*15dc779aSAndroid Build Coastguard Worker ui_noise = pstr_freq_band_data->freq_band_tbl_noise[nb_idx + 1];
666*15dc779aSAndroid Build Coastguard Worker tmp_noise_mant = (WORD16)(ptr_noise_floor[nb_idx] & MASK_M);
667*15dc779aSAndroid Build Coastguard Worker tmp_noise_exp =
668*15dc779aSAndroid Build Coastguard Worker (WORD16)(ptr_noise_floor[nb_idx] & MASK_FOR_EXP) - NOISE_EXP_OFFSET;
669*15dc779aSAndroid Build Coastguard Worker }
670*15dc779aSAndroid Build Coastguard Worker
671*15dc779aSAndroid Build Coastguard Worker if ((k >= ptr_frame_data->max_qmf_subband_aac)) {
672*15dc779aSAndroid Build Coastguard Worker ptr_enrg_orig[2 * c] = tmp_nrg_ref_mant;
673*15dc779aSAndroid Build Coastguard Worker ptr_enrg_orig[2 * c + 1] = tmp_nrg_ref_exp;
674*15dc779aSAndroid Build Coastguard Worker nrg_sine[2 * c] = 0;
675*15dc779aSAndroid Build Coastguard Worker nrg_sine[2 * c + 1] = 0;
676*15dc779aSAndroid Build Coastguard Worker
677*15dc779aSAndroid Build Coastguard Worker ixheaacd_subbandgain_calc(
678*15dc779aSAndroid Build Coastguard Worker tmp_nrg_ref_mant, tmp_noise_mant, nrg_est[2 * c],
679*15dc779aSAndroid Build Coastguard Worker nrg_est[2 * c + 1], tmp_noise_exp, tmp_nrg_ref_exp,
680*15dc779aSAndroid Build Coastguard Worker sine_present_flag,
681*15dc779aSAndroid Build Coastguard Worker (env >= ptr_sine_mapped_1[c]) ? (FLAG)1 : (FLAG)0, noise_absc_flag,
682*15dc779aSAndroid Build Coastguard Worker &nrg_gain[2 * c], &noise_level_mant[2 * c], &nrg_sine[2 * c],
683*15dc779aSAndroid Build Coastguard Worker pstr_common_tables);
684*15dc779aSAndroid Build Coastguard Worker c++;
685*15dc779aSAndroid Build Coastguard Worker }
686*15dc779aSAndroid Build Coastguard Worker }
687*15dc779aSAndroid Build Coastguard Worker }
688*15dc779aSAndroid Build Coastguard Worker }
689*15dc779aSAndroid Build Coastguard Worker
690*15dc779aSAndroid Build Coastguard Worker #define ALIGN_SIZE64(x) ((((x) + 7) >> 3) << 3)
691*15dc779aSAndroid Build Coastguard Worker
ixheaacd_calc_sbrenvelope(ia_sbr_scale_fact_struct * ptr_sbr_scale_fac,ia_sbr_calc_env_struct * ptr_sbr_calc_env,ia_sbr_header_data_struct * ptr_header_data,ia_sbr_frame_info_data_struct * ptr_frame_data,ia_sbr_prev_frame_data_struct * ptr_frame_data_prev,WORD32 ** anal_buf_real_mant,WORD32 ** anal_buf_imag_mant,WORD16 * deg_patched,FLAG low_pow_flag,ia_sbr_tables_struct * ptr_sbr_tables,ixheaacd_misc_tables * pstr_common_tables,WORD32 * ptr_qmf_matrix,WORD32 audio_object_type)692*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaacd_calc_sbrenvelope(
693*15dc779aSAndroid Build Coastguard Worker ia_sbr_scale_fact_struct *ptr_sbr_scale_fac,
694*15dc779aSAndroid Build Coastguard Worker ia_sbr_calc_env_struct *ptr_sbr_calc_env,
695*15dc779aSAndroid Build Coastguard Worker ia_sbr_header_data_struct *ptr_header_data,
696*15dc779aSAndroid Build Coastguard Worker ia_sbr_frame_info_data_struct *ptr_frame_data,
697*15dc779aSAndroid Build Coastguard Worker ia_sbr_prev_frame_data_struct *ptr_frame_data_prev,
698*15dc779aSAndroid Build Coastguard Worker WORD32 **anal_buf_real_mant, WORD32 **anal_buf_imag_mant,
699*15dc779aSAndroid Build Coastguard Worker WORD16 *deg_patched, FLAG low_pow_flag,
700*15dc779aSAndroid Build Coastguard Worker ia_sbr_tables_struct *ptr_sbr_tables,
701*15dc779aSAndroid Build Coastguard Worker ixheaacd_misc_tables *pstr_common_tables, WORD32 *ptr_qmf_matrix,
702*15dc779aSAndroid Build Coastguard Worker WORD32 audio_object_type) {
703*15dc779aSAndroid Build Coastguard Worker WORD32 i, j, m;
704*15dc779aSAndroid Build Coastguard Worker WORD32 noise_floor_idx;
705*15dc779aSAndroid Build Coastguard Worker WORD32 start_pos, end_pos;
706*15dc779aSAndroid Build Coastguard Worker WORD32 freq_res;
707*15dc779aSAndroid Build Coastguard Worker WORD32 num_env = ptr_frame_data->str_frame_info_details.num_env;
708*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_border_vec = ptr_frame_data->str_frame_info_details.border_vec;
709*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err_code = IA_NO_ERROR;
710*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_noise_floor;
711*15dc779aSAndroid Build Coastguard Worker ia_freq_band_data_struct *pstr_freq_band_data =
712*15dc779aSAndroid Build Coastguard Worker ptr_header_data->pstr_freq_band_data;
713*15dc779aSAndroid Build Coastguard Worker
714*15dc779aSAndroid Build Coastguard Worker FLAG noise_absc_flag;
715*15dc779aSAndroid Build Coastguard Worker WORD32 smooth_length;
716*15dc779aSAndroid Build Coastguard Worker
717*15dc779aSAndroid Build Coastguard Worker const WORD16 *num_sf_bands = pstr_freq_band_data->num_sf_bands;
718*15dc779aSAndroid Build Coastguard Worker const WORD32 num_nf_bands = pstr_freq_band_data->num_nf_bands;
719*15dc779aSAndroid Build Coastguard Worker
720*15dc779aSAndroid Build Coastguard Worker WORD32 sub_band_start = pstr_freq_band_data->sub_band_start;
721*15dc779aSAndroid Build Coastguard Worker WORD32 sub_band_end = pstr_freq_band_data->sub_band_end;
722*15dc779aSAndroid Build Coastguard Worker
723*15dc779aSAndroid Build Coastguard Worker WORD16 num_timeslots = ptr_header_data->num_time_slots;
724*15dc779aSAndroid Build Coastguard Worker WORD16 max_cols = ptr_header_data->num_time_slots * 2;
725*15dc779aSAndroid Build Coastguard Worker
726*15dc779aSAndroid Build Coastguard Worker WORD32 num_sub_bands;
727*15dc779aSAndroid Build Coastguard Worker WORD32 skip_bands;
728*15dc779aSAndroid Build Coastguard Worker WORD32 bands;
729*15dc779aSAndroid Build Coastguard Worker
730*15dc779aSAndroid Build Coastguard Worker WORD num_cols;
731*15dc779aSAndroid Build Coastguard Worker WORD32 first_start;
732*15dc779aSAndroid Build Coastguard Worker
733*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_sbr_lim_gain;
734*15dc779aSAndroid Build Coastguard Worker WORD32 max_sfb_nrg_exp;
735*15dc779aSAndroid Build Coastguard Worker
736*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_enrg_orig;
737*15dc779aSAndroid Build Coastguard Worker
738*15dc779aSAndroid Build Coastguard Worker WORD32 input_e;
739*15dc779aSAndroid Build Coastguard Worker WORD32 ov_adj_e;
740*15dc779aSAndroid Build Coastguard Worker WORD32 adj_e;
741*15dc779aSAndroid Build Coastguard Worker WORD32 output_e;
742*15dc779aSAndroid Build Coastguard Worker WORD32 final_e;
743*15dc779aSAndroid Build Coastguard Worker WORD16 noise_e;
744*15dc779aSAndroid Build Coastguard Worker WORD16 lb_scale;
745*15dc779aSAndroid Build Coastguard Worker
746*15dc779aSAndroid Build Coastguard Worker WORD16 nrg_est[2 * MAX_FREQ_COEFFS];
747*15dc779aSAndroid Build Coastguard Worker
748*15dc779aSAndroid Build Coastguard Worker WORD16 nrg_gain[2 * MAX_FREQ_COEFFS];
749*15dc779aSAndroid Build Coastguard Worker WORD16 noise_level_mant[2 * MAX_FREQ_COEFFS];
750*15dc779aSAndroid Build Coastguard Worker WORD16 nrg_sine[2 * MAX_FREQ_COEFFS];
751*15dc779aSAndroid Build Coastguard Worker
752*15dc779aSAndroid Build Coastguard Worker WORD8 sine_mapped_matrix[MAX_FREQ_COEFFS];
753*15dc779aSAndroid Build Coastguard Worker WORD8 alias_red_buf[64];
754*15dc779aSAndroid Build Coastguard Worker
755*15dc779aSAndroid Build Coastguard Worker ptr_noise_floor = ptr_frame_data->int_noise_floor;
756*15dc779aSAndroid Build Coastguard Worker
757*15dc779aSAndroid Build Coastguard Worker ptr_enrg_orig =
758*15dc779aSAndroid Build Coastguard Worker (WORD16 *)((WORD8 *)ptr_frame_data +
759*15dc779aSAndroid Build Coastguard Worker ALIGN_SIZE64(sizeof(ia_sbr_frame_info_data_struct)));
760*15dc779aSAndroid Build Coastguard Worker
761*15dc779aSAndroid Build Coastguard Worker num_env = ptr_frame_data->str_frame_info_details.num_env;
762*15dc779aSAndroid Build Coastguard Worker ptr_border_vec = ptr_frame_data->str_frame_info_details.border_vec;
763*15dc779aSAndroid Build Coastguard Worker num_sub_bands = (sub_band_end - sub_band_start);
764*15dc779aSAndroid Build Coastguard Worker skip_bands = (ptr_frame_data->max_qmf_subband_aac - sub_band_start);
765*15dc779aSAndroid Build Coastguard Worker
766*15dc779aSAndroid Build Coastguard Worker ixheaacd_map_sineflags(
767*15dc779aSAndroid Build Coastguard Worker pstr_freq_band_data->freq_band_table[HIGH],
768*15dc779aSAndroid Build Coastguard Worker pstr_freq_band_data->num_sf_bands[HIGH], ptr_frame_data->add_harmonics,
769*15dc779aSAndroid Build Coastguard Worker ptr_sbr_calc_env->harm_flags_prev,
770*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->str_frame_info_details.transient_env, sine_mapped_matrix);
771*15dc779aSAndroid Build Coastguard Worker
772*15dc779aSAndroid Build Coastguard Worker adj_e = 0;
773*15dc779aSAndroid Build Coastguard Worker {
774*15dc779aSAndroid Build Coastguard Worker WORD16 max_noise;
775*15dc779aSAndroid Build Coastguard Worker WORD32 first_band;
776*15dc779aSAndroid Build Coastguard Worker
777*15dc779aSAndroid Build Coastguard Worker if (ptr_frame_data_prev->max_qmf_subband_aac >
778*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->max_qmf_subband_aac)
779*15dc779aSAndroid Build Coastguard Worker first_band = (ptr_frame_data_prev->max_qmf_subband_aac - sub_band_start);
780*15dc779aSAndroid Build Coastguard Worker else
781*15dc779aSAndroid Build Coastguard Worker first_band = (ptr_frame_data->max_qmf_subband_aac - sub_band_start);
782*15dc779aSAndroid Build Coastguard Worker
783*15dc779aSAndroid Build Coastguard Worker max_noise = 0;
784*15dc779aSAndroid Build Coastguard Worker for (i = first_band; i < num_sub_bands; i++) {
785*15dc779aSAndroid Build Coastguard Worker if (ptr_sbr_calc_env->filt_buf_noise_m[i] > max_noise) {
786*15dc779aSAndroid Build Coastguard Worker max_noise = ptr_sbr_calc_env->filt_buf_noise_m[i];
787*15dc779aSAndroid Build Coastguard Worker }
788*15dc779aSAndroid Build Coastguard Worker }
789*15dc779aSAndroid Build Coastguard Worker adj_e = ((ptr_sbr_calc_env->filt_buf_noise_e - ixheaac_norm32(max_noise)) -
790*15dc779aSAndroid Build Coastguard Worker 16);
791*15dc779aSAndroid Build Coastguard Worker }
792*15dc779aSAndroid Build Coastguard Worker
793*15dc779aSAndroid Build Coastguard Worker final_e = 0;
794*15dc779aSAndroid Build Coastguard Worker {
795*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_env_sf_buf = ptr_frame_data->int_env_sf_arr;
796*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_env; i++) {
797*15dc779aSAndroid Build Coastguard Worker WORD32 temp_val;
798*15dc779aSAndroid Build Coastguard Worker
799*15dc779aSAndroid Build Coastguard Worker max_sfb_nrg_exp = NRG_EXP_OFFSET - SHORT_BITS;
800*15dc779aSAndroid Build Coastguard Worker
801*15dc779aSAndroid Build Coastguard Worker freq_res = ptr_frame_data->str_frame_info_details.freq_res[i];
802*15dc779aSAndroid Build Coastguard Worker
803*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < num_sf_bands[freq_res]; j++) {
804*15dc779aSAndroid Build Coastguard Worker temp_val = ((*ptr_env_sf_buf++ & MASK_FOR_EXP));
805*15dc779aSAndroid Build Coastguard Worker
806*15dc779aSAndroid Build Coastguard Worker if ((temp_val > max_sfb_nrg_exp)) {
807*15dc779aSAndroid Build Coastguard Worker max_sfb_nrg_exp = temp_val;
808*15dc779aSAndroid Build Coastguard Worker }
809*15dc779aSAndroid Build Coastguard Worker }
810*15dc779aSAndroid Build Coastguard Worker
811*15dc779aSAndroid Build Coastguard Worker max_sfb_nrg_exp = (max_sfb_nrg_exp - NRG_EXP_OFFSET);
812*15dc779aSAndroid Build Coastguard Worker
813*15dc779aSAndroid Build Coastguard Worker temp_val = ((max_sfb_nrg_exp + 13) >> 1);
814*15dc779aSAndroid Build Coastguard Worker
815*15dc779aSAndroid Build Coastguard Worker if (num_timeslots != 15) {
816*15dc779aSAndroid Build Coastguard Worker if ((ptr_border_vec[i] < SBR_TIME_SLOTS)) {
817*15dc779aSAndroid Build Coastguard Worker if ((temp_val > adj_e)) {
818*15dc779aSAndroid Build Coastguard Worker adj_e = (WORD16)temp_val;
819*15dc779aSAndroid Build Coastguard Worker }
820*15dc779aSAndroid Build Coastguard Worker }
821*15dc779aSAndroid Build Coastguard Worker
822*15dc779aSAndroid Build Coastguard Worker if ((ptr_border_vec[i + 1] > SBR_TIME_SLOTS)) {
823*15dc779aSAndroid Build Coastguard Worker if ((temp_val > final_e)) {
824*15dc779aSAndroid Build Coastguard Worker final_e = (WORD16)temp_val;
825*15dc779aSAndroid Build Coastguard Worker }
826*15dc779aSAndroid Build Coastguard Worker }
827*15dc779aSAndroid Build Coastguard Worker } else {
828*15dc779aSAndroid Build Coastguard Worker if ((ptr_border_vec[i] < num_timeslots)) {
829*15dc779aSAndroid Build Coastguard Worker if ((temp_val > adj_e)) {
830*15dc779aSAndroid Build Coastguard Worker adj_e = (WORD16)temp_val;
831*15dc779aSAndroid Build Coastguard Worker }
832*15dc779aSAndroid Build Coastguard Worker }
833*15dc779aSAndroid Build Coastguard Worker
834*15dc779aSAndroid Build Coastguard Worker if ((ptr_border_vec[i + 1] > num_timeslots)) {
835*15dc779aSAndroid Build Coastguard Worker if ((temp_val > final_e)) {
836*15dc779aSAndroid Build Coastguard Worker final_e = (WORD16)temp_val;
837*15dc779aSAndroid Build Coastguard Worker }
838*15dc779aSAndroid Build Coastguard Worker }
839*15dc779aSAndroid Build Coastguard Worker }
840*15dc779aSAndroid Build Coastguard Worker }
841*15dc779aSAndroid Build Coastguard Worker }
842*15dc779aSAndroid Build Coastguard Worker
843*15dc779aSAndroid Build Coastguard Worker m = 0;
844*15dc779aSAndroid Build Coastguard Worker noise_floor_idx = 0;
845*15dc779aSAndroid Build Coastguard Worker
846*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_env; i++) {
847*15dc779aSAndroid Build Coastguard Worker if (audio_object_type == AOT_ER_AAC_ELD ||
848*15dc779aSAndroid Build Coastguard Worker audio_object_type == AOT_ER_AAC_LD) {
849*15dc779aSAndroid Build Coastguard Worker start_pos = ptr_border_vec[i];
850*15dc779aSAndroid Build Coastguard Worker end_pos = ptr_border_vec[i + 1];
851*15dc779aSAndroid Build Coastguard Worker } else {
852*15dc779aSAndroid Build Coastguard Worker start_pos = SBR_TIME_STEP * ptr_border_vec[i];
853*15dc779aSAndroid Build Coastguard Worker end_pos = SBR_TIME_STEP * ptr_border_vec[i + 1];
854*15dc779aSAndroid Build Coastguard Worker }
855*15dc779aSAndroid Build Coastguard Worker if ((start_pos >= MAX_ENV_COLS) || (end_pos > MAX_ENV_COLS))
856*15dc779aSAndroid Build Coastguard Worker return IA_FATAL_ERROR;
857*15dc779aSAndroid Build Coastguard Worker freq_res = ptr_frame_data->str_frame_info_details.freq_res[i];
858*15dc779aSAndroid Build Coastguard Worker
859*15dc779aSAndroid Build Coastguard Worker if (noise_floor_idx >= MAX_NOISE_ENVELOPES) return IA_FATAL_ERROR;
860*15dc779aSAndroid Build Coastguard Worker
861*15dc779aSAndroid Build Coastguard Worker if (ptr_border_vec[i] ==
862*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->str_frame_info_details
863*15dc779aSAndroid Build Coastguard Worker .noise_border_vec[noise_floor_idx + 1]) {
864*15dc779aSAndroid Build Coastguard Worker ptr_noise_floor += num_nf_bands;
865*15dc779aSAndroid Build Coastguard Worker noise_floor_idx++;
866*15dc779aSAndroid Build Coastguard Worker }
867*15dc779aSAndroid Build Coastguard Worker
868*15dc779aSAndroid Build Coastguard Worker if ((i == ptr_frame_data->str_frame_info_details.transient_env) ||
869*15dc779aSAndroid Build Coastguard Worker (i == ptr_sbr_calc_env->tansient_env_prev)) {
870*15dc779aSAndroid Build Coastguard Worker noise_absc_flag = 1;
871*15dc779aSAndroid Build Coastguard Worker smooth_length = 0;
872*15dc779aSAndroid Build Coastguard Worker } else {
873*15dc779aSAndroid Build Coastguard Worker noise_absc_flag = 0;
874*15dc779aSAndroid Build Coastguard Worker smooth_length = ((1 - ptr_header_data->smoothing_mode) << 2);
875*15dc779aSAndroid Build Coastguard Worker }
876*15dc779aSAndroid Build Coastguard Worker
877*15dc779aSAndroid Build Coastguard Worker input_e = 15 - ptr_sbr_scale_fac->hb_scale;
878*15dc779aSAndroid Build Coastguard Worker
879*15dc779aSAndroid Build Coastguard Worker if (ptr_header_data->interpol_freq) {
880*15dc779aSAndroid Build Coastguard Worker (*ixheaacd_enery_calc_per_subband)(
881*15dc779aSAndroid Build Coastguard Worker start_pos, end_pos, ptr_frame_data->max_qmf_subband_aac, sub_band_end,
882*15dc779aSAndroid Build Coastguard Worker input_e, nrg_est, low_pow_flag, ptr_sbr_tables, ptr_qmf_matrix);
883*15dc779aSAndroid Build Coastguard Worker } else {
884*15dc779aSAndroid Build Coastguard Worker ixheaacd_enery_calc_persfb(
885*15dc779aSAndroid Build Coastguard Worker anal_buf_real_mant, anal_buf_imag_mant, num_sf_bands[freq_res],
886*15dc779aSAndroid Build Coastguard Worker pstr_freq_band_data->freq_band_table[freq_res], start_pos, end_pos,
887*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->max_qmf_subband_aac, input_e, nrg_est, low_pow_flag,
888*15dc779aSAndroid Build Coastguard Worker ptr_sbr_tables);
889*15dc779aSAndroid Build Coastguard Worker }
890*15dc779aSAndroid Build Coastguard Worker
891*15dc779aSAndroid Build Coastguard Worker if (pstr_freq_band_data->freq_band_table[freq_res][0] < pstr_freq_band_data->sub_band_start) {
892*15dc779aSAndroid Build Coastguard Worker pstr_freq_band_data->sub_band_start = pstr_freq_band_data->freq_band_table[freq_res][0];
893*15dc779aSAndroid Build Coastguard Worker return IA_FATAL_ERROR;
894*15dc779aSAndroid Build Coastguard Worker }
895*15dc779aSAndroid Build Coastguard Worker
896*15dc779aSAndroid Build Coastguard Worker ixheaacd_calc_subband_gains(
897*15dc779aSAndroid Build Coastguard Worker pstr_freq_band_data, ptr_frame_data, freq_res, ptr_noise_floor,
898*15dc779aSAndroid Build Coastguard Worker num_sf_bands[freq_res], m, i, sine_mapped_matrix, alias_red_buf,
899*15dc779aSAndroid Build Coastguard Worker ptr_enrg_orig, nrg_sine, nrg_est, nrg_gain, noise_level_mant,
900*15dc779aSAndroid Build Coastguard Worker noise_absc_flag, pstr_common_tables);
901*15dc779aSAndroid Build Coastguard Worker
902*15dc779aSAndroid Build Coastguard Worker m += num_sf_bands[freq_res];
903*15dc779aSAndroid Build Coastguard Worker
904*15dc779aSAndroid Build Coastguard Worker ptr_sbr_lim_gain =
905*15dc779aSAndroid Build Coastguard Worker &ptr_sbr_tables->env_calc_tables_ptr
906*15dc779aSAndroid Build Coastguard Worker ->sbr_lim_gains_m[2 * ptr_header_data->limiter_gains];
907*15dc779aSAndroid Build Coastguard Worker ixheaacd_noiselimiting(pstr_freq_band_data, skip_bands, ptr_enrg_orig,
908*15dc779aSAndroid Build Coastguard Worker nrg_est, nrg_gain, noise_level_mant, nrg_sine,
909*15dc779aSAndroid Build Coastguard Worker ptr_sbr_lim_gain, noise_absc_flag,
910*15dc779aSAndroid Build Coastguard Worker pstr_common_tables);
911*15dc779aSAndroid Build Coastguard Worker
912*15dc779aSAndroid Build Coastguard Worker if (low_pow_flag) {
913*15dc779aSAndroid Build Coastguard Worker ixheaacd_alias_reduction(deg_patched + sub_band_start, nrg_gain, nrg_est,
914*15dc779aSAndroid Build Coastguard Worker alias_red_buf, num_sub_bands,
915*15dc779aSAndroid Build Coastguard Worker pstr_common_tables);
916*15dc779aSAndroid Build Coastguard Worker }
917*15dc779aSAndroid Build Coastguard Worker
918*15dc779aSAndroid Build Coastguard Worker if (max_cols != 30) {
919*15dc779aSAndroid Build Coastguard Worker if ((start_pos < MAX_COLS)) {
920*15dc779aSAndroid Build Coastguard Worker noise_e = adj_e;
921*15dc779aSAndroid Build Coastguard Worker } else {
922*15dc779aSAndroid Build Coastguard Worker noise_e = final_e;
923*15dc779aSAndroid Build Coastguard Worker }
924*15dc779aSAndroid Build Coastguard Worker } else {
925*15dc779aSAndroid Build Coastguard Worker if ((start_pos < max_cols)) {
926*15dc779aSAndroid Build Coastguard Worker noise_e = adj_e;
927*15dc779aSAndroid Build Coastguard Worker } else {
928*15dc779aSAndroid Build Coastguard Worker noise_e = final_e;
929*15dc779aSAndroid Build Coastguard Worker }
930*15dc779aSAndroid Build Coastguard Worker }
931*15dc779aSAndroid Build Coastguard Worker
932*15dc779aSAndroid Build Coastguard Worker bands = num_sub_bands - skip_bands;
933*15dc779aSAndroid Build Coastguard Worker
934*15dc779aSAndroid Build Coastguard Worker if (low_pow_flag) {
935*15dc779aSAndroid Build Coastguard Worker (*ixheaacd_conv_ergtoamplitudelp)(
936*15dc779aSAndroid Build Coastguard Worker bands, noise_e, nrg_sine, nrg_gain, noise_level_mant,
937*15dc779aSAndroid Build Coastguard Worker (WORD16 *)pstr_common_tables->sqrt_table);
938*15dc779aSAndroid Build Coastguard Worker } else
939*15dc779aSAndroid Build Coastguard Worker
940*15dc779aSAndroid Build Coastguard Worker {
941*15dc779aSAndroid Build Coastguard Worker (*ixheaacd_conv_ergtoamplitude)(bands, noise_e, nrg_sine, nrg_gain,
942*15dc779aSAndroid Build Coastguard Worker noise_level_mant,
943*15dc779aSAndroid Build Coastguard Worker (WORD16 *)pstr_common_tables->sqrt_table);
944*15dc779aSAndroid Build Coastguard Worker }
945*15dc779aSAndroid Build Coastguard Worker
946*15dc779aSAndroid Build Coastguard Worker lb_scale = ixheaac_sub16(15, ptr_sbr_scale_fac->lb_scale);
947*15dc779aSAndroid Build Coastguard Worker
948*15dc779aSAndroid Build Coastguard Worker ixheaacd_adapt_noise_gain_calc(
949*15dc779aSAndroid Build Coastguard Worker ptr_sbr_calc_env, noise_e, num_sub_bands, skip_bands, nrg_gain,
950*15dc779aSAndroid Build Coastguard Worker noise_level_mant, nrg_sine, start_pos, end_pos, input_e, adj_e, final_e,
951*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->max_qmf_subband_aac, lb_scale, noise_absc_flag,
952*15dc779aSAndroid Build Coastguard Worker smooth_length, anal_buf_real_mant, anal_buf_imag_mant, low_pow_flag,
953*15dc779aSAndroid Build Coastguard Worker ptr_sbr_tables, max_cols);
954*15dc779aSAndroid Build Coastguard Worker }
955*15dc779aSAndroid Build Coastguard Worker
956*15dc779aSAndroid Build Coastguard Worker first_start = ptr_border_vec[0] * SBR_TIME_STEP;
957*15dc779aSAndroid Build Coastguard Worker {
958*15dc779aSAndroid Build Coastguard Worker WORD32 ov_reserve, reserve;
959*15dc779aSAndroid Build Coastguard Worker
960*15dc779aSAndroid Build Coastguard Worker ov_reserve = reserve = 0;
961*15dc779aSAndroid Build Coastguard Worker
962*15dc779aSAndroid Build Coastguard Worker if (audio_object_type != AOT_ER_AAC_ELD) {
963*15dc779aSAndroid Build Coastguard Worker if (ptr_header_data->channel_mode == PS_STEREO) {
964*15dc779aSAndroid Build Coastguard Worker ov_reserve = (*ixheaacd_ixheaacd_expsubbandsamples)(
965*15dc779aSAndroid Build Coastguard Worker anal_buf_real_mant, anal_buf_imag_mant,
966*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->max_qmf_subband_aac, sub_band_end, 0, first_start,
967*15dc779aSAndroid Build Coastguard Worker low_pow_flag);
968*15dc779aSAndroid Build Coastguard Worker
969*15dc779aSAndroid Build Coastguard Worker if (max_cols != 30) {
970*15dc779aSAndroid Build Coastguard Worker reserve = (*ixheaacd_ixheaacd_expsubbandsamples)(
971*15dc779aSAndroid Build Coastguard Worker anal_buf_real_mant, anal_buf_imag_mant,
972*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->max_qmf_subband_aac, sub_band_end, first_start,
973*15dc779aSAndroid Build Coastguard Worker MAX_COLS, low_pow_flag);
974*15dc779aSAndroid Build Coastguard Worker } else {
975*15dc779aSAndroid Build Coastguard Worker reserve = (*ixheaacd_ixheaacd_expsubbandsamples)(
976*15dc779aSAndroid Build Coastguard Worker anal_buf_real_mant, anal_buf_imag_mant,
977*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->max_qmf_subband_aac, sub_band_end, first_start,
978*15dc779aSAndroid Build Coastguard Worker max_cols, low_pow_flag);
979*15dc779aSAndroid Build Coastguard Worker }
980*15dc779aSAndroid Build Coastguard Worker }
981*15dc779aSAndroid Build Coastguard Worker }
982*15dc779aSAndroid Build Coastguard Worker
983*15dc779aSAndroid Build Coastguard Worker output_e = 0;
984*15dc779aSAndroid Build Coastguard Worker
985*15dc779aSAndroid Build Coastguard Worker ov_adj_e = 15 - ptr_sbr_scale_fac->ov_hb_scale;
986*15dc779aSAndroid Build Coastguard Worker
987*15dc779aSAndroid Build Coastguard Worker if (((ov_adj_e - ov_reserve) > (adj_e - reserve)))
988*15dc779aSAndroid Build Coastguard Worker output_e = (ov_adj_e - ov_reserve);
989*15dc779aSAndroid Build Coastguard Worker else
990*15dc779aSAndroid Build Coastguard Worker output_e = (adj_e - reserve);
991*15dc779aSAndroid Build Coastguard Worker
992*15dc779aSAndroid Build Coastguard Worker (*ixheaacd_adjust_scale)(anal_buf_real_mant, anal_buf_imag_mant,
993*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->max_qmf_subband_aac, sub_band_end,
994*15dc779aSAndroid Build Coastguard Worker 0, first_start, (ov_adj_e - output_e),
995*15dc779aSAndroid Build Coastguard Worker low_pow_flag);
996*15dc779aSAndroid Build Coastguard Worker
997*15dc779aSAndroid Build Coastguard Worker num_cols = (ptr_header_data->num_time_slots * ptr_header_data->time_step);
998*15dc779aSAndroid Build Coastguard Worker
999*15dc779aSAndroid Build Coastguard Worker (*ixheaacd_adjust_scale)(anal_buf_real_mant, anal_buf_imag_mant,
1000*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->max_qmf_subband_aac, sub_band_end,
1001*15dc779aSAndroid Build Coastguard Worker first_start, num_cols, (adj_e - output_e),
1002*15dc779aSAndroid Build Coastguard Worker low_pow_flag);
1003*15dc779aSAndroid Build Coastguard Worker }
1004*15dc779aSAndroid Build Coastguard Worker
1005*15dc779aSAndroid Build Coastguard Worker ptr_sbr_scale_fac->hb_scale = (WORD16)(15 - output_e);
1006*15dc779aSAndroid Build Coastguard Worker
1007*15dc779aSAndroid Build Coastguard Worker ptr_sbr_scale_fac->ov_hb_scale = (WORD16)(15 - final_e);
1008*15dc779aSAndroid Build Coastguard Worker
1009*15dc779aSAndroid Build Coastguard Worker if (ptr_frame_data->str_frame_info_details.transient_env == num_env) {
1010*15dc779aSAndroid Build Coastguard Worker ptr_sbr_calc_env->tansient_env_prev = 0;
1011*15dc779aSAndroid Build Coastguard Worker } else {
1012*15dc779aSAndroid Build Coastguard Worker ptr_sbr_calc_env->tansient_env_prev = -1;
1013*15dc779aSAndroid Build Coastguard Worker }
1014*15dc779aSAndroid Build Coastguard Worker return err_code;
1015*15dc779aSAndroid Build Coastguard Worker }
1016*15dc779aSAndroid Build Coastguard Worker
ixheaacd_equalize_filt_buff_exp(WORD16 * ptr_filt_buf,WORD16 * nrg_gain,WORD32 subbands)1017*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_equalize_filt_buff_exp(WORD16 *ptr_filt_buf, WORD16 *nrg_gain,
1018*15dc779aSAndroid Build Coastguard Worker WORD32 subbands) {
1019*15dc779aSAndroid Build Coastguard Worker WORD32 band;
1020*15dc779aSAndroid Build Coastguard Worker WORD32 diff;
1021*15dc779aSAndroid Build Coastguard Worker WORD32 gain_m, gain_e;
1022*15dc779aSAndroid Build Coastguard Worker WORD32 filt_buf_mant, filt_buf_exp;
1023*15dc779aSAndroid Build Coastguard Worker
1024*15dc779aSAndroid Build Coastguard Worker for (band = subbands - 1; band >= 0; band--) {
1025*15dc779aSAndroid Build Coastguard Worker filt_buf_exp = *(ptr_filt_buf + 1);
1026*15dc779aSAndroid Build Coastguard Worker gain_e = *(nrg_gain + 1);
1027*15dc779aSAndroid Build Coastguard Worker filt_buf_mant = *ptr_filt_buf;
1028*15dc779aSAndroid Build Coastguard Worker gain_m = *nrg_gain;
1029*15dc779aSAndroid Build Coastguard Worker diff = (gain_e - filt_buf_exp);
1030*15dc779aSAndroid Build Coastguard Worker
1031*15dc779aSAndroid Build Coastguard Worker if (diff >= 0) {
1032*15dc779aSAndroid Build Coastguard Worker *(ptr_filt_buf + 1) = (WORD16)(gain_e);
1033*15dc779aSAndroid Build Coastguard Worker
1034*15dc779aSAndroid Build Coastguard Worker *ptr_filt_buf = (WORD16)(*ptr_filt_buf >> diff);
1035*15dc779aSAndroid Build Coastguard Worker } else {
1036*15dc779aSAndroid Build Coastguard Worker WORD32 reserve;
1037*15dc779aSAndroid Build Coastguard Worker reserve = (ixheaac_norm32(filt_buf_mant) - 16);
1038*15dc779aSAndroid Build Coastguard Worker
1039*15dc779aSAndroid Build Coastguard Worker if ((diff + reserve) >= 0) {
1040*15dc779aSAndroid Build Coastguard Worker *ptr_filt_buf = (WORD16)(filt_buf_mant << -diff);
1041*15dc779aSAndroid Build Coastguard Worker *(ptr_filt_buf + 1) = (WORD16)(filt_buf_exp + diff);
1042*15dc779aSAndroid Build Coastguard Worker } else {
1043*15dc779aSAndroid Build Coastguard Worker WORD32 shift;
1044*15dc779aSAndroid Build Coastguard Worker
1045*15dc779aSAndroid Build Coastguard Worker *ptr_filt_buf = (WORD16)(filt_buf_mant << reserve);
1046*15dc779aSAndroid Build Coastguard Worker
1047*15dc779aSAndroid Build Coastguard Worker *(ptr_filt_buf + 1) = (WORD16)(filt_buf_exp - reserve);
1048*15dc779aSAndroid Build Coastguard Worker
1049*15dc779aSAndroid Build Coastguard Worker shift = -(reserve + diff);
1050*15dc779aSAndroid Build Coastguard Worker
1051*15dc779aSAndroid Build Coastguard Worker *nrg_gain = (WORD16)(gain_m >> shift);
1052*15dc779aSAndroid Build Coastguard Worker *(nrg_gain + 1) = (WORD16)(*(nrg_gain + 1) + shift);
1053*15dc779aSAndroid Build Coastguard Worker }
1054*15dc779aSAndroid Build Coastguard Worker }
1055*15dc779aSAndroid Build Coastguard Worker nrg_gain += 2;
1056*15dc779aSAndroid Build Coastguard Worker ptr_filt_buf += 2;
1057*15dc779aSAndroid Build Coastguard Worker }
1058*15dc779aSAndroid Build Coastguard Worker }
1059*15dc779aSAndroid Build Coastguard Worker
ixheaacd_filt_buf_update(WORD16 * ptr_filt_buf,WORD16 * ptr_filt_buf_noise,WORD16 * nrg_gain,WORD16 * noise_level_mant,WORD32 num_sub_bands)1060*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_filt_buf_update(WORD16 *ptr_filt_buf,
1061*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_filt_buf_noise,
1062*15dc779aSAndroid Build Coastguard Worker WORD16 *nrg_gain,
1063*15dc779aSAndroid Build Coastguard Worker WORD16 *noise_level_mant,
1064*15dc779aSAndroid Build Coastguard Worker WORD32 num_sub_bands) {
1065*15dc779aSAndroid Build Coastguard Worker WORD32 k;
1066*15dc779aSAndroid Build Coastguard Worker WORD32 temp1, temp2;
1067*15dc779aSAndroid Build Coastguard Worker
1068*15dc779aSAndroid Build Coastguard Worker for (k = num_sub_bands - 1; k >= 0; k--) {
1069*15dc779aSAndroid Build Coastguard Worker temp1 = *nrg_gain;
1070*15dc779aSAndroid Build Coastguard Worker nrg_gain += 2;
1071*15dc779aSAndroid Build Coastguard Worker temp2 = *noise_level_mant;
1072*15dc779aSAndroid Build Coastguard Worker noise_level_mant += 2;
1073*15dc779aSAndroid Build Coastguard Worker
1074*15dc779aSAndroid Build Coastguard Worker *ptr_filt_buf = temp1;
1075*15dc779aSAndroid Build Coastguard Worker ptr_filt_buf += 2;
1076*15dc779aSAndroid Build Coastguard Worker *ptr_filt_buf_noise++ = temp2;
1077*15dc779aSAndroid Build Coastguard Worker }
1078*15dc779aSAndroid Build Coastguard Worker }
1079*15dc779aSAndroid Build Coastguard Worker
ixheaacd_noise_level_rescaling(WORD16 * noise_level_mant,WORD32 diff,WORD32 num_sub_bands,WORD32 ixheaacd_drc_offset)1080*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_noise_level_rescaling(WORD16 *noise_level_mant, WORD32 diff,
1081*15dc779aSAndroid Build Coastguard Worker WORD32 num_sub_bands,
1082*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_drc_offset) {
1083*15dc779aSAndroid Build Coastguard Worker WORD32 k;
1084*15dc779aSAndroid Build Coastguard Worker
1085*15dc779aSAndroid Build Coastguard Worker if (diff > 0) {
1086*15dc779aSAndroid Build Coastguard Worker for (k = num_sub_bands - 1; k >= 0; k--) {
1087*15dc779aSAndroid Build Coastguard Worker *noise_level_mant = *noise_level_mant >> diff;
1088*15dc779aSAndroid Build Coastguard Worker noise_level_mant += ixheaacd_drc_offset;
1089*15dc779aSAndroid Build Coastguard Worker }
1090*15dc779aSAndroid Build Coastguard Worker } else if (diff < 0) {
1091*15dc779aSAndroid Build Coastguard Worker diff = -diff;
1092*15dc779aSAndroid Build Coastguard Worker for (k = num_sub_bands - 1; k >= 0; k--) {
1093*15dc779aSAndroid Build Coastguard Worker *noise_level_mant = *noise_level_mant << diff;
1094*15dc779aSAndroid Build Coastguard Worker noise_level_mant += ixheaacd_drc_offset;
1095*15dc779aSAndroid Build Coastguard Worker }
1096*15dc779aSAndroid Build Coastguard Worker }
1097*15dc779aSAndroid Build Coastguard Worker }
1098*15dc779aSAndroid Build Coastguard Worker
ixheaacd_adjust_scale_dec(WORD32 ** re,WORD32 ** im,WORD32 sub_band_start,WORD32 sub_band_end,WORD32 start_pos,WORD32 next_pos,WORD32 shift,FLAG low_pow_flag)1099*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_adjust_scale_dec(WORD32 **re, WORD32 **im, WORD32 sub_band_start,
1100*15dc779aSAndroid Build Coastguard Worker WORD32 sub_band_end, WORD32 start_pos,
1101*15dc779aSAndroid Build Coastguard Worker WORD32 next_pos, WORD32 shift,
1102*15dc779aSAndroid Build Coastguard Worker FLAG low_pow_flag) {
1103*15dc779aSAndroid Build Coastguard Worker WORD32 k, l;
1104*15dc779aSAndroid Build Coastguard Worker
1105*15dc779aSAndroid Build Coastguard Worker if (shift != 0) {
1106*15dc779aSAndroid Build Coastguard Worker WORD32 num_sub_bands = (sub_band_end - sub_band_start);
1107*15dc779aSAndroid Build Coastguard Worker
1108*15dc779aSAndroid Build Coastguard Worker shift = ixheaac_min32(shift, 31);
1109*15dc779aSAndroid Build Coastguard Worker shift = ixheaac_max32(shift, -31);
1110*15dc779aSAndroid Build Coastguard Worker
1111*15dc779aSAndroid Build Coastguard Worker if (low_pow_flag) {
1112*15dc779aSAndroid Build Coastguard Worker if (shift > 0) {
1113*15dc779aSAndroid Build Coastguard Worker for (l = start_pos; l < next_pos; l++) {
1114*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr = re[l] + sub_band_start;
1115*15dc779aSAndroid Build Coastguard Worker for (k = num_sub_bands - 1; k >= 0; k--) {
1116*15dc779aSAndroid Build Coastguard Worker *ptr = (*ptr << shift);
1117*15dc779aSAndroid Build Coastguard Worker ptr++;
1118*15dc779aSAndroid Build Coastguard Worker }
1119*15dc779aSAndroid Build Coastguard Worker }
1120*15dc779aSAndroid Build Coastguard Worker } else {
1121*15dc779aSAndroid Build Coastguard Worker shift = -shift;
1122*15dc779aSAndroid Build Coastguard Worker for (l = start_pos; l < next_pos; l++) {
1123*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr = re[l] + sub_band_start;
1124*15dc779aSAndroid Build Coastguard Worker for (k = num_sub_bands - 1; k >= 0; k--) {
1125*15dc779aSAndroid Build Coastguard Worker *ptr = (*ptr >> shift);
1126*15dc779aSAndroid Build Coastguard Worker ptr++;
1127*15dc779aSAndroid Build Coastguard Worker }
1128*15dc779aSAndroid Build Coastguard Worker }
1129*15dc779aSAndroid Build Coastguard Worker }
1130*15dc779aSAndroid Build Coastguard Worker } else {
1131*15dc779aSAndroid Build Coastguard Worker if (shift > 0) {
1132*15dc779aSAndroid Build Coastguard Worker for (l = start_pos; l < next_pos; l++) {
1133*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr = re[l] + sub_band_start;
1134*15dc779aSAndroid Build Coastguard Worker WORD32 *pti = im[l] + sub_band_start;
1135*15dc779aSAndroid Build Coastguard Worker for (k = num_sub_bands; k > 0; k--) {
1136*15dc779aSAndroid Build Coastguard Worker *ptr = (*ptr << shift);
1137*15dc779aSAndroid Build Coastguard Worker *pti = (*pti << shift);
1138*15dc779aSAndroid Build Coastguard Worker pti++;
1139*15dc779aSAndroid Build Coastguard Worker ptr++;
1140*15dc779aSAndroid Build Coastguard Worker }
1141*15dc779aSAndroid Build Coastguard Worker }
1142*15dc779aSAndroid Build Coastguard Worker } else {
1143*15dc779aSAndroid Build Coastguard Worker shift = -shift;
1144*15dc779aSAndroid Build Coastguard Worker for (l = start_pos; l < next_pos; l++) {
1145*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr = re[l] + sub_band_start;
1146*15dc779aSAndroid Build Coastguard Worker WORD32 *pti = im[l] + sub_band_start;
1147*15dc779aSAndroid Build Coastguard Worker for (k = num_sub_bands; k > 0; k--) {
1148*15dc779aSAndroid Build Coastguard Worker *ptr = (*ptr >> shift);
1149*15dc779aSAndroid Build Coastguard Worker *pti = (*pti >> shift);
1150*15dc779aSAndroid Build Coastguard Worker ptr++;
1151*15dc779aSAndroid Build Coastguard Worker pti++;
1152*15dc779aSAndroid Build Coastguard Worker }
1153*15dc779aSAndroid Build Coastguard Worker }
1154*15dc779aSAndroid Build Coastguard Worker }
1155*15dc779aSAndroid Build Coastguard Worker }
1156*15dc779aSAndroid Build Coastguard Worker }
1157*15dc779aSAndroid Build Coastguard Worker }
1158*15dc779aSAndroid Build Coastguard Worker
ixheaacd_expsubbandsamples_dec(WORD32 ** re,WORD32 ** im,WORD32 sub_band_start,WORD32 sub_band_end,WORD32 start_pos,WORD32 next_pos,FLAG low_pow_flag)1159*15dc779aSAndroid Build Coastguard Worker WORD16 ixheaacd_expsubbandsamples_dec(WORD32 **re, WORD32 **im,
1160*15dc779aSAndroid Build Coastguard Worker WORD32 sub_band_start,
1161*15dc779aSAndroid Build Coastguard Worker WORD32 sub_band_end, WORD32 start_pos,
1162*15dc779aSAndroid Build Coastguard Worker WORD32 next_pos, FLAG low_pow_flag) {
1163*15dc779aSAndroid Build Coastguard Worker WORD32 l, k;
1164*15dc779aSAndroid Build Coastguard Worker WORD16 max_shift;
1165*15dc779aSAndroid Build Coastguard Worker
1166*15dc779aSAndroid Build Coastguard Worker WORD32 value;
1167*15dc779aSAndroid Build Coastguard Worker WORD32 max_abs;
1168*15dc779aSAndroid Build Coastguard Worker WORD32 num_sub_bands;
1169*15dc779aSAndroid Build Coastguard Worker
1170*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr_real;
1171*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr_imag;
1172*15dc779aSAndroid Build Coastguard Worker
1173*15dc779aSAndroid Build Coastguard Worker max_abs = 1;
1174*15dc779aSAndroid Build Coastguard Worker num_sub_bands = (sub_band_end - sub_band_start);
1175*15dc779aSAndroid Build Coastguard Worker
1176*15dc779aSAndroid Build Coastguard Worker if (low_pow_flag) {
1177*15dc779aSAndroid Build Coastguard Worker for (l = start_pos; l < next_pos; l++) {
1178*15dc779aSAndroid Build Coastguard Worker WORD32 temp_real;
1179*15dc779aSAndroid Build Coastguard Worker ptr_real = re[l] + sub_band_start;
1180*15dc779aSAndroid Build Coastguard Worker temp_real = *ptr_real++;
1181*15dc779aSAndroid Build Coastguard Worker for (k = num_sub_bands; k > 0; k--) {
1182*15dc779aSAndroid Build Coastguard Worker value = ixheaac_abs32_nrm(temp_real);
1183*15dc779aSAndroid Build Coastguard Worker max_abs |= value;
1184*15dc779aSAndroid Build Coastguard Worker temp_real = *ptr_real++;
1185*15dc779aSAndroid Build Coastguard Worker }
1186*15dc779aSAndroid Build Coastguard Worker }
1187*15dc779aSAndroid Build Coastguard Worker max_shift = ixheaac_pnorm32(max_abs);
1188*15dc779aSAndroid Build Coastguard Worker } else {
1189*15dc779aSAndroid Build Coastguard Worker for (l = start_pos; l < next_pos; l++) {
1190*15dc779aSAndroid Build Coastguard Worker ptr_real = re[l] + sub_band_start;
1191*15dc779aSAndroid Build Coastguard Worker ptr_imag = im[l] + sub_band_start;
1192*15dc779aSAndroid Build Coastguard Worker
1193*15dc779aSAndroid Build Coastguard Worker for (k = num_sub_bands; k > 0; k--) {
1194*15dc779aSAndroid Build Coastguard Worker WORD32 temp_real = *ptr_real++;
1195*15dc779aSAndroid Build Coastguard Worker WORD32 tempIm = *ptr_imag++;
1196*15dc779aSAndroid Build Coastguard Worker
1197*15dc779aSAndroid Build Coastguard Worker temp_real = ixheaac_abs32_nrm(temp_real);
1198*15dc779aSAndroid Build Coastguard Worker max_abs |= temp_real;
1199*15dc779aSAndroid Build Coastguard Worker tempIm = ixheaac_abs32_nrm(tempIm);
1200*15dc779aSAndroid Build Coastguard Worker max_abs |= tempIm;
1201*15dc779aSAndroid Build Coastguard Worker }
1202*15dc779aSAndroid Build Coastguard Worker }
1203*15dc779aSAndroid Build Coastguard Worker max_shift = ixheaac_pnorm32(max_abs);
1204*15dc779aSAndroid Build Coastguard Worker }
1205*15dc779aSAndroid Build Coastguard Worker
1206*15dc779aSAndroid Build Coastguard Worker return max_shift;
1207*15dc779aSAndroid Build Coastguard Worker }
1208*15dc779aSAndroid Build Coastguard Worker
1209*15dc779aSAndroid Build Coastguard Worker #define SHIFT_BEFORE_SQUARE 4
1210*15dc779aSAndroid Build Coastguard Worker
ixheaacd_enery_calc_per_subband_dec(WORD32 start_pos,WORD32 next_pos,WORD32 sub_band_start,WORD32 sub_band_end,WORD32 frame_exp,WORD16 * nrg_est,FLAG low_pow_flag,ia_sbr_tables_struct * ptr_sbr_tables,WORD32 * ptr_qmf_matrix)1211*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_enery_calc_per_subband_dec(WORD32 start_pos, WORD32 next_pos,
1212*15dc779aSAndroid Build Coastguard Worker WORD32 sub_band_start,
1213*15dc779aSAndroid Build Coastguard Worker WORD32 sub_band_end, WORD32 frame_exp,
1214*15dc779aSAndroid Build Coastguard Worker WORD16 *nrg_est, FLAG low_pow_flag,
1215*15dc779aSAndroid Build Coastguard Worker ia_sbr_tables_struct *ptr_sbr_tables,
1216*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr_qmf_matrix) {
1217*15dc779aSAndroid Build Coastguard Worker WORD16 temp;
1218*15dc779aSAndroid Build Coastguard Worker WORD16 inv_width;
1219*15dc779aSAndroid Build Coastguard Worker WORD16 sum_m;
1220*15dc779aSAndroid Build Coastguard Worker WORD32 accu;
1221*15dc779aSAndroid Build Coastguard Worker WORD32 k, l;
1222*15dc779aSAndroid Build Coastguard Worker WORD32 pre_shift_val;
1223*15dc779aSAndroid Build Coastguard Worker WORD32 shift;
1224*15dc779aSAndroid Build Coastguard Worker WORD32 *p_real;
1225*15dc779aSAndroid Build Coastguard Worker WORD32 max_shift_gap = SHIFT_BEFORE_SQUARE;
1226*15dc779aSAndroid Build Coastguard Worker WORD32 extra_shift = 0;
1227*15dc779aSAndroid Build Coastguard Worker WORD32 num_cols = next_pos - start_pos;
1228*15dc779aSAndroid Build Coastguard Worker
1229*15dc779aSAndroid Build Coastguard Worker if (low_pow_flag) {
1230*15dc779aSAndroid Build Coastguard Worker max_shift_gap -= 1;
1231*15dc779aSAndroid Build Coastguard Worker p_real = ptr_qmf_matrix + sub_band_start + (start_pos << 6);
1232*15dc779aSAndroid Build Coastguard Worker extra_shift++;
1233*15dc779aSAndroid Build Coastguard Worker } else {
1234*15dc779aSAndroid Build Coastguard Worker p_real = ptr_qmf_matrix + sub_band_start + (start_pos << 7);
1235*15dc779aSAndroid Build Coastguard Worker num_cols = num_cols << 1;
1236*15dc779aSAndroid Build Coastguard Worker }
1237*15dc779aSAndroid Build Coastguard Worker inv_width = ptr_sbr_tables->env_calc_tables_ptr
1238*15dc779aSAndroid Build Coastguard Worker ->sbr_inv_int_table[(next_pos - start_pos)];
1239*15dc779aSAndroid Build Coastguard Worker frame_exp = (frame_exp << 1);
1240*15dc779aSAndroid Build Coastguard Worker
1241*15dc779aSAndroid Build Coastguard Worker {
1242*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr;
1243*15dc779aSAndroid Build Coastguard Worker for (k = sub_band_start; k < sub_band_end; k++) {
1244*15dc779aSAndroid Build Coastguard Worker WORD32 max_val = 1;
1245*15dc779aSAndroid Build Coastguard Worker
1246*15dc779aSAndroid Build Coastguard Worker ptr = p_real;
1247*15dc779aSAndroid Build Coastguard Worker
1248*15dc779aSAndroid Build Coastguard Worker for (l = num_cols; l != 0; l -= 2) {
1249*15dc779aSAndroid Build Coastguard Worker WORD32 value = ixheaac_abs32_nrm(*ptr);
1250*15dc779aSAndroid Build Coastguard Worker ptr += 64;
1251*15dc779aSAndroid Build Coastguard Worker max_val = ixheaac_max32(value, max_val);
1252*15dc779aSAndroid Build Coastguard Worker value = ixheaac_abs32_nrm(*ptr);
1253*15dc779aSAndroid Build Coastguard Worker ptr += 64;
1254*15dc779aSAndroid Build Coastguard Worker max_val = ixheaac_max32(value, max_val);
1255*15dc779aSAndroid Build Coastguard Worker }
1256*15dc779aSAndroid Build Coastguard Worker pre_shift_val = (ixheaac_pnorm32(max_val) - max_shift_gap);
1257*15dc779aSAndroid Build Coastguard Worker
1258*15dc779aSAndroid Build Coastguard Worker accu = 0L;
1259*15dc779aSAndroid Build Coastguard Worker shift = 16 - pre_shift_val;
1260*15dc779aSAndroid Build Coastguard Worker ptr = p_real;
1261*15dc779aSAndroid Build Coastguard Worker
1262*15dc779aSAndroid Build Coastguard Worker if (shift > 0)
1263*15dc779aSAndroid Build Coastguard Worker for (l = num_cols; l != 0; l -= 2) {
1264*15dc779aSAndroid Build Coastguard Worker temp = (WORD16)((*(ptr) >> shift));
1265*15dc779aSAndroid Build Coastguard Worker ptr += 64;
1266*15dc779aSAndroid Build Coastguard Worker accu += (temp * temp);
1267*15dc779aSAndroid Build Coastguard Worker temp = (WORD16)((*(ptr) >> shift));
1268*15dc779aSAndroid Build Coastguard Worker ptr += 64;
1269*15dc779aSAndroid Build Coastguard Worker accu += (temp * temp);
1270*15dc779aSAndroid Build Coastguard Worker }
1271*15dc779aSAndroid Build Coastguard Worker else
1272*15dc779aSAndroid Build Coastguard Worker for (l = num_cols; l != 0; l -= 2) {
1273*15dc779aSAndroid Build Coastguard Worker temp = (WORD16)((*(ptr) << (-shift)));
1274*15dc779aSAndroid Build Coastguard Worker ptr += 64;
1275*15dc779aSAndroid Build Coastguard Worker accu += (temp * temp);
1276*15dc779aSAndroid Build Coastguard Worker temp = (WORD16)((*(ptr) << (-shift)));
1277*15dc779aSAndroid Build Coastguard Worker ptr += 64;
1278*15dc779aSAndroid Build Coastguard Worker accu += (temp * temp);
1279*15dc779aSAndroid Build Coastguard Worker }
1280*15dc779aSAndroid Build Coastguard Worker
1281*15dc779aSAndroid Build Coastguard Worker if (accu != 0L) {
1282*15dc779aSAndroid Build Coastguard Worker shift = -(ixheaac_pnorm32(accu));
1283*15dc779aSAndroid Build Coastguard Worker sum_m = (WORD16)(ixheaac_shr32_dir_sat_limit(accu, (16 + shift)));
1284*15dc779aSAndroid Build Coastguard Worker *nrg_est++ = ixheaac_mult16_shl_sat(sum_m, inv_width);
1285*15dc779aSAndroid Build Coastguard Worker shift = (shift - (pre_shift_val << 1));
1286*15dc779aSAndroid Build Coastguard Worker shift += extra_shift;
1287*15dc779aSAndroid Build Coastguard Worker *nrg_est++ = (WORD16)(frame_exp + shift + 1);
1288*15dc779aSAndroid Build Coastguard Worker } else {
1289*15dc779aSAndroid Build Coastguard Worker *nrg_est++ = 0;
1290*15dc779aSAndroid Build Coastguard Worker *nrg_est++ = 0;
1291*15dc779aSAndroid Build Coastguard Worker }
1292*15dc779aSAndroid Build Coastguard Worker
1293*15dc779aSAndroid Build Coastguard Worker p_real++;
1294*15dc779aSAndroid Build Coastguard Worker }
1295*15dc779aSAndroid Build Coastguard Worker }
1296*15dc779aSAndroid Build Coastguard Worker }
1297*15dc779aSAndroid Build Coastguard Worker
ixheaacd_enery_calc_persfb(WORD32 ** anal_buf_real,WORD32 ** anal_buf_imag,WORD32 num_sf_bands,WORD16 * freq_band_table,WORD32 start_pos,WORD32 next_pos,WORD32 max_qmf_subband_aac,WORD32 frame_exp,WORD16 * nrg_est,FLAG low_pow_flag,ia_sbr_tables_struct * ptr_sbr_tables)1298*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_enery_calc_persfb(WORD32 **anal_buf_real, WORD32 **anal_buf_imag,
1299*15dc779aSAndroid Build Coastguard Worker WORD32 num_sf_bands, WORD16 *freq_band_table,
1300*15dc779aSAndroid Build Coastguard Worker WORD32 start_pos, WORD32 next_pos,
1301*15dc779aSAndroid Build Coastguard Worker WORD32 max_qmf_subband_aac, WORD32 frame_exp,
1302*15dc779aSAndroid Build Coastguard Worker WORD16 *nrg_est, FLAG low_pow_flag,
1303*15dc779aSAndroid Build Coastguard Worker ia_sbr_tables_struct *ptr_sbr_tables) {
1304*15dc779aSAndroid Build Coastguard Worker WORD16 inv_width;
1305*15dc779aSAndroid Build Coastguard Worker WORD32 pre_shift_val;
1306*15dc779aSAndroid Build Coastguard Worker WORD32 shift;
1307*15dc779aSAndroid Build Coastguard Worker WORD32 sum_e;
1308*15dc779aSAndroid Build Coastguard Worker WORD16 sum_m;
1309*15dc779aSAndroid Build Coastguard Worker
1310*15dc779aSAndroid Build Coastguard Worker WORD32 j, k, l;
1311*15dc779aSAndroid Build Coastguard Worker WORD32 li, ui;
1312*15dc779aSAndroid Build Coastguard Worker WORD32 accu_line;
1313*15dc779aSAndroid Build Coastguard Worker WORD32 accumulate;
1314*15dc779aSAndroid Build Coastguard Worker WORD32 extra_shift = 10;
1315*15dc779aSAndroid Build Coastguard Worker
1316*15dc779aSAndroid Build Coastguard Worker inv_width = ptr_sbr_tables->env_calc_tables_ptr
1317*15dc779aSAndroid Build Coastguard Worker ->sbr_inv_int_table[(next_pos - start_pos)];
1318*15dc779aSAndroid Build Coastguard Worker
1319*15dc779aSAndroid Build Coastguard Worker frame_exp = (frame_exp << 1);
1320*15dc779aSAndroid Build Coastguard Worker
1321*15dc779aSAndroid Build Coastguard Worker if (low_pow_flag) extra_shift++;
1322*15dc779aSAndroid Build Coastguard Worker
1323*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < num_sf_bands; j++) {
1324*15dc779aSAndroid Build Coastguard Worker li = freq_band_table[j];
1325*15dc779aSAndroid Build Coastguard Worker
1326*15dc779aSAndroid Build Coastguard Worker if ((li >= max_qmf_subband_aac)) {
1327*15dc779aSAndroid Build Coastguard Worker ui = freq_band_table[j + 1];
1328*15dc779aSAndroid Build Coastguard Worker
1329*15dc779aSAndroid Build Coastguard Worker pre_shift_val = (*ixheaacd_ixheaacd_expsubbandsamples)(
1330*15dc779aSAndroid Build Coastguard Worker anal_buf_real, anal_buf_imag, li, ui, start_pos, next_pos,
1331*15dc779aSAndroid Build Coastguard Worker low_pow_flag);
1332*15dc779aSAndroid Build Coastguard Worker
1333*15dc779aSAndroid Build Coastguard Worker pre_shift_val = (pre_shift_val - SHIFT_BEFORE_SQUARE);
1334*15dc779aSAndroid Build Coastguard Worker
1335*15dc779aSAndroid Build Coastguard Worker accumulate = 0;
1336*15dc779aSAndroid Build Coastguard Worker
1337*15dc779aSAndroid Build Coastguard Worker for (k = li; k < ui; k++) {
1338*15dc779aSAndroid Build Coastguard Worker WORD32 pre_shift1 = (16 - pre_shift_val);
1339*15dc779aSAndroid Build Coastguard Worker accu_line = 0L;
1340*15dc779aSAndroid Build Coastguard Worker pre_shift1 = min(pre_shift1, 31);
1341*15dc779aSAndroid Build Coastguard Worker {
1342*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr = &anal_buf_real[start_pos][k];
1343*15dc779aSAndroid Build Coastguard Worker WORD32 inc = !low_pow_flag;
1344*15dc779aSAndroid Build Coastguard Worker for (l = (next_pos - start_pos) << inc; l != 0; l--) {
1345*15dc779aSAndroid Build Coastguard Worker WORD16 temp;
1346*15dc779aSAndroid Build Coastguard Worker temp = ixheaac_extract16l(ixheaac_shr32_dir(*ptr, pre_shift1));
1347*15dc779aSAndroid Build Coastguard Worker ptr += 64;
1348*15dc779aSAndroid Build Coastguard Worker accu_line = ixheaac_mac16x16in32_sat(accu_line, temp, temp);
1349*15dc779aSAndroid Build Coastguard Worker }
1350*15dc779aSAndroid Build Coastguard Worker }
1351*15dc779aSAndroid Build Coastguard Worker accumulate =
1352*15dc779aSAndroid Build Coastguard Worker ixheaac_add32_sat(accumulate, ixheaac_shr32(accu_line, 9));
1353*15dc779aSAndroid Build Coastguard Worker }
1354*15dc779aSAndroid Build Coastguard Worker
1355*15dc779aSAndroid Build Coastguard Worker shift = ixheaac_pnorm32(accumulate);
1356*15dc779aSAndroid Build Coastguard Worker
1357*15dc779aSAndroid Build Coastguard Worker sum_m = ixheaac_extract16l(
1358*15dc779aSAndroid Build Coastguard Worker ixheaac_shr32_dir_sat_limit(accumulate, (16 - shift)));
1359*15dc779aSAndroid Build Coastguard Worker
1360*15dc779aSAndroid Build Coastguard Worker if (sum_m == 0) {
1361*15dc779aSAndroid Build Coastguard Worker sum_e = 0;
1362*15dc779aSAndroid Build Coastguard Worker } else {
1363*15dc779aSAndroid Build Coastguard Worker sum_m = ixheaac_mult16_shl_sat(sum_m, inv_width);
1364*15dc779aSAndroid Build Coastguard Worker
1365*15dc779aSAndroid Build Coastguard Worker sum_m = ixheaac_mult16_shl_sat(
1366*15dc779aSAndroid Build Coastguard Worker sum_m,
1367*15dc779aSAndroid Build Coastguard Worker ptr_sbr_tables->env_calc_tables_ptr->sbr_inv_int_table[ui - li]);
1368*15dc779aSAndroid Build Coastguard Worker
1369*15dc779aSAndroid Build Coastguard Worker sum_e = ((frame_exp + extra_shift) - shift);
1370*15dc779aSAndroid Build Coastguard Worker
1371*15dc779aSAndroid Build Coastguard Worker sum_e = (sum_e - (pre_shift_val << 1));
1372*15dc779aSAndroid Build Coastguard Worker }
1373*15dc779aSAndroid Build Coastguard Worker
1374*15dc779aSAndroid Build Coastguard Worker for (k = li; k < ui; k++) {
1375*15dc779aSAndroid Build Coastguard Worker *nrg_est++ = sum_m;
1376*15dc779aSAndroid Build Coastguard Worker *nrg_est++ = (WORD16)sum_e;
1377*15dc779aSAndroid Build Coastguard Worker }
1378*15dc779aSAndroid Build Coastguard Worker }
1379*15dc779aSAndroid Build Coastguard Worker }
1380*15dc779aSAndroid Build Coastguard Worker }
1381*15dc779aSAndroid Build Coastguard Worker
ixheaacd_subbandgain_calc(WORD16 e_orig_mant_matrix,WORD16 tmp_noise_mant,WORD16 nrg_est_mant,WORD16 nrg_est_exp,WORD16 tmp_noise_exp,WORD16 nrg_ref_exp,FLAG sine_present_flag,FLAG sine_mapped_matrix,FLAG noise_absc_flag,WORD16 * ptr_nrg_gain_mant,WORD16 * ptr_noise_floor_mant,WORD16 * ptr_nrg_sine_m,ixheaacd_misc_tables * pstr_common_tables)1382*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_subbandgain_calc(WORD16 e_orig_mant_matrix, WORD16 tmp_noise_mant,
1383*15dc779aSAndroid Build Coastguard Worker WORD16 nrg_est_mant, WORD16 nrg_est_exp,
1384*15dc779aSAndroid Build Coastguard Worker WORD16 tmp_noise_exp, WORD16 nrg_ref_exp,
1385*15dc779aSAndroid Build Coastguard Worker FLAG sine_present_flag, FLAG sine_mapped_matrix,
1386*15dc779aSAndroid Build Coastguard Worker FLAG noise_absc_flag, WORD16 *ptr_nrg_gain_mant,
1387*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_noise_floor_mant,
1388*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_nrg_sine_m,
1389*15dc779aSAndroid Build Coastguard Worker ixheaacd_misc_tables *pstr_common_tables) {
1390*15dc779aSAndroid Build Coastguard Worker WORD16 var1_mant;
1391*15dc779aSAndroid Build Coastguard Worker WORD16 var1_exp;
1392*15dc779aSAndroid Build Coastguard Worker WORD16 var2_mant;
1393*15dc779aSAndroid Build Coastguard Worker WORD16 var2_exp;
1394*15dc779aSAndroid Build Coastguard Worker WORD16 var3_mant;
1395*15dc779aSAndroid Build Coastguard Worker WORD16 var3_exp;
1396*15dc779aSAndroid Build Coastguard Worker WORD32 temp;
1397*15dc779aSAndroid Build Coastguard Worker
1398*15dc779aSAndroid Build Coastguard Worker if (nrg_est_mant == 0) {
1399*15dc779aSAndroid Build Coastguard Worker nrg_est_mant = 0x4000;
1400*15dc779aSAndroid Build Coastguard Worker nrg_est_exp = 1;
1401*15dc779aSAndroid Build Coastguard Worker }
1402*15dc779aSAndroid Build Coastguard Worker
1403*15dc779aSAndroid Build Coastguard Worker var1_mant = ixheaac_mult16_shl_sat(e_orig_mant_matrix, tmp_noise_mant);
1404*15dc779aSAndroid Build Coastguard Worker var1_exp = (nrg_ref_exp + tmp_noise_exp);
1405*15dc779aSAndroid Build Coastguard Worker
1406*15dc779aSAndroid Build Coastguard Worker {
1407*15dc779aSAndroid Build Coastguard Worker WORD32 accu, exp_diff;
1408*15dc779aSAndroid Build Coastguard Worker
1409*15dc779aSAndroid Build Coastguard Worker exp_diff = tmp_noise_exp - 1;
1410*15dc779aSAndroid Build Coastguard Worker
1411*15dc779aSAndroid Build Coastguard Worker if (exp_diff >= 0) {
1412*15dc779aSAndroid Build Coastguard Worker accu = tmp_noise_mant + ixheaac_shr32(0x4000, exp_diff);
1413*15dc779aSAndroid Build Coastguard Worker var2_exp = tmp_noise_exp;
1414*15dc779aSAndroid Build Coastguard Worker } else {
1415*15dc779aSAndroid Build Coastguard Worker exp_diff = -exp_diff;
1416*15dc779aSAndroid Build Coastguard Worker accu = ixheaac_shr32((WORD32)tmp_noise_mant, exp_diff) + 0x4000;
1417*15dc779aSAndroid Build Coastguard Worker var2_exp = 1;
1418*15dc779aSAndroid Build Coastguard Worker }
1419*15dc779aSAndroid Build Coastguard Worker if (ixheaac_abs32(accu) >= 0x8000) {
1420*15dc779aSAndroid Build Coastguard Worker accu = accu >> 1;
1421*15dc779aSAndroid Build Coastguard Worker var2_exp++;
1422*15dc779aSAndroid Build Coastguard Worker }
1423*15dc779aSAndroid Build Coastguard Worker var2_mant = (WORD16)(accu);
1424*15dc779aSAndroid Build Coastguard Worker }
1425*15dc779aSAndroid Build Coastguard Worker
1426*15dc779aSAndroid Build Coastguard Worker temp = ixheaacd_fix_mant_div(var1_mant, var2_mant, ptr_noise_floor_mant,
1427*15dc779aSAndroid Build Coastguard Worker pstr_common_tables);
1428*15dc779aSAndroid Build Coastguard Worker *(ptr_noise_floor_mant + 1) = temp + (var1_exp - var2_exp) + 1;
1429*15dc779aSAndroid Build Coastguard Worker
1430*15dc779aSAndroid Build Coastguard Worker if (sine_present_flag || !noise_absc_flag) {
1431*15dc779aSAndroid Build Coastguard Worker var3_mant = ixheaac_mult16_shl_sat(var2_mant, nrg_est_mant);
1432*15dc779aSAndroid Build Coastguard Worker var3_exp = (var2_exp + nrg_est_exp);
1433*15dc779aSAndroid Build Coastguard Worker } else {
1434*15dc779aSAndroid Build Coastguard Worker var3_mant = nrg_est_mant;
1435*15dc779aSAndroid Build Coastguard Worker var3_exp = nrg_est_exp;
1436*15dc779aSAndroid Build Coastguard Worker }
1437*15dc779aSAndroid Build Coastguard Worker
1438*15dc779aSAndroid Build Coastguard Worker if (sine_present_flag == 0) {
1439*15dc779aSAndroid Build Coastguard Worker var1_mant = e_orig_mant_matrix;
1440*15dc779aSAndroid Build Coastguard Worker var1_exp = nrg_ref_exp;
1441*15dc779aSAndroid Build Coastguard Worker }
1442*15dc779aSAndroid Build Coastguard Worker
1443*15dc779aSAndroid Build Coastguard Worker temp = ixheaacd_fix_mant_div(var1_mant, var3_mant, ptr_nrg_gain_mant,
1444*15dc779aSAndroid Build Coastguard Worker pstr_common_tables);
1445*15dc779aSAndroid Build Coastguard Worker *(ptr_nrg_gain_mant + 1) = temp + (var1_exp - var3_exp) + 1;
1446*15dc779aSAndroid Build Coastguard Worker
1447*15dc779aSAndroid Build Coastguard Worker if (sine_present_flag && sine_mapped_matrix) {
1448*15dc779aSAndroid Build Coastguard Worker temp = ixheaacd_fix_mant_div(e_orig_mant_matrix, var2_mant, ptr_nrg_sine_m,
1449*15dc779aSAndroid Build Coastguard Worker pstr_common_tables);
1450*15dc779aSAndroid Build Coastguard Worker *(ptr_nrg_sine_m + 1) = temp + (nrg_ref_exp - var2_exp) + 1;
1451*15dc779aSAndroid Build Coastguard Worker }
1452*15dc779aSAndroid Build Coastguard Worker }
1453*15dc779aSAndroid Build Coastguard Worker
ixheaacd_avggain_calc(WORD16 * ptr_enrg_orig,WORD16 * nrg_est,WORD32 sub_band_start,WORD32 sub_band_end,WORD16 * ptr_enrg_orig_mant,WORD16 * ptr_sum_ref_exp,WORD16 * ptr_avg_gain_mant,WORD16 * ptr_avg_gain_exp,ixheaacd_misc_tables * pstr_common_tables,WORD32 flag)1454*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_avggain_calc(WORD16 *ptr_enrg_orig, WORD16 *nrg_est,
1455*15dc779aSAndroid Build Coastguard Worker WORD32 sub_band_start, WORD32 sub_band_end,
1456*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_enrg_orig_mant, WORD16 *ptr_sum_ref_exp,
1457*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_avg_gain_mant, WORD16 *ptr_avg_gain_exp,
1458*15dc779aSAndroid Build Coastguard Worker ixheaacd_misc_tables *pstr_common_tables,
1459*15dc779aSAndroid Build Coastguard Worker WORD32 flag) {
1460*15dc779aSAndroid Build Coastguard Worker WORD16 sum_orig_mant;
1461*15dc779aSAndroid Build Coastguard Worker WORD16 sum_orig_exp;
1462*15dc779aSAndroid Build Coastguard Worker WORD16 sum_est_mant;
1463*15dc779aSAndroid Build Coastguard Worker WORD16 sum_est_exp;
1464*15dc779aSAndroid Build Coastguard Worker
1465*15dc779aSAndroid Build Coastguard Worker WORD32 accu_sum_orig_mant;
1466*15dc779aSAndroid Build Coastguard Worker WORD32 accu_sum_orig_exp;
1467*15dc779aSAndroid Build Coastguard Worker WORD32 accu_sum_est_mant;
1468*15dc779aSAndroid Build Coastguard Worker WORD32 accu_sum_est_exp;
1469*15dc779aSAndroid Build Coastguard Worker
1470*15dc779aSAndroid Build Coastguard Worker WORD32 k, temp;
1471*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_enrg_orig_buf;
1472*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_enrg_est_buf;
1473*15dc779aSAndroid Build Coastguard Worker
1474*15dc779aSAndroid Build Coastguard Worker {
1475*15dc779aSAndroid Build Coastguard Worker accu_sum_orig_mant = 0;
1476*15dc779aSAndroid Build Coastguard Worker accu_sum_orig_exp = 0;
1477*15dc779aSAndroid Build Coastguard Worker
1478*15dc779aSAndroid Build Coastguard Worker accu_sum_est_mant = 0;
1479*15dc779aSAndroid Build Coastguard Worker accu_sum_est_exp = 0;
1480*15dc779aSAndroid Build Coastguard Worker }
1481*15dc779aSAndroid Build Coastguard Worker
1482*15dc779aSAndroid Build Coastguard Worker ptr_enrg_orig_buf = &ptr_enrg_orig[sub_band_start << 1];
1483*15dc779aSAndroid Build Coastguard Worker ptr_enrg_est_buf = &nrg_est[sub_band_start << 1];
1484*15dc779aSAndroid Build Coastguard Worker
1485*15dc779aSAndroid Build Coastguard Worker for (k = sub_band_end - sub_band_start; k != 0; k--) {
1486*15dc779aSAndroid Build Coastguard Worker WORD16 tmp_mant, tmp_e;
1487*15dc779aSAndroid Build Coastguard Worker WORD16 tmp2_m, tmp2_e;
1488*15dc779aSAndroid Build Coastguard Worker
1489*15dc779aSAndroid Build Coastguard Worker tmp_mant = *ptr_enrg_orig_buf++;
1490*15dc779aSAndroid Build Coastguard Worker tmp_e = *ptr_enrg_orig_buf++;
1491*15dc779aSAndroid Build Coastguard Worker tmp2_m = *ptr_enrg_est_buf++;
1492*15dc779aSAndroid Build Coastguard Worker tmp2_e = *ptr_enrg_est_buf++;
1493*15dc779aSAndroid Build Coastguard Worker {
1494*15dc779aSAndroid Build Coastguard Worker WORD32 exp_diff;
1495*15dc779aSAndroid Build Coastguard Worker exp_diff = tmp_e - accu_sum_orig_exp;
1496*15dc779aSAndroid Build Coastguard Worker if (exp_diff >= 0) {
1497*15dc779aSAndroid Build Coastguard Worker accu_sum_orig_mant =
1498*15dc779aSAndroid Build Coastguard Worker tmp_mant + ixheaac_shr32(accu_sum_orig_mant, exp_diff);
1499*15dc779aSAndroid Build Coastguard Worker accu_sum_orig_exp = tmp_e;
1500*15dc779aSAndroid Build Coastguard Worker } else {
1501*15dc779aSAndroid Build Coastguard Worker exp_diff = -exp_diff;
1502*15dc779aSAndroid Build Coastguard Worker accu_sum_orig_mant =
1503*15dc779aSAndroid Build Coastguard Worker ixheaac_shr32(tmp_mant, exp_diff) + accu_sum_orig_mant;
1504*15dc779aSAndroid Build Coastguard Worker }
1505*15dc779aSAndroid Build Coastguard Worker }
1506*15dc779aSAndroid Build Coastguard Worker if (flag) {
1507*15dc779aSAndroid Build Coastguard Worker tmp_mant = (tmp_mant * tmp2_m) >> 16;
1508*15dc779aSAndroid Build Coastguard Worker tmp_e = (tmp_e + tmp2_e + 1);
1509*15dc779aSAndroid Build Coastguard Worker
1510*15dc779aSAndroid Build Coastguard Worker } else {
1511*15dc779aSAndroid Build Coastguard Worker tmp_mant = tmp2_m;
1512*15dc779aSAndroid Build Coastguard Worker tmp_e = tmp2_e;
1513*15dc779aSAndroid Build Coastguard Worker }
1514*15dc779aSAndroid Build Coastguard Worker
1515*15dc779aSAndroid Build Coastguard Worker {
1516*15dc779aSAndroid Build Coastguard Worker WORD32 exp_diff;
1517*15dc779aSAndroid Build Coastguard Worker exp_diff = tmp_e - accu_sum_est_exp;
1518*15dc779aSAndroid Build Coastguard Worker if (exp_diff >= 0) {
1519*15dc779aSAndroid Build Coastguard Worker accu_sum_est_mant =
1520*15dc779aSAndroid Build Coastguard Worker tmp_mant + ixheaac_shr32(accu_sum_est_mant, exp_diff);
1521*15dc779aSAndroid Build Coastguard Worker accu_sum_est_exp = tmp_e;
1522*15dc779aSAndroid Build Coastguard Worker } else {
1523*15dc779aSAndroid Build Coastguard Worker exp_diff = -exp_diff;
1524*15dc779aSAndroid Build Coastguard Worker accu_sum_est_mant =
1525*15dc779aSAndroid Build Coastguard Worker ixheaac_shr32(tmp_mant, exp_diff) + accu_sum_est_mant;
1526*15dc779aSAndroid Build Coastguard Worker }
1527*15dc779aSAndroid Build Coastguard Worker }
1528*15dc779aSAndroid Build Coastguard Worker }
1529*15dc779aSAndroid Build Coastguard Worker {
1530*15dc779aSAndroid Build Coastguard Worker WORD32 norm_val;
1531*15dc779aSAndroid Build Coastguard Worker norm_val = 16 - ixheaac_pnorm32(accu_sum_orig_mant);
1532*15dc779aSAndroid Build Coastguard Worker if (norm_val > 0) {
1533*15dc779aSAndroid Build Coastguard Worker accu_sum_orig_mant >>= norm_val;
1534*15dc779aSAndroid Build Coastguard Worker accu_sum_orig_exp += norm_val;
1535*15dc779aSAndroid Build Coastguard Worker }
1536*15dc779aSAndroid Build Coastguard Worker norm_val = 16 - ixheaac_pnorm32(accu_sum_est_mant);
1537*15dc779aSAndroid Build Coastguard Worker if (norm_val > 0) {
1538*15dc779aSAndroid Build Coastguard Worker accu_sum_est_mant >>= norm_val;
1539*15dc779aSAndroid Build Coastguard Worker accu_sum_est_exp += norm_val;
1540*15dc779aSAndroid Build Coastguard Worker }
1541*15dc779aSAndroid Build Coastguard Worker }
1542*15dc779aSAndroid Build Coastguard Worker
1543*15dc779aSAndroid Build Coastguard Worker if (!flag) {
1544*15dc779aSAndroid Build Coastguard Worker sum_orig_mant = (WORD16)accu_sum_orig_mant;
1545*15dc779aSAndroid Build Coastguard Worker sum_orig_exp = (WORD16)accu_sum_orig_exp;
1546*15dc779aSAndroid Build Coastguard Worker sum_est_mant = (WORD16)accu_sum_est_mant;
1547*15dc779aSAndroid Build Coastguard Worker sum_est_exp = (WORD16)accu_sum_est_exp;
1548*15dc779aSAndroid Build Coastguard Worker } else {
1549*15dc779aSAndroid Build Coastguard Worker sum_est_mant = (WORD16)accu_sum_orig_mant;
1550*15dc779aSAndroid Build Coastguard Worker sum_est_exp = (WORD16)accu_sum_orig_exp;
1551*15dc779aSAndroid Build Coastguard Worker sum_orig_mant = (WORD16)accu_sum_est_mant;
1552*15dc779aSAndroid Build Coastguard Worker sum_orig_exp = (WORD16)accu_sum_est_exp;
1553*15dc779aSAndroid Build Coastguard Worker }
1554*15dc779aSAndroid Build Coastguard Worker
1555*15dc779aSAndroid Build Coastguard Worker {
1556*15dc779aSAndroid Build Coastguard Worker temp = ixheaacd_fix_mant_div(sum_orig_mant, sum_est_mant, ptr_avg_gain_mant,
1557*15dc779aSAndroid Build Coastguard Worker pstr_common_tables);
1558*15dc779aSAndroid Build Coastguard Worker *ptr_avg_gain_exp = temp + (sum_orig_exp - sum_est_exp) + 1;
1559*15dc779aSAndroid Build Coastguard Worker *ptr_enrg_orig_mant = sum_orig_mant;
1560*15dc779aSAndroid Build Coastguard Worker *ptr_sum_ref_exp = sum_orig_exp;
1561*15dc779aSAndroid Build Coastguard Worker }
1562*15dc779aSAndroid Build Coastguard Worker }
1563*15dc779aSAndroid Build Coastguard Worker
ixheaacd_harm_idx_zerotwolp_dec(WORD32 * ptr_real_buf,WORD16 * ptr_gain_buf,WORD32 scale_change,WORD16 * ptr_sine_level_buf,const WORD32 * ptr_rand_ph,WORD16 * noise_level_mant,WORD32 num_sub_bands,FLAG noise_absc_flag,WORD32 harm_index)1564*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_harm_idx_zerotwolp_dec(WORD32 *ptr_real_buf, WORD16 *ptr_gain_buf,
1565*15dc779aSAndroid Build Coastguard Worker WORD32 scale_change,
1566*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_sine_level_buf,
1567*15dc779aSAndroid Build Coastguard Worker const WORD32 *ptr_rand_ph,
1568*15dc779aSAndroid Build Coastguard Worker WORD16 *noise_level_mant,
1569*15dc779aSAndroid Build Coastguard Worker WORD32 num_sub_bands, FLAG noise_absc_flag,
1570*15dc779aSAndroid Build Coastguard Worker WORD32 harm_index) {
1571*15dc779aSAndroid Build Coastguard Worker WORD32 shift, k;
1572*15dc779aSAndroid Build Coastguard Worker WORD32 signal_real;
1573*15dc779aSAndroid Build Coastguard Worker WORD32 sine_level;
1574*15dc779aSAndroid Build Coastguard Worker
1575*15dc779aSAndroid Build Coastguard Worker scale_change = scale_change - 1;
1576*15dc779aSAndroid Build Coastguard Worker if (!noise_absc_flag) {
1577*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < num_sub_bands; k++) {
1578*15dc779aSAndroid Build Coastguard Worker signal_real = ixheaac_mult32x16in32(*ptr_real_buf, *ptr_gain_buf++);
1579*15dc779aSAndroid Build Coastguard Worker shift = (*ptr_gain_buf++ - scale_change);
1580*15dc779aSAndroid Build Coastguard Worker
1581*15dc779aSAndroid Build Coastguard Worker if (shift > 0)
1582*15dc779aSAndroid Build Coastguard Worker signal_real = (signal_real << shift);
1583*15dc779aSAndroid Build Coastguard Worker else
1584*15dc779aSAndroid Build Coastguard Worker signal_real = (signal_real >> -(shift));
1585*15dc779aSAndroid Build Coastguard Worker
1586*15dc779aSAndroid Build Coastguard Worker sine_level = (ptr_sine_level_buf[2 * k] << 16);
1587*15dc779aSAndroid Build Coastguard Worker
1588*15dc779aSAndroid Build Coastguard Worker if (sine_level == 0) {
1589*15dc779aSAndroid Build Coastguard Worker *ptr_real_buf++ = ixheaac_mac16x16in32_shl_sat(
1590*15dc779aSAndroid Build Coastguard Worker signal_real, ixheaac_extract16h(ptr_rand_ph[k]),
1591*15dc779aSAndroid Build Coastguard Worker noise_level_mant[2 * k]);
1592*15dc779aSAndroid Build Coastguard Worker } else if (harm_index == 0)
1593*15dc779aSAndroid Build Coastguard Worker *ptr_real_buf++ = ixheaac_add32_sat(signal_real, sine_level);
1594*15dc779aSAndroid Build Coastguard Worker else
1595*15dc779aSAndroid Build Coastguard Worker *ptr_real_buf++ = ixheaac_sub32_sat(signal_real, sine_level);
1596*15dc779aSAndroid Build Coastguard Worker }
1597*15dc779aSAndroid Build Coastguard Worker } else {
1598*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < num_sub_bands; k++) {
1599*15dc779aSAndroid Build Coastguard Worker signal_real = ixheaac_mult32x16in32(*ptr_real_buf, *ptr_gain_buf++);
1600*15dc779aSAndroid Build Coastguard Worker shift = (*ptr_gain_buf++ - scale_change);
1601*15dc779aSAndroid Build Coastguard Worker
1602*15dc779aSAndroid Build Coastguard Worker if (shift > 0)
1603*15dc779aSAndroid Build Coastguard Worker signal_real = (signal_real << shift);
1604*15dc779aSAndroid Build Coastguard Worker else
1605*15dc779aSAndroid Build Coastguard Worker signal_real = (signal_real >> -(shift));
1606*15dc779aSAndroid Build Coastguard Worker
1607*15dc779aSAndroid Build Coastguard Worker sine_level = (ptr_sine_level_buf[2 * k] << 16);
1608*15dc779aSAndroid Build Coastguard Worker
1609*15dc779aSAndroid Build Coastguard Worker if (harm_index == 0)
1610*15dc779aSAndroid Build Coastguard Worker *ptr_real_buf++ = ixheaac_add32_sat(signal_real, sine_level);
1611*15dc779aSAndroid Build Coastguard Worker else
1612*15dc779aSAndroid Build Coastguard Worker *ptr_real_buf++ = ixheaac_sub32_sat(signal_real, sine_level);
1613*15dc779aSAndroid Build Coastguard Worker }
1614*15dc779aSAndroid Build Coastguard Worker }
1615*15dc779aSAndroid Build Coastguard Worker }
1616*15dc779aSAndroid Build Coastguard Worker
ixheaacd_harm_idx_onethreelp(WORD32 * ptr_real_buf,WORD16 * ptr_gain_buf,WORD32 scale_change,WORD16 * ptr_sine_level_buf,const WORD32 * ptr_rand_ph,WORD16 * noise_level_mant,WORD32 num_sub_bands,FLAG noise_absc_flag,WORD32 freq_inv_flag,WORD32 noise_e,WORD32 sub_band_start)1617*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_harm_idx_onethreelp(
1618*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr_real_buf, WORD16 *ptr_gain_buf, WORD32 scale_change,
1619*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_sine_level_buf, const WORD32 *ptr_rand_ph,
1620*15dc779aSAndroid Build Coastguard Worker WORD16 *noise_level_mant, WORD32 num_sub_bands, FLAG noise_absc_flag,
1621*15dc779aSAndroid Build Coastguard Worker WORD32 freq_inv_flag, WORD32 noise_e, WORD32 sub_band_start) {
1622*15dc779aSAndroid Build Coastguard Worker WORD32 shift, k = 0;
1623*15dc779aSAndroid Build Coastguard Worker WORD32 signal_real, temp_mult, temp_mult2;
1624*15dc779aSAndroid Build Coastguard Worker WORD16 sine_level, sine_level_prev, sine_level_next;
1625*15dc779aSAndroid Build Coastguard Worker WORD32 tone_count = 0;
1626*15dc779aSAndroid Build Coastguard Worker WORD16 tmp;
1627*15dc779aSAndroid Build Coastguard Worker
1628*15dc779aSAndroid Build Coastguard Worker scale_change = scale_change - 1;
1629*15dc779aSAndroid Build Coastguard Worker
1630*15dc779aSAndroid Build Coastguard Worker signal_real = ixheaac_mult32x16in32(*ptr_real_buf, *ptr_gain_buf++);
1631*15dc779aSAndroid Build Coastguard Worker shift = (*ptr_gain_buf++ - scale_change);
1632*15dc779aSAndroid Build Coastguard Worker
1633*15dc779aSAndroid Build Coastguard Worker if (shift > 0)
1634*15dc779aSAndroid Build Coastguard Worker signal_real = (signal_real << shift);
1635*15dc779aSAndroid Build Coastguard Worker else
1636*15dc779aSAndroid Build Coastguard Worker signal_real = (signal_real >> -(shift));
1637*15dc779aSAndroid Build Coastguard Worker
1638*15dc779aSAndroid Build Coastguard Worker sine_level = ((ptr_sine_level_buf[2 * 0]));
1639*15dc779aSAndroid Build Coastguard Worker
1640*15dc779aSAndroid Build Coastguard Worker if (num_sub_bands > 1) {
1641*15dc779aSAndroid Build Coastguard Worker sine_level_next = ((ptr_sine_level_buf[2 * 1]));
1642*15dc779aSAndroid Build Coastguard Worker } else {
1643*15dc779aSAndroid Build Coastguard Worker sine_level_next = 0;
1644*15dc779aSAndroid Build Coastguard Worker }
1645*15dc779aSAndroid Build Coastguard Worker
1646*15dc779aSAndroid Build Coastguard Worker if (ptr_sine_level_buf[2 * 0] != 0) {
1647*15dc779aSAndroid Build Coastguard Worker tone_count++;
1648*15dc779aSAndroid Build Coastguard Worker } else {
1649*15dc779aSAndroid Build Coastguard Worker if (!noise_absc_flag) {
1650*15dc779aSAndroid Build Coastguard Worker signal_real = ixheaac_mac16x16in32_shl_sat(
1651*15dc779aSAndroid Build Coastguard Worker signal_real, ixheaac_extract16h(ptr_rand_ph[k]), *noise_level_mant);
1652*15dc779aSAndroid Build Coastguard Worker }
1653*15dc779aSAndroid Build Coastguard Worker }
1654*15dc779aSAndroid Build Coastguard Worker
1655*15dc779aSAndroid Build Coastguard Worker noise_level_mant += 2;
1656*15dc779aSAndroid Build Coastguard Worker temp_mult2 = ixheaac_mult32x16in32(FACTOR, sine_level_next);
1657*15dc779aSAndroid Build Coastguard Worker temp_mult = ixheaac_mult32x16in32(FACTOR, sine_level);
1658*15dc779aSAndroid Build Coastguard Worker tmp = noise_e;
1659*15dc779aSAndroid Build Coastguard Worker
1660*15dc779aSAndroid Build Coastguard Worker if (tmp > 0) {
1661*15dc779aSAndroid Build Coastguard Worker temp_mult = ixheaac_shl32(temp_mult, tmp);
1662*15dc779aSAndroid Build Coastguard Worker } else {
1663*15dc779aSAndroid Build Coastguard Worker temp_mult = ixheaac_shr32(temp_mult, -tmp);
1664*15dc779aSAndroid Build Coastguard Worker }
1665*15dc779aSAndroid Build Coastguard Worker
1666*15dc779aSAndroid Build Coastguard Worker if (freq_inv_flag < 0) {
1667*15dc779aSAndroid Build Coastguard Worker *(ptr_real_buf - 1) = ixheaac_add32_sat(*(ptr_real_buf - 1), temp_mult);
1668*15dc779aSAndroid Build Coastguard Worker signal_real = ixheaac_sub32_sat(signal_real, temp_mult2);
1669*15dc779aSAndroid Build Coastguard Worker } else {
1670*15dc779aSAndroid Build Coastguard Worker *(ptr_real_buf - 1) = ixheaac_sub32_sat(*(ptr_real_buf - 1), temp_mult);
1671*15dc779aSAndroid Build Coastguard Worker signal_real = ixheaac_add32_sat(signal_real, temp_mult2);
1672*15dc779aSAndroid Build Coastguard Worker }
1673*15dc779aSAndroid Build Coastguard Worker *ptr_real_buf++ = signal_real;
1674*15dc779aSAndroid Build Coastguard Worker
1675*15dc779aSAndroid Build Coastguard Worker num_sub_bands = num_sub_bands - 1;
1676*15dc779aSAndroid Build Coastguard Worker for (k = 1; k < num_sub_bands; k++) {
1677*15dc779aSAndroid Build Coastguard Worker WORD16 gain_m = *ptr_gain_buf++;
1678*15dc779aSAndroid Build Coastguard Worker WORD16 gain_e = *ptr_gain_buf++;
1679*15dc779aSAndroid Build Coastguard Worker WORD32 q_real = *ptr_real_buf;
1680*15dc779aSAndroid Build Coastguard Worker
1681*15dc779aSAndroid Build Coastguard Worker signal_real = ixheaac_mult32x16in32(q_real, gain_m);
1682*15dc779aSAndroid Build Coastguard Worker
1683*15dc779aSAndroid Build Coastguard Worker if ((shift = (gain_e - scale_change)) >= 0)
1684*15dc779aSAndroid Build Coastguard Worker signal_real = (signal_real << shift);
1685*15dc779aSAndroid Build Coastguard Worker else
1686*15dc779aSAndroid Build Coastguard Worker signal_real = (signal_real >> -(shift));
1687*15dc779aSAndroid Build Coastguard Worker
1688*15dc779aSAndroid Build Coastguard Worker sine_level_prev = sine_level;
1689*15dc779aSAndroid Build Coastguard Worker sine_level = sine_level_next;
1690*15dc779aSAndroid Build Coastguard Worker if (sine_level != 0) {
1691*15dc779aSAndroid Build Coastguard Worker tone_count++;
1692*15dc779aSAndroid Build Coastguard Worker }
1693*15dc779aSAndroid Build Coastguard Worker sine_level_next = (ptr_sine_level_buf[2 * (k + 1)]);
1694*15dc779aSAndroid Build Coastguard Worker
1695*15dc779aSAndroid Build Coastguard Worker if ((!noise_absc_flag) && (sine_level == 0)) {
1696*15dc779aSAndroid Build Coastguard Worker signal_real = ixheaac_mac16x16in32_shl_sat(
1697*15dc779aSAndroid Build Coastguard Worker signal_real, ixheaac_extract16h(ptr_rand_ph[k]), *noise_level_mant);
1698*15dc779aSAndroid Build Coastguard Worker }
1699*15dc779aSAndroid Build Coastguard Worker noise_level_mant += 2;
1700*15dc779aSAndroid Build Coastguard Worker
1701*15dc779aSAndroid Build Coastguard Worker if (tone_count <= 16) {
1702*15dc779aSAndroid Build Coastguard Worker WORD32 temp_mult;
1703*15dc779aSAndroid Build Coastguard Worker WORD32 add_sine = ixheaac_mult32x16in32(
1704*15dc779aSAndroid Build Coastguard Worker FACTOR, ixheaac_sub16(sine_level_prev, sine_level_next));
1705*15dc779aSAndroid Build Coastguard Worker temp_mult = add_sine * freq_inv_flag;
1706*15dc779aSAndroid Build Coastguard Worker signal_real = ixheaac_add32_sat(signal_real, temp_mult);
1707*15dc779aSAndroid Build Coastguard Worker }
1708*15dc779aSAndroid Build Coastguard Worker *ptr_real_buf++ = signal_real;
1709*15dc779aSAndroid Build Coastguard Worker freq_inv_flag = -(freq_inv_flag);
1710*15dc779aSAndroid Build Coastguard Worker }
1711*15dc779aSAndroid Build Coastguard Worker
1712*15dc779aSAndroid Build Coastguard Worker freq_inv_flag = (freq_inv_flag + 1) >> 1;
1713*15dc779aSAndroid Build Coastguard Worker
1714*15dc779aSAndroid Build Coastguard Worker if (num_sub_bands > 0) {
1715*15dc779aSAndroid Build Coastguard Worker WORD32 temp_mult_sine;
1716*15dc779aSAndroid Build Coastguard Worker signal_real = ixheaac_mult32x16in32(*ptr_real_buf, *ptr_gain_buf++);
1717*15dc779aSAndroid Build Coastguard Worker shift = (*ptr_gain_buf - scale_change);
1718*15dc779aSAndroid Build Coastguard Worker
1719*15dc779aSAndroid Build Coastguard Worker if (shift > 0)
1720*15dc779aSAndroid Build Coastguard Worker signal_real = (signal_real << shift);
1721*15dc779aSAndroid Build Coastguard Worker else
1722*15dc779aSAndroid Build Coastguard Worker signal_real = (signal_real >> -(shift));
1723*15dc779aSAndroid Build Coastguard Worker
1724*15dc779aSAndroid Build Coastguard Worker temp_mult_sine = ixheaac_mult32x16in32(FACTOR, sine_level);
1725*15dc779aSAndroid Build Coastguard Worker sine_level = sine_level_next;
1726*15dc779aSAndroid Build Coastguard Worker
1727*15dc779aSAndroid Build Coastguard Worker if (sine_level != 0) {
1728*15dc779aSAndroid Build Coastguard Worker tone_count++;
1729*15dc779aSAndroid Build Coastguard Worker } else {
1730*15dc779aSAndroid Build Coastguard Worker if (!noise_absc_flag) {
1731*15dc779aSAndroid Build Coastguard Worker signal_real = ixheaac_mac16x16in32_shl_sat(
1732*15dc779aSAndroid Build Coastguard Worker signal_real, ixheaac_extract16h(ptr_rand_ph[k]),
1733*15dc779aSAndroid Build Coastguard Worker *noise_level_mant);
1734*15dc779aSAndroid Build Coastguard Worker }
1735*15dc779aSAndroid Build Coastguard Worker }
1736*15dc779aSAndroid Build Coastguard Worker
1737*15dc779aSAndroid Build Coastguard Worker if (tone_count <= 16) {
1738*15dc779aSAndroid Build Coastguard Worker temp_mult2 = ixheaac_mult32x16in32(FACTOR, sine_level);
1739*15dc779aSAndroid Build Coastguard Worker
1740*15dc779aSAndroid Build Coastguard Worker if (freq_inv_flag) {
1741*15dc779aSAndroid Build Coastguard Worker *ptr_real_buf++ = ixheaac_add32_sat(signal_real, temp_mult_sine);
1742*15dc779aSAndroid Build Coastguard Worker
1743*15dc779aSAndroid Build Coastguard Worker if ((k + sub_band_start) < 62) {
1744*15dc779aSAndroid Build Coastguard Worker *ptr_real_buf = ixheaac_sub32_sat(*ptr_real_buf, temp_mult2);
1745*15dc779aSAndroid Build Coastguard Worker }
1746*15dc779aSAndroid Build Coastguard Worker } else {
1747*15dc779aSAndroid Build Coastguard Worker *ptr_real_buf++ = ixheaac_sub32_sat(signal_real, temp_mult_sine);
1748*15dc779aSAndroid Build Coastguard Worker
1749*15dc779aSAndroid Build Coastguard Worker if ((k + sub_band_start) < 62) {
1750*15dc779aSAndroid Build Coastguard Worker *ptr_real_buf = ixheaac_add32_sat(*ptr_real_buf, temp_mult2);
1751*15dc779aSAndroid Build Coastguard Worker }
1752*15dc779aSAndroid Build Coastguard Worker }
1753*15dc779aSAndroid Build Coastguard Worker } else {
1754*15dc779aSAndroid Build Coastguard Worker *ptr_real_buf = signal_real;
1755*15dc779aSAndroid Build Coastguard Worker }
1756*15dc779aSAndroid Build Coastguard Worker }
1757*15dc779aSAndroid Build Coastguard Worker }
1758*15dc779aSAndroid Build Coastguard Worker
ixheaacd_harm_idx_zerotwo(FLAG noise_absc_flag,WORD16 num_sub_bands,WORD32 * ptr_real_buf,WORD32 * ptr_imag,WORD16 * smoothed_gain,WORD16 * smoothed_noise,WORD32 factor,WORD16 * ptr_gain_buf,WORD16 scale_change,const WORD32 * ptr_rand_ph,WORD16 * ptr_sine_level_buf,WORD16 noise_e,WORD32 harm_index)1759*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_harm_idx_zerotwo(FLAG noise_absc_flag, WORD16 num_sub_bands,
1760*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr_real_buf, WORD32 *ptr_imag,
1761*15dc779aSAndroid Build Coastguard Worker WORD16 *smoothed_gain, WORD16 *smoothed_noise,
1762*15dc779aSAndroid Build Coastguard Worker WORD32 factor, WORD16 *ptr_gain_buf,
1763*15dc779aSAndroid Build Coastguard Worker WORD16 scale_change, const WORD32 *ptr_rand_ph,
1764*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_sine_level_buf, WORD16 noise_e,
1765*15dc779aSAndroid Build Coastguard Worker WORD32 harm_index) {
1766*15dc779aSAndroid Build Coastguard Worker WORD32 k;
1767*15dc779aSAndroid Build Coastguard Worker WORD32 signal_real, sig_imag;
1768*15dc779aSAndroid Build Coastguard Worker WORD32 shift;
1769*15dc779aSAndroid Build Coastguard Worker WORD32 sine_level;
1770*15dc779aSAndroid Build Coastguard Worker ptr_gain_buf++;
1771*15dc779aSAndroid Build Coastguard Worker
1772*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < num_sub_bands; k++) {
1773*15dc779aSAndroid Build Coastguard Worker signal_real = ixheaac_mult32x16in32(*ptr_real_buf, smoothed_gain[0]);
1774*15dc779aSAndroid Build Coastguard Worker sig_imag = ixheaac_mult32x16in32(*ptr_imag, smoothed_gain[0]);
1775*15dc779aSAndroid Build Coastguard Worker
1776*15dc779aSAndroid Build Coastguard Worker shift = ixheaac_sub16(*ptr_gain_buf, scale_change);
1777*15dc779aSAndroid Build Coastguard Worker ptr_gain_buf += 2;
1778*15dc779aSAndroid Build Coastguard Worker
1779*15dc779aSAndroid Build Coastguard Worker if (shift > 0) {
1780*15dc779aSAndroid Build Coastguard Worker signal_real = ixheaac_shl32(signal_real, shift);
1781*15dc779aSAndroid Build Coastguard Worker sig_imag = ixheaac_shl32(sig_imag, shift);
1782*15dc779aSAndroid Build Coastguard Worker } else {
1783*15dc779aSAndroid Build Coastguard Worker shift = -shift;
1784*15dc779aSAndroid Build Coastguard Worker signal_real = ixheaac_shr32(signal_real, shift);
1785*15dc779aSAndroid Build Coastguard Worker sig_imag = ixheaac_shr32(sig_imag, shift);
1786*15dc779aSAndroid Build Coastguard Worker }
1787*15dc779aSAndroid Build Coastguard Worker
1788*15dc779aSAndroid Build Coastguard Worker ptr_rand_ph++;
1789*15dc779aSAndroid Build Coastguard Worker
1790*15dc779aSAndroid Build Coastguard Worker if (*ptr_sine_level_buf != 0) {
1791*15dc779aSAndroid Build Coastguard Worker WORD32 tmp = ixheaac_sub16(ptr_sine_level_buf[1], noise_e);
1792*15dc779aSAndroid Build Coastguard Worker
1793*15dc779aSAndroid Build Coastguard Worker if (tmp > 0)
1794*15dc779aSAndroid Build Coastguard Worker sine_level = ixheaac_shl32(ptr_sine_level_buf[0], tmp);
1795*15dc779aSAndroid Build Coastguard Worker else
1796*15dc779aSAndroid Build Coastguard Worker sine_level = ixheaac_shr32(ptr_sine_level_buf[0], tmp);
1797*15dc779aSAndroid Build Coastguard Worker
1798*15dc779aSAndroid Build Coastguard Worker if (harm_index == 0)
1799*15dc779aSAndroid Build Coastguard Worker *ptr_real_buf = ixheaac_add32_sat(signal_real, sine_level);
1800*15dc779aSAndroid Build Coastguard Worker else
1801*15dc779aSAndroid Build Coastguard Worker *ptr_real_buf = ixheaac_sub32_sat(signal_real, sine_level);
1802*15dc779aSAndroid Build Coastguard Worker
1803*15dc779aSAndroid Build Coastguard Worker *ptr_imag = sig_imag;
1804*15dc779aSAndroid Build Coastguard Worker } else {
1805*15dc779aSAndroid Build Coastguard Worker if (!noise_absc_flag) {
1806*15dc779aSAndroid Build Coastguard Worker WORD32 random = *ptr_rand_ph;
1807*15dc779aSAndroid Build Coastguard Worker WORD16 noise = smoothed_noise[0];
1808*15dc779aSAndroid Build Coastguard Worker
1809*15dc779aSAndroid Build Coastguard Worker *ptr_real_buf = ixheaac_mac16x16in32_shl_sat(
1810*15dc779aSAndroid Build Coastguard Worker signal_real, ixheaac_extract16h(random), noise);
1811*15dc779aSAndroid Build Coastguard Worker *ptr_imag = ixheaac_mac16x16in32_shl_sat(
1812*15dc779aSAndroid Build Coastguard Worker sig_imag, ixheaac_extract16l(random), noise);
1813*15dc779aSAndroid Build Coastguard Worker } else {
1814*15dc779aSAndroid Build Coastguard Worker *ptr_real_buf = signal_real;
1815*15dc779aSAndroid Build Coastguard Worker *ptr_imag = sig_imag;
1816*15dc779aSAndroid Build Coastguard Worker }
1817*15dc779aSAndroid Build Coastguard Worker }
1818*15dc779aSAndroid Build Coastguard Worker
1819*15dc779aSAndroid Build Coastguard Worker smoothed_noise += factor;
1820*15dc779aSAndroid Build Coastguard Worker smoothed_gain += 2;
1821*15dc779aSAndroid Build Coastguard Worker ptr_sine_level_buf += 2;
1822*15dc779aSAndroid Build Coastguard Worker ptr_real_buf++;
1823*15dc779aSAndroid Build Coastguard Worker ptr_imag++;
1824*15dc779aSAndroid Build Coastguard Worker }
1825*15dc779aSAndroid Build Coastguard Worker }
1826*15dc779aSAndroid Build Coastguard Worker
ixheaacd_harm_idx_onethree(FLAG noise_absc_flag,WORD16 num_sub_bands,WORD32 * ptr_real_buf,WORD32 * ptr_imag,WORD16 * smoothed_gain,WORD16 * smoothed_noise,WORD32 factor,WORD16 * ptr_gain_buf,WORD16 scale_change,const WORD32 * ptr_rand_ph,WORD16 * ptr_sine_level_buf,WORD16 noise_e,WORD32 freq_inv_flag,WORD32 harm_index)1827*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_harm_idx_onethree(FLAG noise_absc_flag, WORD16 num_sub_bands,
1828*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr_real_buf, WORD32 *ptr_imag,
1829*15dc779aSAndroid Build Coastguard Worker WORD16 *smoothed_gain, WORD16 *smoothed_noise,
1830*15dc779aSAndroid Build Coastguard Worker WORD32 factor, WORD16 *ptr_gain_buf,
1831*15dc779aSAndroid Build Coastguard Worker WORD16 scale_change, const WORD32 *ptr_rand_ph,
1832*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_sine_level_buf, WORD16 noise_e,
1833*15dc779aSAndroid Build Coastguard Worker WORD32 freq_inv_flag, WORD32 harm_index) {
1834*15dc779aSAndroid Build Coastguard Worker WORD32 k;
1835*15dc779aSAndroid Build Coastguard Worker WORD32 signal_real, sig_imag;
1836*15dc779aSAndroid Build Coastguard Worker WORD32 shift;
1837*15dc779aSAndroid Build Coastguard Worker WORD32 sine_level;
1838*15dc779aSAndroid Build Coastguard Worker
1839*15dc779aSAndroid Build Coastguard Worker ptr_gain_buf++;
1840*15dc779aSAndroid Build Coastguard Worker
1841*15dc779aSAndroid Build Coastguard Worker if (harm_index == 1) freq_inv_flag = !freq_inv_flag;
1842*15dc779aSAndroid Build Coastguard Worker
1843*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < num_sub_bands; k++) {
1844*15dc779aSAndroid Build Coastguard Worker signal_real = ixheaac_mult32x16in32(*ptr_real_buf, smoothed_gain[0]);
1845*15dc779aSAndroid Build Coastguard Worker sig_imag = ixheaac_mult32x16in32(*ptr_imag, smoothed_gain[0]);
1846*15dc779aSAndroid Build Coastguard Worker
1847*15dc779aSAndroid Build Coastguard Worker shift = ixheaac_sub16(*ptr_gain_buf, scale_change);
1848*15dc779aSAndroid Build Coastguard Worker ptr_gain_buf += 2;
1849*15dc779aSAndroid Build Coastguard Worker
1850*15dc779aSAndroid Build Coastguard Worker if (shift > 0) {
1851*15dc779aSAndroid Build Coastguard Worker signal_real = ixheaac_shl32(signal_real, shift);
1852*15dc779aSAndroid Build Coastguard Worker sig_imag = ixheaac_shl32(sig_imag, shift);
1853*15dc779aSAndroid Build Coastguard Worker } else {
1854*15dc779aSAndroid Build Coastguard Worker shift = -shift;
1855*15dc779aSAndroid Build Coastguard Worker signal_real = ixheaac_shr32(signal_real, shift);
1856*15dc779aSAndroid Build Coastguard Worker sig_imag = ixheaac_shr32(sig_imag, shift);
1857*15dc779aSAndroid Build Coastguard Worker }
1858*15dc779aSAndroid Build Coastguard Worker
1859*15dc779aSAndroid Build Coastguard Worker ptr_rand_ph++;
1860*15dc779aSAndroid Build Coastguard Worker
1861*15dc779aSAndroid Build Coastguard Worker if (*ptr_sine_level_buf != 0) {
1862*15dc779aSAndroid Build Coastguard Worker WORD32 tmp = ixheaac_sub16(ptr_sine_level_buf[1], noise_e);
1863*15dc779aSAndroid Build Coastguard Worker
1864*15dc779aSAndroid Build Coastguard Worker if (tmp > 0)
1865*15dc779aSAndroid Build Coastguard Worker sine_level = ixheaac_shl32(ptr_sine_level_buf[0], tmp);
1866*15dc779aSAndroid Build Coastguard Worker else
1867*15dc779aSAndroid Build Coastguard Worker sine_level = ixheaac_shr32(ptr_sine_level_buf[0], -tmp);
1868*15dc779aSAndroid Build Coastguard Worker
1869*15dc779aSAndroid Build Coastguard Worker *ptr_real_buf = signal_real;
1870*15dc779aSAndroid Build Coastguard Worker
1871*15dc779aSAndroid Build Coastguard Worker if (freq_inv_flag) {
1872*15dc779aSAndroid Build Coastguard Worker *ptr_imag = ixheaac_add32_sat(sig_imag, sine_level);
1873*15dc779aSAndroid Build Coastguard Worker } else {
1874*15dc779aSAndroid Build Coastguard Worker *ptr_imag = ixheaac_sub32_sat(sig_imag, sine_level);
1875*15dc779aSAndroid Build Coastguard Worker }
1876*15dc779aSAndroid Build Coastguard Worker
1877*15dc779aSAndroid Build Coastguard Worker } else {
1878*15dc779aSAndroid Build Coastguard Worker if (!noise_absc_flag) {
1879*15dc779aSAndroid Build Coastguard Worker WORD32 random = *ptr_rand_ph;
1880*15dc779aSAndroid Build Coastguard Worker WORD16 noise = smoothed_noise[0];
1881*15dc779aSAndroid Build Coastguard Worker
1882*15dc779aSAndroid Build Coastguard Worker *ptr_real_buf = ixheaac_mac16x16in32_shl_sat(
1883*15dc779aSAndroid Build Coastguard Worker signal_real, ixheaac_extract16h(random), noise);
1884*15dc779aSAndroid Build Coastguard Worker *ptr_imag = ixheaac_mac16x16in32_shl_sat(
1885*15dc779aSAndroid Build Coastguard Worker sig_imag, ixheaac_extract16l(random), noise);
1886*15dc779aSAndroid Build Coastguard Worker } else {
1887*15dc779aSAndroid Build Coastguard Worker *ptr_real_buf = signal_real;
1888*15dc779aSAndroid Build Coastguard Worker *ptr_imag = sig_imag;
1889*15dc779aSAndroid Build Coastguard Worker }
1890*15dc779aSAndroid Build Coastguard Worker }
1891*15dc779aSAndroid Build Coastguard Worker
1892*15dc779aSAndroid Build Coastguard Worker freq_inv_flag = (!freq_inv_flag);
1893*15dc779aSAndroid Build Coastguard Worker smoothed_gain += 2;
1894*15dc779aSAndroid Build Coastguard Worker smoothed_noise += factor;
1895*15dc779aSAndroid Build Coastguard Worker ptr_sine_level_buf += 2;
1896*15dc779aSAndroid Build Coastguard Worker ptr_real_buf++;
1897*15dc779aSAndroid Build Coastguard Worker ptr_imag++;
1898*15dc779aSAndroid Build Coastguard Worker }
1899*15dc779aSAndroid Build Coastguard Worker }