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 "iusace_cnst.h"
23*15dc779aSAndroid Build Coastguard Worker #include "iusace_type_def.h"
24*15dc779aSAndroid Build Coastguard Worker #include "iusace_block_switch_const.h"
25*15dc779aSAndroid Build Coastguard Worker #include "iusace_block_switch_struct_def.h"
26*15dc779aSAndroid Build Coastguard Worker #include "iusace_bitbuffer.h"
27*15dc779aSAndroid Build Coastguard Worker #include "iusace_tns_usac.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_api.h"
31*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc_eq.h"
32*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc_filter_bank.h"
33*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_gain_enc.h"
34*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_struct_def.h"
35*15dc779aSAndroid Build Coastguard Worker #include "iusace_cnst.h"
36*15dc779aSAndroid Build Coastguard Worker #include "iusace_tns_usac.h"
37*15dc779aSAndroid Build Coastguard Worker #include "iusace_psy_mod.h"
38*15dc779aSAndroid Build Coastguard Worker #include "iusace_psy_utils.h"
39*15dc779aSAndroid Build Coastguard Worker
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
41*15dc779aSAndroid Build Coastguard Worker #include "iusace_type_def.h"
42*15dc779aSAndroid Build Coastguard Worker #include "iusace_cnst.h"
43*15dc779aSAndroid Build Coastguard Worker
44*15dc779aSAndroid Build Coastguard Worker #include "iusace_ms.h"
45*15dc779aSAndroid Build Coastguard Worker
46*15dc779aSAndroid Build Coastguard Worker #include "iusace_psy_utils.h"
47*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_adjust_threshold_data.h"
48*15dc779aSAndroid Build Coastguard Worker #include "iusace_fd_qc_util.h"
49*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_memory_standards.h"
50*15dc779aSAndroid Build Coastguard Worker #include "iusace_config.h"
51*15dc779aSAndroid Build Coastguard Worker #include "iusace_arith_enc.h"
52*15dc779aSAndroid Build Coastguard Worker #include "iusace_fd_quant.h"
53*15dc779aSAndroid Build Coastguard Worker #include "iusace_signal_classifier.h"
54*15dc779aSAndroid Build Coastguard Worker #include "iusace_block_switch_const.h"
55*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_header.h"
56*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_config.h"
57*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_asc_write.h"
58*15dc779aSAndroid Build Coastguard Worker #include "iusace_main.h"
59*15dc779aSAndroid Build Coastguard Worker
iusace_psy_mod_init(ia_psy_mod_struct * pstr_psy_mod,WORD32 sample_rate,WORD32 bit_rate,WORD32 band_width,WORD32 num_channels,WORD32 ch,WORD32 ele_id,WORD32 ccfl)60*15dc779aSAndroid Build Coastguard Worker VOID iusace_psy_mod_init(ia_psy_mod_struct *pstr_psy_mod, WORD32 sample_rate, WORD32 bit_rate,
61*15dc779aSAndroid Build Coastguard Worker WORD32 band_width, WORD32 num_channels, WORD32 ch, WORD32 ele_id,
62*15dc779aSAndroid Build Coastguard Worker WORD32 ccfl) {
63*15dc779aSAndroid Build Coastguard Worker WORD32 i;
64*15dc779aSAndroid Build Coastguard Worker
65*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_channels; i++) {
66*15dc779aSAndroid Build Coastguard Worker iusace_psy_long_config_init(bit_rate / num_channels, sample_rate, band_width,
67*15dc779aSAndroid Build Coastguard Worker &(pstr_psy_mod->str_psy_long_config[ele_id]), ccfl);
68*15dc779aSAndroid Build Coastguard Worker
69*15dc779aSAndroid Build Coastguard Worker iusace_psy_short_config_init(bit_rate / num_channels, sample_rate, band_width,
70*15dc779aSAndroid Build Coastguard Worker &(pstr_psy_mod->str_psy_short_config[ele_id]), ccfl);
71*15dc779aSAndroid Build Coastguard Worker
72*15dc779aSAndroid Build Coastguard Worker pstr_psy_mod->str_psy_data[ch].ptr_sfb_thr_long =
73*15dc779aSAndroid Build Coastguard Worker (FLOAT32 *)pstr_psy_mod->str_psy_data[ch].sfb_thr_short;
74*15dc779aSAndroid Build Coastguard Worker pstr_psy_mod->str_psy_data[ch].ptr_sfb_energy_long =
75*15dc779aSAndroid Build Coastguard Worker (FLOAT32 *)pstr_psy_mod->str_psy_data[ch].sfb_energy_short;
76*15dc779aSAndroid Build Coastguard Worker pstr_psy_mod->str_psy_data[ch].ptr_sfb_spreaded_energy_long =
77*15dc779aSAndroid Build Coastguard Worker (FLOAT32 *)pstr_psy_mod->str_psy_data[ch].sfb_spreaded_energy_short;
78*15dc779aSAndroid Build Coastguard Worker
79*15dc779aSAndroid Build Coastguard Worker memcpy(pstr_psy_mod->str_psy_data[ch].sfb_thr_nm1,
80*15dc779aSAndroid Build Coastguard Worker pstr_psy_mod->str_psy_long_config[ele_id].sfb_thr_quiet,
81*15dc779aSAndroid Build Coastguard Worker pstr_psy_mod->str_psy_long_config[ele_id].sfb_count * sizeof(FLOAT32));
82*15dc779aSAndroid Build Coastguard Worker
83*15dc779aSAndroid Build Coastguard Worker ch++;
84*15dc779aSAndroid Build Coastguard Worker }
85*15dc779aSAndroid Build Coastguard Worker
86*15dc779aSAndroid Build Coastguard Worker return;
87*15dc779aSAndroid Build Coastguard Worker }
88*15dc779aSAndroid Build Coastguard Worker
iusace_psy_mod_lb(ia_psy_mod_struct * pstr_psy_mod,ia_sfb_params_struct * pstr_sfb_prms,FLOAT64 * ptr_spec_in,ia_tns_info * pstr_tns_info[MAX_TIME_CHANNELS],WORD32 tns_select,WORD32 i_ch,WORD32 chn,WORD32 channel_type,FLOAT64 * scratch_tns_filter,WORD32 elem_idx,FLOAT64 * ptr_tns_scratch,WORD32 ccfl)89*15dc779aSAndroid Build Coastguard Worker VOID iusace_psy_mod_lb(ia_psy_mod_struct *pstr_psy_mod, ia_sfb_params_struct *pstr_sfb_prms,
90*15dc779aSAndroid Build Coastguard Worker FLOAT64 *ptr_spec_in, ia_tns_info *pstr_tns_info[MAX_TIME_CHANNELS],
91*15dc779aSAndroid Build Coastguard Worker WORD32 tns_select, WORD32 i_ch, WORD32 chn, WORD32 channel_type,
92*15dc779aSAndroid Build Coastguard Worker FLOAT64 *scratch_tns_filter, WORD32 elem_idx, FLOAT64 *ptr_tns_scratch,
93*15dc779aSAndroid Build Coastguard Worker WORD32 ccfl) {
94*15dc779aSAndroid Build Coastguard Worker ia_psy_mod_data_struct *pstr_psy_data = &(pstr_psy_mod->str_psy_data[i_ch]);
95*15dc779aSAndroid Build Coastguard Worker ia_psy_mod_long_config_struct *pstr_psy_config = &(pstr_psy_mod->str_psy_long_config[elem_idx]);
96*15dc779aSAndroid Build Coastguard Worker WORD32 window_sequence = pstr_sfb_prms->window_sequence[i_ch];
97*15dc779aSAndroid Build Coastguard Worker WORD32 num_sfb = pstr_sfb_prms->num_sfb[i_ch];
98*15dc779aSAndroid Build Coastguard Worker ia_tns_info *ptr_tns_info = pstr_tns_info[i_ch];
99*15dc779aSAndroid Build Coastguard Worker WORD32 sfb, line;
100*15dc779aSAndroid Build Coastguard Worker WORD32 i;
101*15dc779aSAndroid Build Coastguard Worker WORD32 frame_len_long = ccfl;
102*15dc779aSAndroid Build Coastguard Worker FLOAT32 energy_shift = 0.25f;
103*15dc779aSAndroid Build Coastguard Worker FLOAT32 clip_energy = pstr_psy_config->clip_energy * energy_shift;
104*15dc779aSAndroid Build Coastguard Worker (VOID) channel_type;
105*15dc779aSAndroid Build Coastguard Worker
106*15dc779aSAndroid Build Coastguard Worker pstr_psy_data->window_sequence = window_sequence;
107*15dc779aSAndroid Build Coastguard Worker memset(&ptr_spec_in[pstr_psy_config->low_pass_line], 0,
108*15dc779aSAndroid Build Coastguard Worker (frame_len_long - pstr_psy_config->low_pass_line) * sizeof(FLOAT64));
109*15dc779aSAndroid Build Coastguard Worker
110*15dc779aSAndroid Build Coastguard Worker iusace_calc_band_energy(ptr_spec_in, pstr_psy_config->sfb_offset, pstr_psy_config->sfb_active,
111*15dc779aSAndroid Build Coastguard Worker pstr_psy_data->ptr_sfb_energy_long, pstr_psy_config->sfb_count);
112*15dc779aSAndroid Build Coastguard Worker
113*15dc779aSAndroid Build Coastguard Worker if (tns_select != 0) {
114*15dc779aSAndroid Build Coastguard Worker ia_tns_info *ptr_tns_info_ch2 = pstr_tns_info[i_ch - chn];
115*15dc779aSAndroid Build Coastguard Worker ptr_tns_info->number_of_bands = num_sfb;
116*15dc779aSAndroid Build Coastguard Worker ptr_tns_info->block_type = window_sequence;
117*15dc779aSAndroid Build Coastguard Worker ptr_tns_info->spec = ptr_spec_in;
118*15dc779aSAndroid Build Coastguard Worker iusace_tns_encode(ptr_tns_info_ch2, ptr_tns_info, pstr_psy_data->ptr_sfb_energy_long, 0, chn,
119*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->low_pass_line, scratch_tns_filter, 0, ptr_tns_scratch);
120*15dc779aSAndroid Build Coastguard Worker }
121*15dc779aSAndroid Build Coastguard Worker
122*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < pstr_psy_config->sfb_count; i++) {
123*15dc779aSAndroid Build Coastguard Worker pstr_psy_data->ptr_sfb_thr_long[i] =
124*15dc779aSAndroid Build Coastguard Worker pstr_psy_data->ptr_sfb_energy_long[i] * pstr_psy_config->ratio;
125*15dc779aSAndroid Build Coastguard Worker pstr_psy_data->ptr_sfb_thr_long[i] = MIN(pstr_psy_data->ptr_sfb_thr_long[i], clip_energy);
126*15dc779aSAndroid Build Coastguard Worker }
127*15dc779aSAndroid Build Coastguard Worker
128*15dc779aSAndroid Build Coastguard Worker if (tns_select != 0) {
129*15dc779aSAndroid Build Coastguard Worker if (ptr_tns_info->tns_data_present == 1) {
130*15dc779aSAndroid Build Coastguard Worker iusace_calc_band_energy(ptr_spec_in, pstr_psy_config->sfb_offset,
131*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->sfb_active, pstr_psy_data->ptr_sfb_energy_long,
132*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->sfb_count);
133*15dc779aSAndroid Build Coastguard Worker }
134*15dc779aSAndroid Build Coastguard Worker }
135*15dc779aSAndroid Build Coastguard Worker
136*15dc779aSAndroid Build Coastguard Worker iusace_find_max_spreading(pstr_psy_config->sfb_count, pstr_psy_config->sfb_mask_low_fac,
137*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->sfb_mask_high_fac, pstr_psy_data->ptr_sfb_thr_long);
138*15dc779aSAndroid Build Coastguard Worker
139*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < pstr_psy_config->sfb_count; i++) {
140*15dc779aSAndroid Build Coastguard Worker pstr_psy_data->ptr_sfb_thr_long[i] = MAX(pstr_psy_data->ptr_sfb_thr_long[i],
141*15dc779aSAndroid Build Coastguard Worker (pstr_psy_config->sfb_thr_quiet[i] * energy_shift));
142*15dc779aSAndroid Build Coastguard Worker }
143*15dc779aSAndroid Build Coastguard Worker
144*15dc779aSAndroid Build Coastguard Worker if (pstr_psy_data->window_sequence == LONG_STOP_SEQUENCE) {
145*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < pstr_psy_config->sfb_count; i++) {
146*15dc779aSAndroid Build Coastguard Worker pstr_psy_data->sfb_thr_nm1[i] = 1.0e20f;
147*15dc779aSAndroid Build Coastguard Worker }
148*15dc779aSAndroid Build Coastguard Worker }
149*15dc779aSAndroid Build Coastguard Worker
150*15dc779aSAndroid Build Coastguard Worker iusace_pre_echo_control(pstr_psy_data->sfb_thr_nm1, pstr_psy_config->sfb_count,
151*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->max_allowed_inc_fac,
152*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->min_remaining_thr_fac,
153*15dc779aSAndroid Build Coastguard Worker pstr_psy_data->ptr_sfb_thr_long);
154*15dc779aSAndroid Build Coastguard Worker
155*15dc779aSAndroid Build Coastguard Worker if (pstr_psy_data->window_sequence == LONG_START_SEQUENCE) {
156*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < pstr_psy_config->sfb_count; i++) {
157*15dc779aSAndroid Build Coastguard Worker pstr_psy_data->sfb_thr_nm1[i] = 1.0e20f;
158*15dc779aSAndroid Build Coastguard Worker }
159*15dc779aSAndroid Build Coastguard Worker }
160*15dc779aSAndroid Build Coastguard Worker
161*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < pstr_psy_config->sfb_count; i++) {
162*15dc779aSAndroid Build Coastguard Worker pstr_psy_data->ptr_sfb_spreaded_energy_long[i] = pstr_psy_data->ptr_sfb_energy_long[i];
163*15dc779aSAndroid Build Coastguard Worker }
164*15dc779aSAndroid Build Coastguard Worker iusace_find_max_spreading(
165*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->sfb_count, pstr_psy_config->sfb_mask_low_fac_spr_ener,
166*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->sfb_mask_high_fac_spr_ener, pstr_psy_data->ptr_sfb_spreaded_energy_long);
167*15dc779aSAndroid Build Coastguard Worker
168*15dc779aSAndroid Build Coastguard Worker for (sfb = pstr_psy_config->sfb_count - 1; sfb >= 0; sfb--) {
169*15dc779aSAndroid Build Coastguard Worker for (line = pstr_psy_config->sfb_offset[sfb + 1] - 1;
170*15dc779aSAndroid Build Coastguard Worker line >= pstr_psy_config->sfb_offset[sfb]; line--) {
171*15dc779aSAndroid Build Coastguard Worker if (ptr_spec_in[line] != 0) break;
172*15dc779aSAndroid Build Coastguard Worker }
173*15dc779aSAndroid Build Coastguard Worker if (line >= pstr_psy_config->sfb_offset[sfb]) break;
174*15dc779aSAndroid Build Coastguard Worker }
175*15dc779aSAndroid Build Coastguard Worker
176*15dc779aSAndroid Build Coastguard Worker pstr_psy_mod->str_psy_out_data[i_ch].max_sfb_per_grp = sfb + 1;
177*15dc779aSAndroid Build Coastguard Worker
178*15dc779aSAndroid Build Coastguard Worker return;
179*15dc779aSAndroid Build Coastguard Worker }
180*15dc779aSAndroid Build Coastguard Worker
iusace_psy_mod_sb(ia_psy_mod_struct * pstr_psy_mod,ia_sfb_params_struct * pstr_sfb_prms,FLOAT64 * ptr_spec_in,ia_tns_info * pstr_tns_info[MAX_TIME_CHANNELS],WORD32 tns_select,WORD32 i_ch,WORD32 chn,WORD32 channel_type,FLOAT64 * scratch_tns_filter,WORD32 elem_idx,FLOAT64 * ptr_tns_scratch,WORD32 ccfl)181*15dc779aSAndroid Build Coastguard Worker VOID iusace_psy_mod_sb(ia_psy_mod_struct *pstr_psy_mod, ia_sfb_params_struct *pstr_sfb_prms,
182*15dc779aSAndroid Build Coastguard Worker FLOAT64 *ptr_spec_in, ia_tns_info *pstr_tns_info[MAX_TIME_CHANNELS],
183*15dc779aSAndroid Build Coastguard Worker WORD32 tns_select, WORD32 i_ch, WORD32 chn, WORD32 channel_type,
184*15dc779aSAndroid Build Coastguard Worker FLOAT64 *scratch_tns_filter, WORD32 elem_idx, FLOAT64 *ptr_tns_scratch,
185*15dc779aSAndroid Build Coastguard Worker WORD32 ccfl) {
186*15dc779aSAndroid Build Coastguard Worker ia_psy_mod_data_struct *pstr_psy_data = &(pstr_psy_mod->str_psy_data[i_ch]);
187*15dc779aSAndroid Build Coastguard Worker ia_psy_mod_short_config_struct *pstr_psy_config =
188*15dc779aSAndroid Build Coastguard Worker &(pstr_psy_mod->str_psy_short_config[elem_idx]);
189*15dc779aSAndroid Build Coastguard Worker WORD32 max_sfb = 0, sfb, line;
190*15dc779aSAndroid Build Coastguard Worker WORD32 window_sequence = pstr_sfb_prms->window_sequence[i_ch];
191*15dc779aSAndroid Build Coastguard Worker WORD32 num_sfb = pstr_sfb_prms->num_sfb[i_ch];
192*15dc779aSAndroid Build Coastguard Worker ia_tns_info *ptr_tns_info = pstr_tns_info[i_ch];
193*15dc779aSAndroid Build Coastguard Worker WORD32 i, w;
194*15dc779aSAndroid Build Coastguard Worker WORD32 frame_len_short = (ccfl * FRAME_LEN_SHORT_128) / FRAME_LEN_LONG;
195*15dc779aSAndroid Build Coastguard Worker FLOAT32 energy_shift = 0.25f;
196*15dc779aSAndroid Build Coastguard Worker FLOAT32 clip_energy = pstr_psy_config->clip_energy * energy_shift;
197*15dc779aSAndroid Build Coastguard Worker (VOID) channel_type;
198*15dc779aSAndroid Build Coastguard Worker
199*15dc779aSAndroid Build Coastguard Worker pstr_psy_data->window_sequence = window_sequence;
200*15dc779aSAndroid Build Coastguard Worker
201*15dc779aSAndroid Build Coastguard Worker for (w = 0; w < MAX_SHORT_WINDOWS; w++) {
202*15dc779aSAndroid Build Coastguard Worker WORD32 w_offset = w * frame_len_short;
203*15dc779aSAndroid Build Coastguard Worker WORD32 offset;
204*15dc779aSAndroid Build Coastguard Worker FLOAT64 *pmdct_double = &ptr_spec_in[pstr_psy_config->low_pass_line + w_offset];
205*15dc779aSAndroid Build Coastguard Worker
206*15dc779aSAndroid Build Coastguard Worker offset = frame_len_short - pstr_psy_config->low_pass_line;
207*15dc779aSAndroid Build Coastguard Worker
208*15dc779aSAndroid Build Coastguard Worker memset(pmdct_double, 0, sizeof(FLOAT64) * offset);
209*15dc779aSAndroid Build Coastguard Worker
210*15dc779aSAndroid Build Coastguard Worker iusace_calc_band_energy(ptr_spec_in + w_offset, pstr_psy_config->sfb_offset,
211*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->sfb_active, pstr_psy_data->sfb_energy_short[w],
212*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->sfb_count);
213*15dc779aSAndroid Build Coastguard Worker
214*15dc779aSAndroid Build Coastguard Worker if (tns_select != 0) {
215*15dc779aSAndroid Build Coastguard Worker ia_tns_info *ptr_tns_info_ch2 = pstr_tns_info[i_ch - chn];
216*15dc779aSAndroid Build Coastguard Worker ptr_tns_info->number_of_bands = num_sfb;
217*15dc779aSAndroid Build Coastguard Worker ptr_tns_info->block_type = window_sequence;
218*15dc779aSAndroid Build Coastguard Worker ptr_tns_info->spec = ptr_spec_in + w_offset;
219*15dc779aSAndroid Build Coastguard Worker iusace_tns_encode(ptr_tns_info_ch2, ptr_tns_info, pstr_psy_data->sfb_energy_short[w], w,
220*15dc779aSAndroid Build Coastguard Worker chn, pstr_psy_config->low_pass_line, scratch_tns_filter, 0,
221*15dc779aSAndroid Build Coastguard Worker ptr_tns_scratch);
222*15dc779aSAndroid Build Coastguard Worker }
223*15dc779aSAndroid Build Coastguard Worker
224*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < pstr_psy_config->sfb_count; i++) {
225*15dc779aSAndroid Build Coastguard Worker pstr_psy_data->sfb_thr_short[w][i] =
226*15dc779aSAndroid Build Coastguard Worker pstr_psy_data->sfb_energy_short[w][i] * pstr_psy_config->ratio;
227*15dc779aSAndroid Build Coastguard Worker pstr_psy_data->sfb_thr_short[w][i] = MIN(pstr_psy_data->sfb_thr_short[w][i], clip_energy);
228*15dc779aSAndroid Build Coastguard Worker }
229*15dc779aSAndroid Build Coastguard Worker
230*15dc779aSAndroid Build Coastguard Worker if (tns_select != 0) {
231*15dc779aSAndroid Build Coastguard Worker if (ptr_tns_info->tns_data_present == 1) {
232*15dc779aSAndroid Build Coastguard Worker iusace_calc_band_energy(ptr_spec_in + w_offset, pstr_psy_config->sfb_offset,
233*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->sfb_active, pstr_psy_data->sfb_energy_short[w],
234*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->sfb_count);
235*15dc779aSAndroid Build Coastguard Worker }
236*15dc779aSAndroid Build Coastguard Worker }
237*15dc779aSAndroid Build Coastguard Worker
238*15dc779aSAndroid Build Coastguard Worker iusace_find_max_spreading(pstr_psy_config->sfb_count, pstr_psy_config->sfb_mask_low_fac,
239*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->sfb_mask_high_fac,
240*15dc779aSAndroid Build Coastguard Worker pstr_psy_data->sfb_thr_short[w]);
241*15dc779aSAndroid Build Coastguard Worker
242*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < pstr_psy_config->sfb_count; i++) {
243*15dc779aSAndroid Build Coastguard Worker pstr_psy_data->sfb_thr_short[w][i] =
244*15dc779aSAndroid Build Coastguard Worker MAX(pstr_psy_data->sfb_thr_short[w][i], (pstr_psy_config->sfb_thr_quiet[i] * 0.25f));
245*15dc779aSAndroid Build Coastguard Worker }
246*15dc779aSAndroid Build Coastguard Worker
247*15dc779aSAndroid Build Coastguard Worker iusace_pre_echo_control(pstr_psy_data->sfb_thr_nm1, pstr_psy_config->sfb_count,
248*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->max_allowed_inc_fac,
249*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->min_remaining_thr_fac,
250*15dc779aSAndroid Build Coastguard Worker pstr_psy_data->sfb_thr_short[w]);
251*15dc779aSAndroid Build Coastguard Worker
252*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < pstr_psy_config->sfb_count; i++) {
253*15dc779aSAndroid Build Coastguard Worker pstr_psy_data->sfb_spreaded_energy_short[w][i] = pstr_psy_data->sfb_energy_short[w][i];
254*15dc779aSAndroid Build Coastguard Worker }
255*15dc779aSAndroid Build Coastguard Worker iusace_find_max_spreading(
256*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->sfb_count, pstr_psy_config->sfb_mask_low_fac_spr_ener,
257*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->sfb_mask_high_fac_spr_ener, pstr_psy_data->sfb_spreaded_energy_short[w]);
258*15dc779aSAndroid Build Coastguard Worker }
259*15dc779aSAndroid Build Coastguard Worker
260*15dc779aSAndroid Build Coastguard Worker for (WORD32 wnd = 0; wnd < MAX_SHORT_WINDOWS; wnd++) {
261*15dc779aSAndroid Build Coastguard Worker for (sfb = pstr_psy_config->sfb_count - 1; sfb >= max_sfb; sfb--) {
262*15dc779aSAndroid Build Coastguard Worker for (line = pstr_psy_config->sfb_offset[sfb + 1] - 1;
263*15dc779aSAndroid Build Coastguard Worker line >= pstr_psy_config->sfb_offset[sfb]; line--) {
264*15dc779aSAndroid Build Coastguard Worker if (ptr_spec_in[wnd * frame_len_short + line] != 0.0) break;
265*15dc779aSAndroid Build Coastguard Worker }
266*15dc779aSAndroid Build Coastguard Worker if (line >= pstr_psy_config->sfb_offset[sfb]) break;
267*15dc779aSAndroid Build Coastguard Worker }
268*15dc779aSAndroid Build Coastguard Worker max_sfb = MAX(max_sfb, sfb);
269*15dc779aSAndroid Build Coastguard Worker }
270*15dc779aSAndroid Build Coastguard Worker max_sfb = max_sfb > 0 ? max_sfb : 0;
271*15dc779aSAndroid Build Coastguard Worker
272*15dc779aSAndroid Build Coastguard Worker pstr_psy_mod->str_psy_out_data[i_ch].max_sfb_per_grp = max_sfb + 1;
273*15dc779aSAndroid Build Coastguard Worker
274*15dc779aSAndroid Build Coastguard Worker return;
275*15dc779aSAndroid Build Coastguard Worker }
276