xref: /aosp_15_r20/external/libxaac/encoder/ixheaace_psy_mod.c (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
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 <stdlib.h>
22*15dc779aSAndroid Build Coastguard Worker #include <math.h>
23*15dc779aSAndroid Build Coastguard Worker 
24*15dc779aSAndroid Build Coastguard Worker #include <string.h>
25*15dc779aSAndroid Build Coastguard Worker 
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
28*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_common_enc.h"
29*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc.h"
30*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_tables.h"
31*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_api.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_api.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_aac_constants.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_psy_const.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_tns.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_tns_params.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_rom.h"
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_rom.h"
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_bitbuffer.h"
41*15dc779aSAndroid Build Coastguard Worker 
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops16.h"
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops.h"
46*15dc779aSAndroid Build Coastguard Worker 
47*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_block_switch.h"
48*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_psy_utils_spreading.h"
49*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_psy_utils.h"
50*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_calc_ms_band_energy.h"
51*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_tns.h"
52*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_adjust_threshold_data.h"
53*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_dynamic_bits.h"
54*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_qc_data.h"
55*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_psy_data.h"
56*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_ms_stereo.h"
57*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_interface.h"
58*15dc779aSAndroid Build Coastguard Worker 
59*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_write_bitstream.h"
60*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_psy_configuration.h"
61*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_psy_mod.h"
62*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_stereo_preproc.h"
63*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_enc_main.h"
64*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_group_data.h"
65*15dc779aSAndroid Build Coastguard Worker 
66*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_tns_func.h"
67*15dc779aSAndroid Build Coastguard Worker 
68*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_tns_params.h"
69*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_utils.h"
70*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_fft.h"
71*15dc779aSAndroid Build Coastguard Worker 
72*15dc779aSAndroid Build Coastguard Worker static WORD32 ia_enhaacplus_enc_block_type_to_window_shape_lc[] = {KBD_WINDOW, SINE_WINDOW,
73*15dc779aSAndroid Build Coastguard Worker                                                                    SINE_WINDOW, KBD_WINDOW};
74*15dc779aSAndroid Build Coastguard Worker 
75*15dc779aSAndroid Build Coastguard Worker static WORD32 ia_enhaacplus_enc_block_type_to_window_shape_ld[] = {SINE_WINDOW, LD_WINDOW,
76*15dc779aSAndroid Build Coastguard Worker                                                                    LD_WINDOW, SINE_WINDOW};
77*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_psy_new(ixheaace_psy_kernel * pstr_h_psy,WORD32 num_chan,WORD32 * ptr_shared_buffer_2,WORD32 long_frame_len)78*15dc779aSAndroid Build Coastguard Worker WORD32 ia_enhaacplus_enc_psy_new(ixheaace_psy_kernel *pstr_h_psy, WORD32 num_chan,
79*15dc779aSAndroid Build Coastguard Worker                                  WORD32 *ptr_shared_buffer_2, WORD32 long_frame_len)
80*15dc779aSAndroid Build Coastguard Worker 
81*15dc779aSAndroid Build Coastguard Worker {
82*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
83*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < num_chan; i++) {
84*15dc779aSAndroid Build Coastguard Worker     pstr_h_psy->psy_data[i]->ptr_spec_coeffs =
85*15dc779aSAndroid Build Coastguard Worker         (FLOAT32 *)(&ptr_shared_buffer_2[i * long_frame_len]);
86*15dc779aSAndroid Build Coastguard Worker 
87*15dc779aSAndroid Build Coastguard Worker     memset(pstr_h_psy->psy_data[i]->ptr_spec_coeffs, 0,
88*15dc779aSAndroid Build Coastguard Worker            long_frame_len * sizeof(*pstr_h_psy->psy_data[i]->ptr_spec_coeffs));
89*15dc779aSAndroid Build Coastguard Worker   }
90*15dc779aSAndroid Build Coastguard Worker 
91*15dc779aSAndroid Build Coastguard Worker   pstr_h_psy->p_scratch_tns_float = (FLOAT32 *)(&ptr_shared_buffer_2[2 * long_frame_len]);
92*15dc779aSAndroid Build Coastguard Worker   if (long_frame_len == FRAME_LEN_960) {
93*15dc779aSAndroid Build Coastguard Worker     pstr_h_psy->p_scratch_tns_float = pstr_h_psy->p_scratch_tns_float + 128;
94*15dc779aSAndroid Build Coastguard Worker   }
95*15dc779aSAndroid Build Coastguard Worker 
96*15dc779aSAndroid Build Coastguard Worker   memset(pstr_h_psy->p_scratch_tns_float, 0,
97*15dc779aSAndroid Build Coastguard Worker          long_frame_len * sizeof(*pstr_h_psy->p_scratch_tns_float));
98*15dc779aSAndroid Build Coastguard Worker 
99*15dc779aSAndroid Build Coastguard Worker   return IA_NO_ERROR;
100*15dc779aSAndroid Build Coastguard Worker }
101*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_psy_main_init(ixheaace_psy_kernel * pstr_h_psy,WORD32 sample_rate,WORD32 bit_rate,WORD32 channels,WORD32 tns_mask,WORD32 bandwidth,WORD32 aot,ixheaace_aac_tables * pstr_aac_tables,WORD32 frame_len_long)102*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ia_enhaacplus_enc_psy_main_init(ixheaace_psy_kernel *pstr_h_psy, WORD32 sample_rate,
103*15dc779aSAndroid Build Coastguard Worker                                              WORD32 bit_rate, WORD32 channels, WORD32 tns_mask,
104*15dc779aSAndroid Build Coastguard Worker                                              WORD32 bandwidth, WORD32 aot,
105*15dc779aSAndroid Build Coastguard Worker                                              ixheaace_aac_tables *pstr_aac_tables,
106*15dc779aSAndroid Build Coastguard Worker                                              WORD32 frame_len_long)
107*15dc779aSAndroid Build Coastguard Worker 
108*15dc779aSAndroid Build Coastguard Worker {
109*15dc779aSAndroid Build Coastguard Worker   WORD32 ch;
110*15dc779aSAndroid Build Coastguard Worker   IA_ERRORCODE err;
111*15dc779aSAndroid Build Coastguard Worker 
112*15dc779aSAndroid Build Coastguard Worker   err = ia_enhaacplus_enc_init_psy_configuration(bit_rate / channels, sample_rate, bandwidth, aot,
113*15dc779aSAndroid Build Coastguard Worker                                                  &(pstr_h_psy->psy_conf_long), pstr_aac_tables,
114*15dc779aSAndroid Build Coastguard Worker                                                  frame_len_long);
115*15dc779aSAndroid Build Coastguard Worker   if (err != IA_NO_ERROR) {
116*15dc779aSAndroid Build Coastguard Worker     return err;
117*15dc779aSAndroid Build Coastguard Worker   }
118*15dc779aSAndroid Build Coastguard Worker 
119*15dc779aSAndroid Build Coastguard Worker   if (!err) {
120*15dc779aSAndroid Build Coastguard Worker     err = ia_enhaacplus_enc_init_tns_configuration(
121*15dc779aSAndroid Build Coastguard Worker         bit_rate, sample_rate, channels, &pstr_h_psy->psy_conf_long.str_tns_conf,
122*15dc779aSAndroid Build Coastguard Worker         &(pstr_h_psy->psy_conf_long), (WORD32)(tns_mask & 1), pstr_aac_tables->pstr_tns_tab,
123*15dc779aSAndroid Build Coastguard Worker         frame_len_long, aot);
124*15dc779aSAndroid Build Coastguard Worker 
125*15dc779aSAndroid Build Coastguard Worker     if (err != IA_NO_ERROR) {
126*15dc779aSAndroid Build Coastguard Worker       return err;
127*15dc779aSAndroid Build Coastguard Worker     }
128*15dc779aSAndroid Build Coastguard Worker   }
129*15dc779aSAndroid Build Coastguard Worker   if (aot == AOT_AAC_LC || aot == AOT_SBR || aot == AOT_PS) {
130*15dc779aSAndroid Build Coastguard Worker     if (!err) {
131*15dc779aSAndroid Build Coastguard Worker       err = ia_enhaacplus_enc_init_psy_configuration_short(
132*15dc779aSAndroid Build Coastguard Worker           bit_rate / channels, sample_rate, bandwidth, aot, &pstr_h_psy->psy_conf_short,
133*15dc779aSAndroid Build Coastguard Worker           pstr_aac_tables, frame_len_long / BLK_SWITCH_WIN);
134*15dc779aSAndroid Build Coastguard Worker       if (err != IA_NO_ERROR) {
135*15dc779aSAndroid Build Coastguard Worker         return err;
136*15dc779aSAndroid Build Coastguard Worker       }
137*15dc779aSAndroid Build Coastguard Worker     }
138*15dc779aSAndroid Build Coastguard Worker 
139*15dc779aSAndroid Build Coastguard Worker     if (!err) {
140*15dc779aSAndroid Build Coastguard Worker       err = ia_enhaacplus_enc_init_tns_configuration_short(
141*15dc779aSAndroid Build Coastguard Worker           bit_rate, sample_rate, channels, &pstr_h_psy->psy_conf_short.str_tns_conf,
142*15dc779aSAndroid Build Coastguard Worker           &(pstr_h_psy->psy_conf_short), (WORD32)(tns_mask & 1), pstr_aac_tables->pstr_tns_tab,
143*15dc779aSAndroid Build Coastguard Worker           frame_len_long / BLK_SWITCH_WIN, aot);
144*15dc779aSAndroid Build Coastguard Worker       if (err != IA_NO_ERROR) {
145*15dc779aSAndroid Build Coastguard Worker         return err;
146*15dc779aSAndroid Build Coastguard Worker       }
147*15dc779aSAndroid Build Coastguard Worker     }
148*15dc779aSAndroid Build Coastguard Worker   }
149*15dc779aSAndroid Build Coastguard Worker 
150*15dc779aSAndroid Build Coastguard Worker   if (!err) {
151*15dc779aSAndroid Build Coastguard Worker     /* pstr_h_psy->psy_data[] */
152*15dc779aSAndroid Build Coastguard Worker     for (ch = 0; ch < channels; ch++) {
153*15dc779aSAndroid Build Coastguard Worker       switch (aot) {
154*15dc779aSAndroid Build Coastguard Worker         case AOT_AAC_LC:
155*15dc779aSAndroid Build Coastguard Worker         case AOT_SBR:
156*15dc779aSAndroid Build Coastguard Worker         case AOT_PS:
157*15dc779aSAndroid Build Coastguard Worker           iaace_init_block_switching(&pstr_h_psy->psy_data[ch]->blk_switch_cntrl, bit_rate,
158*15dc779aSAndroid Build Coastguard Worker                                      channels);
159*15dc779aSAndroid Build Coastguard Worker           break;
160*15dc779aSAndroid Build Coastguard Worker 
161*15dc779aSAndroid Build Coastguard Worker         case AOT_AAC_LD:
162*15dc779aSAndroid Build Coastguard Worker         case AOT_AAC_ELD:
163*15dc779aSAndroid Build Coastguard Worker           pstr_h_psy->psy_data[ch]->blk_switch_cntrl.win_seq = LONG_WINDOW;
164*15dc779aSAndroid Build Coastguard Worker           pstr_h_psy->psy_data[ch]->blk_switch_cntrl.nxt_win_seq = LONG_WINDOW;
165*15dc779aSAndroid Build Coastguard Worker           break;
166*15dc779aSAndroid Build Coastguard Worker       }
167*15dc779aSAndroid Build Coastguard Worker       ia_enhaacplus_enc_init_pre_echo_control(pstr_h_psy->psy_data[ch]->sfb_threshold_nm1_float,
168*15dc779aSAndroid Build Coastguard Worker                                               pstr_h_psy->psy_conf_long.sfb_cnt,
169*15dc779aSAndroid Build Coastguard Worker                                               pstr_h_psy->psy_conf_long.sfb_threshold_quiet);
170*15dc779aSAndroid Build Coastguard Worker     }
171*15dc779aSAndroid Build Coastguard Worker   }
172*15dc779aSAndroid Build Coastguard Worker 
173*15dc779aSAndroid Build Coastguard Worker   return IA_NO_ERROR;
174*15dc779aSAndroid Build Coastguard Worker }
175*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_advance_psy_long_ms(ixheaace_psy_data ** psy_data,ixheaace_psy_configuration_long * pstr_psy_conf_long)176*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_advance_psy_long_ms(
177*15dc779aSAndroid Build Coastguard Worker     ixheaace_psy_data **psy_data,
178*15dc779aSAndroid Build Coastguard Worker     ixheaace_psy_configuration_long *pstr_psy_conf_long) {
179*15dc779aSAndroid Build Coastguard Worker   ia_enhaacplus_enc_calc_band_energy_ms(
180*15dc779aSAndroid Build Coastguard Worker       psy_data[0]->ptr_spec_coeffs, psy_data[1]->ptr_spec_coeffs, pstr_psy_conf_long->sfb_offsets,
181*15dc779aSAndroid Build Coastguard Worker       pstr_psy_conf_long->sfb_active, pstr_psy_conf_long->sfb_cnt,
182*15dc779aSAndroid Build Coastguard Worker       psy_data[0]->sfb_energy_ms.long_nrg, &psy_data[0]->sfb_energy_sum_ms.long_nrg,
183*15dc779aSAndroid Build Coastguard Worker       psy_data[1]->sfb_energy_ms.long_nrg, &psy_data[1]->sfb_energy_sum_ms.long_nrg);
184*15dc779aSAndroid Build Coastguard Worker }
185*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_advance_psy_short_ms(ixheaace_psy_data ** psy_data,ixheaace_psy_configuration_short * pstr_psy_conf_short,WORD32 ccfl)186*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_advance_psy_short_ms(
187*15dc779aSAndroid Build Coastguard Worker     ixheaace_psy_data **psy_data,
188*15dc779aSAndroid Build Coastguard Worker     ixheaace_psy_configuration_short *pstr_psy_conf_short, WORD32 ccfl) {
189*15dc779aSAndroid Build Coastguard Worker   WORD32 w;
190*15dc779aSAndroid Build Coastguard Worker   WORD32 frame_len_short = FRAME_LEN_SHORT_128;
191*15dc779aSAndroid Build Coastguard Worker 
192*15dc779aSAndroid Build Coastguard Worker   if (ccfl == FRAME_LEN_960) {
193*15dc779aSAndroid Build Coastguard Worker     frame_len_short = FRAME_LEN_SHORT_120;
194*15dc779aSAndroid Build Coastguard Worker   }
195*15dc779aSAndroid Build Coastguard Worker   for (w = 0; w < TRANS_FAC; w++) {
196*15dc779aSAndroid Build Coastguard Worker     WORD32 w_offset = w * frame_len_short;
197*15dc779aSAndroid Build Coastguard Worker 
198*15dc779aSAndroid Build Coastguard Worker     ia_enhaacplus_enc_calc_band_energy_ms(
199*15dc779aSAndroid Build Coastguard Worker         psy_data[0]->ptr_spec_coeffs + w_offset, psy_data[1]->ptr_spec_coeffs + w_offset,
200*15dc779aSAndroid Build Coastguard Worker         pstr_psy_conf_short->sfb_offsets, pstr_psy_conf_short->sfb_active,
201*15dc779aSAndroid Build Coastguard Worker         pstr_psy_conf_short->sfb_cnt, psy_data[0]->sfb_energy_ms.short_nrg[w],
202*15dc779aSAndroid Build Coastguard Worker         &psy_data[0]->sfb_energy_sum_ms.short_nrg[w], psy_data[1]->sfb_energy_ms.short_nrg[w],
203*15dc779aSAndroid Build Coastguard Worker         &psy_data[1]->sfb_energy_sum_ms.short_nrg[w]);
204*15dc779aSAndroid Build Coastguard Worker   }
205*15dc779aSAndroid Build Coastguard Worker }
206*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_advance_psy_short(ixheaace_psy_data * pstr_psy_data,ixheaace_temporal_noise_shaping_data * pstr_tns_data,ixheaace_psy_configuration_short * pstr_psy_conf_short,ixheaace_psy_out_channel * pstr_psy_out_ch,FLOAT32 * ptr_tns_scratch,const ixheaace_temporal_noise_shaping_data * ptr_tns_data2,const WORD32 ch,WORD32 aot,FLOAT32 * ptr_shared_buffer1,ixheaace_aac_tables * pstr_aac_tables,WORD32 frame_len_long)207*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ia_enhaacplus_enc_advance_psy_short(
208*15dc779aSAndroid Build Coastguard Worker     ixheaace_psy_data *pstr_psy_data, ixheaace_temporal_noise_shaping_data *pstr_tns_data,
209*15dc779aSAndroid Build Coastguard Worker     ixheaace_psy_configuration_short *pstr_psy_conf_short,
210*15dc779aSAndroid Build Coastguard Worker     ixheaace_psy_out_channel *pstr_psy_out_ch, FLOAT32 *ptr_tns_scratch,
211*15dc779aSAndroid Build Coastguard Worker     const ixheaace_temporal_noise_shaping_data *ptr_tns_data2, const WORD32 ch, WORD32 aot,
212*15dc779aSAndroid Build Coastguard Worker     FLOAT32 *ptr_shared_buffer1, ixheaace_aac_tables *pstr_aac_tables, WORD32 frame_len_long) {
213*15dc779aSAndroid Build Coastguard Worker   IA_ERRORCODE error_code = IA_NO_ERROR;
214*15dc779aSAndroid Build Coastguard Worker   WORD32 w;
215*15dc779aSAndroid Build Coastguard Worker   FLOAT32 energy_shift = 0.25f;
216*15dc779aSAndroid Build Coastguard Worker   FLOAT32 clip_energy = pstr_psy_conf_short->clip_energy * energy_shift;
217*15dc779aSAndroid Build Coastguard Worker 
218*15dc779aSAndroid Build Coastguard Worker   for (w = 0; w < TRANS_FAC; w++) {
219*15dc779aSAndroid Build Coastguard Worker     WORD32 w_offset = w * frame_len_long;
220*15dc779aSAndroid Build Coastguard Worker     WORD32 i, offset;
221*15dc779aSAndroid Build Coastguard Worker     FLOAT32 *ptr_mdct =
222*15dc779aSAndroid Build Coastguard Worker         &pstr_psy_data->ptr_spec_coeffs[pstr_psy_conf_short->lowpass_line + w_offset];
223*15dc779aSAndroid Build Coastguard Worker 
224*15dc779aSAndroid Build Coastguard Worker     /* Low pass */
225*15dc779aSAndroid Build Coastguard Worker     offset = frame_len_long - pstr_psy_conf_short->lowpass_line;
226*15dc779aSAndroid Build Coastguard Worker     memset(ptr_mdct, 0, sizeof(FLOAT32) * offset);
227*15dc779aSAndroid Build Coastguard Worker 
228*15dc779aSAndroid Build Coastguard Worker     /* Calc sfb-bandwise MDCT-energies for left and right channel */
229*15dc779aSAndroid Build Coastguard Worker     ia_enhaacplus_enc_calc_band_energy(
230*15dc779aSAndroid Build Coastguard Worker         pstr_psy_data->ptr_spec_coeffs + w_offset, pstr_psy_conf_short->sfb_offsets,
231*15dc779aSAndroid Build Coastguard Worker         pstr_psy_conf_short->sfb_active, pstr_psy_data->sfb_energy.short_nrg[w],
232*15dc779aSAndroid Build Coastguard Worker         pstr_psy_conf_short->sfb_cnt, &pstr_psy_data->sfb_energy_sum.short_nrg[w]);
233*15dc779aSAndroid Build Coastguard Worker 
234*15dc779aSAndroid Build Coastguard Worker     /* TNS Detect*/
235*15dc779aSAndroid Build Coastguard Worker     error_code = ia_enhaacplus_enc_tns_detect(
236*15dc779aSAndroid Build Coastguard Worker         pstr_tns_data, pstr_psy_conf_short->str_tns_conf, ptr_tns_scratch,
237*15dc779aSAndroid Build Coastguard Worker         pstr_psy_conf_short->sfb_offsets, pstr_psy_data->ptr_spec_coeffs + w_offset, w,
238*15dc779aSAndroid Build Coastguard Worker         pstr_psy_data->blk_switch_cntrl.win_seq, aot, pstr_psy_data->sfb_energy.short_nrg[w],
239*15dc779aSAndroid Build Coastguard Worker         ptr_shared_buffer1, frame_len_long);
240*15dc779aSAndroid Build Coastguard Worker 
241*15dc779aSAndroid Build Coastguard Worker     if (error_code != IA_NO_ERROR) {
242*15dc779aSAndroid Build Coastguard Worker       return error_code;
243*15dc779aSAndroid Build Coastguard Worker     }
244*15dc779aSAndroid Build Coastguard Worker 
245*15dc779aSAndroid Build Coastguard Worker     /*  TNS Sync */
246*15dc779aSAndroid Build Coastguard Worker     if (ch == 1) {
247*15dc779aSAndroid Build Coastguard Worker       ia_enhaacplus_enc_tns_sync(pstr_tns_data, ptr_tns_data2, pstr_psy_conf_short->str_tns_conf,
248*15dc779aSAndroid Build Coastguard Worker                                  w, (WORD32)pstr_psy_data->blk_switch_cntrl.win_seq);
249*15dc779aSAndroid Build Coastguard Worker     }
250*15dc779aSAndroid Build Coastguard Worker 
251*15dc779aSAndroid Build Coastguard Worker     /* TNS Encode */
252*15dc779aSAndroid Build Coastguard Worker     ia_enhaacplus_enc_tns_encode(
253*15dc779aSAndroid Build Coastguard Worker         &pstr_psy_out_ch->tns_info, pstr_tns_data, pstr_psy_conf_short->sfb_cnt,
254*15dc779aSAndroid Build Coastguard Worker         pstr_psy_conf_short->str_tns_conf, pstr_psy_conf_short->lowpass_line,
255*15dc779aSAndroid Build Coastguard Worker         pstr_psy_data->ptr_spec_coeffs + w_offset, w, pstr_psy_data->blk_switch_cntrl.win_seq,
256*15dc779aSAndroid Build Coastguard Worker         pstr_aac_tables->pstr_tns_tab);
257*15dc779aSAndroid Build Coastguard Worker 
258*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < pstr_psy_conf_short->sfb_cnt; i++) {
259*15dc779aSAndroid Build Coastguard Worker       pstr_psy_data->sfb_threshold.short_nrg[w][i] =
260*15dc779aSAndroid Build Coastguard Worker           pstr_psy_data->sfb_energy.short_nrg[w][i] * pstr_psy_conf_short->ratio_float;
261*15dc779aSAndroid Build Coastguard Worker 
262*15dc779aSAndroid Build Coastguard Worker       pstr_psy_data->sfb_threshold.short_nrg[w][i] =
263*15dc779aSAndroid Build Coastguard Worker           MIN(pstr_psy_data->sfb_threshold.short_nrg[w][i], clip_energy);
264*15dc779aSAndroid Build Coastguard Worker     }
265*15dc779aSAndroid Build Coastguard Worker 
266*15dc779aSAndroid Build Coastguard Worker     /* Calc sfb-bandwise MDCT-energies for left and right channel again, if TNS has modified the
267*15dc779aSAndroid Build Coastguard Worker      * spectrum */
268*15dc779aSAndroid Build Coastguard Worker     if (pstr_psy_out_ch->tns_info.tns_active[w]) {
269*15dc779aSAndroid Build Coastguard Worker       ia_enhaacplus_enc_calc_band_energy(
270*15dc779aSAndroid Build Coastguard Worker           pstr_psy_data->ptr_spec_coeffs + w_offset, pstr_psy_conf_short->sfb_offsets,
271*15dc779aSAndroid Build Coastguard Worker           pstr_psy_conf_short->sfb_active, pstr_psy_data->sfb_energy.short_nrg[w],
272*15dc779aSAndroid Build Coastguard Worker           pstr_psy_conf_short->sfb_cnt, &pstr_psy_data->sfb_energy_sum.short_nrg[w]);
273*15dc779aSAndroid Build Coastguard Worker     }
274*15dc779aSAndroid Build Coastguard Worker 
275*15dc779aSAndroid Build Coastguard Worker     /* Spreading */
276*15dc779aSAndroid Build Coastguard Worker     ia_enhaacplus_enc_spreading_max(
277*15dc779aSAndroid Build Coastguard Worker         pstr_psy_conf_short->sfb_cnt, pstr_psy_conf_short->sfb_mask_low_factor,
278*15dc779aSAndroid Build Coastguard Worker         pstr_psy_conf_short->sfb_mask_high_factor, pstr_psy_data->sfb_threshold.short_nrg[w]);
279*15dc779aSAndroid Build Coastguard Worker 
280*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < pstr_psy_conf_short->sfb_cnt; i++) {
281*15dc779aSAndroid Build Coastguard Worker       pstr_psy_data->sfb_threshold.short_nrg[w][i] =
282*15dc779aSAndroid Build Coastguard Worker           MAX(pstr_psy_data->sfb_threshold.short_nrg[w][i],
283*15dc779aSAndroid Build Coastguard Worker               (pstr_psy_conf_short->sfb_threshold_quiet[i] * energy_shift));
284*15dc779aSAndroid Build Coastguard Worker     }
285*15dc779aSAndroid Build Coastguard Worker 
286*15dc779aSAndroid Build Coastguard Worker     /* Pre-echo Control */
287*15dc779aSAndroid Build Coastguard Worker     ia_enhaacplus_enc_pre_echo_control(pstr_psy_data->sfb_threshold_nm1_float,
288*15dc779aSAndroid Build Coastguard Worker                                        pstr_psy_conf_short->sfb_cnt,
289*15dc779aSAndroid Build Coastguard Worker                                        pstr_psy_conf_short->min_remaining_threshold_factor,
290*15dc779aSAndroid Build Coastguard Worker                                        pstr_psy_data->sfb_threshold.short_nrg[w]);
291*15dc779aSAndroid Build Coastguard Worker 
292*15dc779aSAndroid Build Coastguard Worker     /* Apply TNS mult table on CB thresholds */
293*15dc779aSAndroid Build Coastguard Worker     if (pstr_psy_out_ch->tns_info.tns_active[w]) {
294*15dc779aSAndroid Build Coastguard Worker       ia_enhaacplus_enc_apply_tns_mult_table_to_ratios(
295*15dc779aSAndroid Build Coastguard Worker           pstr_psy_conf_short->str_tns_conf.tns_ratio_patch_lowest_cb,
296*15dc779aSAndroid Build Coastguard Worker           pstr_psy_conf_short->str_tns_conf.tns_start_band,
297*15dc779aSAndroid Build Coastguard Worker           pstr_psy_data->sfb_threshold.short_nrg[w]);
298*15dc779aSAndroid Build Coastguard Worker     }
299*15dc779aSAndroid Build Coastguard Worker 
300*15dc779aSAndroid Build Coastguard Worker     /* Spreaded energy for avoid hole detection */
301*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < pstr_psy_conf_short->sfb_cnt; i++) {
302*15dc779aSAndroid Build Coastguard Worker       pstr_psy_data->sfb_sreaded_energy.short_nrg[w][i] =
303*15dc779aSAndroid Build Coastguard Worker           pstr_psy_data->sfb_energy.short_nrg[w][i];
304*15dc779aSAndroid Build Coastguard Worker     }
305*15dc779aSAndroid Build Coastguard Worker 
306*15dc779aSAndroid Build Coastguard Worker     ia_enhaacplus_enc_spreading_max(pstr_psy_conf_short->sfb_cnt,
307*15dc779aSAndroid Build Coastguard Worker                                     pstr_psy_conf_short->sfb_mask_low_factor_spread_nrg,
308*15dc779aSAndroid Build Coastguard Worker                                     pstr_psy_conf_short->sfb_mask_high_factor_spread_nrg,
309*15dc779aSAndroid Build Coastguard Worker                                     pstr_psy_data->sfb_sreaded_energy.short_nrg[w]);
310*15dc779aSAndroid Build Coastguard Worker   }
311*15dc779aSAndroid Build Coastguard Worker   return error_code;
312*15dc779aSAndroid Build Coastguard Worker }
313*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_advance_psy_long(ixheaace_psy_data * pstr_psy_data,ixheaace_temporal_noise_shaping_data * pstr_tns_data,ixheaace_psy_configuration_long * pstr_psy_conf_long,ixheaace_psy_out_channel * pstr_psy_out_ch,FLOAT32 * ptr_scratch_tns,const ixheaace_temporal_noise_shaping_data * pstr_tns_data2,const WORD32 ch,WORD32 aot,FLOAT32 * ptr_shared_buffer1,ixheaace_aac_tables * pstr_aac_tables,WORD32 frame_len_long)314*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ia_enhaacplus_enc_advance_psy_long(
315*15dc779aSAndroid Build Coastguard Worker     ixheaace_psy_data *pstr_psy_data, ixheaace_temporal_noise_shaping_data *pstr_tns_data,
316*15dc779aSAndroid Build Coastguard Worker     ixheaace_psy_configuration_long *pstr_psy_conf_long,
317*15dc779aSAndroid Build Coastguard Worker     ixheaace_psy_out_channel *pstr_psy_out_ch, FLOAT32 *ptr_scratch_tns,
318*15dc779aSAndroid Build Coastguard Worker     const ixheaace_temporal_noise_shaping_data *pstr_tns_data2, const WORD32 ch, WORD32 aot,
319*15dc779aSAndroid Build Coastguard Worker     FLOAT32 *ptr_shared_buffer1, ixheaace_aac_tables *pstr_aac_tables, WORD32 frame_len_long) {
320*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
321*15dc779aSAndroid Build Coastguard Worker   IA_ERRORCODE error_code = IA_NO_ERROR;
322*15dc779aSAndroid Build Coastguard Worker   FLOAT32 energy_shift = 0.25f;
323*15dc779aSAndroid Build Coastguard Worker   FLOAT32 clip_energy = pstr_psy_conf_long->clip_energy / 4;
324*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_sfb_energy_long = pstr_psy_data->sfb_energy.long_nrg;
325*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_sfb_spreaded_energy = pstr_psy_data->sfb_sreaded_energy.long_nrg;
326*15dc779aSAndroid Build Coastguard Worker 
327*15dc779aSAndroid Build Coastguard Worker   /* Low pass */
328*15dc779aSAndroid Build Coastguard Worker   memset(&pstr_psy_data->ptr_spec_coeffs[pstr_psy_conf_long->lowpass_line], 0,
329*15dc779aSAndroid Build Coastguard Worker          sizeof(*pstr_psy_data->ptr_spec_coeffs) *
330*15dc779aSAndroid Build Coastguard Worker              (frame_len_long - pstr_psy_conf_long->lowpass_line));
331*15dc779aSAndroid Build Coastguard Worker 
332*15dc779aSAndroid Build Coastguard Worker   /* Calculate scale_factor_band - bandwise MDCT-energies for left and right channels */
333*15dc779aSAndroid Build Coastguard Worker   ia_enhaacplus_enc_calc_band_energy(
334*15dc779aSAndroid Build Coastguard Worker       pstr_psy_data->ptr_spec_coeffs, pstr_psy_conf_long->sfb_offsets,
335*15dc779aSAndroid Build Coastguard Worker       pstr_psy_conf_long->sfb_active, pstr_psy_data->sfb_energy.long_nrg,
336*15dc779aSAndroid Build Coastguard Worker       pstr_psy_conf_long->sfb_cnt, &pstr_psy_data->sfb_energy_sum.long_nrg);
337*15dc779aSAndroid Build Coastguard Worker 
338*15dc779aSAndroid Build Coastguard Worker   /* TNS Detect */
339*15dc779aSAndroid Build Coastguard Worker   error_code = ia_enhaacplus_enc_tns_detect(
340*15dc779aSAndroid Build Coastguard Worker       pstr_tns_data, pstr_psy_conf_long->str_tns_conf, ptr_scratch_tns,
341*15dc779aSAndroid Build Coastguard Worker       pstr_psy_conf_long->sfb_offsets, pstr_psy_data->ptr_spec_coeffs, 0,
342*15dc779aSAndroid Build Coastguard Worker       pstr_psy_data->blk_switch_cntrl.win_seq, aot, pstr_psy_data->sfb_energy.long_nrg,
343*15dc779aSAndroid Build Coastguard Worker       ptr_shared_buffer1, frame_len_long);
344*15dc779aSAndroid Build Coastguard Worker 
345*15dc779aSAndroid Build Coastguard Worker   if (error_code != IA_NO_ERROR) {
346*15dc779aSAndroid Build Coastguard Worker     return error_code;
347*15dc779aSAndroid Build Coastguard Worker   }
348*15dc779aSAndroid Build Coastguard Worker 
349*15dc779aSAndroid Build Coastguard Worker   /* TNS Sync */
350*15dc779aSAndroid Build Coastguard Worker   if (ch == 1) {
351*15dc779aSAndroid Build Coastguard Worker     ia_enhaacplus_enc_tns_sync(pstr_tns_data, pstr_tns_data2, pstr_psy_conf_long->str_tns_conf, 0,
352*15dc779aSAndroid Build Coastguard Worker                                (WORD32)pstr_psy_data->blk_switch_cntrl.win_seq);
353*15dc779aSAndroid Build Coastguard Worker   }
354*15dc779aSAndroid Build Coastguard Worker 
355*15dc779aSAndroid Build Coastguard Worker   /* TNS Encode */
356*15dc779aSAndroid Build Coastguard Worker   ia_enhaacplus_enc_tns_encode(&pstr_psy_out_ch->tns_info, pstr_tns_data,
357*15dc779aSAndroid Build Coastguard Worker                                pstr_psy_conf_long->sfb_cnt, pstr_psy_conf_long->str_tns_conf,
358*15dc779aSAndroid Build Coastguard Worker                                pstr_psy_conf_long->lowpass_line, pstr_psy_data->ptr_spec_coeffs,
359*15dc779aSAndroid Build Coastguard Worker                                0, (WORD32)pstr_psy_data->blk_switch_cntrl.win_seq,
360*15dc779aSAndroid Build Coastguard Worker                                pstr_aac_tables->pstr_tns_tab);
361*15dc779aSAndroid Build Coastguard Worker 
362*15dc779aSAndroid Build Coastguard Worker   if (aot == AOT_AAC_ELD) {
363*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < pstr_psy_conf_long->sfb_active; i++) {
364*15dc779aSAndroid Build Coastguard Worker       pstr_psy_data->sfb_threshold.long_nrg[i] =
365*15dc779aSAndroid Build Coastguard Worker           pstr_psy_data->sfb_energy.long_nrg[i] * pstr_psy_conf_long->ratio_float;
366*15dc779aSAndroid Build Coastguard Worker 
367*15dc779aSAndroid Build Coastguard Worker       pstr_psy_data->sfb_threshold.long_nrg[i] =
368*15dc779aSAndroid Build Coastguard Worker           MIN(pstr_psy_data->sfb_threshold.long_nrg[i], clip_energy);
369*15dc779aSAndroid Build Coastguard Worker     }
370*15dc779aSAndroid Build Coastguard Worker   } else {
371*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < pstr_psy_conf_long->sfb_cnt; i++) {
372*15dc779aSAndroid Build Coastguard Worker       pstr_psy_data->sfb_threshold.long_nrg[i] =
373*15dc779aSAndroid Build Coastguard Worker           pstr_psy_data->sfb_energy.long_nrg[i] * pstr_psy_conf_long->ratio_float;
374*15dc779aSAndroid Build Coastguard Worker 
375*15dc779aSAndroid Build Coastguard Worker       pstr_psy_data->sfb_threshold.long_nrg[i] =
376*15dc779aSAndroid Build Coastguard Worker           MIN(pstr_psy_data->sfb_threshold.long_nrg[i], clip_energy);
377*15dc779aSAndroid Build Coastguard Worker     }
378*15dc779aSAndroid Build Coastguard Worker   }
379*15dc779aSAndroid Build Coastguard Worker 
380*15dc779aSAndroid Build Coastguard Worker   /* Calculate scale factor band - bandwise MDCT-energies for left and right channel again, if TNS
381*15dc779aSAndroid Build Coastguard Worker    * has modified the spectrum */
382*15dc779aSAndroid Build Coastguard Worker   if (pstr_psy_out_ch->tns_info.tns_active[0] == 1) {
383*15dc779aSAndroid Build Coastguard Worker     ia_enhaacplus_enc_calc_band_energy(
384*15dc779aSAndroid Build Coastguard Worker         pstr_psy_data->ptr_spec_coeffs, pstr_psy_conf_long->sfb_offsets,
385*15dc779aSAndroid Build Coastguard Worker         pstr_psy_conf_long->sfb_active, pstr_psy_data->sfb_energy.long_nrg,
386*15dc779aSAndroid Build Coastguard Worker         pstr_psy_conf_long->sfb_cnt, &pstr_psy_data->sfb_energy_sum.long_nrg);
387*15dc779aSAndroid Build Coastguard Worker   }
388*15dc779aSAndroid Build Coastguard Worker 
389*15dc779aSAndroid Build Coastguard Worker   /* Spreading */
390*15dc779aSAndroid Build Coastguard Worker   if (aot == AOT_AAC_ELD) {
391*15dc779aSAndroid Build Coastguard Worker     ia_enhaacplus_enc_spreading_max(
392*15dc779aSAndroid Build Coastguard Worker         pstr_psy_conf_long->sfb_active, pstr_psy_conf_long->sfb_mask_low_factor,
393*15dc779aSAndroid Build Coastguard Worker         pstr_psy_conf_long->sfb_mask_high_factor, pstr_psy_data->sfb_threshold.long_nrg);
394*15dc779aSAndroid Build Coastguard Worker   } else {
395*15dc779aSAndroid Build Coastguard Worker     ia_enhaacplus_enc_spreading_max(
396*15dc779aSAndroid Build Coastguard Worker         pstr_psy_conf_long->sfb_cnt, pstr_psy_conf_long->sfb_mask_low_factor,
397*15dc779aSAndroid Build Coastguard Worker         pstr_psy_conf_long->sfb_mask_high_factor, pstr_psy_data->sfb_threshold.long_nrg);
398*15dc779aSAndroid Build Coastguard Worker   }
399*15dc779aSAndroid Build Coastguard Worker 
400*15dc779aSAndroid Build Coastguard Worker   /* Threshold in quiet */
401*15dc779aSAndroid Build Coastguard Worker   if (aot == AOT_AAC_ELD) {
402*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < pstr_psy_conf_long->sfb_active; i++) {
403*15dc779aSAndroid Build Coastguard Worker       pstr_psy_data->sfb_threshold.long_nrg[i] =
404*15dc779aSAndroid Build Coastguard Worker           MAX(pstr_psy_data->sfb_threshold.long_nrg[i],
405*15dc779aSAndroid Build Coastguard Worker               (pstr_psy_conf_long->sfb_threshold_quiet[i] * energy_shift));
406*15dc779aSAndroid Build Coastguard Worker     }
407*15dc779aSAndroid Build Coastguard Worker   } else {
408*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < pstr_psy_conf_long->sfb_cnt; i++) {
409*15dc779aSAndroid Build Coastguard Worker       pstr_psy_data->sfb_threshold.long_nrg[i] =
410*15dc779aSAndroid Build Coastguard Worker           MAX(pstr_psy_data->sfb_threshold.long_nrg[i],
411*15dc779aSAndroid Build Coastguard Worker               (pstr_psy_conf_long->sfb_threshold_quiet[i] * energy_shift));
412*15dc779aSAndroid Build Coastguard Worker     }
413*15dc779aSAndroid Build Coastguard Worker   }
414*15dc779aSAndroid Build Coastguard Worker 
415*15dc779aSAndroid Build Coastguard Worker   /* Pre-echo control */
416*15dc779aSAndroid Build Coastguard Worker   if (pstr_psy_data->blk_switch_cntrl.win_seq == STOP_WINDOW) {
417*15dc779aSAndroid Build Coastguard Worker     /* Prevent pre-echo control from comparing stop thresholds with short thresholds */
418*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < pstr_psy_conf_long->sfb_cnt; i++) {
419*15dc779aSAndroid Build Coastguard Worker       pstr_psy_data->sfb_threshold_nm1_float[i] = 1.0e20f;
420*15dc779aSAndroid Build Coastguard Worker     }
421*15dc779aSAndroid Build Coastguard Worker   }
422*15dc779aSAndroid Build Coastguard Worker 
423*15dc779aSAndroid Build Coastguard Worker   ia_enhaacplus_enc_pre_echo_control(
424*15dc779aSAndroid Build Coastguard Worker       pstr_psy_data->sfb_threshold_nm1_float, pstr_psy_conf_long->sfb_cnt,
425*15dc779aSAndroid Build Coastguard Worker       pstr_psy_conf_long->min_remaining_threshold_factor, pstr_psy_data->sfb_threshold.long_nrg);
426*15dc779aSAndroid Build Coastguard Worker 
427*15dc779aSAndroid Build Coastguard Worker   if (pstr_psy_data->blk_switch_cntrl.win_seq == START_WINDOW) {
428*15dc779aSAndroid Build Coastguard Worker     /* Prevent pre-echo control in next frame from comparing start thresholds with short
429*15dc779aSAndroid Build Coastguard Worker      * thresholds */
430*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < pstr_psy_conf_long->sfb_cnt; i++) {
431*15dc779aSAndroid Build Coastguard Worker       pstr_psy_data->sfb_threshold_nm1_float[i] = 1.0e20f;
432*15dc779aSAndroid Build Coastguard Worker     }
433*15dc779aSAndroid Build Coastguard Worker   }
434*15dc779aSAndroid Build Coastguard Worker 
435*15dc779aSAndroid Build Coastguard Worker   /* Apply TNS mult table on CB thresholds */
436*15dc779aSAndroid Build Coastguard Worker   if (pstr_psy_out_ch->tns_info.tns_active[0]) {
437*15dc779aSAndroid Build Coastguard Worker     ia_enhaacplus_enc_apply_tns_mult_table_to_ratios(
438*15dc779aSAndroid Build Coastguard Worker         pstr_psy_conf_long->str_tns_conf.tns_ratio_patch_lowest_cb,
439*15dc779aSAndroid Build Coastguard Worker         pstr_psy_conf_long->str_tns_conf.tns_start_band, pstr_psy_data->sfb_threshold.long_nrg);
440*15dc779aSAndroid Build Coastguard Worker   }
441*15dc779aSAndroid Build Coastguard Worker 
442*15dc779aSAndroid Build Coastguard Worker   /* Spreaded energy for avoid hole detection */
443*15dc779aSAndroid Build Coastguard Worker 
444*15dc779aSAndroid Build Coastguard Worker   memcpy(&ptr_sfb_spreaded_energy[0], &ptr_sfb_energy_long[0],
445*15dc779aSAndroid Build Coastguard Worker          sizeof(ptr_sfb_spreaded_energy[0]) * pstr_psy_conf_long->sfb_cnt);
446*15dc779aSAndroid Build Coastguard Worker 
447*15dc779aSAndroid Build Coastguard Worker   if (aot == AOT_AAC_ELD) {
448*15dc779aSAndroid Build Coastguard Worker     ia_enhaacplus_enc_spreading_max(pstr_psy_conf_long->sfb_active,
449*15dc779aSAndroid Build Coastguard Worker                                     pstr_psy_conf_long->sfb_mask_low_factor_spread_nrg,
450*15dc779aSAndroid Build Coastguard Worker                                     pstr_psy_conf_long->sfb_mask_high_factor_spread_nrg,
451*15dc779aSAndroid Build Coastguard Worker                                     pstr_psy_data->sfb_sreaded_energy.long_nrg);
452*15dc779aSAndroid Build Coastguard Worker   } else {
453*15dc779aSAndroid Build Coastguard Worker     ia_enhaacplus_enc_spreading_max(pstr_psy_conf_long->sfb_cnt,
454*15dc779aSAndroid Build Coastguard Worker                                     pstr_psy_conf_long->sfb_mask_low_factor_spread_nrg,
455*15dc779aSAndroid Build Coastguard Worker                                     pstr_psy_conf_long->sfb_mask_high_factor_spread_nrg,
456*15dc779aSAndroid Build Coastguard Worker                                     pstr_psy_data->sfb_sreaded_energy.long_nrg);
457*15dc779aSAndroid Build Coastguard Worker   }
458*15dc779aSAndroid Build Coastguard Worker 
459*15dc779aSAndroid Build Coastguard Worker   return error_code;
460*15dc779aSAndroid Build Coastguard Worker }
461*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_psy_main(WORD32 time_sn_stride,ixheaace_element_info * pstr_elem_info,const FLOAT32 * ptr_time_signal,WORD32 aot,ixheaace_psy_data ** psy_data,ixheaace_temporal_noise_shaping_data ** tns_data,ixheaace_psy_configuration_long * pstr_psy_conf_long,ixheaace_psy_configuration_short * pstr_psy_conf_short,ixheaace_psy_out_channel ** psy_out_ch,ixheaace_psy_out_element * pstr_psy_out_element,FLOAT32 * ptr_scratch_tns,FLOAT32 * ptr_shared_buffer1,WORD8 * ptr_shared_buffer5,ixheaace_aac_tables * pstr_aac_tables,WORD32 frame_len_long)462*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ia_enhaacplus_enc_psy_main(
463*15dc779aSAndroid Build Coastguard Worker     WORD32 time_sn_stride, ixheaace_element_info *pstr_elem_info, const FLOAT32 *ptr_time_signal,
464*15dc779aSAndroid Build Coastguard Worker     WORD32 aot, ixheaace_psy_data **psy_data,
465*15dc779aSAndroid Build Coastguard Worker     ixheaace_temporal_noise_shaping_data **tns_data,
466*15dc779aSAndroid Build Coastguard Worker     ixheaace_psy_configuration_long *pstr_psy_conf_long,
467*15dc779aSAndroid Build Coastguard Worker     ixheaace_psy_configuration_short *pstr_psy_conf_short,
468*15dc779aSAndroid Build Coastguard Worker     ixheaace_psy_out_channel **psy_out_ch,
469*15dc779aSAndroid Build Coastguard Worker     ixheaace_psy_out_element *pstr_psy_out_element, FLOAT32 *ptr_scratch_tns,
470*15dc779aSAndroid Build Coastguard Worker     FLOAT32 *ptr_shared_buffer1, WORD8 *ptr_shared_buffer5, ixheaace_aac_tables *pstr_aac_tables,
471*15dc779aSAndroid Build Coastguard Worker     WORD32 frame_len_long)
472*15dc779aSAndroid Build Coastguard Worker 
473*15dc779aSAndroid Build Coastguard Worker {
474*15dc779aSAndroid Build Coastguard Worker   IA_ERRORCODE error_code = IA_NO_ERROR;
475*15dc779aSAndroid Build Coastguard Worker   WORD32 grouped_sfb_offset[IXHEAACE_MAX_CH_IN_BS_ELE][MAXIMUM_GROUPED_SCALE_FACTOR_BAND +
476*15dc779aSAndroid Build Coastguard Worker                                                        1]; /* plus one for last dummy offset ! */
477*15dc779aSAndroid Build Coastguard Worker   FLOAT32 grouped_sfb_min_snr[IXHEAACE_MAX_CH_IN_BS_ELE][MAXIMUM_GROUPED_SCALE_FACTOR_BAND];
478*15dc779aSAndroid Build Coastguard Worker   WORD32 max_sfb_per_grp[IXHEAACE_MAX_CH_IN_BS_ELE] = {0};
479*15dc779aSAndroid Build Coastguard Worker   WORD32 ch, sfb, line;
480*15dc779aSAndroid Build Coastguard Worker   WORD32 num_channels = pstr_elem_info->n_channels_in_el;
481*15dc779aSAndroid Build Coastguard Worker 
482*15dc779aSAndroid Build Coastguard Worker   if (aot == AOT_AAC_LC || aot == AOT_SBR || aot == AOT_PS) {
483*15dc779aSAndroid Build Coastguard Worker     if (pstr_elem_info->el_type != ID_LFE) {
484*15dc779aSAndroid Build Coastguard Worker       for (ch = 0; ch < num_channels; ch++) {
485*15dc779aSAndroid Build Coastguard Worker         iaace_block_switching(&psy_data[ch]->blk_switch_cntrl,
486*15dc779aSAndroid Build Coastguard Worker                               ptr_time_signal + pstr_elem_info->channel_index[ch], frame_len_long,
487*15dc779aSAndroid Build Coastguard Worker                               num_channels);
488*15dc779aSAndroid Build Coastguard Worker       }
489*15dc779aSAndroid Build Coastguard Worker     } else {
490*15dc779aSAndroid Build Coastguard Worker       for (ch = 0; ch < num_channels; ch++) {
491*15dc779aSAndroid Build Coastguard Worker         psy_data[ch]->blk_switch_cntrl.win_seq = LONG_WINDOW;
492*15dc779aSAndroid Build Coastguard Worker       }
493*15dc779aSAndroid Build Coastguard Worker     }
494*15dc779aSAndroid Build Coastguard Worker 
495*15dc779aSAndroid Build Coastguard Worker     /* synch left and right block type */
496*15dc779aSAndroid Build Coastguard Worker     if (num_channels == NUM_CHANS_MONO) {
497*15dc779aSAndroid Build Coastguard Worker       iaace_sync_block_switching(&psy_data[0]->blk_switch_cntrl, NULL, num_channels);
498*15dc779aSAndroid Build Coastguard Worker     }
499*15dc779aSAndroid Build Coastguard Worker     else {
500*15dc779aSAndroid Build Coastguard Worker       iaace_sync_block_switching(&psy_data[0]->blk_switch_cntrl, &psy_data[1]->blk_switch_cntrl,
501*15dc779aSAndroid Build Coastguard Worker                                  num_channels);
502*15dc779aSAndroid Build Coastguard Worker     }
503*15dc779aSAndroid Build Coastguard Worker   } else if (aot == AOT_AAC_LD || aot == AOT_AAC_ELD) {
504*15dc779aSAndroid Build Coastguard Worker     for (ch = 0; ch < num_channels; ch++) {
505*15dc779aSAndroid Build Coastguard Worker       psy_data[ch]->blk_switch_cntrl.win_seq_ld = LONG_WINDOW;
506*15dc779aSAndroid Build Coastguard Worker       psy_data[ch]->blk_switch_cntrl.next_win_seq_ld = LONG_WINDOW;
507*15dc779aSAndroid Build Coastguard Worker       psy_data[ch]->blk_switch_cntrl.win_seq = LONG_WINDOW;
508*15dc779aSAndroid Build Coastguard Worker       psy_data[ch]->blk_switch_cntrl.nxt_win_seq = LONG_WINDOW;
509*15dc779aSAndroid Build Coastguard Worker       psy_data[ch]->blk_switch_cntrl.total_groups_cnt = 1;
510*15dc779aSAndroid Build Coastguard Worker     }
511*15dc779aSAndroid Build Coastguard Worker   }
512*15dc779aSAndroid Build Coastguard Worker   /* transform */
513*15dc779aSAndroid Build Coastguard Worker   for (ch = 0; ch < num_channels; ch++) {
514*15dc779aSAndroid Build Coastguard Worker     if (aot == AOT_AAC_LC || aot == AOT_SBR || aot == AOT_PS) {
515*15dc779aSAndroid Build Coastguard Worker       ixheaace_transform_real_lc_ld(
516*15dc779aSAndroid Build Coastguard Worker           psy_data[ch]->ptr_mdct_delay_buf, ptr_time_signal + pstr_elem_info->channel_index[ch],
517*15dc779aSAndroid Build Coastguard Worker           time_sn_stride, psy_data[ch]->ptr_spec_coeffs, psy_data[ch]->blk_switch_cntrl.win_seq,
518*15dc779aSAndroid Build Coastguard Worker           frame_len_long, ptr_shared_buffer5);
519*15dc779aSAndroid Build Coastguard Worker     } else if (aot == AOT_AAC_LD) {
520*15dc779aSAndroid Build Coastguard Worker       if (frame_len_long == FRAME_LEN_480) {
521*15dc779aSAndroid Build Coastguard Worker         ia_enhaacplus_enc_transform_real(
522*15dc779aSAndroid Build Coastguard Worker             psy_data[ch]->ptr_mdct_delay_buf, ptr_time_signal + pstr_elem_info->channel_index[ch],
523*15dc779aSAndroid Build Coastguard Worker             time_sn_stride, psy_data[ch]->ptr_spec_coeffs, pstr_aac_tables->pstr_mdct_tab,
524*15dc779aSAndroid Build Coastguard Worker             ptr_scratch_tns, ptr_shared_buffer5, frame_len_long);
525*15dc779aSAndroid Build Coastguard Worker       } else {
526*15dc779aSAndroid Build Coastguard Worker         ixheaace_transform_real_lc_ld(
527*15dc779aSAndroid Build Coastguard Worker             psy_data[ch]->ptr_mdct_delay_buf, ptr_time_signal + pstr_elem_info->channel_index[ch],
528*15dc779aSAndroid Build Coastguard Worker             time_sn_stride, psy_data[ch]->ptr_spec_coeffs, psy_data[ch]->blk_switch_cntrl.win_seq,
529*15dc779aSAndroid Build Coastguard Worker             frame_len_long, ptr_shared_buffer5);
530*15dc779aSAndroid Build Coastguard Worker       }
531*15dc779aSAndroid Build Coastguard Worker     } else if (aot == AOT_AAC_ELD) {
532*15dc779aSAndroid Build Coastguard Worker       if (frame_len_long == FRAME_LEN_480) {
533*15dc779aSAndroid Build Coastguard Worker         ia_enhaacplus_enc_transform_real(
534*15dc779aSAndroid Build Coastguard Worker             psy_data[ch]->ptr_mdct_delay_buf, ptr_time_signal + pstr_elem_info->channel_index[ch],
535*15dc779aSAndroid Build Coastguard Worker             time_sn_stride, psy_data[ch]->ptr_spec_coeffs, pstr_aac_tables->pstr_mdct_tab,
536*15dc779aSAndroid Build Coastguard Worker             ptr_scratch_tns, ptr_shared_buffer5, frame_len_long);
537*15dc779aSAndroid Build Coastguard Worker       } else {
538*15dc779aSAndroid Build Coastguard Worker         ia_enhaacplus_enc_transform_real_eld(
539*15dc779aSAndroid Build Coastguard Worker             psy_data[ch]->ptr_mdct_delay_buf, ptr_time_signal + pstr_elem_info->channel_index[ch],
540*15dc779aSAndroid Build Coastguard Worker             time_sn_stride, psy_data[ch]->ptr_spec_coeffs, ptr_shared_buffer5, frame_len_long);
541*15dc779aSAndroid Build Coastguard Worker       }
542*15dc779aSAndroid Build Coastguard Worker     }
543*15dc779aSAndroid Build Coastguard Worker   }
544*15dc779aSAndroid Build Coastguard Worker 
545*15dc779aSAndroid Build Coastguard Worker   for (ch = 0; ch < num_channels; ch++) {
546*15dc779aSAndroid Build Coastguard Worker     if (psy_data[ch]->blk_switch_cntrl.win_seq != SHORT_WINDOW) {
547*15dc779aSAndroid Build Coastguard Worker       error_code = ia_enhaacplus_enc_advance_psy_long(
548*15dc779aSAndroid Build Coastguard Worker           psy_data[ch], tns_data[ch], pstr_psy_conf_long, psy_out_ch[ch], ptr_scratch_tns,
549*15dc779aSAndroid Build Coastguard Worker           tns_data[1 - ch], ch, aot, ptr_shared_buffer1, pstr_aac_tables, frame_len_long);
550*15dc779aSAndroid Build Coastguard Worker 
551*15dc779aSAndroid Build Coastguard Worker       if (error_code != IA_NO_ERROR) {
552*15dc779aSAndroid Build Coastguard Worker         return error_code;
553*15dc779aSAndroid Build Coastguard Worker       }
554*15dc779aSAndroid Build Coastguard Worker 
555*15dc779aSAndroid Build Coastguard Worker       for (sfb = pstr_psy_conf_long->sfb_cnt - 1; sfb >= 0; sfb--) {
556*15dc779aSAndroid Build Coastguard Worker         for (line = pstr_psy_conf_long->sfb_offsets[sfb + 1] - 1;
557*15dc779aSAndroid Build Coastguard Worker              line >= pstr_psy_conf_long->sfb_offsets[sfb]; line--) {
558*15dc779aSAndroid Build Coastguard Worker           if (psy_data[ch]->ptr_spec_coeffs[line] != 0) {
559*15dc779aSAndroid Build Coastguard Worker             break;
560*15dc779aSAndroid Build Coastguard Worker           }
561*15dc779aSAndroid Build Coastguard Worker         }
562*15dc779aSAndroid Build Coastguard Worker         if (line >= pstr_psy_conf_long->sfb_offsets[sfb]) {
563*15dc779aSAndroid Build Coastguard Worker           break;
564*15dc779aSAndroid Build Coastguard Worker         }
565*15dc779aSAndroid Build Coastguard Worker       }
566*15dc779aSAndroid Build Coastguard Worker 
567*15dc779aSAndroid Build Coastguard Worker       max_sfb_per_grp[ch] = sfb + 1;
568*15dc779aSAndroid Build Coastguard Worker 
569*15dc779aSAndroid Build Coastguard Worker       /* Calculate bandwise energies for mid and side channels - only if 2 channels exist */
570*15dc779aSAndroid Build Coastguard Worker       if (ch == 1) {
571*15dc779aSAndroid Build Coastguard Worker         ia_enhaacplus_enc_advance_psy_long_ms(psy_data, pstr_psy_conf_long);
572*15dc779aSAndroid Build Coastguard Worker       }
573*15dc779aSAndroid Build Coastguard Worker     } else {
574*15dc779aSAndroid Build Coastguard Worker       error_code = ia_enhaacplus_enc_advance_psy_short(
575*15dc779aSAndroid Build Coastguard Worker           psy_data[ch], tns_data[ch], pstr_psy_conf_short, psy_out_ch[ch], ptr_scratch_tns,
576*15dc779aSAndroid Build Coastguard Worker           tns_data[1 - ch], ch, aot, ptr_shared_buffer1, pstr_aac_tables, frame_len_long / 8);
577*15dc779aSAndroid Build Coastguard Worker 
578*15dc779aSAndroid Build Coastguard Worker       if (error_code != IA_NO_ERROR) {
579*15dc779aSAndroid Build Coastguard Worker         return error_code;
580*15dc779aSAndroid Build Coastguard Worker       }
581*15dc779aSAndroid Build Coastguard Worker 
582*15dc779aSAndroid Build Coastguard Worker       /* Calculate bandwise energies for mid and side channels - only if 2 channels exist */
583*15dc779aSAndroid Build Coastguard Worker       if (ch == 1) {
584*15dc779aSAndroid Build Coastguard Worker         ia_enhaacplus_enc_advance_psy_short_ms(psy_data, pstr_psy_conf_short, frame_len_long);
585*15dc779aSAndroid Build Coastguard Worker       }
586*15dc779aSAndroid Build Coastguard Worker     }
587*15dc779aSAndroid Build Coastguard Worker   }
588*15dc779aSAndroid Build Coastguard Worker 
589*15dc779aSAndroid Build Coastguard Worker   /* Group short data (max_sfb for short blocks is determined here) */
590*15dc779aSAndroid Build Coastguard Worker   if (aot == AOT_AAC_LC || aot == AOT_SBR || aot == AOT_PS) {
591*15dc779aSAndroid Build Coastguard Worker     for (ch = 0; ch < num_channels; ch++) {
592*15dc779aSAndroid Build Coastguard Worker       if (psy_data[ch]->blk_switch_cntrl.win_seq == SHORT_WINDOW) {
593*15dc779aSAndroid Build Coastguard Worker         iaace_group_short_data(psy_data[ch]->ptr_spec_coeffs, ptr_scratch_tns,
594*15dc779aSAndroid Build Coastguard Worker                                &psy_data[ch]->sfb_threshold, &psy_data[ch]->sfb_energy,
595*15dc779aSAndroid Build Coastguard Worker                                &psy_data[ch]->sfb_energy_ms, &psy_data[ch]->sfb_sreaded_energy,
596*15dc779aSAndroid Build Coastguard Worker                                pstr_psy_conf_short->sfb_cnt, pstr_psy_conf_short->sfb_offsets,
597*15dc779aSAndroid Build Coastguard Worker                                pstr_psy_conf_short->sfb_min_snr, grouped_sfb_offset[ch],
598*15dc779aSAndroid Build Coastguard Worker                                &max_sfb_per_grp[ch], grouped_sfb_min_snr[ch],
599*15dc779aSAndroid Build Coastguard Worker                                psy_data[ch]->blk_switch_cntrl.total_groups_cnt,
600*15dc779aSAndroid Build Coastguard Worker                                psy_data[ch]->blk_switch_cntrl.group_len, frame_len_long);
601*15dc779aSAndroid Build Coastguard Worker       }
602*15dc779aSAndroid Build Coastguard Worker     }
603*15dc779aSAndroid Build Coastguard Worker   }
604*15dc779aSAndroid Build Coastguard Worker 
605*15dc779aSAndroid Build Coastguard Worker #if (IXHEAACE_MAX_CH_IN_BS_ELE > 1)
606*15dc779aSAndroid Build Coastguard Worker   /* Stereo Processing */
607*15dc779aSAndroid Build Coastguard Worker   if (num_channels == 2) {
608*15dc779aSAndroid Build Coastguard Worker     pstr_psy_out_element->tools_info.ms_digest = MS_NONE;
609*15dc779aSAndroid Build Coastguard Worker 
610*15dc779aSAndroid Build Coastguard Worker     max_sfb_per_grp[0] = max_sfb_per_grp[1] = MAX(max_sfb_per_grp[0], max_sfb_per_grp[1]);
611*15dc779aSAndroid Build Coastguard Worker 
612*15dc779aSAndroid Build Coastguard Worker     if (psy_data[0]->blk_switch_cntrl.win_seq != SHORT_WINDOW) {
613*15dc779aSAndroid Build Coastguard Worker       iaace_ms_apply(
614*15dc779aSAndroid Build Coastguard Worker           psy_data, psy_data[0]->ptr_spec_coeffs, psy_data[1]->ptr_spec_coeffs,
615*15dc779aSAndroid Build Coastguard Worker           &pstr_psy_out_element->tools_info.ms_digest, pstr_psy_out_element->tools_info.ms_mask,
616*15dc779aSAndroid Build Coastguard Worker           pstr_psy_conf_long->sfb_cnt, pstr_psy_conf_long->sfb_cnt, max_sfb_per_grp[0],
617*15dc779aSAndroid Build Coastguard Worker           pstr_psy_conf_long->sfb_offsets, &pstr_psy_out_element->weight_ms_lr_pe_ratio);
618*15dc779aSAndroid Build Coastguard Worker     } else {
619*15dc779aSAndroid Build Coastguard Worker       iaace_ms_apply(psy_data, psy_data[0]->ptr_spec_coeffs, psy_data[1]->ptr_spec_coeffs,
620*15dc779aSAndroid Build Coastguard Worker                      &pstr_psy_out_element->tools_info.ms_digest,
621*15dc779aSAndroid Build Coastguard Worker                      pstr_psy_out_element->tools_info.ms_mask,
622*15dc779aSAndroid Build Coastguard Worker                      psy_data[0]->blk_switch_cntrl.total_groups_cnt *
623*15dc779aSAndroid Build Coastguard Worker                      pstr_psy_conf_short->sfb_cnt,
624*15dc779aSAndroid Build Coastguard Worker                      pstr_psy_conf_short->sfb_cnt, max_sfb_per_grp[0], grouped_sfb_offset[0],
625*15dc779aSAndroid Build Coastguard Worker                      &pstr_psy_out_element->weight_ms_lr_pe_ratio);
626*15dc779aSAndroid Build Coastguard Worker     }
627*15dc779aSAndroid Build Coastguard Worker   }
628*15dc779aSAndroid Build Coastguard Worker #endif
629*15dc779aSAndroid Build Coastguard Worker 
630*15dc779aSAndroid Build Coastguard Worker   /* Build output */
631*15dc779aSAndroid Build Coastguard Worker   if (aot == AOT_AAC_LC || aot == AOT_SBR || aot == AOT_PS) {
632*15dc779aSAndroid Build Coastguard Worker     for (ch = 0; ch < num_channels; ch++) {
633*15dc779aSAndroid Build Coastguard Worker       if (psy_data[ch]->blk_switch_cntrl.win_seq != SHORT_WINDOW) {
634*15dc779aSAndroid Build Coastguard Worker         ia_enhaacplus_enc_build_interface(
635*15dc779aSAndroid Build Coastguard Worker             psy_data[ch]->ptr_spec_coeffs, &psy_data[ch]->sfb_threshold,
636*15dc779aSAndroid Build Coastguard Worker             &psy_data[ch]->sfb_energy,
637*15dc779aSAndroid Build Coastguard Worker             &psy_data[ch]->sfb_sreaded_energy, psy_data[ch]->sfb_energy_sum,
638*15dc779aSAndroid Build Coastguard Worker             psy_data[ch]->sfb_energy_sum_ms, psy_data[ch]->blk_switch_cntrl.win_seq,
639*15dc779aSAndroid Build Coastguard Worker             ia_enhaacplus_enc_block_type_to_window_shape_lc[psy_data[ch]
640*15dc779aSAndroid Build Coastguard Worker                                                                 ->blk_switch_cntrl.win_seq],
641*15dc779aSAndroid Build Coastguard Worker             pstr_psy_conf_long->sfb_cnt, pstr_psy_conf_long->sfb_offsets, max_sfb_per_grp[ch],
642*15dc779aSAndroid Build Coastguard Worker             pstr_psy_conf_long->sfb_min_snr, psy_data[ch]->blk_switch_cntrl.total_groups_cnt,
643*15dc779aSAndroid Build Coastguard Worker             psy_data[ch]->blk_switch_cntrl.group_len, psy_out_ch[ch]);
644*15dc779aSAndroid Build Coastguard Worker       } else {
645*15dc779aSAndroid Build Coastguard Worker         ia_enhaacplus_enc_build_interface(
646*15dc779aSAndroid Build Coastguard Worker             psy_data[ch]->ptr_spec_coeffs, &psy_data[ch]->sfb_threshold,
647*15dc779aSAndroid Build Coastguard Worker             &psy_data[ch]->sfb_energy,
648*15dc779aSAndroid Build Coastguard Worker             &psy_data[ch]->sfb_sreaded_energy, psy_data[ch]->sfb_energy_sum,
649*15dc779aSAndroid Build Coastguard Worker             psy_data[ch]->sfb_energy_sum_ms, SHORT_WINDOW, SINE_WINDOW,
650*15dc779aSAndroid Build Coastguard Worker             psy_data[ch]->blk_switch_cntrl.total_groups_cnt * pstr_psy_conf_short->sfb_cnt,
651*15dc779aSAndroid Build Coastguard Worker             grouped_sfb_offset[ch], max_sfb_per_grp[ch], grouped_sfb_min_snr[ch],
652*15dc779aSAndroid Build Coastguard Worker             psy_data[ch]->blk_switch_cntrl.total_groups_cnt,
653*15dc779aSAndroid Build Coastguard Worker             psy_data[ch]->blk_switch_cntrl.group_len, psy_out_ch[ch]);
654*15dc779aSAndroid Build Coastguard Worker       }
655*15dc779aSAndroid Build Coastguard Worker     }
656*15dc779aSAndroid Build Coastguard Worker   } else if (aot == AOT_AAC_LD || aot == AOT_AAC_ELD) {
657*15dc779aSAndroid Build Coastguard Worker     for (ch = 0; ch < num_channels; ch++) {
658*15dc779aSAndroid Build Coastguard Worker       ia_enhaacplus_enc_build_interface(
659*15dc779aSAndroid Build Coastguard Worker           psy_data[ch]->ptr_spec_coeffs, &psy_data[ch]->sfb_threshold, &psy_data[ch]->sfb_energy,
660*15dc779aSAndroid Build Coastguard Worker           &psy_data[ch]->sfb_sreaded_energy, psy_data[ch]->sfb_energy_sum,
661*15dc779aSAndroid Build Coastguard Worker           psy_data[ch]->sfb_energy_sum_ms, LONG_WINDOW,
662*15dc779aSAndroid Build Coastguard Worker           ia_enhaacplus_enc_block_type_to_window_shape_ld[psy_data[ch]
663*15dc779aSAndroid Build Coastguard Worker                                                               ->blk_switch_cntrl.win_seq_ld],
664*15dc779aSAndroid Build Coastguard Worker           ((aot == AOT_AAC_ELD) ? pstr_psy_conf_long->sfb_active : pstr_psy_conf_long->sfb_cnt),
665*15dc779aSAndroid Build Coastguard Worker           pstr_psy_conf_long->sfb_offsets, max_sfb_per_grp[ch], pstr_psy_conf_long->sfb_min_snr,
666*15dc779aSAndroid Build Coastguard Worker           psy_data[ch]->blk_switch_cntrl.total_groups_cnt,
667*15dc779aSAndroid Build Coastguard Worker           psy_data[ch]->blk_switch_cntrl.group_len, psy_out_ch[ch]);
668*15dc779aSAndroid Build Coastguard Worker     }
669*15dc779aSAndroid Build Coastguard Worker   }
670*15dc779aSAndroid Build Coastguard Worker   return error_code;
671*15dc779aSAndroid Build Coastguard Worker }
672