1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker * *
3*15dc779aSAndroid Build Coastguard Worker * Copyright (C) 2023 The Android Open Source Project
4*15dc779aSAndroid Build Coastguard Worker *
5*15dc779aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*15dc779aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*15dc779aSAndroid Build Coastguard Worker * You may obtain a copy of the License at:
8*15dc779aSAndroid Build Coastguard Worker *
9*15dc779aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*15dc779aSAndroid Build Coastguard Worker *
11*15dc779aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*15dc779aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*15dc779aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*15dc779aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*15dc779aSAndroid Build Coastguard Worker * limitations under the License.
16*15dc779aSAndroid Build Coastguard Worker *
17*15dc779aSAndroid Build Coastguard Worker *****************************************************************************
18*15dc779aSAndroid Build Coastguard Worker * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*15dc779aSAndroid Build Coastguard Worker */
20*15dc779aSAndroid Build Coastguard Worker
21*15dc779aSAndroid Build Coastguard Worker #include <string.h>
22*15dc779aSAndroid Build Coastguard Worker #include <math.h>
23*15dc779aSAndroid Build Coastguard Worker #include <limits.h>
24*15dc779aSAndroid Build Coastguard Worker
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_aac_constants.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_error_codes.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops16.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops.h"
34*15dc779aSAndroid Build Coastguard Worker
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_header.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_def.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_resampler.h"
38*15dc779aSAndroid Build Coastguard Worker
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_rom.h"
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_rom.h"
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_hbe.h"
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_qmf_enc.h"
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_tran_det.h"
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_frame_info_gen.h"
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_env_est.h"
46*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_code_envelope.h"
47*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_main.h"
48*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_missing_harmonics_det.h"
49*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_inv_filtering_estimation.h"
50*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_noise_floor_est.h"
51*15dc779aSAndroid Build Coastguard Worker
52*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_rom.h"
53*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_ton_corr.h"
54*15dc779aSAndroid Build Coastguard Worker #include "iusace_esbr_pvc.h"
55*15dc779aSAndroid Build Coastguard Worker #include "iusace_esbr_inter_tes.h"
56*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr.h"
57*15dc779aSAndroid Build Coastguard Worker
58*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_bitbuffer.h"
59*15dc779aSAndroid Build Coastguard Worker
60*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_cmondata.h"
61*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_write_bitstream.h"
62*15dc779aSAndroid Build Coastguard Worker
63*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_hybrid.h"
64*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_ps_enc.h"
65*15dc779aSAndroid Build Coastguard Worker
66*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_utils.h"
67*15dc779aSAndroid Build Coastguard Worker
68*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_header.h"
69*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_def.h"
70*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_resampler.h"
71*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_rom.h"
72*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_rom.h"
73*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_hbe.h"
74*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_qmf_enc.h"
75*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_tran_det.h"
76*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_frame_info_gen.h"
77*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_env_est.h"
78*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_code_envelope.h"
79*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_psy_const.h"
80*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_tns.h"
81*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_tns_params.h"
82*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_rom.h"
83*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_rom.h"
84*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_bitbuffer.h"
85*15dc779aSAndroid Build Coastguard Worker
86*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_main.h"
87*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_rom.h"
88*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_missing_harmonics_det.h"
89*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_inv_filtering_estimation.h"
90*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_noise_floor_est.h"
91*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_ton_corr.h"
92*15dc779aSAndroid Build Coastguard Worker #include "iusace_esbr_pvc.h"
93*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr.h"
94*15dc779aSAndroid Build Coastguard Worker
95*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_freq_scaling.h"
96*15dc779aSAndroid Build Coastguard Worker
97*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_bitbuffer.h"
98*15dc779aSAndroid Build Coastguard Worker
99*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_hybrid.h"
100*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_ps_enc.h"
101*15dc779aSAndroid Build Coastguard Worker
102*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_crc.h"
103*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_cmondata.h"
104*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_enc_struct.h"
105*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_write_bitstream.h"
106*15dc779aSAndroid Build Coastguard Worker
107*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_utils.h"
108*15dc779aSAndroid Build Coastguard Worker
ixheaace_map_panorama(WORD32 nrg_val,WORD32 amp_res,WORD32 * ptr_quant_error)109*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaace_map_panorama(WORD32 nrg_val, WORD32 amp_res, WORD32 *ptr_quant_error) {
110*15dc779aSAndroid Build Coastguard Worker WORD32 i = 0;
111*15dc779aSAndroid Build Coastguard Worker ;
112*15dc779aSAndroid Build Coastguard Worker WORD32 min_val, val;
113*15dc779aSAndroid Build Coastguard Worker WORD32 pan_tab[2][10] = {{0, 2, 4, 6, 8, 12, 16, 20, 24}, {0, 2, 4, 8, 12}};
114*15dc779aSAndroid Build Coastguard Worker WORD32 max_index[2] = {9, 5};
115*15dc779aSAndroid Build Coastguard Worker
116*15dc779aSAndroid Build Coastguard Worker WORD32 pan_index;
117*15dc779aSAndroid Build Coastguard Worker WORD32 sign;
118*15dc779aSAndroid Build Coastguard Worker
119*15dc779aSAndroid Build Coastguard Worker sign = nrg_val > 0 ? 1 : -1;
120*15dc779aSAndroid Build Coastguard Worker
121*15dc779aSAndroid Build Coastguard Worker nrg_val = sign * nrg_val;
122*15dc779aSAndroid Build Coastguard Worker
123*15dc779aSAndroid Build Coastguard Worker min_val = INT_MAX;
124*15dc779aSAndroid Build Coastguard Worker pan_index = 0;
125*15dc779aSAndroid Build Coastguard Worker
126*15dc779aSAndroid Build Coastguard Worker while (i < max_index[amp_res]) {
127*15dc779aSAndroid Build Coastguard Worker val = ixheaac_abs32(nrg_val - pan_tab[amp_res][i]);
128*15dc779aSAndroid Build Coastguard Worker if (val < min_val) {
129*15dc779aSAndroid Build Coastguard Worker min_val = val;
130*15dc779aSAndroid Build Coastguard Worker pan_index = i;
131*15dc779aSAndroid Build Coastguard Worker }
132*15dc779aSAndroid Build Coastguard Worker i++;
133*15dc779aSAndroid Build Coastguard Worker }
134*15dc779aSAndroid Build Coastguard Worker
135*15dc779aSAndroid Build Coastguard Worker *ptr_quant_error = min_val;
136*15dc779aSAndroid Build Coastguard Worker
137*15dc779aSAndroid Build Coastguard Worker return pan_tab[amp_res][max_index[amp_res] - 1] + sign * pan_tab[amp_res][pan_index];
138*15dc779aSAndroid Build Coastguard Worker }
139*15dc779aSAndroid Build Coastguard Worker
ixheaace_sbr_noise_floor_levels_quantisation(WORD32 * ptr_noise_levels,FLOAT32 * ptr_flt_noise_levels,WORD32 coupling)140*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_sbr_noise_floor_levels_quantisation(WORD32 *ptr_noise_levels,
141*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_flt_noise_levels,
142*15dc779aSAndroid Build Coastguard Worker WORD32 coupling) {
143*15dc779aSAndroid Build Coastguard Worker WORD32 i = 0;
144*15dc779aSAndroid Build Coastguard Worker WORD32 dummy;
145*15dc779aSAndroid Build Coastguard Worker
146*15dc779aSAndroid Build Coastguard Worker while (i < MAXIMUM_NUM_NOISE_VALUES) {
147*15dc779aSAndroid Build Coastguard Worker WORD32 tmp;
148*15dc779aSAndroid Build Coastguard Worker
149*15dc779aSAndroid Build Coastguard Worker tmp = ptr_flt_noise_levels[i] > 30.0f ? 30 : (WORD32)(ptr_flt_noise_levels[i] + 0.5f);
150*15dc779aSAndroid Build Coastguard Worker
151*15dc779aSAndroid Build Coastguard Worker if (coupling) {
152*15dc779aSAndroid Build Coastguard Worker tmp = tmp < -30 ? -30 : tmp;
153*15dc779aSAndroid Build Coastguard Worker tmp = ixheaace_map_panorama(tmp, 1, &dummy);
154*15dc779aSAndroid Build Coastguard Worker }
155*15dc779aSAndroid Build Coastguard Worker ptr_noise_levels[i] = tmp;
156*15dc779aSAndroid Build Coastguard Worker
157*15dc779aSAndroid Build Coastguard Worker i++;
158*15dc779aSAndroid Build Coastguard Worker }
159*15dc779aSAndroid Build Coastguard Worker }
160*15dc779aSAndroid Build Coastguard Worker
ixheaace_couple_noise_floor(FLOAT32 * ptr_noise_lvl_left,FLOAT32 * ptr_noise_lvl_right)161*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_couple_noise_floor(FLOAT32 *ptr_noise_lvl_left,
162*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_noise_lvl_right) {
163*15dc779aSAndroid Build Coastguard Worker WORD32 i = 0;
164*15dc779aSAndroid Build Coastguard Worker
165*15dc779aSAndroid Build Coastguard Worker while (i < MAXIMUM_NUM_NOISE_VALUES) {
166*15dc779aSAndroid Build Coastguard Worker FLOAT32 pow_left, pow_right;
167*15dc779aSAndroid Build Coastguard Worker
168*15dc779aSAndroid Build Coastguard Worker pow_left = (FLOAT32)pow(2.0f, (SBR_NOISE_FLOOR_OFFSET - ptr_noise_lvl_left[i]));
169*15dc779aSAndroid Build Coastguard Worker pow_right = (FLOAT32)pow(2.0f, (SBR_NOISE_FLOOR_OFFSET - ptr_noise_lvl_right[i]));
170*15dc779aSAndroid Build Coastguard Worker
171*15dc779aSAndroid Build Coastguard Worker ptr_noise_lvl_right[i] -= ptr_noise_lvl_left[i];
172*15dc779aSAndroid Build Coastguard Worker ptr_noise_lvl_left[i] =
173*15dc779aSAndroid Build Coastguard Worker (FLOAT32)(SBR_NOISE_FLOOR_OFFSET - log((pow_left * pow_right) / 2) * SBR_INV_LOG_2);
174*15dc779aSAndroid Build Coastguard Worker i++;
175*15dc779aSAndroid Build Coastguard Worker }
176*15dc779aSAndroid Build Coastguard Worker }
177*15dc779aSAndroid Build Coastguard Worker
ixheaace_calculate_sbr_envelope(FLOAT32 ** ptr_y_buf_left,FLOAT32 ** ptr_y_buf_right,const ixheaace_str_frame_info_sbr * pstr_const_frame_info,WORD32 * ptr_sfb_ene_l,WORD32 * ptr_sfb_ene_r,ixheaace_pstr_sbr_config_data pstr_sbr_cfg,ixheaace_pstr_enc_channel pstr_sbr,ixheaace_sbr_stereo_mode stereo_mode,WORD32 * ptr_max_quant_err)178*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ixheaace_calculate_sbr_envelope(
179*15dc779aSAndroid Build Coastguard Worker FLOAT32 **ptr_y_buf_left, FLOAT32 **ptr_y_buf_right,
180*15dc779aSAndroid Build Coastguard Worker const ixheaace_str_frame_info_sbr *pstr_const_frame_info, WORD32 *ptr_sfb_ene_l,
181*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr_sfb_ene_r, ixheaace_pstr_sbr_config_data pstr_sbr_cfg,
182*15dc779aSAndroid Build Coastguard Worker ixheaace_pstr_enc_channel pstr_sbr, ixheaace_sbr_stereo_mode stereo_mode,
183*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr_max_quant_err) {
184*15dc779aSAndroid Build Coastguard Worker WORD32 i, j, k, l, count, m = 0;
185*15dc779aSAndroid Build Coastguard Worker WORD32 num_bands, start_pos, stop_pos, li, ui;
186*15dc779aSAndroid Build Coastguard Worker ixheaace_freq_res freq_res;
187*15dc779aSAndroid Build Coastguard Worker
188*15dc779aSAndroid Build Coastguard Worker WORD32 ca = 2 - pstr_sbr->enc_env_data.init_sbr_amp_res;
189*15dc779aSAndroid Build Coastguard Worker WORD32 n_envelopes = pstr_const_frame_info->n_envelopes;
190*15dc779aSAndroid Build Coastguard Worker WORD32 short_env = pstr_const_frame_info->short_env - 1;
191*15dc779aSAndroid Build Coastguard Worker WORD32 time_step = pstr_sbr->str_sbr_extract_env.time_step;
192*15dc779aSAndroid Build Coastguard Worker WORD32 missing_harmonic = 0;
193*15dc779aSAndroid Build Coastguard Worker
194*15dc779aSAndroid Build Coastguard Worker if ((ca != 1) && (ca != 2)) {
195*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_EXE_FATAL_SBR_INVALID_AMP_RES;
196*15dc779aSAndroid Build Coastguard Worker }
197*15dc779aSAndroid Build Coastguard Worker
198*15dc779aSAndroid Build Coastguard Worker if (stereo_mode == SBR_COUPLING) {
199*15dc779aSAndroid Build Coastguard Worker *ptr_max_quant_err = 0;
200*15dc779aSAndroid Build Coastguard Worker }
201*15dc779aSAndroid Build Coastguard Worker
202*15dc779aSAndroid Build Coastguard Worker i = 0;
203*15dc779aSAndroid Build Coastguard Worker while (i < n_envelopes) {
204*15dc779aSAndroid Build Coastguard Worker start_pos = time_step * pstr_const_frame_info->borders[i];
205*15dc779aSAndroid Build Coastguard Worker stop_pos = time_step * pstr_const_frame_info->borders[i + 1];
206*15dc779aSAndroid Build Coastguard Worker freq_res = pstr_const_frame_info->freq_res[i];
207*15dc779aSAndroid Build Coastguard Worker num_bands = pstr_sbr_cfg->num_scf[freq_res];
208*15dc779aSAndroid Build Coastguard Worker
209*15dc779aSAndroid Build Coastguard Worker if (i == short_env) {
210*15dc779aSAndroid Build Coastguard Worker if (pstr_sbr_cfg->is_ld_sbr) {
211*15dc779aSAndroid Build Coastguard Worker WORD32 temp = 2;
212*15dc779aSAndroid Build Coastguard Worker if (temp < time_step) {
213*15dc779aSAndroid Build Coastguard Worker temp = time_step;
214*15dc779aSAndroid Build Coastguard Worker }
215*15dc779aSAndroid Build Coastguard Worker if (stop_pos - start_pos > temp) {
216*15dc779aSAndroid Build Coastguard Worker stop_pos = stop_pos - temp;
217*15dc779aSAndroid Build Coastguard Worker }
218*15dc779aSAndroid Build Coastguard Worker } else {
219*15dc779aSAndroid Build Coastguard Worker stop_pos = stop_pos - time_step;
220*15dc779aSAndroid Build Coastguard Worker }
221*15dc779aSAndroid Build Coastguard Worker }
222*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < num_bands; j++) {
223*15dc779aSAndroid Build Coastguard Worker FLOAT32 energy_left = 0, energy_right = 0, tmp_ene_l = 0, tmp_ene_r = 0;
224*15dc779aSAndroid Build Coastguard Worker li = pstr_sbr_cfg->ptr_freq_band_tab[freq_res][j];
225*15dc779aSAndroid Build Coastguard Worker ui = pstr_sbr_cfg->ptr_freq_band_tab[freq_res][j + 1];
226*15dc779aSAndroid Build Coastguard Worker
227*15dc779aSAndroid Build Coastguard Worker if ((freq_res == FREQ_RES_HIGH) && (j == 0 && ui - li > 1)) {
228*15dc779aSAndroid Build Coastguard Worker li++;
229*15dc779aSAndroid Build Coastguard Worker } else {
230*15dc779aSAndroid Build Coastguard Worker if (j == 0 && ui - li > 2) {
231*15dc779aSAndroid Build Coastguard Worker li++;
232*15dc779aSAndroid Build Coastguard Worker }
233*15dc779aSAndroid Build Coastguard Worker }
234*15dc779aSAndroid Build Coastguard Worker
235*15dc779aSAndroid Build Coastguard Worker missing_harmonic = 0;
236*15dc779aSAndroid Build Coastguard Worker
237*15dc779aSAndroid Build Coastguard Worker if (pstr_sbr->enc_env_data.add_harmonic_flag) {
238*15dc779aSAndroid Build Coastguard Worker if (freq_res == FREQ_RES_HIGH) {
239*15dc779aSAndroid Build Coastguard Worker if (pstr_sbr->enc_env_data.add_harmonic[j]) {
240*15dc779aSAndroid Build Coastguard Worker missing_harmonic = 1;
241*15dc779aSAndroid Build Coastguard Worker }
242*15dc779aSAndroid Build Coastguard Worker } else {
243*15dc779aSAndroid Build Coastguard Worker WORD32 band;
244*15dc779aSAndroid Build Coastguard Worker WORD32 start_band_high = 0;
245*15dc779aSAndroid Build Coastguard Worker WORD32 stop_band_high = 0;
246*15dc779aSAndroid Build Coastguard Worker
247*15dc779aSAndroid Build Coastguard Worker while (pstr_sbr_cfg->ptr_freq_band_tab[FREQ_RES_HIGH][start_band_high] <
248*15dc779aSAndroid Build Coastguard Worker pstr_sbr_cfg->ptr_freq_band_tab[FREQ_RES_LOW][j]) {
249*15dc779aSAndroid Build Coastguard Worker start_band_high++;
250*15dc779aSAndroid Build Coastguard Worker }
251*15dc779aSAndroid Build Coastguard Worker
252*15dc779aSAndroid Build Coastguard Worker while (pstr_sbr_cfg->ptr_freq_band_tab[FREQ_RES_HIGH][stop_band_high] <
253*15dc779aSAndroid Build Coastguard Worker pstr_sbr_cfg->ptr_freq_band_tab[FREQ_RES_LOW][j + 1]) {
254*15dc779aSAndroid Build Coastguard Worker stop_band_high++;
255*15dc779aSAndroid Build Coastguard Worker }
256*15dc779aSAndroid Build Coastguard Worker
257*15dc779aSAndroid Build Coastguard Worker for (band = start_band_high; band < stop_band_high; band++) {
258*15dc779aSAndroid Build Coastguard Worker if (pstr_sbr->enc_env_data.add_harmonic[band]) {
259*15dc779aSAndroid Build Coastguard Worker missing_harmonic = 1;
260*15dc779aSAndroid Build Coastguard Worker }
261*15dc779aSAndroid Build Coastguard Worker }
262*15dc779aSAndroid Build Coastguard Worker }
263*15dc779aSAndroid Build Coastguard Worker }
264*15dc779aSAndroid Build Coastguard Worker
265*15dc779aSAndroid Build Coastguard Worker if (missing_harmonic) {
266*15dc779aSAndroid Build Coastguard Worker count = stop_pos - start_pos;
267*15dc779aSAndroid Build Coastguard Worker for (l = start_pos; l < stop_pos; l++) {
268*15dc779aSAndroid Build Coastguard Worker energy_left += ptr_y_buf_left[l / 2][li];
269*15dc779aSAndroid Build Coastguard Worker }
270*15dc779aSAndroid Build Coastguard Worker
271*15dc779aSAndroid Build Coastguard Worker k = li + 1;
272*15dc779aSAndroid Build Coastguard Worker while (k < ui) {
273*15dc779aSAndroid Build Coastguard Worker tmp_ene_l = 0.0f;
274*15dc779aSAndroid Build Coastguard Worker for (l = start_pos; l < stop_pos; l++) {
275*15dc779aSAndroid Build Coastguard Worker tmp_ene_l += ptr_y_buf_left[l / 2][k];
276*15dc779aSAndroid Build Coastguard Worker }
277*15dc779aSAndroid Build Coastguard Worker
278*15dc779aSAndroid Build Coastguard Worker if (tmp_ene_l > energy_left) {
279*15dc779aSAndroid Build Coastguard Worker energy_left = tmp_ene_l;
280*15dc779aSAndroid Build Coastguard Worker }
281*15dc779aSAndroid Build Coastguard Worker k++;
282*15dc779aSAndroid Build Coastguard Worker }
283*15dc779aSAndroid Build Coastguard Worker
284*15dc779aSAndroid Build Coastguard Worker if (ui - li > 2) {
285*15dc779aSAndroid Build Coastguard Worker energy_left = energy_left * 0.398107267f;
286*15dc779aSAndroid Build Coastguard Worker } else {
287*15dc779aSAndroid Build Coastguard Worker if (ui - li > 1) {
288*15dc779aSAndroid Build Coastguard Worker energy_left = energy_left * 0.5f;
289*15dc779aSAndroid Build Coastguard Worker }
290*15dc779aSAndroid Build Coastguard Worker }
291*15dc779aSAndroid Build Coastguard Worker
292*15dc779aSAndroid Build Coastguard Worker if (stereo_mode == SBR_COUPLING) {
293*15dc779aSAndroid Build Coastguard Worker for (l = start_pos; l < stop_pos; l++) {
294*15dc779aSAndroid Build Coastguard Worker energy_right += ptr_y_buf_right[l / 2][li];
295*15dc779aSAndroid Build Coastguard Worker }
296*15dc779aSAndroid Build Coastguard Worker
297*15dc779aSAndroid Build Coastguard Worker k = li + 1;
298*15dc779aSAndroid Build Coastguard Worker while (k < ui) {
299*15dc779aSAndroid Build Coastguard Worker tmp_ene_r = 0.0f;
300*15dc779aSAndroid Build Coastguard Worker for (l = start_pos; l < stop_pos; l++) {
301*15dc779aSAndroid Build Coastguard Worker tmp_ene_r += ptr_y_buf_right[l / 2][k];
302*15dc779aSAndroid Build Coastguard Worker }
303*15dc779aSAndroid Build Coastguard Worker
304*15dc779aSAndroid Build Coastguard Worker if (tmp_ene_r > energy_right) {
305*15dc779aSAndroid Build Coastguard Worker energy_right = tmp_ene_r;
306*15dc779aSAndroid Build Coastguard Worker }
307*15dc779aSAndroid Build Coastguard Worker k++;
308*15dc779aSAndroid Build Coastguard Worker }
309*15dc779aSAndroid Build Coastguard Worker
310*15dc779aSAndroid Build Coastguard Worker if (ui - li > 2) {
311*15dc779aSAndroid Build Coastguard Worker energy_right = energy_right * 0.398107267f;
312*15dc779aSAndroid Build Coastguard Worker } else {
313*15dc779aSAndroid Build Coastguard Worker if (ui - li > 1) {
314*15dc779aSAndroid Build Coastguard Worker energy_right = energy_right * 0.5f;
315*15dc779aSAndroid Build Coastguard Worker }
316*15dc779aSAndroid Build Coastguard Worker }
317*15dc779aSAndroid Build Coastguard Worker
318*15dc779aSAndroid Build Coastguard Worker tmp_ene_l = energy_left;
319*15dc779aSAndroid Build Coastguard Worker energy_left = (energy_left + energy_right) * 0.5f;
320*15dc779aSAndroid Build Coastguard Worker energy_right = (tmp_ene_l + 1) / (energy_right + 1);
321*15dc779aSAndroid Build Coastguard Worker }
322*15dc779aSAndroid Build Coastguard Worker } else {
323*15dc779aSAndroid Build Coastguard Worker count = (stop_pos - start_pos) * (ui - li);
324*15dc779aSAndroid Build Coastguard Worker
325*15dc779aSAndroid Build Coastguard Worker k = li;
326*15dc779aSAndroid Build Coastguard Worker while (k < ui) {
327*15dc779aSAndroid Build Coastguard Worker for (l = start_pos; l < stop_pos; l++) {
328*15dc779aSAndroid Build Coastguard Worker if (pstr_sbr_cfg->is_ld_sbr) {
329*15dc779aSAndroid Build Coastguard Worker energy_left += ptr_y_buf_left[l][k];
330*15dc779aSAndroid Build Coastguard Worker } else {
331*15dc779aSAndroid Build Coastguard Worker energy_left += ptr_y_buf_left[l / 2][k];
332*15dc779aSAndroid Build Coastguard Worker }
333*15dc779aSAndroid Build Coastguard Worker }
334*15dc779aSAndroid Build Coastguard Worker k++;
335*15dc779aSAndroid Build Coastguard Worker }
336*15dc779aSAndroid Build Coastguard Worker
337*15dc779aSAndroid Build Coastguard Worker if (stereo_mode == SBR_COUPLING) {
338*15dc779aSAndroid Build Coastguard Worker k = li;
339*15dc779aSAndroid Build Coastguard Worker while (k < ui) {
340*15dc779aSAndroid Build Coastguard Worker for (l = start_pos; l < stop_pos; l++) {
341*15dc779aSAndroid Build Coastguard Worker energy_right += ptr_y_buf_right[l / 2][k];
342*15dc779aSAndroid Build Coastguard Worker }
343*15dc779aSAndroid Build Coastguard Worker k++;
344*15dc779aSAndroid Build Coastguard Worker }
345*15dc779aSAndroid Build Coastguard Worker tmp_ene_l = energy_left;
346*15dc779aSAndroid Build Coastguard Worker energy_left = (energy_left + energy_right) * 0.5f;
347*15dc779aSAndroid Build Coastguard Worker energy_right = (tmp_ene_l + 1) / (energy_right + 1);
348*15dc779aSAndroid Build Coastguard Worker }
349*15dc779aSAndroid Build Coastguard Worker }
350*15dc779aSAndroid Build Coastguard Worker
351*15dc779aSAndroid Build Coastguard Worker energy_left = (FLOAT32)(log(energy_left / (count * 64) + EPS) * SBR_INV_LOG_2);
352*15dc779aSAndroid Build Coastguard Worker
353*15dc779aSAndroid Build Coastguard Worker if (energy_left < 0.0f) {
354*15dc779aSAndroid Build Coastguard Worker energy_left = 0.0f;
355*15dc779aSAndroid Build Coastguard Worker }
356*15dc779aSAndroid Build Coastguard Worker
357*15dc779aSAndroid Build Coastguard Worker ptr_sfb_ene_l[m] = (WORD32)(ca * energy_left + 0.5);
358*15dc779aSAndroid Build Coastguard Worker
359*15dc779aSAndroid Build Coastguard Worker if (stereo_mode == SBR_COUPLING) {
360*15dc779aSAndroid Build Coastguard Worker WORD32 quant_err;
361*15dc779aSAndroid Build Coastguard Worker energy_right = (FLOAT32)(log(energy_right) * SBR_INV_LOG_2);
362*15dc779aSAndroid Build Coastguard Worker ptr_sfb_ene_r[m] =
363*15dc779aSAndroid Build Coastguard Worker ixheaace_map_panorama((WORD32)((FLOAT32)ca * energy_right),
364*15dc779aSAndroid Build Coastguard Worker pstr_sbr->enc_env_data.init_sbr_amp_res, &quant_err);
365*15dc779aSAndroid Build Coastguard Worker if (quant_err > *ptr_max_quant_err) {
366*15dc779aSAndroid Build Coastguard Worker *ptr_max_quant_err = quant_err;
367*15dc779aSAndroid Build Coastguard Worker }
368*15dc779aSAndroid Build Coastguard Worker }
369*15dc779aSAndroid Build Coastguard Worker m++;
370*15dc779aSAndroid Build Coastguard Worker }
371*15dc779aSAndroid Build Coastguard Worker
372*15dc779aSAndroid Build Coastguard Worker if (pstr_sbr_cfg->use_parametric_coding) {
373*15dc779aSAndroid Build Coastguard Worker m -= num_bands;
374*15dc779aSAndroid Build Coastguard Worker
375*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < num_bands; j++) {
376*15dc779aSAndroid Build Coastguard Worker if (freq_res == FREQ_RES_HIGH && pstr_sbr->str_sbr_extract_env.envelope_compensation[j]) {
377*15dc779aSAndroid Build Coastguard Worker ptr_sfb_ene_l[m] -= (WORD32)(
378*15dc779aSAndroid Build Coastguard Worker ca * ixheaac_abs32(pstr_sbr->str_sbr_extract_env.envelope_compensation[j]));
379*15dc779aSAndroid Build Coastguard Worker }
380*15dc779aSAndroid Build Coastguard Worker
381*15dc779aSAndroid Build Coastguard Worker if (ptr_sfb_ene_l[m] < 0) {
382*15dc779aSAndroid Build Coastguard Worker ptr_sfb_ene_l[m] = 0;
383*15dc779aSAndroid Build Coastguard Worker }
384*15dc779aSAndroid Build Coastguard Worker m++;
385*15dc779aSAndroid Build Coastguard Worker }
386*15dc779aSAndroid Build Coastguard Worker }
387*15dc779aSAndroid Build Coastguard Worker i++;
388*15dc779aSAndroid Build Coastguard Worker }
389*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
390*15dc779aSAndroid Build Coastguard Worker }
ixheaace_get_pitch_bin_deint(FLOAT32 * ptr_fft_data_real,FLOAT32 * ptr_fft_data_im,const WORD32 * ptr_sfb_tab,WORD32 is_4_1)391*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaace_get_pitch_bin_deint(FLOAT32 *ptr_fft_data_real, FLOAT32 *ptr_fft_data_im,
392*15dc779aSAndroid Build Coastguard Worker const WORD32 *ptr_sfb_tab, WORD32 is_4_1) {
393*15dc779aSAndroid Build Coastguard Worker WORD32 i, j = 0, k = 0;
394*15dc779aSAndroid Build Coastguard Worker WORD32 bin = -1;
395*15dc779aSAndroid Build Coastguard Worker FLOAT32 tmp, prev_val = 0.0f;
396*15dc779aSAndroid Build Coastguard Worker
397*15dc779aSAndroid Build Coastguard Worker while (ptr_sfb_tab[j] != -1) {
398*15dc779aSAndroid Build Coastguard Worker WORD32 size = ptr_sfb_tab[j];
399*15dc779aSAndroid Build Coastguard Worker tmp = 0;
400*15dc779aSAndroid Build Coastguard Worker
401*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < size; i++) {
402*15dc779aSAndroid Build Coastguard Worker tmp += ptr_fft_data_real[k / 2] * ptr_fft_data_real[k / 2];
403*15dc779aSAndroid Build Coastguard Worker tmp += ptr_fft_data_im[k / 2] * ptr_fft_data_im[k / 2];
404*15dc779aSAndroid Build Coastguard Worker k += 2;
405*15dc779aSAndroid Build Coastguard Worker }
406*15dc779aSAndroid Build Coastguard Worker
407*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)log(max(MIN_FLT_VAL, (tmp / (FLOAT32)size)));
408*15dc779aSAndroid Build Coastguard Worker if (j != 0) {
409*15dc779aSAndroid Build Coastguard Worker if (fabs(tmp - prev_val) >= 3.0f) {
410*15dc779aSAndroid Build Coastguard Worker if (1 == is_4_1) {
411*15dc779aSAndroid Build Coastguard Worker bin = ((k - (ptr_sfb_tab[j] * 2)) * 3) / 8;
412*15dc779aSAndroid Build Coastguard Worker } else {
413*15dc779aSAndroid Build Coastguard Worker bin = ((k - (ptr_sfb_tab[j] * 2)) * 3) / 4;
414*15dc779aSAndroid Build Coastguard Worker }
415*15dc779aSAndroid Build Coastguard Worker if (bin > 127) {
416*15dc779aSAndroid Build Coastguard Worker bin = -1;
417*15dc779aSAndroid Build Coastguard Worker }
418*15dc779aSAndroid Build Coastguard Worker break;
419*15dc779aSAndroid Build Coastguard Worker }
420*15dc779aSAndroid Build Coastguard Worker }
421*15dc779aSAndroid Build Coastguard Worker prev_val = tmp;
422*15dc779aSAndroid Build Coastguard Worker j++;
423*15dc779aSAndroid Build Coastguard Worker }
424*15dc779aSAndroid Build Coastguard Worker
425*15dc779aSAndroid Build Coastguard Worker return bin;
426*15dc779aSAndroid Build Coastguard Worker }
ixheaace_get_pitch_bin(FLOAT32 * fft_data,const WORD32 * ptr_sfb_tab,WORD32 is_4_1)427*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaace_get_pitch_bin(FLOAT32 *fft_data, const WORD32 *ptr_sfb_tab,
428*15dc779aSAndroid Build Coastguard Worker WORD32 is_4_1) {
429*15dc779aSAndroid Build Coastguard Worker WORD32 i, j = 0, k = 0;
430*15dc779aSAndroid Build Coastguard Worker WORD32 bin = -1;
431*15dc779aSAndroid Build Coastguard Worker FLOAT32 tmp, prev_val = 0;
432*15dc779aSAndroid Build Coastguard Worker
433*15dc779aSAndroid Build Coastguard Worker while (ptr_sfb_tab[j] != -1) {
434*15dc779aSAndroid Build Coastguard Worker WORD32 size = ptr_sfb_tab[j];
435*15dc779aSAndroid Build Coastguard Worker tmp = 0;
436*15dc779aSAndroid Build Coastguard Worker
437*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < size; i++) {
438*15dc779aSAndroid Build Coastguard Worker tmp += fft_data[k] * fft_data[k];
439*15dc779aSAndroid Build Coastguard Worker tmp += fft_data[k + 1] * fft_data[k + 1];
440*15dc779aSAndroid Build Coastguard Worker k += 2;
441*15dc779aSAndroid Build Coastguard Worker }
442*15dc779aSAndroid Build Coastguard Worker
443*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)log(MAX(MIN_FLT_VAL, (tmp / (FLOAT32)size)));
444*15dc779aSAndroid Build Coastguard Worker if (j != 0) {
445*15dc779aSAndroid Build Coastguard Worker if (fabs(tmp - prev_val) >= 3.0f) {
446*15dc779aSAndroid Build Coastguard Worker if (1 == is_4_1) {
447*15dc779aSAndroid Build Coastguard Worker bin = ((k - (ptr_sfb_tab[j] * 2)) * 3) / 8;
448*15dc779aSAndroid Build Coastguard Worker } else {
449*15dc779aSAndroid Build Coastguard Worker bin = ((k - (ptr_sfb_tab[j] * 2)) * 3) / 4;
450*15dc779aSAndroid Build Coastguard Worker }
451*15dc779aSAndroid Build Coastguard Worker if (bin > 127) {
452*15dc779aSAndroid Build Coastguard Worker bin = -1;
453*15dc779aSAndroid Build Coastguard Worker }
454*15dc779aSAndroid Build Coastguard Worker break;
455*15dc779aSAndroid Build Coastguard Worker }
456*15dc779aSAndroid Build Coastguard Worker }
457*15dc779aSAndroid Build Coastguard Worker prev_val = tmp;
458*15dc779aSAndroid Build Coastguard Worker j++;
459*15dc779aSAndroid Build Coastguard Worker }
460*15dc779aSAndroid Build Coastguard Worker
461*15dc779aSAndroid Build Coastguard Worker return bin;
462*15dc779aSAndroid Build Coastguard Worker }
ixheaace_hbe_get_pitch_bins(FLOAT32 * ptr_time_in,ixheaace_pstr_sbr_config_data pstr_sbr_cfg,FLOAT32 * ptr_esbr_scr,ixheaace_str_sbr_tabs * ptr_sbr_tab,WORD32 time_sn_stride,WORD32 num_samples,WORD32 * bin1,WORD32 * bin2)463*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ixheaace_hbe_get_pitch_bins(FLOAT32 *ptr_time_in,
464*15dc779aSAndroid Build Coastguard Worker ixheaace_pstr_sbr_config_data pstr_sbr_cfg,
465*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_esbr_scr,
466*15dc779aSAndroid Build Coastguard Worker ixheaace_str_sbr_tabs *ptr_sbr_tab,
467*15dc779aSAndroid Build Coastguard Worker WORD32 time_sn_stride, WORD32 num_samples,
468*15dc779aSAndroid Build Coastguard Worker WORD32 *bin1, WORD32 *bin2) {
469*15dc779aSAndroid Build Coastguard Worker const WORD32 *ptr_sbr_table = NULL;
470*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_esbr_inp = ptr_esbr_scr;
471*15dc779aSAndroid Build Coastguard Worker ptr_esbr_scr += num_samples * 2;
472*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_esbr_inp_i = ptr_esbr_inp + num_samples;
473*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_scratch_fft = ptr_esbr_scr;
474*15dc779aSAndroid Build Coastguard Worker WORD32 idx, sf, is_4_1 = 0;
475*15dc779aSAndroid Build Coastguard Worker
476*15dc779aSAndroid Build Coastguard Worker sf = pstr_sbr_cfg->sample_freq;
477*15dc779aSAndroid Build Coastguard Worker if (IXHEAACE_MAX_NUM_SAMPLES == num_samples) {
478*15dc779aSAndroid Build Coastguard Worker sf = sf >> 1;
479*15dc779aSAndroid Build Coastguard Worker is_4_1 = 1;
480*15dc779aSAndroid Build Coastguard Worker }
481*15dc779aSAndroid Build Coastguard Worker
482*15dc779aSAndroid Build Coastguard Worker switch (sf) {
483*15dc779aSAndroid Build Coastguard Worker case 16000:
484*15dc779aSAndroid Build Coastguard Worker ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_8k;
485*15dc779aSAndroid Build Coastguard Worker break;
486*15dc779aSAndroid Build Coastguard Worker case 22050:
487*15dc779aSAndroid Build Coastguard Worker ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_11k;
488*15dc779aSAndroid Build Coastguard Worker break;
489*15dc779aSAndroid Build Coastguard Worker case 24000:
490*15dc779aSAndroid Build Coastguard Worker ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_12k;
491*15dc779aSAndroid Build Coastguard Worker break;
492*15dc779aSAndroid Build Coastguard Worker case 32000:
493*15dc779aSAndroid Build Coastguard Worker ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_16k;
494*15dc779aSAndroid Build Coastguard Worker break;
495*15dc779aSAndroid Build Coastguard Worker case 44100:
496*15dc779aSAndroid Build Coastguard Worker ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_22k;
497*15dc779aSAndroid Build Coastguard Worker break;
498*15dc779aSAndroid Build Coastguard Worker case 48000:
499*15dc779aSAndroid Build Coastguard Worker ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_24k;
500*15dc779aSAndroid Build Coastguard Worker break;
501*15dc779aSAndroid Build Coastguard Worker default:
502*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_EXE_FATAL_SBR_INVALID_SAMP_FREQ;
503*15dc779aSAndroid Build Coastguard Worker }
504*15dc779aSAndroid Build Coastguard Worker if (1 == pstr_sbr_cfg->num_ch) {
505*15dc779aSAndroid Build Coastguard Worker if (num_samples == 2048) {
506*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < num_samples; idx += 2) {
507*15dc779aSAndroid Build Coastguard Worker ptr_esbr_inp[idx] = ptr_time_in[time_sn_stride * idx];
508*15dc779aSAndroid Build Coastguard Worker ptr_esbr_inp[idx + 1] = 0;
509*15dc779aSAndroid Build Coastguard Worker ptr_esbr_inp[num_samples + idx] = ptr_time_in[time_sn_stride * (idx + 1)];
510*15dc779aSAndroid Build Coastguard Worker ptr_esbr_inp[num_samples + idx + 1] = 0;
511*15dc779aSAndroid Build Coastguard Worker }
512*15dc779aSAndroid Build Coastguard Worker iusace_complex_fft_2048(ptr_esbr_inp, ptr_scratch_fft);
513*15dc779aSAndroid Build Coastguard Worker *bin1 = ixheaace_get_pitch_bin(ptr_esbr_inp, ptr_sbr_table, is_4_1);
514*15dc779aSAndroid Build Coastguard Worker } else if (num_samples == IXHEAACE_MAX_NUM_SAMPLES) {
515*15dc779aSAndroid Build Coastguard Worker memset(ptr_esbr_inp_i, 0, num_samples * sizeof(ptr_esbr_inp_i[0]));
516*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < num_samples; idx += 2) {
517*15dc779aSAndroid Build Coastguard Worker ptr_esbr_inp[idx / 2] = ptr_time_in[time_sn_stride * idx];
518*15dc779aSAndroid Build Coastguard Worker ptr_esbr_inp[(num_samples + idx) / 2] = ptr_time_in[time_sn_stride * (idx + 1)];
519*15dc779aSAndroid Build Coastguard Worker }
520*15dc779aSAndroid Build Coastguard Worker iusace_complex_fft_4096(ptr_esbr_inp, ptr_esbr_inp_i, ptr_scratch_fft);
521*15dc779aSAndroid Build Coastguard Worker *bin1 = ixheaace_get_pitch_bin_deint(ptr_esbr_inp, ptr_esbr_inp_i, ptr_sbr_table, is_4_1);
522*15dc779aSAndroid Build Coastguard Worker }
523*15dc779aSAndroid Build Coastguard Worker } else {
524*15dc779aSAndroid Build Coastguard Worker if (num_samples == 2048) {
525*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < num_samples; idx += 2) {
526*15dc779aSAndroid Build Coastguard Worker ptr_esbr_inp[idx] = ptr_time_in[2 * idx];
527*15dc779aSAndroid Build Coastguard Worker ptr_esbr_inp[idx + 1] = 0;
528*15dc779aSAndroid Build Coastguard Worker ptr_esbr_inp[num_samples + idx] = ptr_time_in[2 * idx + 2];
529*15dc779aSAndroid Build Coastguard Worker ptr_esbr_inp[num_samples + idx + 1] = 0;
530*15dc779aSAndroid Build Coastguard Worker }
531*15dc779aSAndroid Build Coastguard Worker iusace_complex_fft_2048(ptr_esbr_inp, ptr_scratch_fft);
532*15dc779aSAndroid Build Coastguard Worker *bin1 = ixheaace_get_pitch_bin(ptr_esbr_inp, ptr_sbr_table, is_4_1);
533*15dc779aSAndroid Build Coastguard Worker
534*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < num_samples; idx += 2) {
535*15dc779aSAndroid Build Coastguard Worker ptr_esbr_inp[idx] = ptr_time_in[2 * idx + 1];
536*15dc779aSAndroid Build Coastguard Worker ptr_esbr_inp[idx + 1] = 0;
537*15dc779aSAndroid Build Coastguard Worker ptr_esbr_inp[num_samples + idx] = ptr_time_in[2 * idx + 3];
538*15dc779aSAndroid Build Coastguard Worker ptr_esbr_inp[num_samples + idx + 1] = 0;
539*15dc779aSAndroid Build Coastguard Worker }
540*15dc779aSAndroid Build Coastguard Worker iusace_complex_fft_2048(ptr_esbr_inp, ptr_scratch_fft);
541*15dc779aSAndroid Build Coastguard Worker *bin2 = ixheaace_get_pitch_bin(ptr_esbr_inp, ptr_sbr_table, is_4_1);
542*15dc779aSAndroid Build Coastguard Worker } else if (num_samples == IXHEAACE_MAX_NUM_SAMPLES) {
543*15dc779aSAndroid Build Coastguard Worker memset(ptr_esbr_inp_i, 0, num_samples * sizeof(ptr_esbr_inp_i[0]));
544*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < num_samples; idx += 2) {
545*15dc779aSAndroid Build Coastguard Worker ptr_esbr_inp[idx / 2] = ptr_time_in[2 * idx];
546*15dc779aSAndroid Build Coastguard Worker ptr_esbr_inp[(num_samples + idx) / 2] = ptr_time_in[2 * idx + 2];
547*15dc779aSAndroid Build Coastguard Worker }
548*15dc779aSAndroid Build Coastguard Worker iusace_complex_fft_4096(ptr_esbr_inp, ptr_esbr_inp_i, ptr_scratch_fft);
549*15dc779aSAndroid Build Coastguard Worker *bin1 = ixheaace_get_pitch_bin_deint(ptr_esbr_inp, ptr_esbr_inp_i, ptr_sbr_table, is_4_1);
550*15dc779aSAndroid Build Coastguard Worker
551*15dc779aSAndroid Build Coastguard Worker memset(ptr_esbr_inp_i, 0, num_samples * sizeof(ptr_esbr_inp_i[0]));
552*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < num_samples; idx += 2) {
553*15dc779aSAndroid Build Coastguard Worker ptr_esbr_inp[idx / 2] = ptr_time_in[2 * idx + 1];
554*15dc779aSAndroid Build Coastguard Worker ptr_esbr_inp[(num_samples + idx) / 2] = ptr_time_in[2 * idx + 3];
555*15dc779aSAndroid Build Coastguard Worker }
556*15dc779aSAndroid Build Coastguard Worker iusace_complex_fft_4096(ptr_esbr_inp, ptr_esbr_inp_i, ptr_scratch_fft);
557*15dc779aSAndroid Build Coastguard Worker *bin2 = ixheaace_get_pitch_bin_deint(ptr_esbr_inp, ptr_esbr_inp_i, ptr_sbr_table, is_4_1);
558*15dc779aSAndroid Build Coastguard Worker }
559*15dc779aSAndroid Build Coastguard Worker }
560*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
561*15dc779aSAndroid Build Coastguard Worker }
ixheaace_update_esbr_ext_data(FLOAT32 * ptr_time_in,ixheaace_pstr_sbr_config_data pstr_sbr_cfg,FLOAT32 * ptr_esbr_scr,ixheaace_str_esbr_bs_data * pstr_esbr,WORD32 transient_info[][3],ixheaace_str_sbr_tabs * ptr_sbr_tab,WORD32 coupling,WORD32 time_sn_stride,WORD32 num_samples)562*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ixheaace_update_esbr_ext_data(
563*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_time_in, ixheaace_pstr_sbr_config_data pstr_sbr_cfg, FLOAT32 *ptr_esbr_scr,
564*15dc779aSAndroid Build Coastguard Worker ixheaace_str_esbr_bs_data *pstr_esbr, WORD32 transient_info[][3],
565*15dc779aSAndroid Build Coastguard Worker ixheaace_str_sbr_tabs *ptr_sbr_tab, WORD32 coupling, WORD32 time_sn_stride,
566*15dc779aSAndroid Build Coastguard Worker WORD32 num_samples) {
567*15dc779aSAndroid Build Coastguard Worker WORD32 bin, bin1;
568*15dc779aSAndroid Build Coastguard Worker const WORD32 *ptr_sbr_table = NULL;
569*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_esbr_inp = ptr_esbr_scr;
570*15dc779aSAndroid Build Coastguard Worker ptr_esbr_scr += num_samples * 2;
571*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_scratch_fft = ptr_esbr_scr;
572*15dc779aSAndroid Build Coastguard Worker WORD32 idx;
573*15dc779aSAndroid Build Coastguard Worker switch (pstr_sbr_cfg->sample_freq) {
574*15dc779aSAndroid Build Coastguard Worker case 16000:
575*15dc779aSAndroid Build Coastguard Worker ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_8k;
576*15dc779aSAndroid Build Coastguard Worker break;
577*15dc779aSAndroid Build Coastguard Worker case 22050:
578*15dc779aSAndroid Build Coastguard Worker ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_11k;
579*15dc779aSAndroid Build Coastguard Worker break;
580*15dc779aSAndroid Build Coastguard Worker case 24000:
581*15dc779aSAndroid Build Coastguard Worker ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_12k;
582*15dc779aSAndroid Build Coastguard Worker break;
583*15dc779aSAndroid Build Coastguard Worker case 32000:
584*15dc779aSAndroid Build Coastguard Worker ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_16k;
585*15dc779aSAndroid Build Coastguard Worker break;
586*15dc779aSAndroid Build Coastguard Worker case 44100:
587*15dc779aSAndroid Build Coastguard Worker ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_22k;
588*15dc779aSAndroid Build Coastguard Worker break;
589*15dc779aSAndroid Build Coastguard Worker case 48000:
590*15dc779aSAndroid Build Coastguard Worker ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_24k;
591*15dc779aSAndroid Build Coastguard Worker break;
592*15dc779aSAndroid Build Coastguard Worker default:
593*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_EXE_FATAL_SBR_INVALID_SAMP_FREQ;
594*15dc779aSAndroid Build Coastguard Worker }
595*15dc779aSAndroid Build Coastguard Worker if (1 == pstr_sbr_cfg->num_ch) {
596*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < num_samples; idx += 2) {
597*15dc779aSAndroid Build Coastguard Worker ptr_esbr_inp[idx] = ptr_time_in[time_sn_stride * idx];
598*15dc779aSAndroid Build Coastguard Worker ptr_esbr_inp[idx + 1] = 0;
599*15dc779aSAndroid Build Coastguard Worker ptr_esbr_inp[num_samples + idx] = ptr_time_in[time_sn_stride * (idx + 1)];
600*15dc779aSAndroid Build Coastguard Worker ptr_esbr_inp[num_samples + idx + 1] = 0;
601*15dc779aSAndroid Build Coastguard Worker }
602*15dc779aSAndroid Build Coastguard Worker iusace_complex_fft_2048(ptr_esbr_inp, ptr_scratch_fft);
603*15dc779aSAndroid Build Coastguard Worker bin = ixheaace_get_pitch_bin(ptr_esbr_inp, ptr_sbr_table, 0);
604*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_num_chan = 1;
605*15dc779aSAndroid Build Coastguard Worker if (transient_info[0][1] != 0) {
606*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_preprocessing = 1;
607*15dc779aSAndroid Build Coastguard Worker } else {
608*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_preprocessing = 0;
609*15dc779aSAndroid Build Coastguard Worker }
610*15dc779aSAndroid Build Coastguard Worker
611*15dc779aSAndroid Build Coastguard Worker if (transient_info[0][1] != 0 && bin != -1) {
612*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_oversampling_flag[0] = 1;
613*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_patching_mode[0] = 0;
614*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_pitchin_flags[0] = 1;
615*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_pitchin_bins[0] = (UWORD8)MIN(bin, 127);
616*15dc779aSAndroid Build Coastguard Worker } else if (bin != -1) {
617*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_oversampling_flag[0] = 0;
618*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_patching_mode[0] = 0;
619*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_pitchin_flags[0] = 1;
620*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_pitchin_bins[0] = (UWORD8)MIN(bin, 127);
621*15dc779aSAndroid Build Coastguard Worker } else if (transient_info[0][1] != 0) {
622*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_oversampling_flag[0] = 1;
623*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_patching_mode[0] = 0;
624*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_pitchin_flags[0] = 0;
625*15dc779aSAndroid Build Coastguard Worker } else {
626*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_patching_mode[0] = 1;
627*15dc779aSAndroid Build Coastguard Worker }
628*15dc779aSAndroid Build Coastguard Worker } else {
629*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_num_chan = 2;
630*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_coupling = coupling;
631*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < num_samples; idx += 2) {
632*15dc779aSAndroid Build Coastguard Worker ptr_esbr_inp[idx] = ptr_time_in[2 * idx];
633*15dc779aSAndroid Build Coastguard Worker ptr_esbr_inp[idx + 1] = 0;
634*15dc779aSAndroid Build Coastguard Worker ptr_esbr_inp[num_samples + idx] = ptr_time_in[2 * idx + 2];
635*15dc779aSAndroid Build Coastguard Worker ptr_esbr_inp[num_samples + idx + 1] = 0;
636*15dc779aSAndroid Build Coastguard Worker }
637*15dc779aSAndroid Build Coastguard Worker iusace_complex_fft_2048(ptr_esbr_inp, ptr_scratch_fft);
638*15dc779aSAndroid Build Coastguard Worker bin = ixheaace_get_pitch_bin(ptr_esbr_inp, ptr_sbr_table, 0);
639*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < num_samples; idx += 2) {
640*15dc779aSAndroid Build Coastguard Worker ptr_esbr_inp[idx] = ptr_time_in[2 * idx + 1];
641*15dc779aSAndroid Build Coastguard Worker ptr_esbr_inp[idx + 1] = 0;
642*15dc779aSAndroid Build Coastguard Worker ptr_esbr_inp[num_samples + idx] = ptr_time_in[2 * idx + 3];
643*15dc779aSAndroid Build Coastguard Worker ptr_esbr_inp[num_samples + idx + 1] = 0;
644*15dc779aSAndroid Build Coastguard Worker }
645*15dc779aSAndroid Build Coastguard Worker iusace_complex_fft_2048(ptr_esbr_inp, ptr_scratch_fft);
646*15dc779aSAndroid Build Coastguard Worker bin1 = ixheaace_get_pitch_bin(ptr_esbr_inp, ptr_sbr_table, 0);
647*15dc779aSAndroid Build Coastguard Worker
648*15dc779aSAndroid Build Coastguard Worker if (coupling) {
649*15dc779aSAndroid Build Coastguard Worker if ((transient_info[0][1] != 0 || transient_info[1][1] != 0)) {
650*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_preprocessing = 1;
651*15dc779aSAndroid Build Coastguard Worker } else {
652*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_preprocessing = 0;
653*15dc779aSAndroid Build Coastguard Worker }
654*15dc779aSAndroid Build Coastguard Worker if ((transient_info[0][1] != 0 || transient_info[1][1] != 0) && bin != -1) {
655*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_oversampling_flag[0] = 1;
656*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_patching_mode[0] = 0;
657*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_pitchin_flags[0] = 1;
658*15dc779aSAndroid Build Coastguard Worker bin = MIN(bin, bin1);
659*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_pitchin_bins[0] = (UWORD8)MIN(bin, 127);
660*15dc779aSAndroid Build Coastguard Worker } else if (bin != -1) {
661*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_oversampling_flag[0] = 0;
662*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_patching_mode[0] = 0;
663*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_pitchin_flags[0] = 1;
664*15dc779aSAndroid Build Coastguard Worker bin = MIN(bin, bin1);
665*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_pitchin_bins[0] = (UWORD8)MIN(bin, 127);
666*15dc779aSAndroid Build Coastguard Worker } else if ((transient_info[0][1] != 0 || transient_info[1][1] != 0)) {
667*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_oversampling_flag[0] = 1;
668*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_patching_mode[0] = 0;
669*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_pitchin_flags[0] = 0;
670*15dc779aSAndroid Build Coastguard Worker } else {
671*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_patching_mode[0] = 1;
672*15dc779aSAndroid Build Coastguard Worker }
673*15dc779aSAndroid Build Coastguard Worker } else {
674*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_preprocessing = 0;
675*15dc779aSAndroid Build Coastguard Worker if ((transient_info[0][1] != 0 || transient_info[1][1] != 0)) {
676*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_preprocessing = 1;
677*15dc779aSAndroid Build Coastguard Worker }
678*15dc779aSAndroid Build Coastguard Worker
679*15dc779aSAndroid Build Coastguard Worker if (transient_info[0][1] != 0 && bin != -1) {
680*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_oversampling_flag[0] = 1;
681*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_patching_mode[0] = 0;
682*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_pitchin_flags[0] = 1;
683*15dc779aSAndroid Build Coastguard Worker bin = MIN(bin, bin1);
684*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_pitchin_bins[0] = (UWORD8)MIN(bin, 127);
685*15dc779aSAndroid Build Coastguard Worker } else if (bin != -1) {
686*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_oversampling_flag[0] = 0;
687*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_patching_mode[0] = 0;
688*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_pitchin_flags[0] = 1;
689*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_pitchin_bins[0] = (UWORD8)MIN(bin, 127);
690*15dc779aSAndroid Build Coastguard Worker } else if (transient_info[0][1] != 0) {
691*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_oversampling_flag[0] = 1;
692*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_patching_mode[0] = 0;
693*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_pitchin_flags[0] = 0;
694*15dc779aSAndroid Build Coastguard Worker } else {
695*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_patching_mode[0] = 1;
696*15dc779aSAndroid Build Coastguard Worker }
697*15dc779aSAndroid Build Coastguard Worker
698*15dc779aSAndroid Build Coastguard Worker if (transient_info[1][1] != 0 && bin1 != -1) {
699*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_oversampling_flag[1] = 1;
700*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_patching_mode[1] = 0;
701*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_pitchin_flags[1] = 1;
702*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_pitchin_bins[1] = (UWORD8)MIN(bin1, 127);
703*15dc779aSAndroid Build Coastguard Worker } else if (bin1 != -1) {
704*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_oversampling_flag[1] = 0;
705*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_patching_mode[1] = 0;
706*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_pitchin_flags[1] = 1;
707*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_pitchin_bins[1] = (UWORD8)MIN(bin1, 127);
708*15dc779aSAndroid Build Coastguard Worker } else if (transient_info[1][1] != 0) {
709*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_oversampling_flag[1] = 1;
710*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_patching_mode[1] = 0;
711*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_pitchin_flags[1] = 0;
712*15dc779aSAndroid Build Coastguard Worker } else {
713*15dc779aSAndroid Build Coastguard Worker pstr_esbr->sbr_patching_mode[1] = 1;
714*15dc779aSAndroid Build Coastguard Worker }
715*15dc779aSAndroid Build Coastguard Worker }
716*15dc779aSAndroid Build Coastguard Worker }
717*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
718*15dc779aSAndroid Build Coastguard Worker }
719*15dc779aSAndroid Build Coastguard Worker
ixheaace_update_harmonic_sbr_data(WORD32 transient_info[][3],WORD32 coupling,ixheaace_pstr_enc_channel * pstr_enc_ch,WORD32 num_channels)720*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_update_harmonic_sbr_data(
721*15dc779aSAndroid Build Coastguard Worker WORD32 transient_info[][3], WORD32 coupling,
722*15dc779aSAndroid Build Coastguard Worker ixheaace_pstr_enc_channel *pstr_enc_ch, WORD32 num_channels) {
723*15dc779aSAndroid Build Coastguard Worker WORD32 bin, bin1;
724*15dc779aSAndroid Build Coastguard Worker struct ixheaace_str_sbr_env_data *pstr_sbr_env_left = NULL;
725*15dc779aSAndroid Build Coastguard Worker struct ixheaace_str_sbr_env_data *pstr_sbr_env_right = NULL;
726*15dc779aSAndroid Build Coastguard Worker if (1 == num_channels) {
727*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left = &pstr_enc_ch[0]->enc_env_data;
728*15dc779aSAndroid Build Coastguard Worker bin = pstr_sbr_env_left->sbr_pitchin_bins;
729*15dc779aSAndroid Build Coastguard Worker if (transient_info[0][1] != 0) {
730*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_preprocessing = 1;
731*15dc779aSAndroid Build Coastguard Worker } else {
732*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_preprocessing = 0;
733*15dc779aSAndroid Build Coastguard Worker }
734*15dc779aSAndroid Build Coastguard Worker
735*15dc779aSAndroid Build Coastguard Worker if (transient_info[0][1] != 0 && bin != -1) {
736*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_oversampling_flag = 1;
737*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_patching_mode = 0;
738*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_pitchin_bins_flag = 1;
739*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_pitchin_bins = min(bin, 127);
740*15dc779aSAndroid Build Coastguard Worker } else if (bin != -1) {
741*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_oversampling_flag = 0;
742*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_patching_mode = 0;
743*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_pitchin_bins_flag = 1;
744*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_pitchin_bins = min(bin, 127);
745*15dc779aSAndroid Build Coastguard Worker } else if (transient_info[0][1] != 0) {
746*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_oversampling_flag = 1;
747*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_patching_mode = 0;
748*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_pitchin_bins = 0;
749*15dc779aSAndroid Build Coastguard Worker } else {
750*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_patching_mode = 1;
751*15dc779aSAndroid Build Coastguard Worker }
752*15dc779aSAndroid Build Coastguard Worker } else {
753*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left = &pstr_enc_ch[0]->enc_env_data;
754*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_right = &pstr_enc_ch[1]->enc_env_data;
755*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_coupling = coupling;
756*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_right->sbr_coupling = coupling;
757*15dc779aSAndroid Build Coastguard Worker bin = pstr_sbr_env_left->sbr_pitchin_bins;
758*15dc779aSAndroid Build Coastguard Worker
759*15dc779aSAndroid Build Coastguard Worker bin1 = pstr_sbr_env_right->sbr_pitchin_bins;
760*15dc779aSAndroid Build Coastguard Worker
761*15dc779aSAndroid Build Coastguard Worker if (coupling) {
762*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_right->sbr_preprocessing = 1;
763*15dc779aSAndroid Build Coastguard Worker if ((transient_info[0][1] != 0 || transient_info[1][1] != 0)) {
764*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_preprocessing = 1;
765*15dc779aSAndroid Build Coastguard Worker } else {
766*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_preprocessing = 0;
767*15dc779aSAndroid Build Coastguard Worker }
768*15dc779aSAndroid Build Coastguard Worker if ((transient_info[0][1] != 0 || transient_info[1][1] != 0) && bin != -1) {
769*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_oversampling_flag = 1;
770*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_patching_mode = 0;
771*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_pitchin_bins_flag = 1;
772*15dc779aSAndroid Build Coastguard Worker bin = min(bin, bin1);
773*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_pitchin_bins = min(bin, 127);
774*15dc779aSAndroid Build Coastguard Worker } else if (bin != -1) {
775*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_oversampling_flag = 0;
776*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_patching_mode = 0;
777*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_pitchin_bins_flag = 1;
778*15dc779aSAndroid Build Coastguard Worker bin = min(bin, bin1);
779*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_pitchin_bins = min(bin, 127);
780*15dc779aSAndroid Build Coastguard Worker } else if ((transient_info[0][1] != 0 || transient_info[1][1] != 0)) {
781*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_oversampling_flag = 1;
782*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_patching_mode = 0;
783*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_pitchin_bins_flag = 0;
784*15dc779aSAndroid Build Coastguard Worker } else {
785*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_patching_mode = 1;
786*15dc779aSAndroid Build Coastguard Worker }
787*15dc779aSAndroid Build Coastguard Worker } else {
788*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_preprocessing = 0;
789*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_right->sbr_preprocessing = 0;
790*15dc779aSAndroid Build Coastguard Worker if ((transient_info[0][1] != 0 || transient_info[1][1] != 0)) {
791*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_preprocessing = 1;
792*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_right->sbr_preprocessing = 1;
793*15dc779aSAndroid Build Coastguard Worker }
794*15dc779aSAndroid Build Coastguard Worker
795*15dc779aSAndroid Build Coastguard Worker if (transient_info[0][1] != 0 && bin != -1) {
796*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_oversampling_flag = 1;
797*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_patching_mode = 0;
798*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_pitchin_bins_flag = 1;
799*15dc779aSAndroid Build Coastguard Worker bin = min(bin, bin1);
800*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_pitchin_bins = min(bin, 127);
801*15dc779aSAndroid Build Coastguard Worker } else if (bin != -1) {
802*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_oversampling_flag = 0;
803*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_patching_mode = 0;
804*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_pitchin_bins_flag = 1;
805*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_pitchin_bins = min(bin, 127);
806*15dc779aSAndroid Build Coastguard Worker } else if (transient_info[0][1] != 0) {
807*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_oversampling_flag = 1;
808*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_patching_mode = 0;
809*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_pitchin_bins_flag = 0;
810*15dc779aSAndroid Build Coastguard Worker } else {
811*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_left->sbr_patching_mode = 1;
812*15dc779aSAndroid Build Coastguard Worker }
813*15dc779aSAndroid Build Coastguard Worker
814*15dc779aSAndroid Build Coastguard Worker if (transient_info[1][1] != 0 && bin1 != -1) {
815*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_right->sbr_oversampling_flag = 1;
816*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_right->sbr_patching_mode = 0;
817*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_right->sbr_pitchin_bins_flag = 1;
818*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_right->sbr_pitchin_bins = bin1 < 127 ? bin1 : 127;
819*15dc779aSAndroid Build Coastguard Worker } else if (bin1 != -1) {
820*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_right->sbr_oversampling_flag = 0;
821*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_right->sbr_patching_mode = 0;
822*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_right->sbr_pitchin_bins_flag = 1;
823*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_right->sbr_pitchin_bins = bin1 < 127 ? bin1 : 127;
824*15dc779aSAndroid Build Coastguard Worker } else if (transient_info[1][1] != 0) {
825*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_right->sbr_oversampling_flag = 1;
826*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_right->sbr_patching_mode = 0;
827*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_right->sbr_pitchin_bins_flag = 0;
828*15dc779aSAndroid Build Coastguard Worker } else {
829*15dc779aSAndroid Build Coastguard Worker pstr_sbr_env_right->sbr_patching_mode = 1;
830*15dc779aSAndroid Build Coastguard Worker }
831*15dc779aSAndroid Build Coastguard Worker }
832*15dc779aSAndroid Build Coastguard Worker }
833*15dc779aSAndroid Build Coastguard Worker }
834*15dc779aSAndroid Build Coastguard Worker
ixheaace_esbr_qmf_init(ia_sbr_qmf_filter_bank_struct * pstr_codec_qmf_bank,WORD32 sbr_ratio_idx,WORD32 output_frame_size)835*15dc779aSAndroid Build Coastguard Worker VOID ixheaace_esbr_qmf_init(ia_sbr_qmf_filter_bank_struct *pstr_codec_qmf_bank,
836*15dc779aSAndroid Build Coastguard Worker WORD32 sbr_ratio_idx, WORD32 output_frame_size) {
837*15dc779aSAndroid Build Coastguard Worker pstr_codec_qmf_bank->pstr_qmf_dec_tabs =
838*15dc779aSAndroid Build Coastguard Worker (ixheaace_str_qmf_dec_tabs_struct *)&ixheaace_str_aac_qmf_tabs;
839*15dc779aSAndroid Build Coastguard Worker memset(
840*15dc779aSAndroid Build Coastguard Worker pstr_codec_qmf_bank->anal_filter_states_32, 0,
841*15dc779aSAndroid Build Coastguard Worker sizeof(pstr_codec_qmf_bank->anal_filter_states_32[0]) * IXHEAACE_QMF_FILTER_STATE_ANA_SIZE);
842*15dc779aSAndroid Build Coastguard Worker pstr_codec_qmf_bank->num_time_slots = (WORD16)(output_frame_size / 64);
843*15dc779aSAndroid Build Coastguard Worker pstr_codec_qmf_bank->ptr_filter_pos_32 = ixheaace_str_aac_qmf_tabs.esbr_qmf_c;
844*15dc779aSAndroid Build Coastguard Worker pstr_codec_qmf_bank->ptr_state_new_samples_pos_low_32 =
845*15dc779aSAndroid Build Coastguard Worker pstr_codec_qmf_bank->anal_filter_states_32;
846*15dc779aSAndroid Build Coastguard Worker pstr_codec_qmf_bank->ptr_ana_win_coeff_32 = ixheaace_str_aac_qmf_tabs.esbr_qmf_c;
847*15dc779aSAndroid Build Coastguard Worker
848*15dc779aSAndroid Build Coastguard Worker switch (sbr_ratio_idx) {
849*15dc779aSAndroid Build Coastguard Worker case USAC_SBR_RATIO_INDEX_2_1:
850*15dc779aSAndroid Build Coastguard Worker pstr_codec_qmf_bank->no_channels = 32;
851*15dc779aSAndroid Build Coastguard Worker pstr_codec_qmf_bank->ptr_esbr_cos_twiddle =
852*15dc779aSAndroid Build Coastguard Worker ixheaace_str_aac_qmf_tabs.esbr_sin_cos_twiddle_l32;
853*15dc779aSAndroid Build Coastguard Worker pstr_codec_qmf_bank->ptr_esbr_alt_sin_twiddle =
854*15dc779aSAndroid Build Coastguard Worker ixheaace_str_aac_qmf_tabs.esbr_alt_sin_twiddle_l32;
855*15dc779aSAndroid Build Coastguard Worker pstr_codec_qmf_bank->ptr_esbr_t_cos = ixheaace_str_aac_qmf_tabs.esbr_t_cos_sin_l32;
856*15dc779aSAndroid Build Coastguard Worker break;
857*15dc779aSAndroid Build Coastguard Worker case USAC_SBR_RATIO_INDEX_8_3:
858*15dc779aSAndroid Build Coastguard Worker pstr_codec_qmf_bank->no_channels = 24;
859*15dc779aSAndroid Build Coastguard Worker pstr_codec_qmf_bank->ptr_filter_pos_32 = ixheaace_str_aac_qmf_tabs.esbr_qmf_c_24;
860*15dc779aSAndroid Build Coastguard Worker pstr_codec_qmf_bank->ptr_ana_win_coeff_32 = ixheaace_str_aac_qmf_tabs.esbr_qmf_c_24;
861*15dc779aSAndroid Build Coastguard Worker pstr_codec_qmf_bank->ptr_esbr_cos_twiddle =
862*15dc779aSAndroid Build Coastguard Worker ixheaace_str_aac_qmf_tabs.esbr_sin_cos_twiddle_l24;
863*15dc779aSAndroid Build Coastguard Worker pstr_codec_qmf_bank->ptr_esbr_alt_sin_twiddle =
864*15dc779aSAndroid Build Coastguard Worker ixheaace_str_aac_qmf_tabs.esbr_alt_sin_twiddle_l24;
865*15dc779aSAndroid Build Coastguard Worker pstr_codec_qmf_bank->ptr_esbr_t_cos = ixheaace_str_aac_qmf_tabs.esbr_t_cos_sin_l24;
866*15dc779aSAndroid Build Coastguard Worker break;
867*15dc779aSAndroid Build Coastguard Worker case USAC_SBR_RATIO_INDEX_4_1:
868*15dc779aSAndroid Build Coastguard Worker pstr_codec_qmf_bank->no_channels = 16;
869*15dc779aSAndroid Build Coastguard Worker pstr_codec_qmf_bank->ptr_esbr_cos_twiddle =
870*15dc779aSAndroid Build Coastguard Worker ixheaace_str_aac_qmf_tabs.esbr_sin_cos_twiddle_l16;
871*15dc779aSAndroid Build Coastguard Worker pstr_codec_qmf_bank->ptr_esbr_alt_sin_twiddle =
872*15dc779aSAndroid Build Coastguard Worker ixheaace_str_aac_qmf_tabs.esbr_alt_sin_twiddle_l16;
873*15dc779aSAndroid Build Coastguard Worker pstr_codec_qmf_bank->ptr_esbr_t_cos = ixheaace_str_aac_qmf_tabs.esbr_t_cos_sin_l16;
874*15dc779aSAndroid Build Coastguard Worker break;
875*15dc779aSAndroid Build Coastguard Worker default:
876*15dc779aSAndroid Build Coastguard Worker pstr_codec_qmf_bank->no_channels = 32;
877*15dc779aSAndroid Build Coastguard Worker pstr_codec_qmf_bank->ptr_esbr_cos_twiddle =
878*15dc779aSAndroid Build Coastguard Worker ixheaace_str_aac_qmf_tabs.esbr_sin_cos_twiddle_l32;
879*15dc779aSAndroid Build Coastguard Worker pstr_codec_qmf_bank->ptr_esbr_alt_sin_twiddle =
880*15dc779aSAndroid Build Coastguard Worker ixheaace_str_aac_qmf_tabs.esbr_alt_sin_twiddle_l32;
881*15dc779aSAndroid Build Coastguard Worker pstr_codec_qmf_bank->ptr_esbr_t_cos = ixheaace_str_aac_qmf_tabs.esbr_t_cos_sin_l32;
882*15dc779aSAndroid Build Coastguard Worker break;
883*15dc779aSAndroid Build Coastguard Worker }
884*15dc779aSAndroid Build Coastguard Worker }
ixheaace_esbr_qmfanal32_winadd(FLOAT32 * ptr_inp1,FLOAT32 * ptr_inp2,FLOAT32 * ptr_qmf1,FLOAT32 * ptr_qmf2,FLOAT32 * ptr_out,WORD32 num_band_anal_qmf)885*15dc779aSAndroid Build Coastguard Worker VOID ixheaace_esbr_qmfanal32_winadd(FLOAT32 *ptr_inp1, FLOAT32 *ptr_inp2, FLOAT32 *ptr_qmf1,
886*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_qmf2, FLOAT32 *ptr_out,
887*15dc779aSAndroid Build Coastguard Worker WORD32 num_band_anal_qmf) {
888*15dc779aSAndroid Build Coastguard Worker WORD32 n;
889*15dc779aSAndroid Build Coastguard Worker FLOAT32 accu;
890*15dc779aSAndroid Build Coastguard Worker
891*15dc779aSAndroid Build Coastguard Worker switch (num_band_anal_qmf) {
892*15dc779aSAndroid Build Coastguard Worker case 32: {
893*15dc779aSAndroid Build Coastguard Worker n = 0;
894*15dc779aSAndroid Build Coastguard Worker while (n < num_band_anal_qmf) {
895*15dc779aSAndroid Build Coastguard Worker accu = (ptr_inp1[n + 0] * ptr_qmf1[2 * (n + 0)]);
896*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp1[n + 2 * num_band_anal_qmf] * ptr_qmf1[2 * (n + 2 * num_band_anal_qmf)]);
897*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp1[n + 4 * num_band_anal_qmf] * ptr_qmf1[2 * (n + 4 * num_band_anal_qmf)]);
898*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp1[n + 6 * num_band_anal_qmf] * ptr_qmf1[2 * (n + 6 * num_band_anal_qmf)]);
899*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp1[n + 8 * num_band_anal_qmf] * ptr_qmf1[2 * (n + 8 * num_band_anal_qmf)]);
900*15dc779aSAndroid Build Coastguard Worker ptr_out[n] = 2 * accu;
901*15dc779aSAndroid Build Coastguard Worker
902*15dc779aSAndroid Build Coastguard Worker accu = (ptr_inp1[n + 1 + 0] * ptr_qmf1[2 * (n + 1 + 0)]);
903*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp1[n + 1 + 2 * num_band_anal_qmf] *
904*15dc779aSAndroid Build Coastguard Worker ptr_qmf1[2 * (n + 1 + 2 * num_band_anal_qmf)]);
905*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp1[n + 1 + 4 * num_band_anal_qmf] *
906*15dc779aSAndroid Build Coastguard Worker ptr_qmf1[2 * (n + 1 + 4 * num_band_anal_qmf)]);
907*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp1[n + 1 + 6 * num_band_anal_qmf] *
908*15dc779aSAndroid Build Coastguard Worker ptr_qmf1[2 * (n + 1 + 6 * num_band_anal_qmf)]);
909*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp1[n + 1 + 8 * num_band_anal_qmf] *
910*15dc779aSAndroid Build Coastguard Worker ptr_qmf1[2 * (n + 1 + 8 * num_band_anal_qmf)]);
911*15dc779aSAndroid Build Coastguard Worker ptr_out[n + 1] = 2 * accu;
912*15dc779aSAndroid Build Coastguard Worker
913*15dc779aSAndroid Build Coastguard Worker accu = (ptr_inp2[n + 0] * ptr_qmf2[2 * (n + 0)]);
914*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp2[n + 2 * num_band_anal_qmf] * ptr_qmf2[2 * (n + 2 * num_band_anal_qmf)]);
915*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp2[n + 4 * num_band_anal_qmf] * ptr_qmf2[2 * (n + 4 * num_band_anal_qmf)]);
916*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp2[n + 6 * num_band_anal_qmf] * ptr_qmf2[2 * (n + 6 * num_band_anal_qmf)]);
917*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp2[n + 8 * num_band_anal_qmf] * ptr_qmf2[2 * (n + 8 * num_band_anal_qmf)]);
918*15dc779aSAndroid Build Coastguard Worker ptr_out[n + num_band_anal_qmf] = 2 * accu;
919*15dc779aSAndroid Build Coastguard Worker
920*15dc779aSAndroid Build Coastguard Worker accu = (ptr_inp2[n + 1 + 0] * ptr_qmf2[2 * (n + 1 + 0)]);
921*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp2[n + 1 + 2 * num_band_anal_qmf] *
922*15dc779aSAndroid Build Coastguard Worker ptr_qmf2[2 * (n + 1 + 2 * num_band_anal_qmf)]);
923*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp2[n + 1 + 4 * num_band_anal_qmf] *
924*15dc779aSAndroid Build Coastguard Worker ptr_qmf2[2 * (n + 1 + 4 * num_band_anal_qmf)]);
925*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp2[n + 1 + 6 * num_band_anal_qmf] *
926*15dc779aSAndroid Build Coastguard Worker ptr_qmf2[2 * (n + 1 + 6 * num_band_anal_qmf)]);
927*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp2[n + 1 + 8 * num_band_anal_qmf] *
928*15dc779aSAndroid Build Coastguard Worker ptr_qmf2[2 * (n + 1 + 8 * num_band_anal_qmf)]);
929*15dc779aSAndroid Build Coastguard Worker ptr_out[n + 1 + num_band_anal_qmf] = 2 * accu;
930*15dc779aSAndroid Build Coastguard Worker
931*15dc779aSAndroid Build Coastguard Worker n += 2;
932*15dc779aSAndroid Build Coastguard Worker }
933*15dc779aSAndroid Build Coastguard Worker break;
934*15dc779aSAndroid Build Coastguard Worker }
935*15dc779aSAndroid Build Coastguard Worker case 24: {
936*15dc779aSAndroid Build Coastguard Worker n = 0;
937*15dc779aSAndroid Build Coastguard Worker while (n < num_band_anal_qmf) {
938*15dc779aSAndroid Build Coastguard Worker accu = (ptr_inp1[n + 0] * ptr_qmf1[(n + 0)]);
939*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp1[n + 2 * num_band_anal_qmf] * ptr_qmf1[(n + 2 * num_band_anal_qmf)]);
940*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp1[n + 4 * num_band_anal_qmf] * ptr_qmf1[(n + 4 * num_band_anal_qmf)]);
941*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp1[n + 6 * num_band_anal_qmf] * ptr_qmf1[(n + 6 * num_band_anal_qmf)]);
942*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp1[n + 8 * num_band_anal_qmf] * ptr_qmf1[(n + 8 * num_band_anal_qmf)]);
943*15dc779aSAndroid Build Coastguard Worker ptr_out[n] = 2 * accu;
944*15dc779aSAndroid Build Coastguard Worker
945*15dc779aSAndroid Build Coastguard Worker accu = (ptr_inp1[n + 1 + 0] * ptr_qmf1[(n + 1 + 0)]);
946*15dc779aSAndroid Build Coastguard Worker accu +=
947*15dc779aSAndroid Build Coastguard Worker (ptr_inp1[n + 1 + 2 * num_band_anal_qmf] * ptr_qmf1[(n + 1 + 2 * num_band_anal_qmf)]);
948*15dc779aSAndroid Build Coastguard Worker accu +=
949*15dc779aSAndroid Build Coastguard Worker (ptr_inp1[n + 1 + 4 * num_band_anal_qmf] * ptr_qmf1[(n + 1 + 4 * num_band_anal_qmf)]);
950*15dc779aSAndroid Build Coastguard Worker accu +=
951*15dc779aSAndroid Build Coastguard Worker (ptr_inp1[n + 1 + 6 * num_band_anal_qmf] * ptr_qmf1[(n + 1 + 6 * num_band_anal_qmf)]);
952*15dc779aSAndroid Build Coastguard Worker accu +=
953*15dc779aSAndroid Build Coastguard Worker (ptr_inp1[n + 1 + 8 * num_band_anal_qmf] * ptr_qmf1[(n + 1 + 8 * num_band_anal_qmf)]);
954*15dc779aSAndroid Build Coastguard Worker ptr_out[n + 1] = 2 * accu;
955*15dc779aSAndroid Build Coastguard Worker
956*15dc779aSAndroid Build Coastguard Worker accu = (ptr_inp2[n + 0] * ptr_qmf2[(n + 0)]);
957*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp2[n + 2 * num_band_anal_qmf] * ptr_qmf2[(n + 2 * num_band_anal_qmf)]);
958*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp2[n + 4 * num_band_anal_qmf] * ptr_qmf2[(n + 4 * num_band_anal_qmf)]);
959*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp2[n + 6 * num_band_anal_qmf] * ptr_qmf2[(n + 6 * num_band_anal_qmf)]);
960*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp2[n + 8 * num_band_anal_qmf] * ptr_qmf2[(n + 8 * num_band_anal_qmf)]);
961*15dc779aSAndroid Build Coastguard Worker ptr_out[n + num_band_anal_qmf] = 2 * accu;
962*15dc779aSAndroid Build Coastguard Worker
963*15dc779aSAndroid Build Coastguard Worker accu = (ptr_inp2[n + 1 + 0] * ptr_qmf2[(n + 1 + 0)]);
964*15dc779aSAndroid Build Coastguard Worker accu +=
965*15dc779aSAndroid Build Coastguard Worker (ptr_inp2[n + 1 + 2 * num_band_anal_qmf] * ptr_qmf2[(n + 1 + 2 * num_band_anal_qmf)]);
966*15dc779aSAndroid Build Coastguard Worker accu +=
967*15dc779aSAndroid Build Coastguard Worker (ptr_inp2[n + 1 + 4 * num_band_anal_qmf] * ptr_qmf2[(n + 1 + 4 * num_band_anal_qmf)]);
968*15dc779aSAndroid Build Coastguard Worker accu +=
969*15dc779aSAndroid Build Coastguard Worker (ptr_inp2[n + 1 + 6 * num_band_anal_qmf] * ptr_qmf2[(n + 1 + 6 * num_band_anal_qmf)]);
970*15dc779aSAndroid Build Coastguard Worker accu +=
971*15dc779aSAndroid Build Coastguard Worker (ptr_inp2[n + 1 + 8 * num_band_anal_qmf] * ptr_qmf2[(n + 1 + 8 * num_band_anal_qmf)]);
972*15dc779aSAndroid Build Coastguard Worker ptr_out[n + 1 + num_band_anal_qmf] = 2 * accu;
973*15dc779aSAndroid Build Coastguard Worker n += 2;
974*15dc779aSAndroid Build Coastguard Worker }
975*15dc779aSAndroid Build Coastguard Worker break;
976*15dc779aSAndroid Build Coastguard Worker }
977*15dc779aSAndroid Build Coastguard Worker default: {
978*15dc779aSAndroid Build Coastguard Worker n = 0;
979*15dc779aSAndroid Build Coastguard Worker while (n < num_band_anal_qmf) {
980*15dc779aSAndroid Build Coastguard Worker accu = (ptr_inp1[n + 0] * ptr_qmf1[4 * (n + 0)]);
981*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp1[n + 2 * num_band_anal_qmf] * ptr_qmf1[4 * (n + 2 * num_band_anal_qmf)]);
982*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp1[n + 4 * num_band_anal_qmf] * ptr_qmf1[4 * (n + 4 * num_band_anal_qmf)]);
983*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp1[n + 6 * num_band_anal_qmf] * ptr_qmf1[4 * (n + 6 * num_band_anal_qmf)]);
984*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp1[n + 8 * num_band_anal_qmf] * ptr_qmf1[4 * (n + 8 * num_band_anal_qmf)]);
985*15dc779aSAndroid Build Coastguard Worker ptr_out[n] = 2 * accu;
986*15dc779aSAndroid Build Coastguard Worker
987*15dc779aSAndroid Build Coastguard Worker accu = (ptr_inp1[n + 1 + 0] * ptr_qmf1[4 * (n + 1 + 0)]);
988*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp1[n + 1 + 2 * num_band_anal_qmf] *
989*15dc779aSAndroid Build Coastguard Worker ptr_qmf1[4 * (n + 1 + 2 * num_band_anal_qmf)]);
990*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp1[n + 1 + 4 * num_band_anal_qmf] *
991*15dc779aSAndroid Build Coastguard Worker ptr_qmf1[4 * (n + 1 + 4 * num_band_anal_qmf)]);
992*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp1[n + 1 + 6 * num_band_anal_qmf] *
993*15dc779aSAndroid Build Coastguard Worker ptr_qmf1[4 * (n + 1 + 6 * num_band_anal_qmf)]);
994*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp1[n + 1 + 8 * num_band_anal_qmf] *
995*15dc779aSAndroid Build Coastguard Worker ptr_qmf1[4 * (n + 1 + 8 * num_band_anal_qmf)]);
996*15dc779aSAndroid Build Coastguard Worker ptr_out[n + 1] = 2 * accu;
997*15dc779aSAndroid Build Coastguard Worker
998*15dc779aSAndroid Build Coastguard Worker accu = (ptr_inp2[n + 0] * ptr_qmf2[4 * (n + 0)]);
999*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp2[n + 2 * num_band_anal_qmf] * ptr_qmf2[4 * (n + 2 * num_band_anal_qmf)]);
1000*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp2[n + 4 * num_band_anal_qmf] * ptr_qmf2[4 * (n + 4 * num_band_anal_qmf)]);
1001*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp2[n + 6 * num_band_anal_qmf] * ptr_qmf2[4 * (n + 6 * num_band_anal_qmf)]);
1002*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp2[n + 8 * num_band_anal_qmf] * ptr_qmf2[4 * (n + 8 * num_band_anal_qmf)]);
1003*15dc779aSAndroid Build Coastguard Worker ptr_out[n + num_band_anal_qmf] = 2 * accu;
1004*15dc779aSAndroid Build Coastguard Worker
1005*15dc779aSAndroid Build Coastguard Worker accu = (ptr_inp2[n + 1 + 0] * ptr_qmf2[4 * (n + 1 + 0)]);
1006*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp2[n + 1 + 2 * num_band_anal_qmf] *
1007*15dc779aSAndroid Build Coastguard Worker ptr_qmf2[4 * (n + 1 + 2 * num_band_anal_qmf)]);
1008*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp2[n + 1 + 4 * num_band_anal_qmf] *
1009*15dc779aSAndroid Build Coastguard Worker ptr_qmf2[4 * (n + 1 + 4 * num_band_anal_qmf)]);
1010*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp2[n + 1 + 6 * num_band_anal_qmf] *
1011*15dc779aSAndroid Build Coastguard Worker ptr_qmf2[4 * (n + 1 + 6 * num_band_anal_qmf)]);
1012*15dc779aSAndroid Build Coastguard Worker accu += (ptr_inp2[n + 1 + 8 * num_band_anal_qmf] *
1013*15dc779aSAndroid Build Coastguard Worker ptr_qmf2[4 * (n + 1 + 8 * num_band_anal_qmf)]);
1014*15dc779aSAndroid Build Coastguard Worker ptr_out[n + 1 + num_band_anal_qmf] = 2 * accu;
1015*15dc779aSAndroid Build Coastguard Worker n += 2;
1016*15dc779aSAndroid Build Coastguard Worker }
1017*15dc779aSAndroid Build Coastguard Worker break;
1018*15dc779aSAndroid Build Coastguard Worker }
1019*15dc779aSAndroid Build Coastguard Worker }
1020*15dc779aSAndroid Build Coastguard Worker }
1021*15dc779aSAndroid Build Coastguard Worker
ixheaace_esbr_radix4bfly(const FLOAT32 * ptr_w_in,FLOAT32 * ptr_x,WORD32 index1,WORD32 index)1022*15dc779aSAndroid Build Coastguard Worker VOID ixheaace_esbr_radix4bfly(const FLOAT32 *ptr_w_in, FLOAT32 *ptr_x, WORD32 index1,
1023*15dc779aSAndroid Build Coastguard Worker WORD32 index) {
1024*15dc779aSAndroid Build Coastguard Worker int i;
1025*15dc779aSAndroid Build Coastguard Worker WORD32 l1, l2, h2, fft_jmp;
1026*15dc779aSAndroid Build Coastguard Worker FLOAT32 xt0_0, yt0_0, xt1_0, yt1_0, xt2_0, yt2_0;
1027*15dc779aSAndroid Build Coastguard Worker FLOAT32 xh0_0, xh1_0, xh20_0, xh21_0, xl0_0, xl1_0, xl20_0, xl21_0;
1028*15dc779aSAndroid Build Coastguard Worker FLOAT32 x_0, x_1, x_l1_0, x_l1_1, x_l2_0, x_l2_1;
1029*15dc779aSAndroid Build Coastguard Worker FLOAT32 x_h2_0, x_h2_1;
1030*15dc779aSAndroid Build Coastguard Worker FLOAT32 si10, si20, si30, co10, co20, co30;
1031*15dc779aSAndroid Build Coastguard Worker
1032*15dc779aSAndroid Build Coastguard Worker FLOAT32 mul_1, mul_2, mul_3, mul_4, mul_5, mul_6;
1033*15dc779aSAndroid Build Coastguard Worker FLOAT32 mul_7, mul_8, mul_9, mul_10, mul_11, mul_12;
1034*15dc779aSAndroid Build Coastguard Worker
1035*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *ptr_w = ptr_w_in;
1036*15dc779aSAndroid Build Coastguard Worker WORD32 i1;
1037*15dc779aSAndroid Build Coastguard Worker
1038*15dc779aSAndroid Build Coastguard Worker h2 = index << 1;
1039*15dc779aSAndroid Build Coastguard Worker l1 = index << 2;
1040*15dc779aSAndroid Build Coastguard Worker l2 = (index << 2) + (index << 1);
1041*15dc779aSAndroid Build Coastguard Worker
1042*15dc779aSAndroid Build Coastguard Worker fft_jmp = 6 * (index);
1043*15dc779aSAndroid Build Coastguard Worker
1044*15dc779aSAndroid Build Coastguard Worker i1 = 0;
1045*15dc779aSAndroid Build Coastguard Worker while (i1 < index1) {
1046*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < index; i++) {
1047*15dc779aSAndroid Build Coastguard Worker si10 = (*ptr_w++);
1048*15dc779aSAndroid Build Coastguard Worker co10 = (*ptr_w++);
1049*15dc779aSAndroid Build Coastguard Worker si20 = (*ptr_w++);
1050*15dc779aSAndroid Build Coastguard Worker co20 = (*ptr_w++);
1051*15dc779aSAndroid Build Coastguard Worker si30 = (*ptr_w++);
1052*15dc779aSAndroid Build Coastguard Worker co30 = (*ptr_w++);
1053*15dc779aSAndroid Build Coastguard Worker
1054*15dc779aSAndroid Build Coastguard Worker x_0 = ptr_x[0];
1055*15dc779aSAndroid Build Coastguard Worker x_h2_0 = ptr_x[h2];
1056*15dc779aSAndroid Build Coastguard Worker x_l1_0 = ptr_x[l1];
1057*15dc779aSAndroid Build Coastguard Worker x_l2_0 = ptr_x[l2];
1058*15dc779aSAndroid Build Coastguard Worker
1059*15dc779aSAndroid Build Coastguard Worker xh0_0 = (x_0 + x_l1_0);
1060*15dc779aSAndroid Build Coastguard Worker xl0_0 = (x_0 - x_l1_0);
1061*15dc779aSAndroid Build Coastguard Worker
1062*15dc779aSAndroid Build Coastguard Worker xh20_0 = (x_h2_0 + x_l2_0);
1063*15dc779aSAndroid Build Coastguard Worker xl20_0 = (x_h2_0 - x_l2_0);
1064*15dc779aSAndroid Build Coastguard Worker
1065*15dc779aSAndroid Build Coastguard Worker ptr_x[0] = (xh0_0 + xh20_0);
1066*15dc779aSAndroid Build Coastguard Worker xt0_0 = (xh0_0 - xh20_0);
1067*15dc779aSAndroid Build Coastguard Worker
1068*15dc779aSAndroid Build Coastguard Worker x_1 = ptr_x[1];
1069*15dc779aSAndroid Build Coastguard Worker x_h2_1 = ptr_x[h2 + 1];
1070*15dc779aSAndroid Build Coastguard Worker x_l1_1 = ptr_x[l1 + 1];
1071*15dc779aSAndroid Build Coastguard Worker x_l2_1 = ptr_x[l2 + 1];
1072*15dc779aSAndroid Build Coastguard Worker
1073*15dc779aSAndroid Build Coastguard Worker xh1_0 = (x_1 + x_l1_1);
1074*15dc779aSAndroid Build Coastguard Worker xl1_0 = (x_1 - x_l1_1);
1075*15dc779aSAndroid Build Coastguard Worker
1076*15dc779aSAndroid Build Coastguard Worker xh21_0 = (x_h2_1 + x_l2_1);
1077*15dc779aSAndroid Build Coastguard Worker xl21_0 = (x_h2_1 - x_l2_1);
1078*15dc779aSAndroid Build Coastguard Worker
1079*15dc779aSAndroid Build Coastguard Worker ptr_x[1] = (xh1_0 + xh21_0);
1080*15dc779aSAndroid Build Coastguard Worker yt0_0 = (xh1_0 - xh21_0);
1081*15dc779aSAndroid Build Coastguard Worker
1082*15dc779aSAndroid Build Coastguard Worker xt1_0 = (xl0_0 + xl21_0);
1083*15dc779aSAndroid Build Coastguard Worker xt2_0 = (xl0_0 - xl21_0);
1084*15dc779aSAndroid Build Coastguard Worker
1085*15dc779aSAndroid Build Coastguard Worker yt2_0 = (xl1_0 + xl20_0);
1086*15dc779aSAndroid Build Coastguard Worker yt1_0 = (xl1_0 - xl20_0);
1087*15dc779aSAndroid Build Coastguard Worker
1088*15dc779aSAndroid Build Coastguard Worker mul_11 = (xt2_0 * co30);
1089*15dc779aSAndroid Build Coastguard Worker mul_3 = (yt2_0 * si30);
1090*15dc779aSAndroid Build Coastguard Worker ptr_x[l2] = 2 * (mul_3 + mul_11);
1091*15dc779aSAndroid Build Coastguard Worker
1092*15dc779aSAndroid Build Coastguard Worker mul_5 = (xt2_0 * si30);
1093*15dc779aSAndroid Build Coastguard Worker mul_9 = (yt2_0 * co30);
1094*15dc779aSAndroid Build Coastguard Worker ptr_x[l2 + 1] = 2 * (mul_9 - mul_5);
1095*15dc779aSAndroid Build Coastguard Worker
1096*15dc779aSAndroid Build Coastguard Worker mul_12 = (xt0_0 * co20);
1097*15dc779aSAndroid Build Coastguard Worker mul_2 = (yt0_0 * si20);
1098*15dc779aSAndroid Build Coastguard Worker ptr_x[l1] = 2 * (mul_2 + mul_12);
1099*15dc779aSAndroid Build Coastguard Worker
1100*15dc779aSAndroid Build Coastguard Worker mul_6 = (xt0_0 * si20);
1101*15dc779aSAndroid Build Coastguard Worker mul_8 = (yt0_0 * co20);
1102*15dc779aSAndroid Build Coastguard Worker ptr_x[l1 + 1] = 2 * (mul_8 - mul_6);
1103*15dc779aSAndroid Build Coastguard Worker
1104*15dc779aSAndroid Build Coastguard Worker mul_4 = (xt1_0 * co10);
1105*15dc779aSAndroid Build Coastguard Worker mul_1 = (yt1_0 * si10);
1106*15dc779aSAndroid Build Coastguard Worker ptr_x[h2] = 2 * (mul_1 + mul_4);
1107*15dc779aSAndroid Build Coastguard Worker
1108*15dc779aSAndroid Build Coastguard Worker mul_10 = (xt1_0 * si10);
1109*15dc779aSAndroid Build Coastguard Worker mul_7 = (yt1_0 * co10);
1110*15dc779aSAndroid Build Coastguard Worker ptr_x[h2 + 1] = 2 * (mul_7 - mul_10);
1111*15dc779aSAndroid Build Coastguard Worker
1112*15dc779aSAndroid Build Coastguard Worker ptr_x += 2;
1113*15dc779aSAndroid Build Coastguard Worker }
1114*15dc779aSAndroid Build Coastguard Worker ptr_x += fft_jmp;
1115*15dc779aSAndroid Build Coastguard Worker ptr_w = ptr_w - fft_jmp;
1116*15dc779aSAndroid Build Coastguard Worker i1++;
1117*15dc779aSAndroid Build Coastguard Worker }
1118*15dc779aSAndroid Build Coastguard Worker }
1119*15dc779aSAndroid Build Coastguard Worker
ixheaace_esbr_postradixcompute2(FLOAT32 * ptr_y,FLOAT32 * ptr_x,const FLOAT32 * ptr_dig_rev_tbl,WORD32 npoints)1120*15dc779aSAndroid Build Coastguard Worker VOID ixheaace_esbr_postradixcompute2(FLOAT32 *ptr_y, FLOAT32 *ptr_x,
1121*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *ptr_dig_rev_tbl, WORD32 npoints) {
1122*15dc779aSAndroid Build Coastguard Worker WORD32 i, k;
1123*15dc779aSAndroid Build Coastguard Worker WORD32 h2;
1124*15dc779aSAndroid Build Coastguard Worker FLOAT32 x_0, x_1, x_2, x_3;
1125*15dc779aSAndroid Build Coastguard Worker FLOAT32 x_4, x_5, x_6, x_7;
1126*15dc779aSAndroid Build Coastguard Worker FLOAT32 x_8, x_9, x_a, x_b, x_c, x_d, x_e, x_f;
1127*15dc779aSAndroid Build Coastguard Worker FLOAT32 n00, n10, n20, n30, n01, n11, n21, n31;
1128*15dc779aSAndroid Build Coastguard Worker FLOAT32 n02, n12, n22, n32, n03, n13, n23, n33;
1129*15dc779aSAndroid Build Coastguard Worker
1130*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_x2, *ptr_x0;
1131*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_y0, *ptr_y1, *ptr_y2, *ptr_y3;
1132*15dc779aSAndroid Build Coastguard Worker
1133*15dc779aSAndroid Build Coastguard Worker ptr_y0 = ptr_y;
1134*15dc779aSAndroid Build Coastguard Worker ptr_y2 = ptr_y + (WORD32)npoints;
1135*15dc779aSAndroid Build Coastguard Worker ptr_x0 = ptr_x;
1136*15dc779aSAndroid Build Coastguard Worker ptr_x2 = ptr_x + (WORD32)(npoints >> 1);
1137*15dc779aSAndroid Build Coastguard Worker
1138*15dc779aSAndroid Build Coastguard Worker ptr_y1 = ptr_y0 + (WORD32)(npoints >> 2);
1139*15dc779aSAndroid Build Coastguard Worker ptr_y3 = ptr_y2 + (WORD32)(npoints >> 2);
1140*15dc779aSAndroid Build Coastguard Worker
1141*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < 2; k++) {
1142*15dc779aSAndroid Build Coastguard Worker for (i = 0; i<npoints>> 1; i += 8) {
1143*15dc779aSAndroid Build Coastguard Worker h2 = (WORD32)*ptr_dig_rev_tbl++ / 4;
1144*15dc779aSAndroid Build Coastguard Worker
1145*15dc779aSAndroid Build Coastguard Worker x_0 = *ptr_x0++;
1146*15dc779aSAndroid Build Coastguard Worker x_1 = *ptr_x0++;
1147*15dc779aSAndroid Build Coastguard Worker x_2 = *ptr_x0++;
1148*15dc779aSAndroid Build Coastguard Worker x_3 = *ptr_x0++;
1149*15dc779aSAndroid Build Coastguard Worker x_4 = *ptr_x0++;
1150*15dc779aSAndroid Build Coastguard Worker x_5 = *ptr_x0++;
1151*15dc779aSAndroid Build Coastguard Worker x_6 = *ptr_x0++;
1152*15dc779aSAndroid Build Coastguard Worker x_7 = *ptr_x0++;
1153*15dc779aSAndroid Build Coastguard Worker
1154*15dc779aSAndroid Build Coastguard Worker n00 = (x_0 + x_2);
1155*15dc779aSAndroid Build Coastguard Worker n01 = (x_1 + x_3);
1156*15dc779aSAndroid Build Coastguard Worker
1157*15dc779aSAndroid Build Coastguard Worker n20 = (x_0 - x_2);
1158*15dc779aSAndroid Build Coastguard Worker n21 = (x_1 - x_3);
1159*15dc779aSAndroid Build Coastguard Worker
1160*15dc779aSAndroid Build Coastguard Worker n10 = (x_4 + x_6);
1161*15dc779aSAndroid Build Coastguard Worker n11 = (x_5 + x_7);
1162*15dc779aSAndroid Build Coastguard Worker
1163*15dc779aSAndroid Build Coastguard Worker n30 = (x_4 - x_6);
1164*15dc779aSAndroid Build Coastguard Worker n31 = (x_5 - x_7);
1165*15dc779aSAndroid Build Coastguard Worker
1166*15dc779aSAndroid Build Coastguard Worker ptr_y0[h2] = n00;
1167*15dc779aSAndroid Build Coastguard Worker ptr_y0[h2 + 1] = n01;
1168*15dc779aSAndroid Build Coastguard Worker ptr_y1[h2] = n10;
1169*15dc779aSAndroid Build Coastguard Worker ptr_y1[h2 + 1] = n11;
1170*15dc779aSAndroid Build Coastguard Worker ptr_y2[h2] = n20;
1171*15dc779aSAndroid Build Coastguard Worker ptr_y2[h2 + 1] = n21;
1172*15dc779aSAndroid Build Coastguard Worker ptr_y3[h2] = n30;
1173*15dc779aSAndroid Build Coastguard Worker ptr_y3[h2 + 1] = n31;
1174*15dc779aSAndroid Build Coastguard Worker
1175*15dc779aSAndroid Build Coastguard Worker x_8 = *ptr_x2++;
1176*15dc779aSAndroid Build Coastguard Worker x_9 = *ptr_x2++;
1177*15dc779aSAndroid Build Coastguard Worker x_a = *ptr_x2++;
1178*15dc779aSAndroid Build Coastguard Worker x_b = *ptr_x2++;
1179*15dc779aSAndroid Build Coastguard Worker x_c = *ptr_x2++;
1180*15dc779aSAndroid Build Coastguard Worker x_d = *ptr_x2++;
1181*15dc779aSAndroid Build Coastguard Worker x_e = *ptr_x2++;
1182*15dc779aSAndroid Build Coastguard Worker x_f = *ptr_x2++;
1183*15dc779aSAndroid Build Coastguard Worker
1184*15dc779aSAndroid Build Coastguard Worker n02 = (x_8 + x_a);
1185*15dc779aSAndroid Build Coastguard Worker n03 = (x_9 + x_b);
1186*15dc779aSAndroid Build Coastguard Worker
1187*15dc779aSAndroid Build Coastguard Worker n22 = (x_8 - x_a);
1188*15dc779aSAndroid Build Coastguard Worker n23 = (x_9 - x_b);
1189*15dc779aSAndroid Build Coastguard Worker
1190*15dc779aSAndroid Build Coastguard Worker n12 = (x_c + x_e);
1191*15dc779aSAndroid Build Coastguard Worker n13 = (x_d + x_f);
1192*15dc779aSAndroid Build Coastguard Worker
1193*15dc779aSAndroid Build Coastguard Worker n32 = (x_c - x_e);
1194*15dc779aSAndroid Build Coastguard Worker n33 = (x_d - x_f);
1195*15dc779aSAndroid Build Coastguard Worker
1196*15dc779aSAndroid Build Coastguard Worker ptr_y0[h2 + 2] = n02;
1197*15dc779aSAndroid Build Coastguard Worker ptr_y0[h2 + 3] = n03;
1198*15dc779aSAndroid Build Coastguard Worker ptr_y1[h2 + 2] = n12;
1199*15dc779aSAndroid Build Coastguard Worker ptr_y1[h2 + 3] = n13;
1200*15dc779aSAndroid Build Coastguard Worker ptr_y2[h2 + 2] = n22;
1201*15dc779aSAndroid Build Coastguard Worker ptr_y2[h2 + 3] = n23;
1202*15dc779aSAndroid Build Coastguard Worker ptr_y3[h2 + 2] = n32;
1203*15dc779aSAndroid Build Coastguard Worker ptr_y3[h2 + 3] = n33;
1204*15dc779aSAndroid Build Coastguard Worker }
1205*15dc779aSAndroid Build Coastguard Worker ptr_x0 += (WORD32)npoints >> 1;
1206*15dc779aSAndroid Build Coastguard Worker ptr_x2 += (WORD32)npoints >> 1;
1207*15dc779aSAndroid Build Coastguard Worker }
1208*15dc779aSAndroid Build Coastguard Worker }
1209*15dc779aSAndroid Build Coastguard Worker
ixheaace_esbr_postradixcompute4(FLOAT32 * ptr_y,FLOAT32 * ptr_x,const FLOAT32 * ptr_dig_rev_tbl,WORD32 npoints)1210*15dc779aSAndroid Build Coastguard Worker VOID ixheaace_esbr_postradixcompute4(FLOAT32 *ptr_y, FLOAT32 *ptr_x,
1211*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *ptr_dig_rev_tbl, WORD32 npoints) {
1212*15dc779aSAndroid Build Coastguard Worker WORD32 i, k;
1213*15dc779aSAndroid Build Coastguard Worker WORD32 h2;
1214*15dc779aSAndroid Build Coastguard Worker FLOAT32 xh0_0, xh1_0, xl0_0, xl1_0;
1215*15dc779aSAndroid Build Coastguard Worker FLOAT32 xh0_1, xh1_1, xl0_1, xl1_1;
1216*15dc779aSAndroid Build Coastguard Worker FLOAT32 x_0, x_1, x_2, x_3;
1217*15dc779aSAndroid Build Coastguard Worker FLOAT32 xh0_2, xh1_2, xl0_2, xl1_2, xh0_3, xh1_3, xl0_3, xl1_3;
1218*15dc779aSAndroid Build Coastguard Worker FLOAT32 x_4, x_5, x_6, x_7;
1219*15dc779aSAndroid Build Coastguard Worker FLOAT32 x_8, x_9, x_a, x_b, x_c, x_d, x_e, x_f;
1220*15dc779aSAndroid Build Coastguard Worker FLOAT32 n00, n10, n20, n30, n01, n11, n21, n31;
1221*15dc779aSAndroid Build Coastguard Worker FLOAT32 n02, n12, n22, n32, n03, n13, n23, n33;
1222*15dc779aSAndroid Build Coastguard Worker
1223*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_x2, *ptr_x0;
1224*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_y0, *ptr_y1, *ptr_y2, *ptr_y3;
1225*15dc779aSAndroid Build Coastguard Worker
1226*15dc779aSAndroid Build Coastguard Worker ptr_y0 = ptr_y;
1227*15dc779aSAndroid Build Coastguard Worker ptr_y2 = ptr_y + npoints;
1228*15dc779aSAndroid Build Coastguard Worker ptr_x0 = ptr_x;
1229*15dc779aSAndroid Build Coastguard Worker ptr_x2 = ptr_x + (WORD32)(npoints >> 1);
1230*15dc779aSAndroid Build Coastguard Worker
1231*15dc779aSAndroid Build Coastguard Worker ptr_y1 = ptr_y0 + (WORD32)(npoints >> 1);
1232*15dc779aSAndroid Build Coastguard Worker ptr_y3 = ptr_y2 + (WORD32)(npoints >> 1);
1233*15dc779aSAndroid Build Coastguard Worker
1234*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < 2; k++) {
1235*15dc779aSAndroid Build Coastguard Worker for (i = 0; i<npoints>> 1; i += 8) {
1236*15dc779aSAndroid Build Coastguard Worker h2 = (WORD32)*ptr_dig_rev_tbl++ / 4;
1237*15dc779aSAndroid Build Coastguard Worker x_0 = *ptr_x0++;
1238*15dc779aSAndroid Build Coastguard Worker x_1 = *ptr_x0++;
1239*15dc779aSAndroid Build Coastguard Worker x_2 = *ptr_x0++;
1240*15dc779aSAndroid Build Coastguard Worker x_3 = *ptr_x0++;
1241*15dc779aSAndroid Build Coastguard Worker x_4 = *ptr_x0++;
1242*15dc779aSAndroid Build Coastguard Worker x_5 = *ptr_x0++;
1243*15dc779aSAndroid Build Coastguard Worker x_6 = *ptr_x0++;
1244*15dc779aSAndroid Build Coastguard Worker x_7 = *ptr_x0++;
1245*15dc779aSAndroid Build Coastguard Worker
1246*15dc779aSAndroid Build Coastguard Worker xh0_0 = (x_0 + x_4);
1247*15dc779aSAndroid Build Coastguard Worker xh1_0 = (x_1 + x_5);
1248*15dc779aSAndroid Build Coastguard Worker
1249*15dc779aSAndroid Build Coastguard Worker xl0_0 = (x_0 - x_4);
1250*15dc779aSAndroid Build Coastguard Worker xl1_0 = (x_1 - x_5);
1251*15dc779aSAndroid Build Coastguard Worker
1252*15dc779aSAndroid Build Coastguard Worker xh0_1 = (x_2 + x_6);
1253*15dc779aSAndroid Build Coastguard Worker xh1_1 = (x_3 + x_7);
1254*15dc779aSAndroid Build Coastguard Worker
1255*15dc779aSAndroid Build Coastguard Worker xl0_1 = (x_2 - x_6);
1256*15dc779aSAndroid Build Coastguard Worker xl1_1 = (x_3 - x_7);
1257*15dc779aSAndroid Build Coastguard Worker
1258*15dc779aSAndroid Build Coastguard Worker n00 = (xh0_0 + xh0_1);
1259*15dc779aSAndroid Build Coastguard Worker n01 = (xh1_0 + xh1_1);
1260*15dc779aSAndroid Build Coastguard Worker n10 = (xl0_0 + xl1_1);
1261*15dc779aSAndroid Build Coastguard Worker
1262*15dc779aSAndroid Build Coastguard Worker n11 = (xl1_0 - xl0_1);
1263*15dc779aSAndroid Build Coastguard Worker n20 = (xh0_0 - xh0_1);
1264*15dc779aSAndroid Build Coastguard Worker n21 = (xh1_0 - xh1_1);
1265*15dc779aSAndroid Build Coastguard Worker n30 = (xl0_0 - xl1_1);
1266*15dc779aSAndroid Build Coastguard Worker
1267*15dc779aSAndroid Build Coastguard Worker n31 = (xl1_0 + xl0_1);
1268*15dc779aSAndroid Build Coastguard Worker
1269*15dc779aSAndroid Build Coastguard Worker ptr_y0[h2] = n00;
1270*15dc779aSAndroid Build Coastguard Worker ptr_y0[h2 + 1] = n01;
1271*15dc779aSAndroid Build Coastguard Worker ptr_y1[h2] = n10;
1272*15dc779aSAndroid Build Coastguard Worker ptr_y1[h2 + 1] = n11;
1273*15dc779aSAndroid Build Coastguard Worker ptr_y2[h2] = n20;
1274*15dc779aSAndroid Build Coastguard Worker ptr_y2[h2 + 1] = n21;
1275*15dc779aSAndroid Build Coastguard Worker ptr_y3[h2] = n30;
1276*15dc779aSAndroid Build Coastguard Worker ptr_y3[h2 + 1] = n31;
1277*15dc779aSAndroid Build Coastguard Worker
1278*15dc779aSAndroid Build Coastguard Worker x_8 = *ptr_x2++;
1279*15dc779aSAndroid Build Coastguard Worker x_9 = *ptr_x2++;
1280*15dc779aSAndroid Build Coastguard Worker x_a = *ptr_x2++;
1281*15dc779aSAndroid Build Coastguard Worker x_b = *ptr_x2++;
1282*15dc779aSAndroid Build Coastguard Worker x_c = *ptr_x2++;
1283*15dc779aSAndroid Build Coastguard Worker x_d = *ptr_x2++;
1284*15dc779aSAndroid Build Coastguard Worker x_e = *ptr_x2++;
1285*15dc779aSAndroid Build Coastguard Worker x_f = *ptr_x2++;
1286*15dc779aSAndroid Build Coastguard Worker
1287*15dc779aSAndroid Build Coastguard Worker xh0_2 = (x_8 + x_c);
1288*15dc779aSAndroid Build Coastguard Worker xh1_2 = (x_9 + x_d);
1289*15dc779aSAndroid Build Coastguard Worker
1290*15dc779aSAndroid Build Coastguard Worker xl0_2 = (x_8 - x_c);
1291*15dc779aSAndroid Build Coastguard Worker xl1_2 = (x_9 - x_d);
1292*15dc779aSAndroid Build Coastguard Worker
1293*15dc779aSAndroid Build Coastguard Worker xh0_3 = (x_a + x_e);
1294*15dc779aSAndroid Build Coastguard Worker xh1_3 = (x_b + x_f);
1295*15dc779aSAndroid Build Coastguard Worker
1296*15dc779aSAndroid Build Coastguard Worker xl0_3 = (x_a - x_e);
1297*15dc779aSAndroid Build Coastguard Worker xl1_3 = (x_b - x_f);
1298*15dc779aSAndroid Build Coastguard Worker
1299*15dc779aSAndroid Build Coastguard Worker n02 = (xh0_2 + xh0_3);
1300*15dc779aSAndroid Build Coastguard Worker n03 = (xh1_2 + xh1_3);
1301*15dc779aSAndroid Build Coastguard Worker n12 = (xl0_2 + xl1_3);
1302*15dc779aSAndroid Build Coastguard Worker
1303*15dc779aSAndroid Build Coastguard Worker n13 = (xl1_2 - xl0_3);
1304*15dc779aSAndroid Build Coastguard Worker n22 = (xh0_2 - xh0_3);
1305*15dc779aSAndroid Build Coastguard Worker n23 = (xh1_2 - xh1_3);
1306*15dc779aSAndroid Build Coastguard Worker n32 = (xl0_2 - xl1_3);
1307*15dc779aSAndroid Build Coastguard Worker
1308*15dc779aSAndroid Build Coastguard Worker n33 = (xl1_2 + xl0_3);
1309*15dc779aSAndroid Build Coastguard Worker
1310*15dc779aSAndroid Build Coastguard Worker ptr_y0[h2 + 2] = n02;
1311*15dc779aSAndroid Build Coastguard Worker ptr_y0[h2 + 3] = n03;
1312*15dc779aSAndroid Build Coastguard Worker ptr_y1[h2 + 2] = n12;
1313*15dc779aSAndroid Build Coastguard Worker ptr_y1[h2 + 3] = n13;
1314*15dc779aSAndroid Build Coastguard Worker ptr_y2[h2 + 2] = n22;
1315*15dc779aSAndroid Build Coastguard Worker ptr_y2[h2 + 3] = n23;
1316*15dc779aSAndroid Build Coastguard Worker ptr_y3[h2 + 2] = n32;
1317*15dc779aSAndroid Build Coastguard Worker ptr_y3[h2 + 3] = n33;
1318*15dc779aSAndroid Build Coastguard Worker }
1319*15dc779aSAndroid Build Coastguard Worker ptr_x0 += (WORD32)npoints >> 1;
1320*15dc779aSAndroid Build Coastguard Worker ptr_x2 += (WORD32)npoints >> 1;
1321*15dc779aSAndroid Build Coastguard Worker }
1322*15dc779aSAndroid Build Coastguard Worker }
1323*15dc779aSAndroid Build Coastguard Worker
ixheaace_esbr_cos_sin_mod(FLOAT32 * subband,ia_sbr_qmf_filter_bank_struct * pstr_qmf_bank,FLOAT32 * ptr_twiddle,FLOAT32 * ptr_dig_rev_tbl)1324*15dc779aSAndroid Build Coastguard Worker VOID ixheaace_esbr_cos_sin_mod(FLOAT32 *subband, ia_sbr_qmf_filter_bank_struct *pstr_qmf_bank,
1325*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_twiddle, FLOAT32 *ptr_dig_rev_tbl) {
1326*15dc779aSAndroid Build Coastguard Worker WORD32 z;
1327*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp[128] = {0};
1328*15dc779aSAndroid Build Coastguard Worker
1329*15dc779aSAndroid Build Coastguard Worker FLOAT32 re2, re3;
1330*15dc779aSAndroid Build Coastguard Worker FLOAT32 wim, wre;
1331*15dc779aSAndroid Build Coastguard Worker
1332*15dc779aSAndroid Build Coastguard Worker WORD32 i, M_2;
1333*15dc779aSAndroid Build Coastguard Worker WORD32 M = pstr_qmf_bank->no_channels / 2;
1334*15dc779aSAndroid Build Coastguard Worker
1335*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *ptr_sin;
1336*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *ptr_sin_cos;
1337*15dc779aSAndroid Build Coastguard Worker
1338*15dc779aSAndroid Build Coastguard Worker FLOAT32 subband_tmp[128] = {0};
1339*15dc779aSAndroid Build Coastguard Worker FLOAT32 re;
1340*15dc779aSAndroid Build Coastguard Worker FLOAT32 im;
1341*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_subband, *ptr_subband1;
1342*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_subband_t, *ptr_subband1_t;
1343*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_subband2, *ptr_subband12;
1344*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_subband_t2, *ptr_subband1_t2;
1345*15dc779aSAndroid Build Coastguard Worker
1346*15dc779aSAndroid Build Coastguard Worker M_2 = M / 2;
1347*15dc779aSAndroid Build Coastguard Worker
1348*15dc779aSAndroid Build Coastguard Worker ptr_sin_cos = pstr_qmf_bank->ptr_esbr_cos_twiddle;
1349*15dc779aSAndroid Build Coastguard Worker
1350*15dc779aSAndroid Build Coastguard Worker ptr_subband = &subband[0];
1351*15dc779aSAndroid Build Coastguard Worker ptr_subband1 = &subband[2 * M - 1];
1352*15dc779aSAndroid Build Coastguard Worker ptr_subband_t = subband_tmp;
1353*15dc779aSAndroid Build Coastguard Worker ptr_subband1_t = &subband_tmp[2 * M - 1];
1354*15dc779aSAndroid Build Coastguard Worker
1355*15dc779aSAndroid Build Coastguard Worker ptr_subband2 = &subband[64];
1356*15dc779aSAndroid Build Coastguard Worker ptr_subband12 = &subband[2 * M - 1 + 64];
1357*15dc779aSAndroid Build Coastguard Worker ptr_subband_t2 = &subband_tmp[64];
1358*15dc779aSAndroid Build Coastguard Worker ptr_subband1_t2 = &subband_tmp[2 * M - 1 + 64];
1359*15dc779aSAndroid Build Coastguard Worker
1360*15dc779aSAndroid Build Coastguard Worker i = (M_2 >> 1) - 1;
1361*15dc779aSAndroid Build Coastguard Worker while (i >= 0) {
1362*15dc779aSAndroid Build Coastguard Worker re = *ptr_subband++;
1363*15dc779aSAndroid Build Coastguard Worker im = *ptr_subband1--;
1364*15dc779aSAndroid Build Coastguard Worker
1365*15dc779aSAndroid Build Coastguard Worker wim = *ptr_sin_cos++;
1366*15dc779aSAndroid Build Coastguard Worker wre = *ptr_sin_cos++;
1367*15dc779aSAndroid Build Coastguard Worker
1368*15dc779aSAndroid Build Coastguard Worker *ptr_subband_t++ = (re * wre) + (im * wim);
1369*15dc779aSAndroid Build Coastguard Worker *ptr_subband_t++ = (im * wre) - (re * wim);
1370*15dc779aSAndroid Build Coastguard Worker
1371*15dc779aSAndroid Build Coastguard Worker re = *ptr_subband2++;
1372*15dc779aSAndroid Build Coastguard Worker im = *ptr_subband12--;
1373*15dc779aSAndroid Build Coastguard Worker
1374*15dc779aSAndroid Build Coastguard Worker *ptr_subband_t2++ = (im * wim) - (re * wre);
1375*15dc779aSAndroid Build Coastguard Worker *ptr_subband_t2++ = (re * wim) + (im * wre);
1376*15dc779aSAndroid Build Coastguard Worker
1377*15dc779aSAndroid Build Coastguard Worker re = *ptr_subband1--;
1378*15dc779aSAndroid Build Coastguard Worker im = *ptr_subband++;
1379*15dc779aSAndroid Build Coastguard Worker
1380*15dc779aSAndroid Build Coastguard Worker wim = *ptr_sin_cos++;
1381*15dc779aSAndroid Build Coastguard Worker wre = *ptr_sin_cos++;
1382*15dc779aSAndroid Build Coastguard Worker
1383*15dc779aSAndroid Build Coastguard Worker *ptr_subband1_t-- = (im * wre) - (re * wim);
1384*15dc779aSAndroid Build Coastguard Worker *ptr_subband1_t-- = (re * wre) + (im * wim);
1385*15dc779aSAndroid Build Coastguard Worker
1386*15dc779aSAndroid Build Coastguard Worker re = *ptr_subband12--;
1387*15dc779aSAndroid Build Coastguard Worker im = *ptr_subband2++;
1388*15dc779aSAndroid Build Coastguard Worker
1389*15dc779aSAndroid Build Coastguard Worker *ptr_subband1_t2-- = (re * wim) + (im * wre);
1390*15dc779aSAndroid Build Coastguard Worker *ptr_subband1_t2-- = (im * wim) - (re * wre);
1391*15dc779aSAndroid Build Coastguard Worker
1392*15dc779aSAndroid Build Coastguard Worker re = *ptr_subband++;
1393*15dc779aSAndroid Build Coastguard Worker im = *ptr_subband1--;
1394*15dc779aSAndroid Build Coastguard Worker
1395*15dc779aSAndroid Build Coastguard Worker wim = *ptr_sin_cos++;
1396*15dc779aSAndroid Build Coastguard Worker wre = *ptr_sin_cos++;
1397*15dc779aSAndroid Build Coastguard Worker
1398*15dc779aSAndroid Build Coastguard Worker *ptr_subband_t++ = (re * wre) + (im * wim);
1399*15dc779aSAndroid Build Coastguard Worker *ptr_subband_t++ = (im * wre) - (re * wim);
1400*15dc779aSAndroid Build Coastguard Worker
1401*15dc779aSAndroid Build Coastguard Worker re = *ptr_subband2++;
1402*15dc779aSAndroid Build Coastguard Worker im = *ptr_subband12--;
1403*15dc779aSAndroid Build Coastguard Worker
1404*15dc779aSAndroid Build Coastguard Worker *ptr_subband_t2++ = (im * wim) - (re * wre);
1405*15dc779aSAndroid Build Coastguard Worker *ptr_subband_t2++ = (re * wim) + (im * wre);
1406*15dc779aSAndroid Build Coastguard Worker
1407*15dc779aSAndroid Build Coastguard Worker re = *ptr_subband1--;
1408*15dc779aSAndroid Build Coastguard Worker im = *ptr_subband++;
1409*15dc779aSAndroid Build Coastguard Worker
1410*15dc779aSAndroid Build Coastguard Worker wim = *ptr_sin_cos++;
1411*15dc779aSAndroid Build Coastguard Worker wre = *ptr_sin_cos++;
1412*15dc779aSAndroid Build Coastguard Worker
1413*15dc779aSAndroid Build Coastguard Worker *ptr_subband1_t-- = (im * wre) - (re * wim);
1414*15dc779aSAndroid Build Coastguard Worker *ptr_subband1_t-- = (re * wre) + (im * wim);
1415*15dc779aSAndroid Build Coastguard Worker
1416*15dc779aSAndroid Build Coastguard Worker re = *ptr_subband12--;
1417*15dc779aSAndroid Build Coastguard Worker im = *ptr_subband2++;
1418*15dc779aSAndroid Build Coastguard Worker
1419*15dc779aSAndroid Build Coastguard Worker *ptr_subband1_t2-- = (re * wim) + (im * wre);
1420*15dc779aSAndroid Build Coastguard Worker *ptr_subband1_t2-- = (im * wim) - (re * wre);
1421*15dc779aSAndroid Build Coastguard Worker
1422*15dc779aSAndroid Build Coastguard Worker i--;
1423*15dc779aSAndroid Build Coastguard Worker }
1424*15dc779aSAndroid Build Coastguard Worker
1425*15dc779aSAndroid Build Coastguard Worker switch (M) {
1426*15dc779aSAndroid Build Coastguard Worker case M_32:
1427*15dc779aSAndroid Build Coastguard Worker ixheaace_esbr_radix4bfly(ptr_twiddle, subband_tmp, 1, 8);
1428*15dc779aSAndroid Build Coastguard Worker ixheaace_esbr_radix4bfly(ptr_twiddle + 48, subband_tmp, 4, 2);
1429*15dc779aSAndroid Build Coastguard Worker ixheaace_esbr_postradixcompute2(subband, subband_tmp, ptr_dig_rev_tbl, 32);
1430*15dc779aSAndroid Build Coastguard Worker
1431*15dc779aSAndroid Build Coastguard Worker ixheaace_esbr_radix4bfly(ptr_twiddle, &subband_tmp[64], 1, 8);
1432*15dc779aSAndroid Build Coastguard Worker ixheaace_esbr_radix4bfly(ptr_twiddle + 48, &subband_tmp[64], 4, 2);
1433*15dc779aSAndroid Build Coastguard Worker ixheaace_esbr_postradixcompute2(&subband[64], &subband_tmp[64], ptr_dig_rev_tbl, 32);
1434*15dc779aSAndroid Build Coastguard Worker break;
1435*15dc779aSAndroid Build Coastguard Worker
1436*15dc779aSAndroid Build Coastguard Worker case M_16:
1437*15dc779aSAndroid Build Coastguard Worker ixheaace_esbr_radix4bfly(ptr_twiddle, subband_tmp, 1, 4);
1438*15dc779aSAndroid Build Coastguard Worker ixheaace_esbr_postradixcompute4(subband, subband_tmp, ptr_dig_rev_tbl, 16);
1439*15dc779aSAndroid Build Coastguard Worker
1440*15dc779aSAndroid Build Coastguard Worker ixheaace_esbr_radix4bfly(ptr_twiddle, &subband_tmp[64], 1, 4);
1441*15dc779aSAndroid Build Coastguard Worker ixheaace_esbr_postradixcompute4(&subband[64], &subband_tmp[64], ptr_dig_rev_tbl, 16);
1442*15dc779aSAndroid Build Coastguard Worker break;
1443*15dc779aSAndroid Build Coastguard Worker
1444*15dc779aSAndroid Build Coastguard Worker case M_12:
1445*15dc779aSAndroid Build Coastguard Worker
1446*15dc779aSAndroid Build Coastguard Worker for (z = 0; z < (pstr_qmf_bank->no_channels >> 1); z++) {
1447*15dc779aSAndroid Build Coastguard Worker temp[z] = subband_tmp[2 * z];
1448*15dc779aSAndroid Build Coastguard Worker temp[12 + z] = subband_tmp[2 * z + 1];
1449*15dc779aSAndroid Build Coastguard Worker }
1450*15dc779aSAndroid Build Coastguard Worker
1451*15dc779aSAndroid Build Coastguard Worker // convert re and im data to interleave
1452*15dc779aSAndroid Build Coastguard Worker FLOAT32 intermediate[24];
1453*15dc779aSAndroid Build Coastguard Worker WORD32 cnt = 0;
1454*15dc779aSAndroid Build Coastguard Worker while (cnt < M_12) {
1455*15dc779aSAndroid Build Coastguard Worker intermediate[2 * cnt] = temp[cnt];
1456*15dc779aSAndroid Build Coastguard Worker intermediate[2 * cnt + 1] = temp[12 + cnt];
1457*15dc779aSAndroid Build Coastguard Worker cnt++;
1458*15dc779aSAndroid Build Coastguard Worker }
1459*15dc779aSAndroid Build Coastguard Worker
1460*15dc779aSAndroid Build Coastguard Worker iusace_complex_fft_p3_no_scratch(intermediate, 12);
1461*15dc779aSAndroid Build Coastguard Worker // de-interleave
1462*15dc779aSAndroid Build Coastguard Worker for (cnt = 0; cnt < 12; cnt++) {
1463*15dc779aSAndroid Build Coastguard Worker temp[cnt] = intermediate[2 * cnt];
1464*15dc779aSAndroid Build Coastguard Worker temp[12 + cnt] = intermediate[2 * cnt + 1];
1465*15dc779aSAndroid Build Coastguard Worker }
1466*15dc779aSAndroid Build Coastguard Worker
1467*15dc779aSAndroid Build Coastguard Worker z = 0;
1468*15dc779aSAndroid Build Coastguard Worker while (z < (pstr_qmf_bank->no_channels >> 1)) {
1469*15dc779aSAndroid Build Coastguard Worker subband[2 * z] = temp[z];
1470*15dc779aSAndroid Build Coastguard Worker subband[2 * z + 1] = temp[z + 12];
1471*15dc779aSAndroid Build Coastguard Worker z++;
1472*15dc779aSAndroid Build Coastguard Worker }
1473*15dc779aSAndroid Build Coastguard Worker
1474*15dc779aSAndroid Build Coastguard Worker z = 0;
1475*15dc779aSAndroid Build Coastguard Worker while (z < (pstr_qmf_bank->no_channels >> 1)) {
1476*15dc779aSAndroid Build Coastguard Worker temp[z] = subband_tmp[64 + 2 * z];
1477*15dc779aSAndroid Build Coastguard Worker temp[12 + z] = subband_tmp[64 + 2 * z + 1];
1478*15dc779aSAndroid Build Coastguard Worker z++;
1479*15dc779aSAndroid Build Coastguard Worker }
1480*15dc779aSAndroid Build Coastguard Worker
1481*15dc779aSAndroid Build Coastguard Worker // convert re and im data to interleave
1482*15dc779aSAndroid Build Coastguard Worker cnt = 0;
1483*15dc779aSAndroid Build Coastguard Worker while (cnt < 12) {
1484*15dc779aSAndroid Build Coastguard Worker intermediate[2 * cnt] = temp[cnt];
1485*15dc779aSAndroid Build Coastguard Worker intermediate[2 * cnt + 1] = temp[12 + cnt];
1486*15dc779aSAndroid Build Coastguard Worker cnt++;
1487*15dc779aSAndroid Build Coastguard Worker }
1488*15dc779aSAndroid Build Coastguard Worker iusace_complex_fft_p3_no_scratch(intermediate, 12);
1489*15dc779aSAndroid Build Coastguard Worker // de-interleave
1490*15dc779aSAndroid Build Coastguard Worker
1491*15dc779aSAndroid Build Coastguard Worker cnt = 0;
1492*15dc779aSAndroid Build Coastguard Worker while (cnt < 12) {
1493*15dc779aSAndroid Build Coastguard Worker temp[cnt] = intermediate[2 * cnt];
1494*15dc779aSAndroid Build Coastguard Worker temp[12 + cnt] = intermediate[2 * cnt + 1];
1495*15dc779aSAndroid Build Coastguard Worker cnt++;
1496*15dc779aSAndroid Build Coastguard Worker }
1497*15dc779aSAndroid Build Coastguard Worker
1498*15dc779aSAndroid Build Coastguard Worker z = 0;
1499*15dc779aSAndroid Build Coastguard Worker while (z < (pstr_qmf_bank->no_channels >> 1)) {
1500*15dc779aSAndroid Build Coastguard Worker subband[64 + 2 * z] = temp[z];
1501*15dc779aSAndroid Build Coastguard Worker subband[64 + 2 * z + 1] = temp[z + 12];
1502*15dc779aSAndroid Build Coastguard Worker z++;
1503*15dc779aSAndroid Build Coastguard Worker }
1504*15dc779aSAndroid Build Coastguard Worker break;
1505*15dc779aSAndroid Build Coastguard Worker
1506*15dc779aSAndroid Build Coastguard Worker default:
1507*15dc779aSAndroid Build Coastguard Worker z = 0;
1508*15dc779aSAndroid Build Coastguard Worker while (z < (pstr_qmf_bank->no_channels >> 1)) {
1509*15dc779aSAndroid Build Coastguard Worker temp[z] = subband_tmp[2 * z];
1510*15dc779aSAndroid Build Coastguard Worker temp[8 + z] = subband_tmp[2 * z + 1];
1511*15dc779aSAndroid Build Coastguard Worker z++;
1512*15dc779aSAndroid Build Coastguard Worker }
1513*15dc779aSAndroid Build Coastguard Worker
1514*15dc779aSAndroid Build Coastguard Worker FLOAT32 scratch[1024];
1515*15dc779aSAndroid Build Coastguard Worker cnt = 0;
1516*15dc779aSAndroid Build Coastguard Worker while (cnt < 8) {
1517*15dc779aSAndroid Build Coastguard Worker intermediate[2 * cnt] = temp[cnt];
1518*15dc779aSAndroid Build Coastguard Worker intermediate[2 * cnt + 1] = temp[8 + cnt];
1519*15dc779aSAndroid Build Coastguard Worker cnt++;
1520*15dc779aSAndroid Build Coastguard Worker }
1521*15dc779aSAndroid Build Coastguard Worker
1522*15dc779aSAndroid Build Coastguard Worker iusace_complex_fft_p2(intermediate, 8, scratch);
1523*15dc779aSAndroid Build Coastguard Worker // de-interleave
1524*15dc779aSAndroid Build Coastguard Worker cnt = 0;
1525*15dc779aSAndroid Build Coastguard Worker while (cnt < 8) {
1526*15dc779aSAndroid Build Coastguard Worker temp[cnt] = intermediate[2 * cnt];
1527*15dc779aSAndroid Build Coastguard Worker temp[8 + cnt] = intermediate[2 * cnt + 1];
1528*15dc779aSAndroid Build Coastguard Worker cnt++;
1529*15dc779aSAndroid Build Coastguard Worker }
1530*15dc779aSAndroid Build Coastguard Worker
1531*15dc779aSAndroid Build Coastguard Worker z = 0;
1532*15dc779aSAndroid Build Coastguard Worker while (z < (pstr_qmf_bank->no_channels >> 1)) {
1533*15dc779aSAndroid Build Coastguard Worker subband[2 * z] = temp[z];
1534*15dc779aSAndroid Build Coastguard Worker subband[2 * z + 1] = temp[z + 8];
1535*15dc779aSAndroid Build Coastguard Worker z++;
1536*15dc779aSAndroid Build Coastguard Worker }
1537*15dc779aSAndroid Build Coastguard Worker z = 0;
1538*15dc779aSAndroid Build Coastguard Worker while (z < (pstr_qmf_bank->no_channels >> 1)) {
1539*15dc779aSAndroid Build Coastguard Worker temp[z] = subband_tmp[64 + 2 * z];
1540*15dc779aSAndroid Build Coastguard Worker temp[8 + z] = subband_tmp[64 + 2 * z + 1];
1541*15dc779aSAndroid Build Coastguard Worker z++;
1542*15dc779aSAndroid Build Coastguard Worker }
1543*15dc779aSAndroid Build Coastguard Worker
1544*15dc779aSAndroid Build Coastguard Worker // convert re and im data to interleave
1545*15dc779aSAndroid Build Coastguard Worker cnt = 0;
1546*15dc779aSAndroid Build Coastguard Worker while (cnt < 8) {
1547*15dc779aSAndroid Build Coastguard Worker intermediate[2 * cnt] = temp[cnt];
1548*15dc779aSAndroid Build Coastguard Worker intermediate[2 * cnt + 1] = temp[8 + cnt];
1549*15dc779aSAndroid Build Coastguard Worker cnt++;
1550*15dc779aSAndroid Build Coastguard Worker }
1551*15dc779aSAndroid Build Coastguard Worker
1552*15dc779aSAndroid Build Coastguard Worker iusace_complex_fft_p2(intermediate, 8, scratch);
1553*15dc779aSAndroid Build Coastguard Worker
1554*15dc779aSAndroid Build Coastguard Worker // de-interleave
1555*15dc779aSAndroid Build Coastguard Worker cnt = 0;
1556*15dc779aSAndroid Build Coastguard Worker while (cnt < 8) {
1557*15dc779aSAndroid Build Coastguard Worker temp[cnt] = intermediate[2 * cnt];
1558*15dc779aSAndroid Build Coastguard Worker temp[8 + cnt] = intermediate[2 * cnt + 1];
1559*15dc779aSAndroid Build Coastguard Worker cnt++;
1560*15dc779aSAndroid Build Coastguard Worker }
1561*15dc779aSAndroid Build Coastguard Worker
1562*15dc779aSAndroid Build Coastguard Worker z = 0;
1563*15dc779aSAndroid Build Coastguard Worker while (z < (pstr_qmf_bank->no_channels >> 1)) {
1564*15dc779aSAndroid Build Coastguard Worker subband[64 + 2 * z] = temp[z];
1565*15dc779aSAndroid Build Coastguard Worker subband[64 + 2 * z + 1] = temp[8 + z];
1566*15dc779aSAndroid Build Coastguard Worker z++;
1567*15dc779aSAndroid Build Coastguard Worker }
1568*15dc779aSAndroid Build Coastguard Worker break;
1569*15dc779aSAndroid Build Coastguard Worker }
1570*15dc779aSAndroid Build Coastguard Worker
1571*15dc779aSAndroid Build Coastguard Worker ptr_subband = &subband[0];
1572*15dc779aSAndroid Build Coastguard Worker ptr_subband1 = &subband[2 * M - 1];
1573*15dc779aSAndroid Build Coastguard Worker
1574*15dc779aSAndroid Build Coastguard Worker re = *ptr_subband1;
1575*15dc779aSAndroid Build Coastguard Worker
1576*15dc779aSAndroid Build Coastguard Worker *ptr_subband = *ptr_subband / 2;
1577*15dc779aSAndroid Build Coastguard Worker ptr_subband++;
1578*15dc779aSAndroid Build Coastguard Worker *ptr_subband1 = -(*ptr_subband / 2);
1579*15dc779aSAndroid Build Coastguard Worker ptr_subband1--;
1580*15dc779aSAndroid Build Coastguard Worker
1581*15dc779aSAndroid Build Coastguard Worker ptr_sin = pstr_qmf_bank->ptr_esbr_alt_sin_twiddle;
1582*15dc779aSAndroid Build Coastguard Worker
1583*15dc779aSAndroid Build Coastguard Worker wim = *ptr_sin++;
1584*15dc779aSAndroid Build Coastguard Worker wre = *ptr_sin++;
1585*15dc779aSAndroid Build Coastguard Worker
1586*15dc779aSAndroid Build Coastguard Worker im = *ptr_subband1;
1587*15dc779aSAndroid Build Coastguard Worker
1588*15dc779aSAndroid Build Coastguard Worker *ptr_subband1-- = (re * wre) + (im * wim);
1589*15dc779aSAndroid Build Coastguard Worker *ptr_subband++ = (im * wre) - (re * wim);
1590*15dc779aSAndroid Build Coastguard Worker
1591*15dc779aSAndroid Build Coastguard Worker ptr_subband2 = &subband[64];
1592*15dc779aSAndroid Build Coastguard Worker ptr_subband12 = &subband[2 * M - 1 + 64];
1593*15dc779aSAndroid Build Coastguard Worker
1594*15dc779aSAndroid Build Coastguard Worker re = *ptr_subband12;
1595*15dc779aSAndroid Build Coastguard Worker
1596*15dc779aSAndroid Build Coastguard Worker *ptr_subband12-- = -(*ptr_subband2 / 2);
1597*15dc779aSAndroid Build Coastguard Worker
1598*15dc779aSAndroid Build Coastguard Worker *ptr_subband2 = ptr_subband2[1] / 2;
1599*15dc779aSAndroid Build Coastguard Worker
1600*15dc779aSAndroid Build Coastguard Worker ptr_subband2++;
1601*15dc779aSAndroid Build Coastguard Worker
1602*15dc779aSAndroid Build Coastguard Worker im = *ptr_subband12;
1603*15dc779aSAndroid Build Coastguard Worker
1604*15dc779aSAndroid Build Coastguard Worker *ptr_subband2++ = -((re * wre) + (im * wim));
1605*15dc779aSAndroid Build Coastguard Worker *ptr_subband12-- = (re * wim) - (im * wre);
1606*15dc779aSAndroid Build Coastguard Worker
1607*15dc779aSAndroid Build Coastguard Worker i = (M_2 - 2);
1608*15dc779aSAndroid Build Coastguard Worker while (i >= 0) {
1609*15dc779aSAndroid Build Coastguard Worker im = ptr_subband[0];
1610*15dc779aSAndroid Build Coastguard Worker
1611*15dc779aSAndroid Build Coastguard Worker re = ptr_subband[1];
1612*15dc779aSAndroid Build Coastguard Worker
1613*15dc779aSAndroid Build Coastguard Worker re2 = *ptr_subband1;
1614*15dc779aSAndroid Build Coastguard Worker
1615*15dc779aSAndroid Build Coastguard Worker *ptr_subband++ = (re * wim) + (im * wre);
1616*15dc779aSAndroid Build Coastguard Worker *ptr_subband1-- = (im * wim) - (re * wre);
1617*15dc779aSAndroid Build Coastguard Worker
1618*15dc779aSAndroid Build Coastguard Worker im = ptr_subband2[0];
1619*15dc779aSAndroid Build Coastguard Worker
1620*15dc779aSAndroid Build Coastguard Worker re = ptr_subband2[1];
1621*15dc779aSAndroid Build Coastguard Worker
1622*15dc779aSAndroid Build Coastguard Worker re3 = *ptr_subband12;
1623*15dc779aSAndroid Build Coastguard Worker
1624*15dc779aSAndroid Build Coastguard Worker *ptr_subband12-- = -((re * wim) + (im * wre));
1625*15dc779aSAndroid Build Coastguard Worker *ptr_subband2++ = (re * wre) - (im * wim);
1626*15dc779aSAndroid Build Coastguard Worker
1627*15dc779aSAndroid Build Coastguard Worker wim = *ptr_sin++;
1628*15dc779aSAndroid Build Coastguard Worker wre = *ptr_sin++;
1629*15dc779aSAndroid Build Coastguard Worker im = ptr_subband1[0];
1630*15dc779aSAndroid Build Coastguard Worker
1631*15dc779aSAndroid Build Coastguard Worker *ptr_subband1-- = (re2 * wre) + (im * wim);
1632*15dc779aSAndroid Build Coastguard Worker *ptr_subband++ = (im * wre) - (re2 * wim);
1633*15dc779aSAndroid Build Coastguard Worker
1634*15dc779aSAndroid Build Coastguard Worker im = ptr_subband12[0];
1635*15dc779aSAndroid Build Coastguard Worker
1636*15dc779aSAndroid Build Coastguard Worker *ptr_subband2++ = -((re3 * wre) + (im * wim));
1637*15dc779aSAndroid Build Coastguard Worker *ptr_subband12-- = (re3 * wim) - (im * wre);
1638*15dc779aSAndroid Build Coastguard Worker i--;
1639*15dc779aSAndroid Build Coastguard Worker }
1640*15dc779aSAndroid Build Coastguard Worker }
1641*15dc779aSAndroid Build Coastguard Worker
ixheaace_esbr_fwd_modulation(const FLOAT32 * ptr_time_sample_buf,FLOAT32 * ptr_in_real_subband,FLOAT32 * ptr_in_imag_subband,ia_sbr_qmf_filter_bank_struct * pstr_qmf_bank,ixheaace_str_qmf_dec_tabs_struct * pstr_qmf_dec_tabs)1642*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_esbr_fwd_modulation(const FLOAT32 *ptr_time_sample_buf,
1643*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_in_real_subband,
1644*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_in_imag_subband,
1645*15dc779aSAndroid Build Coastguard Worker ia_sbr_qmf_filter_bank_struct *pstr_qmf_bank,
1646*15dc779aSAndroid Build Coastguard Worker ixheaace_str_qmf_dec_tabs_struct *pstr_qmf_dec_tabs) {
1647*15dc779aSAndroid Build Coastguard Worker WORD32 i;
1648*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *ptr_time_sample_buf1 = &ptr_time_sample_buf[2 * pstr_qmf_bank->no_channels - 1];
1649*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp1, temp2;
1650*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_real_subband = ptr_in_real_subband;
1651*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_imag_subband = ptr_in_imag_subband;
1652*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *ptr_cos;
1653*15dc779aSAndroid Build Coastguard Worker
1654*15dc779aSAndroid Build Coastguard Worker for (i = pstr_qmf_bank->no_channels - 1; i >= 0; i--) {
1655*15dc779aSAndroid Build Coastguard Worker temp1 = *ptr_time_sample_buf++ / 16.0f;
1656*15dc779aSAndroid Build Coastguard Worker temp2 = *ptr_time_sample_buf1-- / 16.0f;
1657*15dc779aSAndroid Build Coastguard Worker *ptr_real_subband++ = (temp1 - temp2);
1658*15dc779aSAndroid Build Coastguard Worker *ptr_imag_subband++ = (temp1 + temp2);
1659*15dc779aSAndroid Build Coastguard Worker }
1660*15dc779aSAndroid Build Coastguard Worker
1661*15dc779aSAndroid Build Coastguard Worker ixheaace_esbr_cos_sin_mod(ptr_in_real_subband, pstr_qmf_bank, pstr_qmf_dec_tabs->esbr_w_16,
1662*15dc779aSAndroid Build Coastguard Worker pstr_qmf_dec_tabs->dig_rev_tab_4_16);
1663*15dc779aSAndroid Build Coastguard Worker
1664*15dc779aSAndroid Build Coastguard Worker ptr_cos = pstr_qmf_bank->ptr_esbr_t_cos;
1665*15dc779aSAndroid Build Coastguard Worker
1666*15dc779aSAndroid Build Coastguard Worker i = (pstr_qmf_bank->usb - pstr_qmf_bank->lsb - 1);
1667*15dc779aSAndroid Build Coastguard Worker while (i >= 0) {
1668*15dc779aSAndroid Build Coastguard Worker FLOAT32 cosh, sinh;
1669*15dc779aSAndroid Build Coastguard Worker FLOAT32 re, im;
1670*15dc779aSAndroid Build Coastguard Worker
1671*15dc779aSAndroid Build Coastguard Worker re = *ptr_in_real_subband;
1672*15dc779aSAndroid Build Coastguard Worker im = *ptr_in_imag_subband;
1673*15dc779aSAndroid Build Coastguard Worker cosh = *ptr_cos++;
1674*15dc779aSAndroid Build Coastguard Worker sinh = *ptr_cos++;
1675*15dc779aSAndroid Build Coastguard Worker *ptr_in_real_subband++ = 2 * ((re * cosh) + (im * sinh));
1676*15dc779aSAndroid Build Coastguard Worker *ptr_in_imag_subband++ = 2 * ((im * cosh) - (re * sinh));
1677*15dc779aSAndroid Build Coastguard Worker i--;
1678*15dc779aSAndroid Build Coastguard Worker }
1679*15dc779aSAndroid Build Coastguard Worker }
1680*15dc779aSAndroid Build Coastguard Worker
ixheaace_esbr_analysis_filt_block(ia_sbr_qmf_filter_bank_struct * pstr_codec_qmf_bank,ixheaace_str_qmf_dec_tabs_struct * pstr_qmf_dec_tabs,FLOAT32 * ptr_core_coder_samples,FLOAT32 qmf_buf_real[IXHEAACE_TIMESLOT_BUFFER_SIZE+2* 32][IXHEAACE_NUM_QMF_SYNTH_CHANNELS],FLOAT32 qmf_buf_imag[IXHEAACE_TIMESLOT_BUFFER_SIZE+2* 32][IXHEAACE_NUM_QMF_SYNTH_CHANNELS],WORD32 op_delay)1681*15dc779aSAndroid Build Coastguard Worker VOID ixheaace_esbr_analysis_filt_block(
1682*15dc779aSAndroid Build Coastguard Worker ia_sbr_qmf_filter_bank_struct *pstr_codec_qmf_bank,
1683*15dc779aSAndroid Build Coastguard Worker ixheaace_str_qmf_dec_tabs_struct *pstr_qmf_dec_tabs, FLOAT32 *ptr_core_coder_samples,
1684*15dc779aSAndroid Build Coastguard Worker FLOAT32 qmf_buf_real[IXHEAACE_TIMESLOT_BUFFER_SIZE + 2 * 32][IXHEAACE_NUM_QMF_SYNTH_CHANNELS],
1685*15dc779aSAndroid Build Coastguard Worker FLOAT32 qmf_buf_imag[IXHEAACE_TIMESLOT_BUFFER_SIZE + 2 * 32][IXHEAACE_NUM_QMF_SYNTH_CHANNELS],
1686*15dc779aSAndroid Build Coastguard Worker WORD32 op_delay) {
1687*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_filt_states;
1688*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_filt_states_1;
1689*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_filt_states_2;
1690*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_temp;
1691*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_win_coeffs_1;
1692*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_win_coeffs_2;
1693*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_win_coeffs;
1694*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_loc_qmf_buf_real;
1695*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_loc_qmf_buf_imag;
1696*15dc779aSAndroid Build Coastguard Worker FLOAT32 local_qmf_buffer[128] = {0};
1697*15dc779aSAndroid Build Coastguard Worker FLOAT32 anal_buf[2 * 32] = {0};
1698*15dc779aSAndroid Build Coastguard Worker WORD32 idx, z;
1699*15dc779aSAndroid Build Coastguard Worker WORD32 core_syn_ch_index;
1700*15dc779aSAndroid Build Coastguard Worker FLOAT32 gain;
1701*15dc779aSAndroid Build Coastguard Worker WORD32 filt_offset;
1702*15dc779aSAndroid Build Coastguard Worker WORD32 num_columns;
1703*15dc779aSAndroid Build Coastguard Worker
1704*15dc779aSAndroid Build Coastguard Worker ia_sbr_qmf_filter_bank_struct *pstr_qmf_anal_bank = pstr_codec_qmf_bank;
1705*15dc779aSAndroid Build Coastguard Worker ptr_filt_states = pstr_qmf_anal_bank->ptr_state_new_samples_pos_low_32;
1706*15dc779aSAndroid Build Coastguard Worker ptr_win_coeffs_1 = (FLOAT32 *)pstr_qmf_anal_bank->ptr_filter_pos_32;
1707*15dc779aSAndroid Build Coastguard Worker num_columns = pstr_qmf_anal_bank->no_channels;
1708*15dc779aSAndroid Build Coastguard Worker
1709*15dc779aSAndroid Build Coastguard Worker switch (num_columns) {
1710*15dc779aSAndroid Build Coastguard Worker case 16:
1711*15dc779aSAndroid Build Coastguard Worker ptr_win_coeffs_2 = ptr_win_coeffs_1 + 64;
1712*15dc779aSAndroid Build Coastguard Worker gain = 128.0f;
1713*15dc779aSAndroid Build Coastguard Worker filt_offset = 64;
1714*15dc779aSAndroid Build Coastguard Worker break;
1715*15dc779aSAndroid Build Coastguard Worker case 24:
1716*15dc779aSAndroid Build Coastguard Worker ptr_win_coeffs_2 = ptr_win_coeffs_1 + 24;
1717*15dc779aSAndroid Build Coastguard Worker gain = 12.0f;
1718*15dc779aSAndroid Build Coastguard Worker filt_offset = 24;
1719*15dc779aSAndroid Build Coastguard Worker break;
1720*15dc779aSAndroid Build Coastguard Worker case 32:
1721*15dc779aSAndroid Build Coastguard Worker ptr_win_coeffs_2 = ptr_win_coeffs_1 + 64;
1722*15dc779aSAndroid Build Coastguard Worker gain = 256.0f;
1723*15dc779aSAndroid Build Coastguard Worker filt_offset = 64;
1724*15dc779aSAndroid Build Coastguard Worker break;
1725*15dc779aSAndroid Build Coastguard Worker default:
1726*15dc779aSAndroid Build Coastguard Worker ptr_win_coeffs_2 = ptr_win_coeffs_1 + 64;
1727*15dc779aSAndroid Build Coastguard Worker gain = 256.0f;
1728*15dc779aSAndroid Build Coastguard Worker filt_offset = 64;
1729*15dc779aSAndroid Build Coastguard Worker break;
1730*15dc779aSAndroid Build Coastguard Worker }
1731*15dc779aSAndroid Build Coastguard Worker gain = 1.0f / gain;
1732*15dc779aSAndroid Build Coastguard Worker
1733*15dc779aSAndroid Build Coastguard Worker pstr_qmf_anal_bank->usb = (WORD16)num_columns;
1734*15dc779aSAndroid Build Coastguard Worker
1735*15dc779aSAndroid Build Coastguard Worker ptr_loc_qmf_buf_real = &local_qmf_buffer[0];
1736*15dc779aSAndroid Build Coastguard Worker ptr_loc_qmf_buf_imag = &local_qmf_buffer[64];
1737*15dc779aSAndroid Build Coastguard Worker
1738*15dc779aSAndroid Build Coastguard Worker ptr_filt_states_1 = pstr_qmf_anal_bank->anal_filter_states_32;
1739*15dc779aSAndroid Build Coastguard Worker ptr_filt_states_2 = pstr_qmf_anal_bank->anal_filter_states_32 + num_columns;
1740*15dc779aSAndroid Build Coastguard Worker
1741*15dc779aSAndroid Build Coastguard Worker idx = 0;
1742*15dc779aSAndroid Build Coastguard Worker while (idx < pstr_codec_qmf_bank->num_time_slots) {
1743*15dc779aSAndroid Build Coastguard Worker for (z = 0; z < num_columns; z++) {
1744*15dc779aSAndroid Build Coastguard Worker ptr_filt_states[num_columns - 1 - z] = ptr_core_coder_samples[z];
1745*15dc779aSAndroid Build Coastguard Worker }
1746*15dc779aSAndroid Build Coastguard Worker
1747*15dc779aSAndroid Build Coastguard Worker ixheaace_esbr_qmfanal32_winadd(ptr_filt_states_1, ptr_filt_states_2, ptr_win_coeffs_1,
1748*15dc779aSAndroid Build Coastguard Worker ptr_win_coeffs_2, anal_buf, num_columns);
1749*15dc779aSAndroid Build Coastguard Worker
1750*15dc779aSAndroid Build Coastguard Worker ptr_core_coder_samples += num_columns;
1751*15dc779aSAndroid Build Coastguard Worker
1752*15dc779aSAndroid Build Coastguard Worker ptr_filt_states -= num_columns;
1753*15dc779aSAndroid Build Coastguard Worker if (ptr_filt_states < pstr_qmf_anal_bank->anal_filter_states_32) {
1754*15dc779aSAndroid Build Coastguard Worker ptr_filt_states =
1755*15dc779aSAndroid Build Coastguard Worker pstr_qmf_anal_bank->anal_filter_states_32 + 10 * num_columns - num_columns;
1756*15dc779aSAndroid Build Coastguard Worker }
1757*15dc779aSAndroid Build Coastguard Worker
1758*15dc779aSAndroid Build Coastguard Worker ptr_temp = ptr_filt_states_1;
1759*15dc779aSAndroid Build Coastguard Worker ptr_filt_states_1 = ptr_filt_states_2;
1760*15dc779aSAndroid Build Coastguard Worker ptr_filt_states_2 = ptr_temp;
1761*15dc779aSAndroid Build Coastguard Worker
1762*15dc779aSAndroid Build Coastguard Worker ptr_win_coeffs_1 += filt_offset;
1763*15dc779aSAndroid Build Coastguard Worker ptr_win_coeffs_2 += filt_offset;
1764*15dc779aSAndroid Build Coastguard Worker
1765*15dc779aSAndroid Build Coastguard Worker ptr_win_coeffs = ptr_win_coeffs_1;
1766*15dc779aSAndroid Build Coastguard Worker ptr_win_coeffs_1 = ptr_win_coeffs_2;
1767*15dc779aSAndroid Build Coastguard Worker ptr_win_coeffs_2 = ptr_win_coeffs;
1768*15dc779aSAndroid Build Coastguard Worker
1769*15dc779aSAndroid Build Coastguard Worker if (ptr_win_coeffs_2 > (pstr_qmf_anal_bank->ptr_ana_win_coeff_32 + filt_offset * 10)) {
1770*15dc779aSAndroid Build Coastguard Worker ptr_win_coeffs_1 = (FLOAT32 *)pstr_qmf_anal_bank->ptr_ana_win_coeff_32;
1771*15dc779aSAndroid Build Coastguard Worker ptr_win_coeffs_2 = (FLOAT32 *)pstr_qmf_anal_bank->ptr_ana_win_coeff_32 + filt_offset;
1772*15dc779aSAndroid Build Coastguard Worker }
1773*15dc779aSAndroid Build Coastguard Worker
1774*15dc779aSAndroid Build Coastguard Worker ixheaace_esbr_fwd_modulation(anal_buf, &ptr_loc_qmf_buf_real[0], &ptr_loc_qmf_buf_imag[0],
1775*15dc779aSAndroid Build Coastguard Worker pstr_qmf_anal_bank, pstr_qmf_dec_tabs);
1776*15dc779aSAndroid Build Coastguard Worker
1777*15dc779aSAndroid Build Coastguard Worker core_syn_ch_index = num_columns;
1778*15dc779aSAndroid Build Coastguard Worker
1779*15dc779aSAndroid Build Coastguard Worker for (z = 0; z < core_syn_ch_index; z++) {
1780*15dc779aSAndroid Build Coastguard Worker qmf_buf_real[op_delay + idx][z] = ((FLOAT32)ptr_loc_qmf_buf_real[z] * gain);
1781*15dc779aSAndroid Build Coastguard Worker qmf_buf_imag[op_delay + idx][z] = ((FLOAT32)ptr_loc_qmf_buf_imag[z] * gain);
1782*15dc779aSAndroid Build Coastguard Worker }
1783*15dc779aSAndroid Build Coastguard Worker
1784*15dc779aSAndroid Build Coastguard Worker idx++;
1785*15dc779aSAndroid Build Coastguard Worker }
1786*15dc779aSAndroid Build Coastguard Worker
1787*15dc779aSAndroid Build Coastguard Worker pstr_qmf_anal_bank->ptr_filter_pos_32 = ptr_win_coeffs_1;
1788*15dc779aSAndroid Build Coastguard Worker pstr_qmf_anal_bank->ptr_state_new_samples_pos_low_32 = ptr_filt_states;
1789*15dc779aSAndroid Build Coastguard Worker }
ixheaace_extract_sbr_envelope(FLOAT32 * ptr_in_time,FLOAT32 * ptr_core_buf,UWORD32 time_sn_stride,ixheaace_pstr_sbr_enc pstr_env_enc,ixheaace_str_sbr_tabs * ptr_sbr_tab,ixheaace_comm_tables * pstr_com_tab,WORD32 flag_framelength_small)1790*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaace_extract_sbr_envelope(FLOAT32 *ptr_in_time, FLOAT32 *ptr_core_buf,
1791*15dc779aSAndroid Build Coastguard Worker UWORD32 time_sn_stride,
1792*15dc779aSAndroid Build Coastguard Worker ixheaace_pstr_sbr_enc pstr_env_enc,
1793*15dc779aSAndroid Build Coastguard Worker ixheaace_str_sbr_tabs *ptr_sbr_tab,
1794*15dc779aSAndroid Build Coastguard Worker ixheaace_comm_tables *pstr_com_tab,
1795*15dc779aSAndroid Build Coastguard Worker WORD32 flag_framelength_small) {
1796*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err_code = IA_NO_ERROR;
1797*15dc779aSAndroid Build Coastguard Worker WORD32 ch, i, j, c;
1798*15dc779aSAndroid Build Coastguard Worker WORD32 n_envelopes[IXHEAACE_MAX_CH_IN_BS_ELE];
1799*15dc779aSAndroid Build Coastguard Worker WORD32 transient_info[IXHEAACE_MAX_CH_IN_BS_ELE][3];
1800*15dc779aSAndroid Build Coastguard Worker const ixheaace_str_frame_info_sbr *pstr_const_frame_info[IXHEAACE_MAX_CH_IN_BS_ELE];
1801*15dc779aSAndroid Build Coastguard Worker ixheaace_str_frame_info_sbr *pstr_frame_info = NULL;
1802*15dc779aSAndroid Build Coastguard Worker
1803*15dc779aSAndroid Build Coastguard Worker ixheaace_pstr_sbr_config_data pstr_sbr_cfg = &pstr_env_enc->str_sbr_cfg;
1804*15dc779aSAndroid Build Coastguard Worker ixheaace_pstr_sbr_hdr_data pstr_sbr_hdr = &pstr_env_enc->str_sbr_hdr;
1805*15dc779aSAndroid Build Coastguard Worker ixheaace_pstr_sbr_bitstream_data pstr_sbr_bs = &pstr_env_enc->str_sbr_bs;
1806*15dc779aSAndroid Build Coastguard Worker struct ixheaace_ps_enc *pstr_ps_enc = pstr_env_enc->pstr_ps_enc;
1807*15dc779aSAndroid Build Coastguard Worker ixheaace_pstr_sbr_qmf_filter_bank pstr_synthesis_qmf_bank =
1808*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->pstr_synthesis_qmf_bank;
1809*15dc779aSAndroid Build Coastguard Worker ixheaace_pstr_common_data pstr_com_data = &pstr_env_enc->str_cmon_data;
1810*15dc779aSAndroid Build Coastguard Worker WORD8 *ptr_sbr_scratch = pstr_env_enc->ptr_sbr_enc_scr->sbr_scratch;
1811*15dc779aSAndroid Build Coastguard Worker ixheaace_pstr_enc_channel pstr_env_ch[IXHEAACE_MAX_CH_IN_BS_ELE];
1812*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[0] = pstr_env_enc->pstr_env_channel[0];
1813*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[1] = pstr_env_enc->pstr_env_channel[1];
1814*15dc779aSAndroid Build Coastguard Worker
1815*15dc779aSAndroid Build Coastguard Worker WORD32 num_channels = pstr_sbr_cfg->num_ch;
1816*15dc779aSAndroid Build Coastguard Worker WORD32 n_in_channels = (pstr_ps_enc) ? 2 : num_channels;
1817*15dc779aSAndroid Build Coastguard Worker
1818*15dc779aSAndroid Build Coastguard Worker ixheaace_sbr_stereo_mode stereo_mode = pstr_sbr_cfg->stereo_mode;
1819*15dc779aSAndroid Build Coastguard Worker struct ixheaace_str_sbr_env_data *pstr_env_0 = &(pstr_env_ch[0]->enc_env_data);
1820*15dc779aSAndroid Build Coastguard Worker struct ixheaace_str_sbr_env_data *pstr_env_1 = NULL;
1821*15dc779aSAndroid Build Coastguard Worker
1822*15dc779aSAndroid Build Coastguard Worker if (num_channels > 1) {
1823*15dc779aSAndroid Build Coastguard Worker pstr_env_1 = &(pstr_env_ch[1]->enc_env_data);
1824*15dc779aSAndroid Build Coastguard Worker }
1825*15dc779aSAndroid Build Coastguard Worker ixheaace_freq_res res[MAXIMUM_NUM_NOISE_VALUES];
1826*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr_v_tuning;
1827*15dc779aSAndroid Build Coastguard Worker WORD32 v_tuning_lc_sbr[6] = {0, 2, 4, 0, 0, 0};
1828*15dc779aSAndroid Build Coastguard Worker WORD32 v_tuning_ld_sbr[6] = {0, 2, 3, 0, 0, 0};
1829*15dc779aSAndroid Build Coastguard Worker if (pstr_sbr_cfg->is_ld_sbr) {
1830*15dc779aSAndroid Build Coastguard Worker ptr_v_tuning = v_tuning_ld_sbr;
1831*15dc779aSAndroid Build Coastguard Worker } else {
1832*15dc779aSAndroid Build Coastguard Worker ptr_v_tuning = v_tuning_lc_sbr;
1833*15dc779aSAndroid Build Coastguard Worker }
1834*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_noise_floor[IXHEAACE_MAX_CH_IN_BS_ELE] = {NULL};
1835*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr_scale_factor_band_nrg[IXHEAACE_MAX_CH_IN_BS_ELE] = {NULL};
1836*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr_noise_level[IXHEAACE_MAX_CH_IN_BS_ELE] = {NULL};
1837*15dc779aSAndroid Build Coastguard Worker
1838*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr_sfb_nrg_coupling[IXHEAACE_MAX_CH_IN_BS_ELE];
1839*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr_noise_lvl_coupling[IXHEAACE_MAX_CH_IN_BS_ELE];
1840*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr_frame_splitter_scratch =
1841*15dc779aSAndroid Build Coastguard Worker (WORD32 *)pstr_env_ch[0]->str_sbr_extract_env.ptr_r_buffer[0];
1842*15dc779aSAndroid Build Coastguard Worker
1843*15dc779aSAndroid Build Coastguard Worker WORD32 max_quant_error;
1844*15dc779aSAndroid Build Coastguard Worker ixheaace_str_esbr_bs_data str_esbr = {0};
1845*15dc779aSAndroid Build Coastguard Worker WORD32 samp_ratio_fac = DOWNSAMPLE_FAC_2_1;
1846*15dc779aSAndroid Build Coastguard Worker if ((pstr_env_enc->str_sbr_cfg.sbr_codec == USAC_SBR) &&
1847*15dc779aSAndroid Build Coastguard Worker (pstr_env_enc->str_sbr_cfg.sbr_ratio_idx == USAC_SBR_RATIO_INDEX_4_1)) {
1848*15dc779aSAndroid Build Coastguard Worker samp_ratio_fac = DOWNSAMPLE_FAC_4_1;
1849*15dc779aSAndroid Build Coastguard Worker }
1850*15dc779aSAndroid Build Coastguard Worker if ((n_in_channels > IXHEAACE_MAX_CH_IN_BS_ELE) || (n_in_channels < num_channels) ||
1851*15dc779aSAndroid Build Coastguard Worker (n_in_channels <= 0) || (num_channels <= 0)) {
1852*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_EXE_FATAL_SBR_INVALID_IN_CHANNELS;
1853*15dc779aSAndroid Build Coastguard Worker }
1854*15dc779aSAndroid Build Coastguard Worker ch = 0;
1855*15dc779aSAndroid Build Coastguard Worker while (ch < n_in_channels) {
1856*15dc779aSAndroid Build Coastguard Worker ptr_sfb_nrg_coupling[ch] = (WORD32 *)pstr_env_ch[ch]->str_sbr_extract_env.ptr_r_buffer[0];
1857*15dc779aSAndroid Build Coastguard Worker ptr_noise_lvl_coupling[ch] = (WORD32 *)pstr_env_ch[ch]->str_sbr_extract_env.ptr_i_buffer[0];
1858*15dc779aSAndroid Build Coastguard Worker ptr_scale_factor_band_nrg[ch] =
1859*15dc779aSAndroid Build Coastguard Worker (WORD32 *)pstr_env_ch[ch]->str_sbr_extract_env.ptr_r_buffer[0] +
1860*15dc779aSAndroid Build Coastguard Worker IXHEAACE_MAX_CH_IN_BS_ELE * MAXIMUM_NUM_ENVELOPE_VALUES;
1861*15dc779aSAndroid Build Coastguard Worker ptr_noise_level[ch] = (WORD32 *)pstr_env_ch[ch]->str_sbr_extract_env.ptr_i_buffer[0] +
1862*15dc779aSAndroid Build Coastguard Worker IXHEAACE_MAX_CH_IN_BS_ELE * MAXIMUM_NUM_ENVELOPE_VALUES;
1863*15dc779aSAndroid Build Coastguard Worker ptr_noise_floor[ch] = pstr_env_ch[ch]->str_sbr_extract_env.ptr_i_buffer[0] +
1864*15dc779aSAndroid Build Coastguard Worker IXHEAACE_MAX_CH_IN_BS_ELE * MAXIMUM_NUM_ENVELOPE_VALUES * 2;
1865*15dc779aSAndroid Build Coastguard Worker ch++;
1866*15dc779aSAndroid Build Coastguard Worker }
1867*15dc779aSAndroid Build Coastguard Worker if ((pstr_sbr_cfg->sbr_codec == USAC_SBR) && (pstr_sbr_hdr->sbr_harmonic)) {
1868*15dc779aSAndroid Build Coastguard Worker WORD32 num_sbr_samples = 2048;
1869*15dc779aSAndroid Build Coastguard Worker if (pstr_sbr_cfg->sbr_ratio_idx == USAC_SBR_RATIO_INDEX_4_1) {
1870*15dc779aSAndroid Build Coastguard Worker num_sbr_samples = IXHEAACE_MAX_NUM_SAMPLES;
1871*15dc779aSAndroid Build Coastguard Worker }
1872*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_hbe_get_pitch_bins(
1873*15dc779aSAndroid Build Coastguard Worker ptr_in_time, pstr_sbr_cfg, pstr_env_ch[0]->str_sbr_extract_env.ptr_r_buffer[0],
1874*15dc779aSAndroid Build Coastguard Worker ptr_sbr_tab, time_sn_stride, num_sbr_samples, &pstr_env_0->sbr_pitchin_bins,
1875*15dc779aSAndroid Build Coastguard Worker n_in_channels == 1 ? NULL : &pstr_env_1->sbr_pitchin_bins);
1876*15dc779aSAndroid Build Coastguard Worker if (err_code) return err_code;
1877*15dc779aSAndroid Build Coastguard Worker
1878*15dc779aSAndroid Build Coastguard Worker WORD32 op_delay, codec_x_delay, num_time_slots;
1879*15dc779aSAndroid Build Coastguard Worker op_delay = IXHEAACE_OP_DELAY_OFFSET;
1880*15dc779aSAndroid Build Coastguard Worker codec_x_delay = IXHEAACE_ESBR_HBE_DELAY_OFFSET;
1881*15dc779aSAndroid Build Coastguard Worker if (pstr_sbr_cfg->sbr_ratio_idx == USAC_SBR_RATIO_INDEX_4_1) {
1882*15dc779aSAndroid Build Coastguard Worker op_delay = 2 * op_delay;
1883*15dc779aSAndroid Build Coastguard Worker codec_x_delay = 2 * codec_x_delay;
1884*15dc779aSAndroid Build Coastguard Worker }
1885*15dc779aSAndroid Build Coastguard Worker
1886*15dc779aSAndroid Build Coastguard Worker WORD32 eff_offset = op_delay + IXHEAACE_SBR_HF_ADJ_OFFSET;
1887*15dc779aSAndroid Build Coastguard Worker WORD32 memmove_sz1 = (eff_offset + codec_x_delay) *
1888*15dc779aSAndroid Build Coastguard Worker sizeof(pstr_env_ch[0]->pstr_hbe_enc->qmf_buf_real[0][0]) *
1889*15dc779aSAndroid Build Coastguard Worker MAX_QMF_TIME_SLOTS;
1890*15dc779aSAndroid Build Coastguard Worker WORD32 memmove_sz2 = eff_offset *
1891*15dc779aSAndroid Build Coastguard Worker sizeof(pstr_env_ch[0]->pstr_hbe_enc->ph_vocod_qmf_real[0][0]) *
1892*15dc779aSAndroid Build Coastguard Worker MAX_QMF_TIME_SLOTS;
1893*15dc779aSAndroid Build Coastguard Worker
1894*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < n_in_channels; ch++) {
1895*15dc779aSAndroid Build Coastguard Worker ixheaace_str_hbe_enc *pstr_hbe_enc = pstr_env_ch[ch]->pstr_hbe_enc;
1896*15dc779aSAndroid Build Coastguard Worker num_time_slots =
1897*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[ch]->str_sbr_qmf.num_time_slots * pstr_env_ch[ch]->str_sbr_qmf.rate;
1898*15dc779aSAndroid Build Coastguard Worker
1899*15dc779aSAndroid Build Coastguard Worker memmove(pstr_hbe_enc->qmf_buf_real[0], pstr_hbe_enc->qmf_buf_real[num_time_slots],
1900*15dc779aSAndroid Build Coastguard Worker memmove_sz1);
1901*15dc779aSAndroid Build Coastguard Worker memmove(pstr_hbe_enc->qmf_buf_imag[0], pstr_hbe_enc->qmf_buf_imag[num_time_slots],
1902*15dc779aSAndroid Build Coastguard Worker memmove_sz1);
1903*15dc779aSAndroid Build Coastguard Worker memmove(pstr_hbe_enc->ph_vocod_qmf_real[0], pstr_hbe_enc->ph_vocod_qmf_real[num_time_slots],
1904*15dc779aSAndroid Build Coastguard Worker memmove_sz2);
1905*15dc779aSAndroid Build Coastguard Worker memmove(pstr_hbe_enc->ph_vocod_qmf_imag, pstr_hbe_enc->ph_vocod_qmf_imag + num_time_slots,
1906*15dc779aSAndroid Build Coastguard Worker memmove_sz2);
1907*15dc779aSAndroid Build Coastguard Worker }
1908*15dc779aSAndroid Build Coastguard Worker }
1909*15dc779aSAndroid Build Coastguard Worker i = 0;
1910*15dc779aSAndroid Build Coastguard Worker while (i < MAXIMUM_NUM_NOISE_VALUES) {
1911*15dc779aSAndroid Build Coastguard Worker res[i] = FREQ_RES_HIGH;
1912*15dc779aSAndroid Build Coastguard Worker i++;
1913*15dc779aSAndroid Build Coastguard Worker }
1914*15dc779aSAndroid Build Coastguard Worker
1915*15dc779aSAndroid Build Coastguard Worker memset(transient_info, 0, sizeof(transient_info));
1916*15dc779aSAndroid Build Coastguard Worker
1917*15dc779aSAndroid Build Coastguard Worker ch = 0;
1918*15dc779aSAndroid Build Coastguard Worker while (ch < n_in_channels) {
1919*15dc779aSAndroid Build Coastguard Worker ixheaace_str_sbr_extr_env *pstr_sbr_extract_env = &(pstr_env_ch[ch]->str_sbr_extract_env);
1920*15dc779aSAndroid Build Coastguard Worker
1921*15dc779aSAndroid Build Coastguard Worker ixheaace_sbr_analysis_filtering(
1922*15dc779aSAndroid Build Coastguard Worker ptr_in_time ? ptr_in_time + ch : NULL, time_sn_stride,
1923*15dc779aSAndroid Build Coastguard Worker pstr_sbr_extract_env->ptr_r_buffer, pstr_sbr_extract_env->ptr_i_buffer,
1924*15dc779aSAndroid Build Coastguard Worker &pstr_env_ch[ch]->str_sbr_qmf, ptr_sbr_tab->ptr_qmf_tab,
1925*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[ch]->str_sbr_qmf.num_time_slots * pstr_env_ch[ch]->str_sbr_qmf.rate,
1926*15dc779aSAndroid Build Coastguard Worker pstr_sbr_cfg->is_ld_sbr, (FLOAT32 *)ptr_sbr_scratch,
1927*15dc779aSAndroid Build Coastguard Worker (pstr_ps_enc != NULL && flag_framelength_small));
1928*15dc779aSAndroid Build Coastguard Worker
1929*15dc779aSAndroid Build Coastguard Worker if ((1 == n_in_channels) && (USAC_SBR == pstr_sbr_cfg->sbr_codec) &&
1930*15dc779aSAndroid Build Coastguard Worker (pstr_sbr_hdr->sbr_pvc_active)) {
1931*15dc779aSAndroid Build Coastguard Worker ixheaace_pvc_scratch *pstr_pvc_scr = (ixheaace_pvc_scratch *)ptr_sbr_scratch;
1932*15dc779aSAndroid Build Coastguard Worker WORD32 ts, bd;
1933*15dc779aSAndroid Build Coastguard Worker FLOAT32 nrg_0, nrg_1;
1934*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_r_0, *ptr_r_1, *ptr_i_0, *ptr_i_1;
1935*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_r_2, *ptr_r_3, *ptr_i_2, *ptr_i_3, nrg_2, nrg_3;
1936*15dc779aSAndroid Build Coastguard Worker WORD32 pvc_rate = pstr_env_enc->pstr_pvc_enc->pvc_param.pvc_rate;
1937*15dc779aSAndroid Build Coastguard Worker
1938*15dc779aSAndroid Build Coastguard Worker // update header_active to send SBR header when previous PVC mode is different from
1939*15dc779aSAndroid Build Coastguard Worker // current frame's
1940*15dc779aSAndroid Build Coastguard Worker if (pstr_env_enc->str_sbr_hdr.sbr_pvc_mode !=
1941*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->pstr_pvc_enc->pvc_param.pvc_mode) {
1942*15dc779aSAndroid Build Coastguard Worker pstr_sbr_bs->header_active = 1;
1943*15dc779aSAndroid Build Coastguard Worker }
1944*15dc779aSAndroid Build Coastguard Worker
1945*15dc779aSAndroid Build Coastguard Worker switch (pvc_rate) {
1946*15dc779aSAndroid Build Coastguard Worker case 2: {
1947*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < IXHEAACE_ESBR_PVC_NUM_TS; ts++) {
1948*15dc779aSAndroid Build Coastguard Worker ptr_r_0 = pstr_sbr_extract_env->ptr_r_buffer[pvc_rate * ts];
1949*15dc779aSAndroid Build Coastguard Worker ptr_r_1 = pstr_sbr_extract_env->ptr_r_buffer[pvc_rate * ts + 1];
1950*15dc779aSAndroid Build Coastguard Worker ptr_i_0 = pstr_sbr_extract_env->ptr_i_buffer[pvc_rate * ts];
1951*15dc779aSAndroid Build Coastguard Worker ptr_i_1 = pstr_sbr_extract_env->ptr_i_buffer[pvc_rate * ts + 1];
1952*15dc779aSAndroid Build Coastguard Worker
1953*15dc779aSAndroid Build Coastguard Worker for (bd = 0; bd < MAX_QMF_TIME_SLOTS; bd++) {
1954*15dc779aSAndroid Build Coastguard Worker nrg_0 = ptr_r_0[bd] * ptr_r_0[bd] + ptr_i_0[bd] * ptr_i_0[bd];
1955*15dc779aSAndroid Build Coastguard Worker nrg_1 = ptr_r_1[bd] * ptr_r_1[bd] + ptr_i_1[bd] * ptr_i_1[bd];
1956*15dc779aSAndroid Build Coastguard Worker pstr_pvc_scr->pvc_qmf_high[ts * IXHEAACE_ESBR_PVC_NUM_QMF_BANDS + bd] =
1957*15dc779aSAndroid Build Coastguard Worker (nrg_0 + nrg_1) / 2.0f;
1958*15dc779aSAndroid Build Coastguard Worker }
1959*15dc779aSAndroid Build Coastguard Worker WORD32 num_low_bands = MAX_QMF_TIME_SLOTS >> 1;
1960*15dc779aSAndroid Build Coastguard Worker for (bd = 0; bd < num_low_bands; bd++) {
1961*15dc779aSAndroid Build Coastguard Worker pstr_pvc_scr->pvc_qmf_low[ts * num_low_bands + bd] =
1962*15dc779aSAndroid Build Coastguard Worker pstr_pvc_scr->pvc_qmf_high[ts * IXHEAACE_ESBR_PVC_NUM_QMF_BANDS + bd];
1963*15dc779aSAndroid Build Coastguard Worker }
1964*15dc779aSAndroid Build Coastguard Worker }
1965*15dc779aSAndroid Build Coastguard Worker break;
1966*15dc779aSAndroid Build Coastguard Worker }
1967*15dc779aSAndroid Build Coastguard Worker case 4: {
1968*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < IXHEAACE_ESBR_PVC_NUM_TS; ts++) {
1969*15dc779aSAndroid Build Coastguard Worker ptr_r_0 = pstr_sbr_extract_env->ptr_r_buffer[pvc_rate * ts];
1970*15dc779aSAndroid Build Coastguard Worker ptr_r_1 = pstr_sbr_extract_env->ptr_r_buffer[pvc_rate * ts + 1];
1971*15dc779aSAndroid Build Coastguard Worker ptr_r_2 = pstr_sbr_extract_env->ptr_r_buffer[pvc_rate * ts + 2];
1972*15dc779aSAndroid Build Coastguard Worker ptr_r_3 = pstr_sbr_extract_env->ptr_r_buffer[pvc_rate * ts + 3];
1973*15dc779aSAndroid Build Coastguard Worker ptr_i_0 = pstr_sbr_extract_env->ptr_i_buffer[pvc_rate * ts];
1974*15dc779aSAndroid Build Coastguard Worker ptr_i_1 = pstr_sbr_extract_env->ptr_i_buffer[pvc_rate * ts + 1];
1975*15dc779aSAndroid Build Coastguard Worker ptr_i_2 = pstr_sbr_extract_env->ptr_i_buffer[pvc_rate * ts + 2];
1976*15dc779aSAndroid Build Coastguard Worker ptr_i_3 = pstr_sbr_extract_env->ptr_i_buffer[pvc_rate * ts + 3];
1977*15dc779aSAndroid Build Coastguard Worker
1978*15dc779aSAndroid Build Coastguard Worker for (bd = 0; bd < MAX_QMF_TIME_SLOTS; bd++) {
1979*15dc779aSAndroid Build Coastguard Worker nrg_0 = ptr_r_0[bd] * ptr_r_0[bd] + ptr_i_0[bd] * ptr_i_0[bd];
1980*15dc779aSAndroid Build Coastguard Worker nrg_1 = ptr_r_1[bd] * ptr_r_1[bd] + ptr_i_1[bd] * ptr_i_1[bd];
1981*15dc779aSAndroid Build Coastguard Worker nrg_2 = ptr_r_2[bd] * ptr_r_2[bd] + ptr_i_2[bd] * ptr_i_2[bd];
1982*15dc779aSAndroid Build Coastguard Worker nrg_3 = ptr_r_3[bd] * ptr_r_3[bd] + ptr_i_3[bd] * ptr_i_3[bd];
1983*15dc779aSAndroid Build Coastguard Worker pstr_pvc_scr->pvc_qmf_high[ts * IXHEAACE_ESBR_PVC_NUM_QMF_BANDS + bd] =
1984*15dc779aSAndroid Build Coastguard Worker (nrg_0 + nrg_1 + nrg_2 + nrg_3) / 4.0f;
1985*15dc779aSAndroid Build Coastguard Worker }
1986*15dc779aSAndroid Build Coastguard Worker WORD32 num_low_bands = (MAX_QMF_TIME_SLOTS >> 2);
1987*15dc779aSAndroid Build Coastguard Worker for (bd = 0; bd < num_low_bands; bd++) {
1988*15dc779aSAndroid Build Coastguard Worker pstr_pvc_scr->pvc_qmf_low[ts * num_low_bands + bd] =
1989*15dc779aSAndroid Build Coastguard Worker pstr_pvc_scr->pvc_qmf_high[ts * IXHEAACE_ESBR_PVC_NUM_QMF_BANDS + bd];
1990*15dc779aSAndroid Build Coastguard Worker }
1991*15dc779aSAndroid Build Coastguard Worker }
1992*15dc779aSAndroid Build Coastguard Worker break;
1993*15dc779aSAndroid Build Coastguard Worker }
1994*15dc779aSAndroid Build Coastguard Worker }
1995*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->pstr_pvc_enc->pvc_param.usac_indep_flag = pstr_sbr_bs->usac_indep_flag;
1996*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_pvc_encode_frame(
1997*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->pstr_pvc_enc, (UWORD8)pstr_env_enc->str_sbr_hdr.sbr_pvc_mode,
1998*15dc779aSAndroid Build Coastguard Worker pstr_pvc_scr->pvc_qmf_low, pstr_pvc_scr->pvc_qmf_high,
1999*15dc779aSAndroid Build Coastguard Worker pstr_sbr_cfg->ptr_v_k_master[0],
2000*15dc779aSAndroid Build Coastguard Worker pstr_sbr_cfg->ptr_v_k_master[pstr_sbr_cfg->num_master] - 1);
2001*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2002*15dc779aSAndroid Build Coastguard Worker return err_code;
2003*15dc779aSAndroid Build Coastguard Worker }
2004*15dc779aSAndroid Build Coastguard Worker
2005*15dc779aSAndroid Build Coastguard Worker memcpy(&pstr_env_ch[ch]->enc_env_data.pvc_info, &pstr_env_enc->pstr_pvc_enc->pvc_bs_info,
2006*15dc779aSAndroid Build Coastguard Worker sizeof(ixheaace_pvc_bs_info));
2007*15dc779aSAndroid Build Coastguard Worker }
2008*15dc779aSAndroid Build Coastguard Worker
2009*15dc779aSAndroid Build Coastguard Worker // COPY generated spectrum for inter-TES encoder
2010*15dc779aSAndroid Build Coastguard Worker if ((USAC_SBR == pstr_sbr_cfg->sbr_codec) && (1 == pstr_sbr_hdr->sbr_inter_tes_active)) {
2011*15dc779aSAndroid Build Coastguard Worker WORD32 ts, num_ts, delay;
2012*15dc779aSAndroid Build Coastguard Worker num_ts = pstr_env_ch[ch]->str_sbr_qmf.num_time_slots;
2013*15dc779aSAndroid Build Coastguard Worker
2014*15dc779aSAndroid Build Coastguard Worker ixheaace_str_inter_tes_params *pstr_tes_enc = &pstr_env_ch[ch]->str_inter_tes_enc;
2015*15dc779aSAndroid Build Coastguard Worker delay = pstr_tes_enc->op_delay + pstr_tes_enc->codec_delay + IXHEAACE_SBR_HF_ADJ_OFFSET;
2016*15dc779aSAndroid Build Coastguard Worker ts = 0;
2017*15dc779aSAndroid Build Coastguard Worker while (ts < num_ts) {
2018*15dc779aSAndroid Build Coastguard Worker memcpy(pstr_tes_enc->qmf_buf_real[delay + ts], pstr_sbr_extract_env->ptr_r_buffer[ts],
2019*15dc779aSAndroid Build Coastguard Worker IXHEAACE_QMF_CHANNELS * sizeof(pstr_tes_enc->qmf_buf_real[0][0]));
2020*15dc779aSAndroid Build Coastguard Worker memcpy(pstr_tes_enc->qmf_buf_imag[delay + ts], pstr_sbr_extract_env->ptr_i_buffer[ts],
2021*15dc779aSAndroid Build Coastguard Worker IXHEAACE_QMF_CHANNELS * sizeof(pstr_tes_enc->qmf_buf_imag[0][0]));
2022*15dc779aSAndroid Build Coastguard Worker ts++;
2023*15dc779aSAndroid Build Coastguard Worker }
2024*15dc779aSAndroid Build Coastguard Worker }
2025*15dc779aSAndroid Build Coastguard Worker
2026*15dc779aSAndroid Build Coastguard Worker ch++;
2027*15dc779aSAndroid Build Coastguard Worker }
2028*15dc779aSAndroid Build Coastguard Worker if ((pstr_sbr_cfg->sbr_codec == USAC_SBR) && (pstr_sbr_hdr->sbr_harmonic)) {
2029*15dc779aSAndroid Build Coastguard Worker WORD32 dft_hbe_flag = 0;
2030*15dc779aSAndroid Build Coastguard Worker WORD32 op_delay, codec_x_delay, num_time_slots;
2031*15dc779aSAndroid Build Coastguard Worker WORD32 esbr_hbe_delay_offsets = IXHEAACE_ESBR_HBE_DELAY_OFFSET;
2032*15dc779aSAndroid Build Coastguard Worker WORD32 oversampling_flag = 0;
2033*15dc779aSAndroid Build Coastguard Worker op_delay = IXHEAACE_OP_DELAY_OFFSET;
2034*15dc779aSAndroid Build Coastguard Worker codec_x_delay = IXHEAACE_ESBR_HBE_DELAY_OFFSET;
2035*15dc779aSAndroid Build Coastguard Worker if (pstr_sbr_cfg->sbr_ratio_idx == USAC_SBR_RATIO_INDEX_4_1) {
2036*15dc779aSAndroid Build Coastguard Worker op_delay = 2 * IXHEAACE_OP_DELAY_OFFSET;
2037*15dc779aSAndroid Build Coastguard Worker codec_x_delay = 2 * codec_x_delay;
2038*15dc779aSAndroid Build Coastguard Worker oversampling_flag = 1;
2039*15dc779aSAndroid Build Coastguard Worker }
2040*15dc779aSAndroid Build Coastguard Worker WORD32 eff_offset = op_delay + IXHEAACE_SBR_HF_ADJ_OFFSET;
2041*15dc779aSAndroid Build Coastguard Worker dft_hbe_flag = pstr_sbr_hdr->hq_esbr;
2042*15dc779aSAndroid Build Coastguard Worker ch = 0;
2043*15dc779aSAndroid Build Coastguard Worker while (ch < n_in_channels) {
2044*15dc779aSAndroid Build Coastguard Worker ixheaace_str_hbe_enc *pstr_hbe_enc = pstr_env_ch[ch]->pstr_hbe_enc;
2045*15dc779aSAndroid Build Coastguard Worker pstr_hbe_enc->pstr_hbe_txposer->oversampling_flag = oversampling_flag;
2046*15dc779aSAndroid Build Coastguard Worker num_time_slots =
2047*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[ch]->str_sbr_qmf.num_time_slots * pstr_env_ch[ch]->str_sbr_qmf.rate;
2048*15dc779aSAndroid Build Coastguard Worker
2049*15dc779aSAndroid Build Coastguard Worker if (dft_hbe_flag == 1) {
2050*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_dft_hbe_apply(
2051*15dc779aSAndroid Build Coastguard Worker pstr_hbe_enc->pstr_hbe_txposer,
2052*15dc779aSAndroid Build Coastguard Worker pstr_hbe_enc->qmf_buf_real + eff_offset + esbr_hbe_delay_offsets,
2053*15dc779aSAndroid Build Coastguard Worker pstr_hbe_enc->qmf_buf_imag + eff_offset + esbr_hbe_delay_offsets, num_time_slots,
2054*15dc779aSAndroid Build Coastguard Worker pstr_hbe_enc->ph_vocod_qmf_real + eff_offset,
2055*15dc779aSAndroid Build Coastguard Worker pstr_hbe_enc->ph_vocod_qmf_imag + eff_offset,
2056*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[ch]->enc_env_data.sbr_pitchin_bins, (FLOAT32 *)ptr_sbr_scratch);
2057*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2058*15dc779aSAndroid Build Coastguard Worker return err_code;
2059*15dc779aSAndroid Build Coastguard Worker }
2060*15dc779aSAndroid Build Coastguard Worker } else {
2061*15dc779aSAndroid Build Coastguard Worker // size 4096 samples
2062*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_time_data = (FLOAT32 *)ptr_sbr_scratch;
2063*15dc779aSAndroid Build Coastguard Worker int cnt = 0;
2064*15dc779aSAndroid Build Coastguard Worker if (0 == ch) {
2065*15dc779aSAndroid Build Coastguard Worker while (cnt < IXHEAACE_MAX_NUM_SAMPLES) {
2066*15dc779aSAndroid Build Coastguard Worker ptr_time_data[cnt] = pstr_env_enc->ptr_hbe_resample_buf[2 * cnt];
2067*15dc779aSAndroid Build Coastguard Worker cnt++;
2068*15dc779aSAndroid Build Coastguard Worker }
2069*15dc779aSAndroid Build Coastguard Worker } else {
2070*15dc779aSAndroid Build Coastguard Worker while (cnt < IXHEAACE_MAX_NUM_SAMPLES) {
2071*15dc779aSAndroid Build Coastguard Worker ptr_time_data[cnt] = pstr_env_enc->ptr_hbe_resample_buf[2 * cnt + 1];
2072*15dc779aSAndroid Build Coastguard Worker cnt++;
2073*15dc779aSAndroid Build Coastguard Worker }
2074*15dc779aSAndroid Build Coastguard Worker }
2075*15dc779aSAndroid Build Coastguard Worker
2076*15dc779aSAndroid Build Coastguard Worker ixheaace_esbr_analysis_filt_block(&(pstr_hbe_enc->str_codec_qmf_bank),
2077*15dc779aSAndroid Build Coastguard Worker pstr_hbe_enc->str_codec_qmf_bank.pstr_qmf_dec_tabs,
2078*15dc779aSAndroid Build Coastguard Worker ptr_time_data, pstr_hbe_enc->qmf_buf_real,
2079*15dc779aSAndroid Build Coastguard Worker pstr_hbe_enc->qmf_buf_imag,
2080*15dc779aSAndroid Build Coastguard Worker op_delay + codec_x_delay + IXHEAACE_SBR_HF_ADJ_OFFSET);
2081*15dc779aSAndroid Build Coastguard Worker
2082*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_qmf_hbe_apply(
2083*15dc779aSAndroid Build Coastguard Worker pstr_hbe_enc->pstr_hbe_txposer,
2084*15dc779aSAndroid Build Coastguard Worker pstr_hbe_enc->qmf_buf_real + eff_offset + esbr_hbe_delay_offsets,
2085*15dc779aSAndroid Build Coastguard Worker pstr_hbe_enc->qmf_buf_imag + eff_offset + esbr_hbe_delay_offsets, num_time_slots,
2086*15dc779aSAndroid Build Coastguard Worker pstr_hbe_enc->ph_vocod_qmf_real + eff_offset,
2087*15dc779aSAndroid Build Coastguard Worker pstr_hbe_enc->ph_vocod_qmf_imag + eff_offset,
2088*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[ch]->enc_env_data.sbr_pitchin_bins);
2089*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2090*15dc779aSAndroid Build Coastguard Worker return err_code;
2091*15dc779aSAndroid Build Coastguard Worker }
2092*15dc779aSAndroid Build Coastguard Worker
2093*15dc779aSAndroid Build Coastguard Worker if (pstr_sbr_cfg->sbr_ratio_idx == USAC_SBR_RATIO_INDEX_4_1) {
2094*15dc779aSAndroid Build Coastguard Worker ixheaace_hbe_repl_spec(&pstr_hbe_enc->pstr_hbe_txposer->x_over_qmf[0],
2095*15dc779aSAndroid Build Coastguard Worker pstr_hbe_enc->ph_vocod_qmf_real + eff_offset,
2096*15dc779aSAndroid Build Coastguard Worker pstr_hbe_enc->ph_vocod_qmf_imag + eff_offset, num_time_slots,
2097*15dc779aSAndroid Build Coastguard Worker pstr_hbe_enc->pstr_hbe_txposer->max_stretch);
2098*15dc779aSAndroid Build Coastguard Worker }
2099*15dc779aSAndroid Build Coastguard Worker }
2100*15dc779aSAndroid Build Coastguard Worker ch++;
2101*15dc779aSAndroid Build Coastguard Worker }
2102*15dc779aSAndroid Build Coastguard Worker }
2103*15dc779aSAndroid Build Coastguard Worker if (pstr_ps_enc && pstr_synthesis_qmf_bank) {
2104*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_encode_ps_frame(
2105*15dc779aSAndroid Build Coastguard Worker pstr_ps_enc, pstr_env_ch[0]->str_sbr_extract_env.ptr_i_buffer,
2106*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[0]->str_sbr_extract_env.ptr_r_buffer,
2107*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[1]->str_sbr_extract_env.ptr_i_buffer,
2108*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[1]->str_sbr_extract_env.ptr_r_buffer, ptr_sbr_tab->ptr_ps_tab, pstr_com_tab);
2109*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2110*15dc779aSAndroid Build Coastguard Worker return err_code;
2111*15dc779aSAndroid Build Coastguard Worker }
2112*15dc779aSAndroid Build Coastguard Worker ixheaace_enc_synthesis_qmf_filtering(
2113*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[0]->str_sbr_extract_env.ptr_r_buffer,
2114*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[0]->str_sbr_extract_env.ptr_i_buffer, ptr_core_buf,
2115*15dc779aSAndroid Build Coastguard Worker (ixheaace_pstr_sbr_qmf_filter_bank)pstr_synthesis_qmf_bank);
2116*15dc779aSAndroid Build Coastguard Worker }
2117*15dc779aSAndroid Build Coastguard Worker
2118*15dc779aSAndroid Build Coastguard Worker ch = 0;
2119*15dc779aSAndroid Build Coastguard Worker while (ch < num_channels) {
2120*15dc779aSAndroid Build Coastguard Worker ixheaace_str_hbe_enc *pstr_hbe_enc = pstr_env_ch[ch]->pstr_hbe_enc;
2121*15dc779aSAndroid Build Coastguard Worker ixheaace_str_sbr_extr_env *pstr_sbr_extract_env = &(pstr_env_ch[ch]->str_sbr_extract_env);
2122*15dc779aSAndroid Build Coastguard Worker
2123*15dc779aSAndroid Build Coastguard Worker ixheaace_get_energy_from_cplx_qmf(
2124*15dc779aSAndroid Build Coastguard Worker pstr_sbr_extract_env->ptr_y_buffer + pstr_sbr_extract_env->y_buffer_write_offset,
2125*15dc779aSAndroid Build Coastguard Worker pstr_sbr_extract_env->ptr_r_buffer, pstr_sbr_extract_env->ptr_i_buffer,
2126*15dc779aSAndroid Build Coastguard Worker pstr_sbr_cfg->is_ld_sbr, pstr_env_ch[ch]->str_sbr_qmf.num_time_slots, samp_ratio_fac,
2127*15dc779aSAndroid Build Coastguard Worker pstr_hbe_enc, (IXHEAACE_OP_DELAY_OFFSET + IXHEAACE_ESBR_HBE_DELAY_OFFSET +
2128*15dc779aSAndroid Build Coastguard Worker IXHEAACE_SBR_HF_ADJ_OFFSET), pstr_sbr_hdr->sbr_harmonic);
2129*15dc779aSAndroid Build Coastguard Worker
2130*15dc779aSAndroid Build Coastguard Worker ixheaace_calculate_tonality_quotas(
2131*15dc779aSAndroid Build Coastguard Worker &pstr_env_ch[ch]->str_ton_corr, pstr_sbr_extract_env->ptr_r_buffer,
2132*15dc779aSAndroid Build Coastguard Worker pstr_sbr_extract_env->ptr_i_buffer,
2133*15dc779aSAndroid Build Coastguard Worker pstr_sbr_cfg->ptr_freq_band_tab[HI][pstr_sbr_cfg->num_scf[HI]],
2134*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[ch]->str_sbr_qmf.num_time_slots, pstr_sbr_cfg->is_ld_sbr);
2135*15dc779aSAndroid Build Coastguard Worker if (pstr_sbr_cfg->is_ld_sbr) {
2136*15dc779aSAndroid Build Coastguard Worker ixheaace_detect_transient_eld(pstr_sbr_extract_env->ptr_y_buffer,
2137*15dc779aSAndroid Build Coastguard Worker &pstr_env_ch[ch]->str_sbr_trans_detector, transient_info[ch]);
2138*15dc779aSAndroid Build Coastguard Worker } else {
2139*15dc779aSAndroid Build Coastguard Worker ixheaace_detect_transient(pstr_sbr_extract_env->ptr_y_buffer,
2140*15dc779aSAndroid Build Coastguard Worker &pstr_env_ch[ch]->str_sbr_trans_detector, transient_info[ch],
2141*15dc779aSAndroid Build Coastguard Worker pstr_sbr_extract_env->time_step, pstr_sbr_cfg->sbr_codec);
2142*15dc779aSAndroid Build Coastguard Worker }
2143*15dc779aSAndroid Build Coastguard Worker if (transient_info[ch][1] == 0) {
2144*15dc779aSAndroid Build Coastguard Worker if (pstr_sbr_cfg->is_ld_sbr) {
2145*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_frame_splitter(
2146*15dc779aSAndroid Build Coastguard Worker pstr_sbr_extract_env->ptr_y_buffer, &pstr_env_ch[ch]->str_sbr_trans_detector,
2147*15dc779aSAndroid Build Coastguard Worker pstr_sbr_cfg->ptr_freq_band_tab[1], pstr_sbr_cfg->num_scf[1],
2148*15dc779aSAndroid Build Coastguard Worker pstr_sbr_extract_env->time_step, pstr_sbr_extract_env->time_slots, transient_info[ch],
2149*15dc779aSAndroid Build Coastguard Worker (FLOAT32 *)ptr_frame_splitter_scratch, pstr_sbr_cfg->is_ld_sbr);
2150*15dc779aSAndroid Build Coastguard Worker } else {
2151*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_frame_splitter(
2152*15dc779aSAndroid Build Coastguard Worker pstr_sbr_extract_env->ptr_y_buffer, &pstr_env_ch[ch]->str_sbr_trans_detector,
2153*15dc779aSAndroid Build Coastguard Worker pstr_sbr_cfg->ptr_freq_band_tab[1], pstr_sbr_cfg->num_scf[1],
2154*15dc779aSAndroid Build Coastguard Worker pstr_sbr_extract_env->time_step, pstr_sbr_extract_env->no_cols, transient_info[ch],
2155*15dc779aSAndroid Build Coastguard Worker (FLOAT32 *)ptr_frame_splitter_scratch, pstr_sbr_cfg->is_ld_sbr);
2156*15dc779aSAndroid Build Coastguard Worker }
2157*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2158*15dc779aSAndroid Build Coastguard Worker return err_code;
2159*15dc779aSAndroid Build Coastguard Worker }
2160*15dc779aSAndroid Build Coastguard Worker }
2161*15dc779aSAndroid Build Coastguard Worker ch++;
2162*15dc779aSAndroid Build Coastguard Worker }
2163*15dc779aSAndroid Build Coastguard Worker
2164*15dc779aSAndroid Build Coastguard Worker if (stereo_mode == SBR_COUPLING) {
2165*15dc779aSAndroid Build Coastguard Worker if (transient_info[0][1] && transient_info[1][1]) {
2166*15dc779aSAndroid Build Coastguard Worker transient_info[0][0] = ixheaac_min32(transient_info[1][0], transient_info[0][0]);
2167*15dc779aSAndroid Build Coastguard Worker
2168*15dc779aSAndroid Build Coastguard Worker transient_info[1][0] = transient_info[0][0];
2169*15dc779aSAndroid Build Coastguard Worker } else if (transient_info[0][1] && !transient_info[1][1]) {
2170*15dc779aSAndroid Build Coastguard Worker transient_info[1][0] = transient_info[0][0];
2171*15dc779aSAndroid Build Coastguard Worker } else if (!transient_info[0][1] && transient_info[1][1]) {
2172*15dc779aSAndroid Build Coastguard Worker transient_info[0][0] = transient_info[1][0];
2173*15dc779aSAndroid Build Coastguard Worker } else {
2174*15dc779aSAndroid Build Coastguard Worker transient_info[0][0] = ixheaac_max32(transient_info[1][0], transient_info[0][0]);
2175*15dc779aSAndroid Build Coastguard Worker
2176*15dc779aSAndroid Build Coastguard Worker transient_info[1][0] = transient_info[0][0];
2177*15dc779aSAndroid Build Coastguard Worker }
2178*15dc779aSAndroid Build Coastguard Worker }
2179*15dc779aSAndroid Build Coastguard Worker
2180*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_frame_info_generator(
2181*15dc779aSAndroid Build Coastguard Worker &pstr_env_ch[0]->str_sbr_env_frame, pstr_env_ch[0]->str_sbr_extract_env.pre_transient_info,
2182*15dc779aSAndroid Build Coastguard Worker transient_info[0], ptr_v_tuning, ptr_sbr_tab->ptr_qmf_tab,
2183*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[0]->str_sbr_qmf.num_time_slots, pstr_sbr_cfg->is_ld_sbr, &pstr_frame_info,
2184*15dc779aSAndroid Build Coastguard Worker flag_framelength_small);
2185*15dc779aSAndroid Build Coastguard Worker if (pstr_sbr_cfg->is_ld_sbr && transient_info[0][2]) {
2186*15dc779aSAndroid Build Coastguard Worker pstr_frame_info->short_env = pstr_frame_info->n_envelopes;
2187*15dc779aSAndroid Build Coastguard Worker }
2188*15dc779aSAndroid Build Coastguard Worker pstr_const_frame_info[0] = pstr_frame_info;
2189*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2190*15dc779aSAndroid Build Coastguard Worker return err_code;
2191*15dc779aSAndroid Build Coastguard Worker }
2192*15dc779aSAndroid Build Coastguard Worker
2193*15dc779aSAndroid Build Coastguard Worker pstr_env_0->pstr_sbr_bs_grid = &pstr_env_ch[0]->str_sbr_env_frame.sbr_grid;
2194*15dc779aSAndroid Build Coastguard Worker
2195*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < num_channels; ch++) {
2196*15dc779aSAndroid Build Coastguard Worker memset(
2197*15dc779aSAndroid Build Coastguard Worker ptr_noise_floor[ch], 0,
2198*15dc779aSAndroid Build Coastguard Worker IXHEAACE_MAX_CH_IN_BS_ELE * MAXIMUM_NUM_ENVELOPE_VALUES * sizeof(ptr_noise_floor[0][0]));
2199*15dc779aSAndroid Build Coastguard Worker }
2200*15dc779aSAndroid Build Coastguard Worker
2201*15dc779aSAndroid Build Coastguard Worker switch (stereo_mode) {
2202*15dc779aSAndroid Build Coastguard Worker case IXHEAACE_SBR_MODE_LEFT_RIGHT:
2203*15dc779aSAndroid Build Coastguard Worker case IXHEAACE_SBR_MODE_SWITCH_LRC:
2204*15dc779aSAndroid Build Coastguard Worker
2205*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_frame_info_generator(
2206*15dc779aSAndroid Build Coastguard Worker &pstr_env_ch[1]->str_sbr_env_frame,
2207*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[1]->str_sbr_extract_env.pre_transient_info, transient_info[1], ptr_v_tuning,
2208*15dc779aSAndroid Build Coastguard Worker ptr_sbr_tab->ptr_qmf_tab, pstr_env_ch[1]->str_sbr_qmf.num_time_slots,
2209*15dc779aSAndroid Build Coastguard Worker pstr_sbr_cfg->is_ld_sbr, &pstr_frame_info, flag_framelength_small);
2210*15dc779aSAndroid Build Coastguard Worker
2211*15dc779aSAndroid Build Coastguard Worker if (pstr_sbr_cfg->is_ld_sbr && transient_info[1][2]) {
2212*15dc779aSAndroid Build Coastguard Worker pstr_frame_info->short_env = pstr_frame_info->n_envelopes;
2213*15dc779aSAndroid Build Coastguard Worker }
2214*15dc779aSAndroid Build Coastguard Worker pstr_const_frame_info[1] = pstr_frame_info;
2215*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2216*15dc779aSAndroid Build Coastguard Worker return err_code;
2217*15dc779aSAndroid Build Coastguard Worker }
2218*15dc779aSAndroid Build Coastguard Worker
2219*15dc779aSAndroid Build Coastguard Worker pstr_env_1->pstr_sbr_bs_grid = &pstr_env_ch[1]->str_sbr_env_frame.sbr_grid;
2220*15dc779aSAndroid Build Coastguard Worker
2221*15dc779aSAndroid Build Coastguard Worker if (pstr_const_frame_info[0]->n_envelopes != pstr_const_frame_info[1]->n_envelopes) {
2222*15dc779aSAndroid Build Coastguard Worker stereo_mode = IXHEAACE_SBR_MODE_LEFT_RIGHT;
2223*15dc779aSAndroid Build Coastguard Worker } else {
2224*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < pstr_const_frame_info[0]->n_envelopes + 1; i++) {
2225*15dc779aSAndroid Build Coastguard Worker if (pstr_const_frame_info[0]->borders[i] != pstr_const_frame_info[1]->borders[i]) {
2226*15dc779aSAndroid Build Coastguard Worker stereo_mode = IXHEAACE_SBR_MODE_LEFT_RIGHT;
2227*15dc779aSAndroid Build Coastguard Worker break;
2228*15dc779aSAndroid Build Coastguard Worker }
2229*15dc779aSAndroid Build Coastguard Worker }
2230*15dc779aSAndroid Build Coastguard Worker
2231*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < pstr_const_frame_info[0]->n_envelopes; i++) {
2232*15dc779aSAndroid Build Coastguard Worker if (pstr_const_frame_info[0]->freq_res[i] != pstr_const_frame_info[1]->freq_res[i]) {
2233*15dc779aSAndroid Build Coastguard Worker stereo_mode = IXHEAACE_SBR_MODE_LEFT_RIGHT;
2234*15dc779aSAndroid Build Coastguard Worker break;
2235*15dc779aSAndroid Build Coastguard Worker }
2236*15dc779aSAndroid Build Coastguard Worker }
2237*15dc779aSAndroid Build Coastguard Worker
2238*15dc779aSAndroid Build Coastguard Worker if (pstr_const_frame_info[0]->short_env != pstr_const_frame_info[1]->short_env) {
2239*15dc779aSAndroid Build Coastguard Worker stereo_mode = IXHEAACE_SBR_MODE_LEFT_RIGHT;
2240*15dc779aSAndroid Build Coastguard Worker }
2241*15dc779aSAndroid Build Coastguard Worker }
2242*15dc779aSAndroid Build Coastguard Worker break;
2243*15dc779aSAndroid Build Coastguard Worker case SBR_COUPLING:
2244*15dc779aSAndroid Build Coastguard Worker
2245*15dc779aSAndroid Build Coastguard Worker pstr_const_frame_info[1] = pstr_const_frame_info[0];
2246*15dc779aSAndroid Build Coastguard Worker
2247*15dc779aSAndroid Build Coastguard Worker pstr_env_1->pstr_sbr_bs_grid = &pstr_env_ch[0]->str_sbr_env_frame.sbr_grid;
2248*15dc779aSAndroid Build Coastguard Worker break;
2249*15dc779aSAndroid Build Coastguard Worker case IXHEAACE_SBR_MODE_MONO:
2250*15dc779aSAndroid Build Coastguard Worker break;
2251*15dc779aSAndroid Build Coastguard Worker }
2252*15dc779aSAndroid Build Coastguard Worker
2253*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < num_channels; ch++) {
2254*15dc779aSAndroid Build Coastguard Worker ixheaace_str_sbr_extr_env *pstr_sbr_extract_env = &(pstr_env_ch[ch]->str_sbr_extract_env);
2255*15dc779aSAndroid Build Coastguard Worker
2256*15dc779aSAndroid Build Coastguard Worker pstr_sbr_extract_env->pre_transient_info[0] = transient_info[ch][0];
2257*15dc779aSAndroid Build Coastguard Worker pstr_sbr_extract_env->pre_transient_info[1] = transient_info[ch][1];
2258*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[ch]->enc_env_data.no_of_envelopes = n_envelopes[ch] =
2259*15dc779aSAndroid Build Coastguard Worker pstr_const_frame_info[ch]->n_envelopes;
2260*15dc779aSAndroid Build Coastguard Worker
2261*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < n_envelopes[ch]; i++) {
2262*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[ch]->enc_env_data.no_scf_bands[i] =
2263*15dc779aSAndroid Build Coastguard Worker (pstr_const_frame_info[ch]->freq_res[i] == FREQ_RES_HIGH
2264*15dc779aSAndroid Build Coastguard Worker ? pstr_sbr_cfg->num_scf[FREQ_RES_HIGH]
2265*15dc779aSAndroid Build Coastguard Worker : pstr_sbr_cfg->num_scf[FREQ_RES_LOW]);
2266*15dc779aSAndroid Build Coastguard Worker }
2267*15dc779aSAndroid Build Coastguard Worker
2268*15dc779aSAndroid Build Coastguard Worker if ((pstr_env_ch[ch]->enc_env_data.pstr_sbr_bs_grid->frame_type == IXHEAACE_FIXFIX) &&
2269*15dc779aSAndroid Build Coastguard Worker (n_envelopes[ch] == 1)) {
2270*15dc779aSAndroid Build Coastguard Worker if (pstr_sbr_cfg->is_ld_sbr) {
2271*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[ch]->enc_env_data.curr_sbr_amp_res = IXHEAACE_SBR_AMP_RES_3_0;
2272*15dc779aSAndroid Build Coastguard Worker } else {
2273*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[ch]->enc_env_data.curr_sbr_amp_res = IXHEAACE_SBR_AMP_RES_1_5;
2274*15dc779aSAndroid Build Coastguard Worker }
2275*15dc779aSAndroid Build Coastguard Worker if (pstr_env_ch[ch]->enc_env_data.init_sbr_amp_res !=
2276*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[ch]->enc_env_data.curr_sbr_amp_res) {
2277*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_init_sbr_huffman_tabs(
2278*15dc779aSAndroid Build Coastguard Worker &pstr_env_ch[ch]->enc_env_data, &pstr_env_ch[ch]->str_sbr_code_env,
2279*15dc779aSAndroid Build Coastguard Worker &pstr_env_ch[ch]->str_sbr_code_noise_floor, IXHEAACE_SBR_AMP_RES_1_5,
2280*15dc779aSAndroid Build Coastguard Worker ptr_sbr_tab->ptr_sbr_huff_tab);
2281*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2282*15dc779aSAndroid Build Coastguard Worker return err_code;
2283*15dc779aSAndroid Build Coastguard Worker }
2284*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[ch]->sbr_amp_res_init = IXHEAACE_SBR_AMP_RES_1_5;
2285*15dc779aSAndroid Build Coastguard Worker }
2286*15dc779aSAndroid Build Coastguard Worker } else {
2287*15dc779aSAndroid Build Coastguard Worker if (pstr_sbr_hdr->sbr_amp_res != pstr_env_ch[ch]->enc_env_data.init_sbr_amp_res) {
2288*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_init_sbr_huffman_tabs(
2289*15dc779aSAndroid Build Coastguard Worker &pstr_env_ch[ch]->enc_env_data, &pstr_env_ch[ch]->str_sbr_code_env,
2290*15dc779aSAndroid Build Coastguard Worker &pstr_env_ch[ch]->str_sbr_code_noise_floor, pstr_sbr_hdr->sbr_amp_res,
2291*15dc779aSAndroid Build Coastguard Worker ptr_sbr_tab->ptr_sbr_huff_tab);
2292*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2293*15dc779aSAndroid Build Coastguard Worker return err_code;
2294*15dc779aSAndroid Build Coastguard Worker }
2295*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[ch]->sbr_amp_res_init = pstr_sbr_hdr->sbr_amp_res;
2296*15dc779aSAndroid Build Coastguard Worker }
2297*15dc779aSAndroid Build Coastguard Worker }
2298*15dc779aSAndroid Build Coastguard Worker
2299*15dc779aSAndroid Build Coastguard Worker ixheaace_ton_corr_param_extr(
2300*15dc779aSAndroid Build Coastguard Worker &pstr_env_ch[ch]->str_ton_corr, pstr_env_ch[ch]->enc_env_data.sbr_invf_mode_vec,
2301*15dc779aSAndroid Build Coastguard Worker ptr_noise_floor[ch], &pstr_env_ch[ch]->enc_env_data.add_harmonic_flag,
2302*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[ch]->enc_env_data.add_harmonic, pstr_sbr_extract_env->envelope_compensation,
2303*15dc779aSAndroid Build Coastguard Worker pstr_const_frame_info[ch], transient_info[ch], pstr_sbr_cfg->ptr_freq_band_tab[HI],
2304*15dc779aSAndroid Build Coastguard Worker pstr_sbr_cfg->num_scf[HI], pstr_env_ch[ch]->enc_env_data.sbr_xpos_mode, ptr_sbr_scratch,
2305*15dc779aSAndroid Build Coastguard Worker pstr_sbr_cfg->is_ld_sbr);
2306*15dc779aSAndroid Build Coastguard Worker
2307*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[ch]->enc_env_data.sbr_invf_mode =
2308*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[ch]->enc_env_data.sbr_invf_mode_vec[0];
2309*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[ch]->enc_env_data.noise_band_count =
2310*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[ch]->str_ton_corr.sbr_noise_floor_est.num_of_noise_bands;
2311*15dc779aSAndroid Build Coastguard Worker }
2312*15dc779aSAndroid Build Coastguard Worker
2313*15dc779aSAndroid Build Coastguard Worker switch (stereo_mode) {
2314*15dc779aSAndroid Build Coastguard Worker case IXHEAACE_SBR_MODE_MONO:
2315*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_calculate_sbr_envelope(pstr_env_ch[0]->str_sbr_extract_env.ptr_y_buffer,
2316*15dc779aSAndroid Build Coastguard Worker NULL, pstr_const_frame_info[0],
2317*15dc779aSAndroid Build Coastguard Worker ptr_scale_factor_band_nrg[0], NULL, pstr_sbr_cfg,
2318*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[0], IXHEAACE_SBR_MODE_MONO, NULL);
2319*15dc779aSAndroid Build Coastguard Worker
2320*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2321*15dc779aSAndroid Build Coastguard Worker return err_code;
2322*15dc779aSAndroid Build Coastguard Worker }
2323*15dc779aSAndroid Build Coastguard Worker break;
2324*15dc779aSAndroid Build Coastguard Worker
2325*15dc779aSAndroid Build Coastguard Worker case IXHEAACE_SBR_MODE_LEFT_RIGHT:
2326*15dc779aSAndroid Build Coastguard Worker
2327*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_calculate_sbr_envelope(pstr_env_ch[0]->str_sbr_extract_env.ptr_y_buffer,
2328*15dc779aSAndroid Build Coastguard Worker NULL, pstr_const_frame_info[0],
2329*15dc779aSAndroid Build Coastguard Worker ptr_scale_factor_band_nrg[0], NULL, pstr_sbr_cfg,
2330*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[0], IXHEAACE_SBR_MODE_MONO, NULL);
2331*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2332*15dc779aSAndroid Build Coastguard Worker return err_code;
2333*15dc779aSAndroid Build Coastguard Worker }
2334*15dc779aSAndroid Build Coastguard Worker
2335*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_calculate_sbr_envelope(pstr_env_ch[1]->str_sbr_extract_env.ptr_y_buffer,
2336*15dc779aSAndroid Build Coastguard Worker NULL, pstr_const_frame_info[1],
2337*15dc779aSAndroid Build Coastguard Worker ptr_scale_factor_band_nrg[1], NULL, pstr_sbr_cfg,
2338*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[1], IXHEAACE_SBR_MODE_MONO, NULL);
2339*15dc779aSAndroid Build Coastguard Worker
2340*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2341*15dc779aSAndroid Build Coastguard Worker return err_code;
2342*15dc779aSAndroid Build Coastguard Worker }
2343*15dc779aSAndroid Build Coastguard Worker
2344*15dc779aSAndroid Build Coastguard Worker break;
2345*15dc779aSAndroid Build Coastguard Worker
2346*15dc779aSAndroid Build Coastguard Worker case SBR_COUPLING:
2347*15dc779aSAndroid Build Coastguard Worker
2348*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_calculate_sbr_envelope(
2349*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[0]->str_sbr_extract_env.ptr_y_buffer,
2350*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[1]->str_sbr_extract_env.ptr_y_buffer, pstr_const_frame_info[0],
2351*15dc779aSAndroid Build Coastguard Worker ptr_scale_factor_band_nrg[0], ptr_scale_factor_band_nrg[1], pstr_sbr_cfg,
2352*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[0], SBR_COUPLING, &max_quant_error);
2353*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2354*15dc779aSAndroid Build Coastguard Worker return err_code;
2355*15dc779aSAndroid Build Coastguard Worker }
2356*15dc779aSAndroid Build Coastguard Worker break;
2357*15dc779aSAndroid Build Coastguard Worker
2358*15dc779aSAndroid Build Coastguard Worker case IXHEAACE_SBR_MODE_SWITCH_LRC:
2359*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_calculate_sbr_envelope(pstr_env_ch[0]->str_sbr_extract_env.ptr_y_buffer,
2360*15dc779aSAndroid Build Coastguard Worker NULL, pstr_const_frame_info[0],
2361*15dc779aSAndroid Build Coastguard Worker ptr_scale_factor_band_nrg[0], NULL, pstr_sbr_cfg,
2362*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[0], IXHEAACE_SBR_MODE_MONO, NULL);
2363*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2364*15dc779aSAndroid Build Coastguard Worker return err_code;
2365*15dc779aSAndroid Build Coastguard Worker }
2366*15dc779aSAndroid Build Coastguard Worker
2367*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_calculate_sbr_envelope(pstr_env_ch[1]->str_sbr_extract_env.ptr_y_buffer,
2368*15dc779aSAndroid Build Coastguard Worker NULL, pstr_const_frame_info[1],
2369*15dc779aSAndroid Build Coastguard Worker ptr_scale_factor_band_nrg[1], NULL, pstr_sbr_cfg,
2370*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[1], IXHEAACE_SBR_MODE_MONO, NULL);
2371*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2372*15dc779aSAndroid Build Coastguard Worker return err_code;
2373*15dc779aSAndroid Build Coastguard Worker }
2374*15dc779aSAndroid Build Coastguard Worker
2375*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_calculate_sbr_envelope(
2376*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[0]->str_sbr_extract_env.ptr_y_buffer,
2377*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[1]->str_sbr_extract_env.ptr_y_buffer, pstr_const_frame_info[0],
2378*15dc779aSAndroid Build Coastguard Worker ptr_sfb_nrg_coupling[0], ptr_sfb_nrg_coupling[1], pstr_sbr_cfg, pstr_env_ch[0],
2379*15dc779aSAndroid Build Coastguard Worker SBR_COUPLING, &max_quant_error);
2380*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2381*15dc779aSAndroid Build Coastguard Worker return err_code;
2382*15dc779aSAndroid Build Coastguard Worker }
2383*15dc779aSAndroid Build Coastguard Worker break;
2384*15dc779aSAndroid Build Coastguard Worker }
2385*15dc779aSAndroid Build Coastguard Worker
2386*15dc779aSAndroid Build Coastguard Worker switch (stereo_mode) {
2387*15dc779aSAndroid Build Coastguard Worker case IXHEAACE_SBR_MODE_MONO:
2388*15dc779aSAndroid Build Coastguard Worker
2389*15dc779aSAndroid Build Coastguard Worker ixheaace_sbr_noise_floor_levels_quantisation(ptr_noise_level[0], ptr_noise_floor[0], 0);
2390*15dc779aSAndroid Build Coastguard Worker
2391*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_code_envelope(
2392*15dc779aSAndroid Build Coastguard Worker ptr_noise_level[0], res, &pstr_env_ch[0]->str_sbr_code_noise_floor,
2393*15dc779aSAndroid Build Coastguard Worker pstr_env_0->domain_vec_noise, 0, (pstr_const_frame_info[0]->n_envelopes > 1 ? 2 : 1), 0,
2394*15dc779aSAndroid Build Coastguard Worker pstr_sbr_bs->header_active, pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2395*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2396*15dc779aSAndroid Build Coastguard Worker return err_code;
2397*15dc779aSAndroid Build Coastguard Worker }
2398*15dc779aSAndroid Build Coastguard Worker
2399*15dc779aSAndroid Build Coastguard Worker break;
2400*15dc779aSAndroid Build Coastguard Worker
2401*15dc779aSAndroid Build Coastguard Worker case IXHEAACE_SBR_MODE_LEFT_RIGHT:
2402*15dc779aSAndroid Build Coastguard Worker // We have a error checks for Number of channels to ensure memory is assigned to
2403*15dc779aSAndroid Build Coastguard Worker // ptr_noise_floor[]. However, MSVS static analysis is marking this as a potential error.
2404*15dc779aSAndroid Build Coastguard Worker // So, suppressed this in source
2405*15dc779aSAndroid Build Coastguard Worker ixheaace_sbr_noise_floor_levels_quantisation(ptr_noise_level[0], ptr_noise_floor[0], 0);
2406*15dc779aSAndroid Build Coastguard Worker
2407*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_code_envelope(
2408*15dc779aSAndroid Build Coastguard Worker ptr_noise_level[0], res, &pstr_env_ch[0]->str_sbr_code_noise_floor,
2409*15dc779aSAndroid Build Coastguard Worker pstr_env_0->domain_vec_noise, 0, (pstr_const_frame_info[0]->n_envelopes > 1 ? 2 : 1), 0,
2410*15dc779aSAndroid Build Coastguard Worker pstr_sbr_bs->header_active, pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2411*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2412*15dc779aSAndroid Build Coastguard Worker return err_code;
2413*15dc779aSAndroid Build Coastguard Worker }
2414*15dc779aSAndroid Build Coastguard Worker
2415*15dc779aSAndroid Build Coastguard Worker ixheaace_sbr_noise_floor_levels_quantisation(ptr_noise_level[1], ptr_noise_floor[1], 0);
2416*15dc779aSAndroid Build Coastguard Worker
2417*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_code_envelope(
2418*15dc779aSAndroid Build Coastguard Worker ptr_noise_level[1], res, &pstr_env_ch[1]->str_sbr_code_noise_floor,
2419*15dc779aSAndroid Build Coastguard Worker pstr_env_1->domain_vec_noise, 0, (pstr_const_frame_info[1]->n_envelopes > 1 ? 2 : 1), 0,
2420*15dc779aSAndroid Build Coastguard Worker pstr_sbr_bs->header_active, pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2421*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2422*15dc779aSAndroid Build Coastguard Worker return err_code;
2423*15dc779aSAndroid Build Coastguard Worker }
2424*15dc779aSAndroid Build Coastguard Worker
2425*15dc779aSAndroid Build Coastguard Worker break;
2426*15dc779aSAndroid Build Coastguard Worker
2427*15dc779aSAndroid Build Coastguard Worker case SBR_COUPLING:
2428*15dc779aSAndroid Build Coastguard Worker ixheaace_couple_noise_floor(ptr_noise_floor[0], ptr_noise_floor[1]);
2429*15dc779aSAndroid Build Coastguard Worker
2430*15dc779aSAndroid Build Coastguard Worker ixheaace_sbr_noise_floor_levels_quantisation(ptr_noise_level[0], ptr_noise_floor[0], 0);
2431*15dc779aSAndroid Build Coastguard Worker
2432*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_code_envelope(
2433*15dc779aSAndroid Build Coastguard Worker ptr_noise_level[0], res, &pstr_env_ch[0]->str_sbr_code_noise_floor,
2434*15dc779aSAndroid Build Coastguard Worker pstr_env_0->domain_vec_noise, 1, (pstr_const_frame_info[0]->n_envelopes > 1 ? 2 : 1), 0,
2435*15dc779aSAndroid Build Coastguard Worker pstr_sbr_bs->header_active, pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2436*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2437*15dc779aSAndroid Build Coastguard Worker return err_code;
2438*15dc779aSAndroid Build Coastguard Worker }
2439*15dc779aSAndroid Build Coastguard Worker
2440*15dc779aSAndroid Build Coastguard Worker ixheaace_sbr_noise_floor_levels_quantisation(ptr_noise_level[1], ptr_noise_floor[1], 1);
2441*15dc779aSAndroid Build Coastguard Worker
2442*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_code_envelope(
2443*15dc779aSAndroid Build Coastguard Worker ptr_noise_level[1], res, &pstr_env_ch[1]->str_sbr_code_noise_floor,
2444*15dc779aSAndroid Build Coastguard Worker pstr_env_1->domain_vec_noise, 1, (pstr_const_frame_info[1]->n_envelopes > 1 ? 2 : 1), 1,
2445*15dc779aSAndroid Build Coastguard Worker pstr_sbr_bs->header_active, pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2446*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2447*15dc779aSAndroid Build Coastguard Worker return err_code;
2448*15dc779aSAndroid Build Coastguard Worker }
2449*15dc779aSAndroid Build Coastguard Worker
2450*15dc779aSAndroid Build Coastguard Worker break;
2451*15dc779aSAndroid Build Coastguard Worker
2452*15dc779aSAndroid Build Coastguard Worker case IXHEAACE_SBR_MODE_SWITCH_LRC:
2453*15dc779aSAndroid Build Coastguard Worker
2454*15dc779aSAndroid Build Coastguard Worker ixheaace_sbr_noise_floor_levels_quantisation(ptr_noise_level[0], ptr_noise_floor[0], 0);
2455*15dc779aSAndroid Build Coastguard Worker
2456*15dc779aSAndroid Build Coastguard Worker ixheaace_sbr_noise_floor_levels_quantisation(ptr_noise_level[1], ptr_noise_floor[1], 0);
2457*15dc779aSAndroid Build Coastguard Worker
2458*15dc779aSAndroid Build Coastguard Worker ixheaace_couple_noise_floor(ptr_noise_floor[0], ptr_noise_floor[1]);
2459*15dc779aSAndroid Build Coastguard Worker
2460*15dc779aSAndroid Build Coastguard Worker ixheaace_sbr_noise_floor_levels_quantisation(ptr_noise_lvl_coupling[0], ptr_noise_floor[0],
2461*15dc779aSAndroid Build Coastguard Worker 0);
2462*15dc779aSAndroid Build Coastguard Worker
2463*15dc779aSAndroid Build Coastguard Worker ixheaace_sbr_noise_floor_levels_quantisation(ptr_noise_lvl_coupling[1], ptr_noise_floor[1],
2464*15dc779aSAndroid Build Coastguard Worker 1);
2465*15dc779aSAndroid Build Coastguard Worker break;
2466*15dc779aSAndroid Build Coastguard Worker }
2467*15dc779aSAndroid Build Coastguard Worker
2468*15dc779aSAndroid Build Coastguard Worker switch (stereo_mode) {
2469*15dc779aSAndroid Build Coastguard Worker case IXHEAACE_SBR_MODE_MONO:
2470*15dc779aSAndroid Build Coastguard Worker
2471*15dc779aSAndroid Build Coastguard Worker pstr_sbr_hdr->coupling = 0;
2472*15dc779aSAndroid Build Coastguard Worker pstr_env_0->balance = 0;
2473*15dc779aSAndroid Build Coastguard Worker
2474*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_code_envelope(
2475*15dc779aSAndroid Build Coastguard Worker ptr_scale_factor_band_nrg[0], pstr_const_frame_info[0]->freq_res,
2476*15dc779aSAndroid Build Coastguard Worker &pstr_env_ch[0]->str_sbr_code_env, pstr_env_0->domain_vec, pstr_sbr_hdr->coupling,
2477*15dc779aSAndroid Build Coastguard Worker pstr_const_frame_info[0]->n_envelopes, 0, pstr_sbr_bs->header_active,
2478*15dc779aSAndroid Build Coastguard Worker pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2479*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2480*15dc779aSAndroid Build Coastguard Worker return err_code;
2481*15dc779aSAndroid Build Coastguard Worker }
2482*15dc779aSAndroid Build Coastguard Worker break;
2483*15dc779aSAndroid Build Coastguard Worker
2484*15dc779aSAndroid Build Coastguard Worker case IXHEAACE_SBR_MODE_LEFT_RIGHT:
2485*15dc779aSAndroid Build Coastguard Worker
2486*15dc779aSAndroid Build Coastguard Worker pstr_sbr_hdr->coupling = 0;
2487*15dc779aSAndroid Build Coastguard Worker
2488*15dc779aSAndroid Build Coastguard Worker pstr_env_0->balance = 0;
2489*15dc779aSAndroid Build Coastguard Worker pstr_env_1->balance = 0;
2490*15dc779aSAndroid Build Coastguard Worker
2491*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_code_envelope(
2492*15dc779aSAndroid Build Coastguard Worker ptr_scale_factor_band_nrg[0], pstr_const_frame_info[0]->freq_res,
2493*15dc779aSAndroid Build Coastguard Worker &pstr_env_ch[0]->str_sbr_code_env, pstr_env_0->domain_vec, pstr_sbr_hdr->coupling,
2494*15dc779aSAndroid Build Coastguard Worker pstr_const_frame_info[0]->n_envelopes, 0, pstr_sbr_bs->header_active,
2495*15dc779aSAndroid Build Coastguard Worker pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2496*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2497*15dc779aSAndroid Build Coastguard Worker return err_code;
2498*15dc779aSAndroid Build Coastguard Worker }
2499*15dc779aSAndroid Build Coastguard Worker
2500*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_code_envelope(
2501*15dc779aSAndroid Build Coastguard Worker ptr_scale_factor_band_nrg[1], pstr_const_frame_info[1]->freq_res,
2502*15dc779aSAndroid Build Coastguard Worker &pstr_env_ch[1]->str_sbr_code_env, pstr_env_1->domain_vec, pstr_sbr_hdr->coupling,
2503*15dc779aSAndroid Build Coastguard Worker pstr_const_frame_info[1]->n_envelopes, 0, pstr_sbr_bs->header_active,
2504*15dc779aSAndroid Build Coastguard Worker pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2505*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2506*15dc779aSAndroid Build Coastguard Worker return err_code;
2507*15dc779aSAndroid Build Coastguard Worker }
2508*15dc779aSAndroid Build Coastguard Worker break;
2509*15dc779aSAndroid Build Coastguard Worker
2510*15dc779aSAndroid Build Coastguard Worker case SBR_COUPLING:
2511*15dc779aSAndroid Build Coastguard Worker
2512*15dc779aSAndroid Build Coastguard Worker pstr_sbr_hdr->coupling = 1;
2513*15dc779aSAndroid Build Coastguard Worker pstr_env_0->balance = 0;
2514*15dc779aSAndroid Build Coastguard Worker pstr_env_1->balance = 1;
2515*15dc779aSAndroid Build Coastguard Worker
2516*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_code_envelope(
2517*15dc779aSAndroid Build Coastguard Worker ptr_scale_factor_band_nrg[0], pstr_const_frame_info[0]->freq_res,
2518*15dc779aSAndroid Build Coastguard Worker &pstr_env_ch[0]->str_sbr_code_env, pstr_env_0->domain_vec, pstr_sbr_hdr->coupling,
2519*15dc779aSAndroid Build Coastguard Worker pstr_const_frame_info[0]->n_envelopes, 0, pstr_sbr_bs->header_active,
2520*15dc779aSAndroid Build Coastguard Worker pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2521*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2522*15dc779aSAndroid Build Coastguard Worker return err_code;
2523*15dc779aSAndroid Build Coastguard Worker }
2524*15dc779aSAndroid Build Coastguard Worker
2525*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_code_envelope(
2526*15dc779aSAndroid Build Coastguard Worker ptr_scale_factor_band_nrg[1], pstr_const_frame_info[1]->freq_res,
2527*15dc779aSAndroid Build Coastguard Worker &pstr_env_ch[1]->str_sbr_code_env, pstr_env_1->domain_vec, pstr_sbr_hdr->coupling,
2528*15dc779aSAndroid Build Coastguard Worker pstr_const_frame_info[1]->n_envelopes, 1, pstr_sbr_bs->header_active,
2529*15dc779aSAndroid Build Coastguard Worker pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2530*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2531*15dc779aSAndroid Build Coastguard Worker return err_code;
2532*15dc779aSAndroid Build Coastguard Worker }
2533*15dc779aSAndroid Build Coastguard Worker break;
2534*15dc779aSAndroid Build Coastguard Worker
2535*15dc779aSAndroid Build Coastguard Worker case IXHEAACE_SBR_MODE_SWITCH_LRC: {
2536*15dc779aSAndroid Build Coastguard Worker WORD32 payloadbits_lr;
2537*15dc779aSAndroid Build Coastguard Worker WORD32 payloadbits_coupling;
2538*15dc779aSAndroid Build Coastguard Worker
2539*15dc779aSAndroid Build Coastguard Worker WORD32 scale_factor_band_nrg_prev_temp[IXHEAACE_MAX_CH_IN_BS_ELE][MAXIMUM_FREQ_COEFFS];
2540*15dc779aSAndroid Build Coastguard Worker WORD32 noise_prev_temp[IXHEAACE_MAX_CH_IN_BS_ELE][MAXIMUM_NUM_NOISE_COEFFS];
2541*15dc779aSAndroid Build Coastguard Worker WORD32 up_date_nrg_temp[IXHEAACE_MAX_CH_IN_BS_ELE];
2542*15dc779aSAndroid Build Coastguard Worker WORD32 up_date_noise_temp[IXHEAACE_MAX_CH_IN_BS_ELE];
2543*15dc779aSAndroid Build Coastguard Worker WORD32 domain_vec_temp[IXHEAACE_MAX_CH_IN_BS_ELE][IXHEAACE_MAX_ENV];
2544*15dc779aSAndroid Build Coastguard Worker WORD32 domain_vec_noise_temp[IXHEAACE_MAX_CH_IN_BS_ELE][IXHEAACE_MAX_ENV];
2545*15dc779aSAndroid Build Coastguard Worker
2546*15dc779aSAndroid Build Coastguard Worker WORD32 temp_flag_right = 0;
2547*15dc779aSAndroid Build Coastguard Worker WORD32 temp_flag_left = 0;
2548*15dc779aSAndroid Build Coastguard Worker
2549*15dc779aSAndroid Build Coastguard Worker ch = 0;
2550*15dc779aSAndroid Build Coastguard Worker while (ch < num_channels) {
2551*15dc779aSAndroid Build Coastguard Worker memcpy(scale_factor_band_nrg_prev_temp[ch],
2552*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[ch]->str_sbr_code_env.sfb_nrg_prev,
2553*15dc779aSAndroid Build Coastguard Worker MAXIMUM_FREQ_COEFFS * sizeof(scale_factor_band_nrg_prev_temp[0][0]));
2554*15dc779aSAndroid Build Coastguard Worker
2555*15dc779aSAndroid Build Coastguard Worker memcpy(noise_prev_temp[ch], pstr_env_ch[ch]->str_sbr_code_noise_floor.sfb_nrg_prev,
2556*15dc779aSAndroid Build Coastguard Worker MAXIMUM_NUM_NOISE_COEFFS * sizeof(noise_prev_temp[0][0]));
2557*15dc779aSAndroid Build Coastguard Worker
2558*15dc779aSAndroid Build Coastguard Worker up_date_nrg_temp[ch] = pstr_env_ch[ch]->str_sbr_code_env.update;
2559*15dc779aSAndroid Build Coastguard Worker up_date_noise_temp[ch] = pstr_env_ch[ch]->str_sbr_code_noise_floor.update;
2560*15dc779aSAndroid Build Coastguard Worker
2561*15dc779aSAndroid Build Coastguard Worker if (pstr_sbr_hdr->prev_coupling) {
2562*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[ch]->str_sbr_code_env.update = 0;
2563*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[ch]->str_sbr_code_noise_floor.update = 0;
2564*15dc779aSAndroid Build Coastguard Worker }
2565*15dc779aSAndroid Build Coastguard Worker ch++;
2566*15dc779aSAndroid Build Coastguard Worker }
2567*15dc779aSAndroid Build Coastguard Worker
2568*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_code_envelope(
2569*15dc779aSAndroid Build Coastguard Worker ptr_scale_factor_band_nrg[0], pstr_const_frame_info[0]->freq_res,
2570*15dc779aSAndroid Build Coastguard Worker &pstr_env_ch[0]->str_sbr_code_env, pstr_env_0->domain_vec, 0,
2571*15dc779aSAndroid Build Coastguard Worker pstr_const_frame_info[0]->n_envelopes, 0, pstr_sbr_bs->header_active,
2572*15dc779aSAndroid Build Coastguard Worker pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2573*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2574*15dc779aSAndroid Build Coastguard Worker return err_code;
2575*15dc779aSAndroid Build Coastguard Worker }
2576*15dc779aSAndroid Build Coastguard Worker
2577*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_code_envelope(
2578*15dc779aSAndroid Build Coastguard Worker ptr_scale_factor_band_nrg[1], pstr_const_frame_info[1]->freq_res,
2579*15dc779aSAndroid Build Coastguard Worker &pstr_env_ch[1]->str_sbr_code_env, pstr_env_1->domain_vec, 0,
2580*15dc779aSAndroid Build Coastguard Worker pstr_const_frame_info[1]->n_envelopes, 0, pstr_sbr_bs->header_active,
2581*15dc779aSAndroid Build Coastguard Worker pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2582*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2583*15dc779aSAndroid Build Coastguard Worker return err_code;
2584*15dc779aSAndroid Build Coastguard Worker }
2585*15dc779aSAndroid Build Coastguard Worker
2586*15dc779aSAndroid Build Coastguard Worker c = 0;
2587*15dc779aSAndroid Build Coastguard Worker i = 0;
2588*15dc779aSAndroid Build Coastguard Worker while (i < n_envelopes[0]) {
2589*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < pstr_env_0->no_scf_bands[i]; j++) {
2590*15dc779aSAndroid Build Coastguard Worker pstr_env_0->ienvelope[i][j] = ptr_scale_factor_band_nrg[0][c];
2591*15dc779aSAndroid Build Coastguard Worker pstr_env_1->ienvelope[i][j] = ptr_scale_factor_band_nrg[1][c];
2592*15dc779aSAndroid Build Coastguard Worker
2593*15dc779aSAndroid Build Coastguard Worker c++;
2594*15dc779aSAndroid Build Coastguard Worker }
2595*15dc779aSAndroid Build Coastguard Worker i++;
2596*15dc779aSAndroid Build Coastguard Worker }
2597*15dc779aSAndroid Build Coastguard Worker
2598*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_code_envelope(
2599*15dc779aSAndroid Build Coastguard Worker ptr_noise_level[0], res, &pstr_env_ch[0]->str_sbr_code_noise_floor,
2600*15dc779aSAndroid Build Coastguard Worker pstr_env_0->domain_vec_noise, 0, (pstr_const_frame_info[0]->n_envelopes > 1 ? 2 : 1), 0,
2601*15dc779aSAndroid Build Coastguard Worker pstr_sbr_bs->header_active, pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2602*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2603*15dc779aSAndroid Build Coastguard Worker return err_code;
2604*15dc779aSAndroid Build Coastguard Worker }
2605*15dc779aSAndroid Build Coastguard Worker
2606*15dc779aSAndroid Build Coastguard Worker i = 0;
2607*15dc779aSAndroid Build Coastguard Worker while (i < MAXIMUM_NUM_NOISE_VALUES) {
2608*15dc779aSAndroid Build Coastguard Worker pstr_env_0->noise_level[i] = ptr_noise_level[0][i];
2609*15dc779aSAndroid Build Coastguard Worker i++;
2610*15dc779aSAndroid Build Coastguard Worker }
2611*15dc779aSAndroid Build Coastguard Worker
2612*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_code_envelope(
2613*15dc779aSAndroid Build Coastguard Worker ptr_noise_level[1], res, &pstr_env_ch[1]->str_sbr_code_noise_floor,
2614*15dc779aSAndroid Build Coastguard Worker pstr_env_1->domain_vec_noise, 0, (pstr_const_frame_info[1]->n_envelopes > 1 ? 2 : 1), 0,
2615*15dc779aSAndroid Build Coastguard Worker pstr_sbr_bs->header_active, pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2616*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2617*15dc779aSAndroid Build Coastguard Worker return err_code;
2618*15dc779aSAndroid Build Coastguard Worker }
2619*15dc779aSAndroid Build Coastguard Worker
2620*15dc779aSAndroid Build Coastguard Worker i = 0;
2621*15dc779aSAndroid Build Coastguard Worker while (i < MAXIMUM_NUM_NOISE_VALUES) {
2622*15dc779aSAndroid Build Coastguard Worker pstr_env_1->noise_level[i] = ptr_noise_level[1][i];
2623*15dc779aSAndroid Build Coastguard Worker i++;
2624*15dc779aSAndroid Build Coastguard Worker }
2625*15dc779aSAndroid Build Coastguard Worker
2626*15dc779aSAndroid Build Coastguard Worker pstr_sbr_hdr->coupling = 0;
2627*15dc779aSAndroid Build Coastguard Worker pstr_env_0->balance = 0;
2628*15dc779aSAndroid Build Coastguard Worker pstr_env_1->balance = 0;
2629*15dc779aSAndroid Build Coastguard Worker
2630*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_count_sbr_channel_pair_element(
2631*15dc779aSAndroid Build Coastguard Worker pstr_sbr_hdr, pstr_sbr_bs, &pstr_env_ch[0]->enc_env_data, &pstr_env_ch[1]->enc_env_data,
2632*15dc779aSAndroid Build Coastguard Worker pstr_com_data, ptr_sbr_tab, pstr_sbr_cfg->sbr_codec, pstr_sbr_cfg->is_esbr, &str_esbr,
2633*15dc779aSAndroid Build Coastguard Worker &payloadbits_lr);
2634*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2635*15dc779aSAndroid Build Coastguard Worker return err_code;
2636*15dc779aSAndroid Build Coastguard Worker }
2637*15dc779aSAndroid Build Coastguard Worker
2638*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < num_channels; ch++) {
2639*15dc779aSAndroid Build Coastguard Worker WORD32 itmp;
2640*15dc779aSAndroid Build Coastguard Worker
2641*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < MAXIMUM_FREQ_COEFFS; i++) {
2642*15dc779aSAndroid Build Coastguard Worker itmp = pstr_env_ch[ch]->str_sbr_code_env.sfb_nrg_prev[i];
2643*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[ch]->str_sbr_code_env.sfb_nrg_prev[i] =
2644*15dc779aSAndroid Build Coastguard Worker scale_factor_band_nrg_prev_temp[ch][i];
2645*15dc779aSAndroid Build Coastguard Worker scale_factor_band_nrg_prev_temp[ch][i] = itmp;
2646*15dc779aSAndroid Build Coastguard Worker }
2647*15dc779aSAndroid Build Coastguard Worker
2648*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < MAXIMUM_NUM_NOISE_COEFFS; i++) {
2649*15dc779aSAndroid Build Coastguard Worker itmp = pstr_env_ch[ch]->str_sbr_code_noise_floor.sfb_nrg_prev[i];
2650*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[ch]->str_sbr_code_noise_floor.sfb_nrg_prev[i] = noise_prev_temp[ch][i];
2651*15dc779aSAndroid Build Coastguard Worker noise_prev_temp[ch][i] = itmp;
2652*15dc779aSAndroid Build Coastguard Worker }
2653*15dc779aSAndroid Build Coastguard Worker
2654*15dc779aSAndroid Build Coastguard Worker itmp = pstr_env_ch[ch]->str_sbr_code_env.update;
2655*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[ch]->str_sbr_code_env.update = up_date_nrg_temp[ch];
2656*15dc779aSAndroid Build Coastguard Worker up_date_nrg_temp[ch] = itmp;
2657*15dc779aSAndroid Build Coastguard Worker
2658*15dc779aSAndroid Build Coastguard Worker itmp = pstr_env_ch[ch]->str_sbr_code_noise_floor.update;
2659*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[ch]->str_sbr_code_noise_floor.update = up_date_noise_temp[ch];
2660*15dc779aSAndroid Build Coastguard Worker up_date_noise_temp[ch] = itmp;
2661*15dc779aSAndroid Build Coastguard Worker
2662*15dc779aSAndroid Build Coastguard Worker memcpy(domain_vec_temp[ch], pstr_env_ch[ch]->enc_env_data.domain_vec,
2663*15dc779aSAndroid Build Coastguard Worker sizeof(domain_vec_temp[0][0]) * IXHEAACE_MAX_ENV);
2664*15dc779aSAndroid Build Coastguard Worker
2665*15dc779aSAndroid Build Coastguard Worker memcpy(domain_vec_noise_temp[ch], pstr_env_ch[ch]->enc_env_data.domain_vec_noise,
2666*15dc779aSAndroid Build Coastguard Worker sizeof(domain_vec_noise_temp[0][0]) * IXHEAACE_MAX_ENV);
2667*15dc779aSAndroid Build Coastguard Worker
2668*15dc779aSAndroid Build Coastguard Worker if (!pstr_sbr_hdr->prev_coupling) {
2669*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[ch]->str_sbr_code_env.update = 0;
2670*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[ch]->str_sbr_code_noise_floor.update = 0;
2671*15dc779aSAndroid Build Coastguard Worker }
2672*15dc779aSAndroid Build Coastguard Worker }
2673*15dc779aSAndroid Build Coastguard Worker
2674*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_code_envelope(
2675*15dc779aSAndroid Build Coastguard Worker ptr_sfb_nrg_coupling[0], pstr_const_frame_info[0]->freq_res,
2676*15dc779aSAndroid Build Coastguard Worker &pstr_env_ch[0]->str_sbr_code_env, pstr_env_0->domain_vec, 1,
2677*15dc779aSAndroid Build Coastguard Worker pstr_const_frame_info[0]->n_envelopes, 0, pstr_sbr_bs->header_active,
2678*15dc779aSAndroid Build Coastguard Worker pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2679*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2680*15dc779aSAndroid Build Coastguard Worker return err_code;
2681*15dc779aSAndroid Build Coastguard Worker }
2682*15dc779aSAndroid Build Coastguard Worker
2683*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_code_envelope(
2684*15dc779aSAndroid Build Coastguard Worker ptr_sfb_nrg_coupling[1], pstr_const_frame_info[1]->freq_res,
2685*15dc779aSAndroid Build Coastguard Worker &pstr_env_ch[1]->str_sbr_code_env, pstr_env_1->domain_vec, 1,
2686*15dc779aSAndroid Build Coastguard Worker pstr_const_frame_info[1]->n_envelopes, 1, pstr_sbr_bs->header_active,
2687*15dc779aSAndroid Build Coastguard Worker pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2688*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2689*15dc779aSAndroid Build Coastguard Worker return err_code;
2690*15dc779aSAndroid Build Coastguard Worker }
2691*15dc779aSAndroid Build Coastguard Worker
2692*15dc779aSAndroid Build Coastguard Worker c = 0;
2693*15dc779aSAndroid Build Coastguard Worker i = 0;
2694*15dc779aSAndroid Build Coastguard Worker while (i < n_envelopes[0]) {
2695*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < pstr_env_0->no_scf_bands[i]; j++) {
2696*15dc779aSAndroid Build Coastguard Worker pstr_env_0->ienvelope[i][j] = ptr_sfb_nrg_coupling[0][c];
2697*15dc779aSAndroid Build Coastguard Worker pstr_env_1->ienvelope[i][j] = ptr_sfb_nrg_coupling[1][c];
2698*15dc779aSAndroid Build Coastguard Worker c++;
2699*15dc779aSAndroid Build Coastguard Worker }
2700*15dc779aSAndroid Build Coastguard Worker i++;
2701*15dc779aSAndroid Build Coastguard Worker }
2702*15dc779aSAndroid Build Coastguard Worker
2703*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_code_envelope(
2704*15dc779aSAndroid Build Coastguard Worker ptr_noise_lvl_coupling[0], res, &pstr_env_ch[0]->str_sbr_code_noise_floor,
2705*15dc779aSAndroid Build Coastguard Worker pstr_env_0->domain_vec_noise, 1, (pstr_const_frame_info[0]->n_envelopes > 1 ? 2 : 1), 0,
2706*15dc779aSAndroid Build Coastguard Worker pstr_sbr_bs->header_active, pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2707*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2708*15dc779aSAndroid Build Coastguard Worker return err_code;
2709*15dc779aSAndroid Build Coastguard Worker }
2710*15dc779aSAndroid Build Coastguard Worker
2711*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < MAXIMUM_NUM_NOISE_VALUES; i++) {
2712*15dc779aSAndroid Build Coastguard Worker pstr_env_0->noise_level[i] = ptr_noise_lvl_coupling[0][i];
2713*15dc779aSAndroid Build Coastguard Worker }
2714*15dc779aSAndroid Build Coastguard Worker
2715*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_code_envelope(
2716*15dc779aSAndroid Build Coastguard Worker ptr_noise_lvl_coupling[1], res, &pstr_env_ch[1]->str_sbr_code_noise_floor,
2717*15dc779aSAndroid Build Coastguard Worker pstr_env_1->domain_vec_noise, 1, ((pstr_const_frame_info[1]->n_envelopes > 1) ? 2 : 1),
2718*15dc779aSAndroid Build Coastguard Worker 1, pstr_sbr_bs->header_active, pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2719*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2720*15dc779aSAndroid Build Coastguard Worker return err_code;
2721*15dc779aSAndroid Build Coastguard Worker }
2722*15dc779aSAndroid Build Coastguard Worker
2723*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < MAXIMUM_NUM_NOISE_VALUES; i++) {
2724*15dc779aSAndroid Build Coastguard Worker pstr_env_1->noise_level[i] = ptr_noise_lvl_coupling[1][i];
2725*15dc779aSAndroid Build Coastguard Worker }
2726*15dc779aSAndroid Build Coastguard Worker
2727*15dc779aSAndroid Build Coastguard Worker pstr_sbr_hdr->coupling = 1;
2728*15dc779aSAndroid Build Coastguard Worker
2729*15dc779aSAndroid Build Coastguard Worker pstr_env_0->balance = 0;
2730*15dc779aSAndroid Build Coastguard Worker pstr_env_1->balance = 1;
2731*15dc779aSAndroid Build Coastguard Worker
2732*15dc779aSAndroid Build Coastguard Worker temp_flag_left = pstr_env_0->add_harmonic_flag;
2733*15dc779aSAndroid Build Coastguard Worker temp_flag_right = pstr_env_1->add_harmonic_flag;
2734*15dc779aSAndroid Build Coastguard Worker
2735*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_count_sbr_channel_pair_element(
2736*15dc779aSAndroid Build Coastguard Worker pstr_sbr_hdr, pstr_sbr_bs, &pstr_env_ch[0]->enc_env_data, &pstr_env_ch[1]->enc_env_data,
2737*15dc779aSAndroid Build Coastguard Worker pstr_com_data, ptr_sbr_tab, pstr_sbr_cfg->sbr_codec, pstr_sbr_cfg->is_esbr, &str_esbr,
2738*15dc779aSAndroid Build Coastguard Worker &payloadbits_coupling);
2739*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2740*15dc779aSAndroid Build Coastguard Worker return err_code;
2741*15dc779aSAndroid Build Coastguard Worker }
2742*15dc779aSAndroid Build Coastguard Worker
2743*15dc779aSAndroid Build Coastguard Worker pstr_env_0->add_harmonic_flag = temp_flag_left;
2744*15dc779aSAndroid Build Coastguard Worker pstr_env_1->add_harmonic_flag = temp_flag_right;
2745*15dc779aSAndroid Build Coastguard Worker
2746*15dc779aSAndroid Build Coastguard Worker if (payloadbits_coupling < payloadbits_lr) {
2747*15dc779aSAndroid Build Coastguard Worker ch = 0;
2748*15dc779aSAndroid Build Coastguard Worker while (ch < num_channels) {
2749*15dc779aSAndroid Build Coastguard Worker memcpy(ptr_scale_factor_band_nrg[ch], ptr_sfb_nrg_coupling[ch],
2750*15dc779aSAndroid Build Coastguard Worker MAXIMUM_NUM_ENVELOPE_VALUES * sizeof(ptr_scale_factor_band_nrg[0][0]));
2751*15dc779aSAndroid Build Coastguard Worker
2752*15dc779aSAndroid Build Coastguard Worker memcpy(ptr_noise_level[ch], ptr_noise_lvl_coupling[ch],
2753*15dc779aSAndroid Build Coastguard Worker MAXIMUM_NUM_NOISE_VALUES * sizeof(ptr_noise_level[0][0]));
2754*15dc779aSAndroid Build Coastguard Worker ch++;
2755*15dc779aSAndroid Build Coastguard Worker }
2756*15dc779aSAndroid Build Coastguard Worker
2757*15dc779aSAndroid Build Coastguard Worker pstr_sbr_hdr->coupling = 1;
2758*15dc779aSAndroid Build Coastguard Worker pstr_env_0->balance = 0;
2759*15dc779aSAndroid Build Coastguard Worker pstr_env_1->balance = 1;
2760*15dc779aSAndroid Build Coastguard Worker } else {
2761*15dc779aSAndroid Build Coastguard Worker ch = 0;
2762*15dc779aSAndroid Build Coastguard Worker while (ch < num_channels) {
2763*15dc779aSAndroid Build Coastguard Worker memcpy(pstr_env_ch[ch]->str_sbr_code_env.sfb_nrg_prev,
2764*15dc779aSAndroid Build Coastguard Worker scale_factor_band_nrg_prev_temp[ch],
2765*15dc779aSAndroid Build Coastguard Worker MAXIMUM_FREQ_COEFFS * sizeof(scale_factor_band_nrg_prev_temp[0][0]));
2766*15dc779aSAndroid Build Coastguard Worker
2767*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[ch]->str_sbr_code_env.update = up_date_nrg_temp[ch];
2768*15dc779aSAndroid Build Coastguard Worker
2769*15dc779aSAndroid Build Coastguard Worker memcpy(pstr_env_ch[ch]->str_sbr_code_noise_floor.sfb_nrg_prev, noise_prev_temp[ch],
2770*15dc779aSAndroid Build Coastguard Worker MAXIMUM_NUM_NOISE_COEFFS * sizeof(noise_prev_temp[0][0]));
2771*15dc779aSAndroid Build Coastguard Worker
2772*15dc779aSAndroid Build Coastguard Worker memcpy(pstr_env_ch[ch]->enc_env_data.domain_vec, domain_vec_temp[ch],
2773*15dc779aSAndroid Build Coastguard Worker sizeof(domain_vec_temp[0][0]) * IXHEAACE_MAX_ENV);
2774*15dc779aSAndroid Build Coastguard Worker
2775*15dc779aSAndroid Build Coastguard Worker memcpy(pstr_env_ch[ch]->enc_env_data.domain_vec_noise, domain_vec_noise_temp[ch],
2776*15dc779aSAndroid Build Coastguard Worker sizeof(domain_vec_noise_temp[0][0]) * IXHEAACE_MAX_ENV);
2777*15dc779aSAndroid Build Coastguard Worker
2778*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[ch]->str_sbr_code_noise_floor.update = up_date_noise_temp[ch];
2779*15dc779aSAndroid Build Coastguard Worker ch++;
2780*15dc779aSAndroid Build Coastguard Worker }
2781*15dc779aSAndroid Build Coastguard Worker
2782*15dc779aSAndroid Build Coastguard Worker pstr_sbr_hdr->coupling = 0;
2783*15dc779aSAndroid Build Coastguard Worker pstr_env_0->balance = 0;
2784*15dc779aSAndroid Build Coastguard Worker pstr_env_1->balance = 0;
2785*15dc779aSAndroid Build Coastguard Worker }
2786*15dc779aSAndroid Build Coastguard Worker } break;
2787*15dc779aSAndroid Build Coastguard Worker }
2788*15dc779aSAndroid Build Coastguard Worker
2789*15dc779aSAndroid Build Coastguard Worker if (num_channels == 1) {
2790*15dc779aSAndroid Build Coastguard Worker if (pstr_env_0->domain_vec[0] == TIME) {
2791*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[0]->str_sbr_code_env.df_edge_incr_fac++;
2792*15dc779aSAndroid Build Coastguard Worker } else {
2793*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[0]->str_sbr_code_env.df_edge_incr_fac = 0;
2794*15dc779aSAndroid Build Coastguard Worker }
2795*15dc779aSAndroid Build Coastguard Worker } else {
2796*15dc779aSAndroid Build Coastguard Worker if (pstr_env_0->domain_vec[0] == TIME || pstr_env_1->domain_vec[0] == TIME) {
2797*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[0]->str_sbr_code_env.df_edge_incr_fac++;
2798*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[1]->str_sbr_code_env.df_edge_incr_fac++;
2799*15dc779aSAndroid Build Coastguard Worker } else {
2800*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[0]->str_sbr_code_env.df_edge_incr_fac = 0;
2801*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[1]->str_sbr_code_env.df_edge_incr_fac = 0;
2802*15dc779aSAndroid Build Coastguard Worker }
2803*15dc779aSAndroid Build Coastguard Worker }
2804*15dc779aSAndroid Build Coastguard Worker
2805*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < num_channels; ch++) {
2806*15dc779aSAndroid Build Coastguard Worker c = 0;
2807*15dc779aSAndroid Build Coastguard Worker i = 0;
2808*15dc779aSAndroid Build Coastguard Worker
2809*15dc779aSAndroid Build Coastguard Worker while (i < n_envelopes[ch]) {
2810*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < pstr_env_ch[ch]->enc_env_data.no_scf_bands[i]; j++) {
2811*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[ch]->enc_env_data.ienvelope[i][j] = ptr_scale_factor_band_nrg[ch][c];
2812*15dc779aSAndroid Build Coastguard Worker c++;
2813*15dc779aSAndroid Build Coastguard Worker }
2814*15dc779aSAndroid Build Coastguard Worker i++;
2815*15dc779aSAndroid Build Coastguard Worker }
2816*15dc779aSAndroid Build Coastguard Worker
2817*15dc779aSAndroid Build Coastguard Worker i = 0;
2818*15dc779aSAndroid Build Coastguard Worker while (i < MAXIMUM_NUM_NOISE_VALUES) {
2819*15dc779aSAndroid Build Coastguard Worker pstr_env_ch[ch]->enc_env_data.noise_level[i] = ptr_noise_level[ch][i];
2820*15dc779aSAndroid Build Coastguard Worker i++;
2821*15dc779aSAndroid Build Coastguard Worker }
2822*15dc779aSAndroid Build Coastguard Worker }
2823*15dc779aSAndroid Build Coastguard Worker if ((USAC_SBR == pstr_sbr_cfg->sbr_codec) && (1 == pstr_sbr_hdr->sbr_inter_tes_active)) {
2824*15dc779aSAndroid Build Coastguard Worker // inter-TES encoder
2825*15dc779aSAndroid Build Coastguard Worker WORD32 idx;
2826*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < num_channels; ch++) {
2827*15dc779aSAndroid Build Coastguard Worker ixheaace_str_inter_tes_params *pstr_tes_enc = &pstr_env_ch[ch]->str_inter_tes_enc;
2828*15dc779aSAndroid Build Coastguard Worker
2829*15dc779aSAndroid Build Coastguard Worker pstr_tes_enc->num_if_bands = pstr_env_ch[ch]->enc_env_data.noise_band_count;
2830*15dc779aSAndroid Build Coastguard Worker pstr_tes_enc->sub_band_start = pstr_sbr_cfg->ptr_freq_band_tab[LO][0];
2831*15dc779aSAndroid Build Coastguard Worker pstr_tes_enc->sub_band_end = pstr_sbr_cfg->ptr_freq_band_tab[LO][pstr_sbr_cfg->num_scf[LO]];
2832*15dc779aSAndroid Build Coastguard Worker pstr_tes_enc->num_mf_bands = pstr_sbr_cfg->num_master;
2833*15dc779aSAndroid Build Coastguard Worker pstr_tes_enc->out_fs = pstr_sbr_cfg->sample_freq;
2834*15dc779aSAndroid Build Coastguard Worker pstr_tes_enc->num_env = pstr_env_ch[ch]->str_sbr_env_frame.sbr_grid.bs_num_env;
2835*15dc779aSAndroid Build Coastguard Worker
2836*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < (IXHEAACE_MAX_ENV + 1); idx++) {
2837*15dc779aSAndroid Build Coastguard Worker pstr_tes_enc->border_vec[idx] = (WORD16)pstr_const_frame_info[ch]->borders[idx];
2838*15dc779aSAndroid Build Coastguard Worker }
2839*15dc779aSAndroid Build Coastguard Worker
2840*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < (MAXIMUM_FREQ_COEFFS + 1); idx++) {
2841*15dc779aSAndroid Build Coastguard Worker pstr_tes_enc->f_master_tbl[idx] = (WORD16)((UWORD16)pstr_sbr_cfg->ptr_v_k_master[idx]);
2842*15dc779aSAndroid Build Coastguard Worker }
2843*15dc779aSAndroid Build Coastguard Worker
2844*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < MAXIMUM_NUM_NOISE_VALUES; idx++) {
2845*15dc779aSAndroid Build Coastguard Worker pstr_tes_enc->inv_filt_mode[idx] =
2846*15dc779aSAndroid Build Coastguard Worker (WORD32)pstr_env_ch[ch]->enc_env_data.sbr_invf_mode_vec[idx];
2847*15dc779aSAndroid Build Coastguard Worker pstr_tes_enc->invf_band_tbl[idx] =
2848*15dc779aSAndroid Build Coastguard Worker (WORD16)pstr_env_ch[ch]->str_ton_corr.sbr_noise_floor_est.s_freq_qmf_band_tbl[idx];
2849*15dc779aSAndroid Build Coastguard Worker }
2850*15dc779aSAndroid Build Coastguard Worker pstr_tes_enc->invf_band_tbl[MAXIMUM_NUM_NOISE_VALUES] =
2851*15dc779aSAndroid Build Coastguard Worker (WORD16)pstr_env_ch[ch]
2852*15dc779aSAndroid Build Coastguard Worker ->str_ton_corr.sbr_noise_floor_est.s_freq_qmf_band_tbl[MAXIMUM_NUM_NOISE_VALUES];
2853*15dc779aSAndroid Build Coastguard Worker
2854*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_process_inter_tes(pstr_tes_enc, ptr_sbr_scratch);
2855*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2856*15dc779aSAndroid Build Coastguard Worker return err_code;
2857*15dc779aSAndroid Build Coastguard Worker }
2858*15dc779aSAndroid Build Coastguard Worker
2859*15dc779aSAndroid Build Coastguard Worker WORD32 ts, num_ts, delay;
2860*15dc779aSAndroid Build Coastguard Worker num_ts = pstr_env_ch[ch]->str_sbr_qmf.num_time_slots;
2861*15dc779aSAndroid Build Coastguard Worker
2862*15dc779aSAndroid Build Coastguard Worker delay = pstr_tes_enc->op_delay + pstr_tes_enc->codec_delay + IXHEAACE_SBR_HF_ADJ_OFFSET;
2863*15dc779aSAndroid Build Coastguard Worker
2864*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < delay; ts++) {
2865*15dc779aSAndroid Build Coastguard Worker memcpy(pstr_tes_enc->qmf_buf_real[ts], pstr_tes_enc->qmf_buf_real[num_ts + ts],
2866*15dc779aSAndroid Build Coastguard Worker IXHEAACE_QMF_CHANNELS * sizeof(pstr_tes_enc->qmf_buf_real[0][0]));
2867*15dc779aSAndroid Build Coastguard Worker memcpy(pstr_tes_enc->qmf_buf_imag[ts], pstr_tes_enc->qmf_buf_imag[num_ts + ts],
2868*15dc779aSAndroid Build Coastguard Worker IXHEAACE_QMF_CHANNELS * sizeof(pstr_tes_enc->qmf_buf_imag[0][0]));
2869*15dc779aSAndroid Build Coastguard Worker }
2870*15dc779aSAndroid Build Coastguard Worker }
2871*15dc779aSAndroid Build Coastguard Worker }
2872*15dc779aSAndroid Build Coastguard Worker // Pitch detection, pre-processing detection and oversampling decision making
2873*15dc779aSAndroid Build Coastguard Worker if ((1 == pstr_sbr_cfg->is_esbr) && (pstr_sbr_cfg->sbr_codec == HEAAC_SBR)) {
2874*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_update_esbr_ext_data(
2875*15dc779aSAndroid Build Coastguard Worker ptr_in_time, pstr_sbr_cfg, pstr_env_ch[0]->str_sbr_extract_env.ptr_r_buffer[0], &str_esbr,
2876*15dc779aSAndroid Build Coastguard Worker transient_info, ptr_sbr_tab, pstr_sbr_hdr->coupling, time_sn_stride, 2048);
2877*15dc779aSAndroid Build Coastguard Worker if (err_code) return err_code;
2878*15dc779aSAndroid Build Coastguard Worker }
2879*15dc779aSAndroid Build Coastguard Worker
2880*15dc779aSAndroid Build Coastguard Worker if ((pstr_sbr_cfg->sbr_codec == USAC_SBR) && (pstr_sbr_hdr->sbr_harmonic)) {
2881*15dc779aSAndroid Build Coastguard Worker ixheaace_update_harmonic_sbr_data(transient_info, pstr_sbr_hdr->coupling,
2882*15dc779aSAndroid Build Coastguard Worker &pstr_env_ch[0], num_channels);
2883*15dc779aSAndroid Build Coastguard Worker }
2884*15dc779aSAndroid Build Coastguard Worker if (num_channels == 2) {
2885*15dc779aSAndroid Build Coastguard Worker WORD32 num_bits;
2886*15dc779aSAndroid Build Coastguard Worker pstr_env_0->usac_indep_flag = pstr_sbr_bs->usac_indep_flag;
2887*15dc779aSAndroid Build Coastguard Worker pstr_env_1->usac_indep_flag = pstr_sbr_bs->usac_indep_flag;
2888*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_write_env_channel_pair_element(
2889*15dc779aSAndroid Build Coastguard Worker pstr_sbr_hdr, pstr_sbr_bs, &pstr_env_ch[0]->enc_env_data, &pstr_env_ch[1]->enc_env_data,
2890*15dc779aSAndroid Build Coastguard Worker pstr_com_data, ptr_sbr_tab, pstr_sbr_cfg->sbr_codec, pstr_sbr_cfg->is_esbr, &str_esbr,
2891*15dc779aSAndroid Build Coastguard Worker &num_bits);
2892*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2893*15dc779aSAndroid Build Coastguard Worker return err_code;
2894*15dc779aSAndroid Build Coastguard Worker }
2895*15dc779aSAndroid Build Coastguard Worker } else {
2896*15dc779aSAndroid Build Coastguard Worker WORD32 num_bits;
2897*15dc779aSAndroid Build Coastguard Worker pstr_env_0->sbr_pvc_mode = pstr_sbr_hdr->sbr_pvc_mode;
2898*15dc779aSAndroid Build Coastguard Worker pstr_env_0->sbr_sinusoidal_pos_flag = 0;
2899*15dc779aSAndroid Build Coastguard Worker pstr_env_0->usac_indep_flag = pstr_sbr_bs->usac_indep_flag;
2900*15dc779aSAndroid Build Coastguard Worker
2901*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_write_env_single_channel_element(
2902*15dc779aSAndroid Build Coastguard Worker pstr_sbr_hdr, pstr_sbr_bs, &pstr_env_ch[0]->enc_env_data, pstr_ps_enc, pstr_com_data,
2903*15dc779aSAndroid Build Coastguard Worker ptr_sbr_tab, pstr_sbr_cfg->sbr_codec, pstr_sbr_cfg->is_esbr, &str_esbr, &num_bits);
2904*15dc779aSAndroid Build Coastguard Worker if (err_code) {
2905*15dc779aSAndroid Build Coastguard Worker return err_code;
2906*15dc779aSAndroid Build Coastguard Worker }
2907*15dc779aSAndroid Build Coastguard Worker }
2908*15dc779aSAndroid Build Coastguard Worker
2909*15dc779aSAndroid Build Coastguard Worker ch = 0;
2910*15dc779aSAndroid Build Coastguard Worker while (ch < num_channels) {
2911*15dc779aSAndroid Build Coastguard Worker ixheaace_str_sbr_extr_env *pstr_sbr_extract_env = &(pstr_env_ch[ch]->str_sbr_extract_env);
2912*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < pstr_sbr_extract_env->y_buffer_write_offset; i++) {
2913*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_tmp;
2914*15dc779aSAndroid Build Coastguard Worker ptr_tmp = pstr_sbr_extract_env->ptr_y_buffer[i];
2915*15dc779aSAndroid Build Coastguard Worker pstr_sbr_extract_env->ptr_y_buffer[i] =
2916*15dc779aSAndroid Build Coastguard Worker pstr_sbr_extract_env->ptr_y_buffer[i + (pstr_sbr_extract_env->no_cols >> 1)];
2917*15dc779aSAndroid Build Coastguard Worker pstr_sbr_extract_env->ptr_y_buffer[i + (pstr_sbr_extract_env->no_cols >> 1)] = ptr_tmp;
2918*15dc779aSAndroid Build Coastguard Worker }
2919*15dc779aSAndroid Build Coastguard Worker
2920*15dc779aSAndroid Build Coastguard Worker pstr_sbr_extract_env->buffer_flag ^= 1;
2921*15dc779aSAndroid Build Coastguard Worker ch++;
2922*15dc779aSAndroid Build Coastguard Worker }
2923*15dc779aSAndroid Build Coastguard Worker
2924*15dc779aSAndroid Build Coastguard Worker pstr_sbr_hdr->prev_coupling = pstr_sbr_hdr->coupling;
2925*15dc779aSAndroid Build Coastguard Worker
2926*15dc779aSAndroid Build Coastguard Worker return err_code;
2927*15dc779aSAndroid Build Coastguard Worker }
2928