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
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
25*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_common_enc.h"
26*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc.h"
27*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_tables.h"
28*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_api.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_api.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_aac_constants.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_error_codes.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops16.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops.h"
37*15dc779aSAndroid Build Coastguard Worker
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_header.h"
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_def.h"
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_resampler.h"
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_rom.h"
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_rom.h"
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_hbe.h"
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_qmf_enc.h"
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_tran_det.h"
46*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_frame_info_gen.h"
47*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_env_est.h"
48*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_code_envelope.h"
49*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_psy_const.h"
50*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_tns.h"
51*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_tns_params.h"
52*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_rom.h"
53*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_rom.h"
54*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_bitbuffer.h"
55*15dc779aSAndroid Build Coastguard Worker
56*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_main.h"
57*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_rom.h"
58*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_missing_harmonics_det.h"
59*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_inv_filtering_estimation.h"
60*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_noise_floor_est.h"
61*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_ton_corr.h"
62*15dc779aSAndroid Build Coastguard Worker #include "iusace_esbr_pvc.h"
63*15dc779aSAndroid Build Coastguard Worker #include "iusace_esbr_inter_tes.h"
64*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr.h"
65*15dc779aSAndroid Build Coastguard Worker
66*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_freq_scaling.h"
67*15dc779aSAndroid Build Coastguard Worker
68*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_bitbuffer.h"
69*15dc779aSAndroid Build Coastguard Worker
70*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_hybrid.h"
71*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_ps_enc.h"
72*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_cmondata.h"
73*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_crc.h"
74*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_enc_struct.h"
75*15dc779aSAndroid Build Coastguard Worker
ixheaace_set_usac_sbr_params(ixheaace_pstr_sbr_enc pstr_env_enc,WORD32 usac_indep_flag,WORD32 sbr_pre_proc,WORD32 sbr_pvc_active,WORD32 sbr_pvc_mode,WORD32 inter_tes_active,WORD32 sbr_harmonic,WORD32 sbr_patching_mode)76*15dc779aSAndroid Build Coastguard Worker VOID ixheaace_set_usac_sbr_params(ixheaace_pstr_sbr_enc pstr_env_enc, WORD32 usac_indep_flag,
77*15dc779aSAndroid Build Coastguard Worker WORD32 sbr_pre_proc, WORD32 sbr_pvc_active, WORD32 sbr_pvc_mode,
78*15dc779aSAndroid Build Coastguard Worker WORD32 inter_tes_active, WORD32 sbr_harmonic,
79*15dc779aSAndroid Build Coastguard Worker WORD32 sbr_patching_mode) {
80*15dc779aSAndroid Build Coastguard Worker WORD32 ch;
81*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_bs.usac_indep_flag = usac_indep_flag;
82*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_hdr.sbr_pre_proc = sbr_pre_proc;
83*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_hdr.sbr_pvc_active = sbr_pvc_active;
84*15dc779aSAndroid Build Coastguard Worker if (pstr_env_enc->str_sbr_cfg.num_ch == 2) {
85*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_hdr.sbr_pvc_mode = 0;
86*15dc779aSAndroid Build Coastguard Worker } else {
87*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_hdr.sbr_pvc_mode = sbr_pvc_mode;
88*15dc779aSAndroid Build Coastguard Worker }
89*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_hdr.sbr_inter_tes_active = inter_tes_active;
90*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_hdr.sbr_harmonic = sbr_harmonic;
91*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < pstr_env_enc->str_sbr_cfg.num_ch; ch++) {
92*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->pstr_env_channel[ch]->enc_env_data.sbr_inter_tes = inter_tes_active;
93*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->pstr_env_channel[ch]->enc_env_data.sbr_patching_mode = sbr_patching_mode;
94*15dc779aSAndroid Build Coastguard Worker }
95*15dc779aSAndroid Build Coastguard Worker }
ixheaace_get_hbe_resample_buffer(ixheaace_pstr_sbr_enc pstr_env_enc)96*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ixheaace_get_hbe_resample_buffer(ixheaace_pstr_sbr_enc pstr_env_enc) {
97*15dc779aSAndroid Build Coastguard Worker return pstr_env_enc->ptr_hbe_resample_buf;
98*15dc779aSAndroid Build Coastguard Worker }
99*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_get_sbr_tuning_table_idx(UWORD32 bitrate,UWORD32 num_ch,UWORD32 sample_rate,ixheaace_str_qmf_tabs * pstr_qmf_tab,UWORD32 * ptr_closest_br,WORD32 * ptr_idx_sr,WORD32 * ptr_idx_ch,WORD32 * ptr_idx_entry,ixheaace_sbr_tuning_tables sbr_tune_table[10][2][10])100*15dc779aSAndroid Build Coastguard Worker static FLAG ia_enhaacplus_enc_get_sbr_tuning_table_idx(
101*15dc779aSAndroid Build Coastguard Worker UWORD32 bitrate, UWORD32 num_ch, UWORD32 sample_rate, ixheaace_str_qmf_tabs *pstr_qmf_tab,
102*15dc779aSAndroid Build Coastguard Worker UWORD32 *ptr_closest_br, WORD32 *ptr_idx_sr, WORD32 *ptr_idx_ch, WORD32 *ptr_idx_entry,
103*15dc779aSAndroid Build Coastguard Worker ixheaace_sbr_tuning_tables sbr_tune_table[10][2][10]) {
104*15dc779aSAndroid Build Coastguard Worker WORD32 found = 0;
105*15dc779aSAndroid Build Coastguard Worker WORD32 i_sr, br_closest_lower_idx_sr = -1, br_closest_upper_idx_sr = -1;
106*15dc779aSAndroid Build Coastguard Worker WORD32 br_closest_lower_idx_ch = -1, br_closest_upper_idx_sch = -1;
107*15dc779aSAndroid Build Coastguard Worker UWORD32 i_ch;
108*15dc779aSAndroid Build Coastguard Worker WORD32 i_entry, br_closest_lower_idx_entry = -1, br_closest_upper_idx_entry = -1;
109*15dc779aSAndroid Build Coastguard Worker UWORD32 br_closest_upper = 0, br_closest_lower = IXHEAACE_DISTANCE_CEIL_VALUE;
110*15dc779aSAndroid Build Coastguard Worker const UWORD32 *ptr_sample_rate_supported = pstr_qmf_tab->supported_sample_rate;
111*15dc779aSAndroid Build Coastguard Worker WORD32 check_size = sizeof(sbr_tune_table[i_sr][i_ch]) / sizeof(sbr_tune_table[i_sr][i_ch][0]);
112*15dc779aSAndroid Build Coastguard Worker for (i_sr = 0; i_sr < 9; i_sr++) {
113*15dc779aSAndroid Build Coastguard Worker for (i_ch = 0; i_ch < 2; i_ch++) {
114*15dc779aSAndroid Build Coastguard Worker found = 1;
115*15dc779aSAndroid Build Coastguard Worker if ((num_ch - 1) == (i_ch) && (sample_rate == ptr_sample_rate_supported[i_sr])) {
116*15dc779aSAndroid Build Coastguard Worker for (i_entry = 0; i_entry < check_size - 1; i_entry++) {
117*15dc779aSAndroid Build Coastguard Worker if ((bitrate >= sbr_tune_table[i_sr][i_ch][i_entry].bitrate_from) &&
118*15dc779aSAndroid Build Coastguard Worker (bitrate < sbr_tune_table[i_sr][i_ch][i_entry].bitrate_to)) {
119*15dc779aSAndroid Build Coastguard Worker *ptr_idx_sr = i_sr;
120*15dc779aSAndroid Build Coastguard Worker *ptr_idx_ch = i_ch;
121*15dc779aSAndroid Build Coastguard Worker *ptr_idx_entry = i_entry;
122*15dc779aSAndroid Build Coastguard Worker return IXHEAACE_TABLE_IDX_FOUND;
123*15dc779aSAndroid Build Coastguard Worker } else {
124*15dc779aSAndroid Build Coastguard Worker if ((sbr_tune_table[i_sr][i_ch][i_entry].bitrate_from > bitrate) &&
125*15dc779aSAndroid Build Coastguard Worker (sbr_tune_table[i_sr][i_ch][i_entry].bitrate_from < br_closest_lower)) {
126*15dc779aSAndroid Build Coastguard Worker br_closest_lower = sbr_tune_table[i_sr][i_ch][i_entry].bitrate_from;
127*15dc779aSAndroid Build Coastguard Worker br_closest_lower_idx_sr = i_sr;
128*15dc779aSAndroid Build Coastguard Worker br_closest_lower_idx_ch = i_ch;
129*15dc779aSAndroid Build Coastguard Worker br_closest_lower_idx_entry = i_entry;
130*15dc779aSAndroid Build Coastguard Worker }
131*15dc779aSAndroid Build Coastguard Worker if ((sbr_tune_table[i_sr][i_ch][i_entry].bitrate_to <= bitrate) &&
132*15dc779aSAndroid Build Coastguard Worker (sbr_tune_table[i_sr][i_ch][i_entry].bitrate_to > br_closest_upper)) {
133*15dc779aSAndroid Build Coastguard Worker br_closest_upper = sbr_tune_table[i_sr][i_ch][i_entry].bitrate_to - 1;
134*15dc779aSAndroid Build Coastguard Worker br_closest_upper_idx_sr = i_sr;
135*15dc779aSAndroid Build Coastguard Worker br_closest_upper_idx_sch = i_ch;
136*15dc779aSAndroid Build Coastguard Worker br_closest_upper_idx_entry = i_entry;
137*15dc779aSAndroid Build Coastguard Worker }
138*15dc779aSAndroid Build Coastguard Worker }
139*15dc779aSAndroid Build Coastguard Worker
140*15dc779aSAndroid Build Coastguard Worker if (sbr_tune_table[i_sr][i_ch][i_entry + 1].bitrate_from == 0) {
141*15dc779aSAndroid Build Coastguard Worker *ptr_idx_sr = i_sr;
142*15dc779aSAndroid Build Coastguard Worker *ptr_idx_ch = i_ch;
143*15dc779aSAndroid Build Coastguard Worker *ptr_idx_entry = i_entry;
144*15dc779aSAndroid Build Coastguard Worker break;
145*15dc779aSAndroid Build Coastguard Worker }
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
151*15dc779aSAndroid Build Coastguard Worker if (br_closest_upper_idx_entry >= 0) {
152*15dc779aSAndroid Build Coastguard Worker return IXHEAACE_TABLE_IDX_FOUND;
153*15dc779aSAndroid Build Coastguard Worker }
154*15dc779aSAndroid Build Coastguard Worker
155*15dc779aSAndroid Build Coastguard Worker if (ptr_closest_br != NULL) {
156*15dc779aSAndroid Build Coastguard Worker if (found) {
157*15dc779aSAndroid Build Coastguard Worker WORD32 distance_upper = IXHEAACE_DISTANCE_CEIL_VALUE,
158*15dc779aSAndroid Build Coastguard Worker distance_lower = IXHEAACE_DISTANCE_CEIL_VALUE;
159*15dc779aSAndroid Build Coastguard Worker if (br_closest_lower_idx_entry >= 0) {
160*15dc779aSAndroid Build Coastguard Worker distance_lower = sbr_tune_table[br_closest_lower_idx_sr][br_closest_lower_idx_ch]
161*15dc779aSAndroid Build Coastguard Worker [br_closest_lower_idx_entry]
162*15dc779aSAndroid Build Coastguard Worker .bitrate_from -
163*15dc779aSAndroid Build Coastguard Worker bitrate;
164*15dc779aSAndroid Build Coastguard Worker }
165*15dc779aSAndroid Build Coastguard Worker if (br_closest_upper_idx_entry >= 0) {
166*15dc779aSAndroid Build Coastguard Worker distance_upper =
167*15dc779aSAndroid Build Coastguard Worker bitrate - sbr_tune_table[br_closest_upper_idx_sr][br_closest_upper_idx_sch]
168*15dc779aSAndroid Build Coastguard Worker [br_closest_lower_idx_entry]
169*15dc779aSAndroid Build Coastguard Worker .bitrate_to;
170*15dc779aSAndroid Build Coastguard Worker }
171*15dc779aSAndroid Build Coastguard Worker
172*15dc779aSAndroid Build Coastguard Worker *ptr_closest_br = (distance_upper < distance_lower) ? br_closest_upper : br_closest_lower;
173*15dc779aSAndroid Build Coastguard Worker } else {
174*15dc779aSAndroid Build Coastguard Worker *ptr_closest_br = 0;
175*15dc779aSAndroid Build Coastguard Worker }
176*15dc779aSAndroid Build Coastguard Worker }
177*15dc779aSAndroid Build Coastguard Worker
178*15dc779aSAndroid Build Coastguard Worker return IXHEAACE_TABLE_IDX_NOT_FOUND;
179*15dc779aSAndroid Build Coastguard Worker }
180*15dc779aSAndroid Build Coastguard Worker
ixheaace_create_env_channel(WORD32 ch,ixheaace_pstr_sbr_config_data pstr_sbr_cfg,ixheaace_pstr_sbr_hdr_data pstr_sbr_hdr,ixheaace_pstr_enc_channel pstr_env,ixheaace_pstr_sbr_cfg params,WORD32 * ptr_common_buf,WORD32 * ptr_common_buffer2,FLOAT32 * ptr_sbr_env_r_buf,FLOAT32 * ptr_sbr_env_i_buf,ixheaace_str_sbr_tabs * pstr_sbr_tab)181*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ixheaace_create_env_channel(
182*15dc779aSAndroid Build Coastguard Worker WORD32 ch, ixheaace_pstr_sbr_config_data pstr_sbr_cfg,
183*15dc779aSAndroid Build Coastguard Worker ixheaace_pstr_sbr_hdr_data pstr_sbr_hdr, ixheaace_pstr_enc_channel pstr_env,
184*15dc779aSAndroid Build Coastguard Worker ixheaace_pstr_sbr_cfg params, WORD32 *ptr_common_buf, WORD32 *ptr_common_buffer2,
185*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_sbr_env_r_buf, FLOAT32 *ptr_sbr_env_i_buf, ixheaace_str_sbr_tabs *pstr_sbr_tab) {
186*15dc779aSAndroid Build Coastguard Worker WORD32 e = 1;
187*15dc779aSAndroid Build Coastguard Worker WORD32 tran_fc = 0;
188*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err_code = IA_NO_ERROR;
189*15dc779aSAndroid Build Coastguard Worker
190*15dc779aSAndroid Build Coastguard Worker WORD32 start_index;
191*15dc779aSAndroid Build Coastguard Worker WORD32 noise_groups[2] = {3, 3};
192*15dc779aSAndroid Build Coastguard Worker
193*15dc779aSAndroid Build Coastguard Worker e = ixheaac_shl32(1, params->e);
194*15dc779aSAndroid Build Coastguard Worker
195*15dc779aSAndroid Build Coastguard Worker if (params->use_low_freq_res == 1) {
196*15dc779aSAndroid Build Coastguard Worker pstr_env->enc_env_data.freq_res_fix = FREQ_RES_LOW;
197*15dc779aSAndroid Build Coastguard Worker } else {
198*15dc779aSAndroid Build Coastguard Worker pstr_env->enc_env_data.freq_res_fix = FREQ_RES_HIGH;
199*15dc779aSAndroid Build Coastguard Worker }
200*15dc779aSAndroid Build Coastguard Worker
201*15dc779aSAndroid Build Coastguard Worker pstr_env->enc_env_data.sbr_xpos_mode = (ixheaace_sbr_xpos_mode)params->sbr_xpos_mode;
202*15dc779aSAndroid Build Coastguard Worker pstr_env->enc_env_data.sbr_xpos_ctrl = params->sbr_xpos_ctrl;
203*15dc779aSAndroid Build Coastguard Worker
204*15dc779aSAndroid Build Coastguard Worker if (params->is_ld_sbr) {
205*15dc779aSAndroid Build Coastguard Worker pstr_env->str_sbr_qmf.num_time_slots = 16;
206*15dc779aSAndroid Build Coastguard Worker pstr_env->str_sbr_qmf.rate = 1;
207*15dc779aSAndroid Build Coastguard Worker if (params->frame_flag_480 == 1) {
208*15dc779aSAndroid Build Coastguard Worker pstr_env->str_sbr_qmf.num_time_slots = 15;
209*15dc779aSAndroid Build Coastguard Worker }
210*15dc779aSAndroid Build Coastguard Worker } else {
211*15dc779aSAndroid Build Coastguard Worker pstr_env->str_sbr_qmf.num_time_slots = 16;
212*15dc779aSAndroid Build Coastguard Worker pstr_env->str_sbr_qmf.rate = 2;
213*15dc779aSAndroid Build Coastguard Worker if (params->frame_flag_960 == 1) {
214*15dc779aSAndroid Build Coastguard Worker pstr_env->str_sbr_qmf.num_time_slots = 15;
215*15dc779aSAndroid Build Coastguard Worker }
216*15dc779aSAndroid Build Coastguard Worker if (pstr_sbr_cfg->sbr_codec == USAC_SBR) {
217*15dc779aSAndroid Build Coastguard Worker if (USAC_SBR_RATIO_INDEX_4_1 == pstr_sbr_cfg->sbr_ratio_idx) {
218*15dc779aSAndroid Build Coastguard Worker pstr_env->str_sbr_qmf.rate = 4;
219*15dc779aSAndroid Build Coastguard Worker }
220*15dc779aSAndroid Build Coastguard Worker }
221*15dc779aSAndroid Build Coastguard Worker }
222*15dc779aSAndroid Build Coastguard Worker
223*15dc779aSAndroid Build Coastguard Worker ixheaace_create_qmf_bank(&pstr_env->str_sbr_qmf, pstr_sbr_tab, params->is_ld_sbr);
224*15dc779aSAndroid Build Coastguard Worker
225*15dc779aSAndroid Build Coastguard Worker start_index = 576;
226*15dc779aSAndroid Build Coastguard Worker
227*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_create_ton_corr_param_extr(
228*15dc779aSAndroid Build Coastguard Worker ch, &pstr_env->str_ton_corr, pstr_sbr_cfg->sample_freq, 64, params->sbr_xpos_ctrl,
229*15dc779aSAndroid Build Coastguard Worker pstr_sbr_cfg->ptr_freq_band_tab[LOW_RES][0], pstr_sbr_cfg->ptr_v_k_master,
230*15dc779aSAndroid Build Coastguard Worker pstr_sbr_cfg->num_master, params->ana_max_level, pstr_sbr_cfg->ptr_freq_band_tab,
231*15dc779aSAndroid Build Coastguard Worker pstr_sbr_cfg->num_scf, pstr_sbr_hdr->sbr_noise_bands, params->use_speech_config,
232*15dc779aSAndroid Build Coastguard Worker ptr_common_buf, pstr_sbr_tab->ptr_qmf_tab, params->is_ld_sbr);
233*15dc779aSAndroid Build Coastguard Worker if (err_code) {
234*15dc779aSAndroid Build Coastguard Worker return err_code;
235*15dc779aSAndroid Build Coastguard Worker }
236*15dc779aSAndroid Build Coastguard Worker
237*15dc779aSAndroid Build Coastguard Worker pstr_env->enc_env_data.noise_band_count =
238*15dc779aSAndroid Build Coastguard Worker pstr_env->str_ton_corr.sbr_noise_floor_est.num_of_noise_bands;
239*15dc779aSAndroid Build Coastguard Worker
240*15dc779aSAndroid Build Coastguard Worker noise_groups[0] = pstr_env->enc_env_data.noise_band_count;
241*15dc779aSAndroid Build Coastguard Worker noise_groups[1] = pstr_env->enc_env_data.noise_band_count;
242*15dc779aSAndroid Build Coastguard Worker
243*15dc779aSAndroid Build Coastguard Worker pstr_env->enc_env_data.sbr_invf_mode = (ixheaace_invf_mode)params->sbr_invf_mode;
244*15dc779aSAndroid Build Coastguard Worker
245*15dc779aSAndroid Build Coastguard Worker if (pstr_env->enc_env_data.sbr_invf_mode == IXHEAACE_INVF_SWITCHED) {
246*15dc779aSAndroid Build Coastguard Worker pstr_env->enc_env_data.sbr_invf_mode = IXHEAACE_INVF_MID_LEVEL;
247*15dc779aSAndroid Build Coastguard Worker pstr_env->str_ton_corr.switch_inverse_filt = TRUE;
248*15dc779aSAndroid Build Coastguard Worker } else {
249*15dc779aSAndroid Build Coastguard Worker pstr_env->str_ton_corr.switch_inverse_filt = FALSE;
250*15dc779aSAndroid Build Coastguard Worker }
251*15dc779aSAndroid Build Coastguard Worker
252*15dc779aSAndroid Build Coastguard Worker tran_fc = params->tran_fc;
253*15dc779aSAndroid Build Coastguard Worker
254*15dc779aSAndroid Build Coastguard Worker if (tran_fc == 0) {
255*15dc779aSAndroid Build Coastguard Worker tran_fc = ixheaac_min32(5000, ixheaace_get_sbr_start_freq_raw(pstr_sbr_hdr->sbr_start_freq,
256*15dc779aSAndroid Build Coastguard Worker 64, pstr_sbr_cfg->sample_freq));
257*15dc779aSAndroid Build Coastguard Worker }
258*15dc779aSAndroid Build Coastguard Worker
259*15dc779aSAndroid Build Coastguard Worker tran_fc = (tran_fc * 4 * 64 / pstr_sbr_cfg->sample_freq + 1) >> 1;
260*15dc779aSAndroid Build Coastguard Worker if (params->sbr_codec == USAC_SBR) {
261*15dc779aSAndroid Build Coastguard Worker pstr_env->str_sbr_extract_env.sbr_ratio_idx = params->sbr_ratio_idx;
262*15dc779aSAndroid Build Coastguard Worker }
263*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_create_extract_sbr_envelope(
264*15dc779aSAndroid Build Coastguard Worker ch, &pstr_env->str_sbr_extract_env, start_index, ptr_common_buffer2, ptr_sbr_env_r_buf,
265*15dc779aSAndroid Build Coastguard Worker ptr_sbr_env_i_buf, params->is_ld_sbr, params->frame_flag_480, params->sbr_codec);
266*15dc779aSAndroid Build Coastguard Worker if (err_code) {
267*15dc779aSAndroid Build Coastguard Worker return err_code;
268*15dc779aSAndroid Build Coastguard Worker }
269*15dc779aSAndroid Build Coastguard Worker
270*15dc779aSAndroid Build Coastguard Worker ixheaace_create_sbr_code_envelope(&pstr_env->str_sbr_code_env, pstr_sbr_cfg->num_scf,
271*15dc779aSAndroid Build Coastguard Worker params->delta_t_across_frames, params->df_edge_1st_env,
272*15dc779aSAndroid Build Coastguard Worker params->df_edge_incr);
273*15dc779aSAndroid Build Coastguard Worker
274*15dc779aSAndroid Build Coastguard Worker ixheaace_create_sbr_code_envelope(&pstr_env->str_sbr_code_noise_floor, noise_groups,
275*15dc779aSAndroid Build Coastguard Worker params->delta_t_across_frames, 0, 0);
276*15dc779aSAndroid Build Coastguard Worker
277*15dc779aSAndroid Build Coastguard Worker pstr_env->sbr_amp_res_init = pstr_sbr_hdr->sbr_amp_res;
278*15dc779aSAndroid Build Coastguard Worker
279*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_init_sbr_huffman_tabs(
280*15dc779aSAndroid Build Coastguard Worker &pstr_env->enc_env_data, &pstr_env->str_sbr_code_env, &pstr_env->str_sbr_code_noise_floor,
281*15dc779aSAndroid Build Coastguard Worker pstr_env->sbr_amp_res_init, pstr_sbr_tab->ptr_sbr_huff_tab);
282*15dc779aSAndroid Build Coastguard Worker if (err_code) {
283*15dc779aSAndroid Build Coastguard Worker return err_code;
284*15dc779aSAndroid Build Coastguard Worker }
285*15dc779aSAndroid Build Coastguard Worker
286*15dc779aSAndroid Build Coastguard Worker ixheaace_create_frame_info_generator(&pstr_env->str_sbr_env_frame, params->spread, e,
287*15dc779aSAndroid Build Coastguard Worker params->stat, pstr_env->enc_env_data.freq_res_fix,
288*15dc779aSAndroid Build Coastguard Worker params->use_low_freq_res);
289*15dc779aSAndroid Build Coastguard Worker
290*15dc779aSAndroid Build Coastguard Worker ixheaace_create_sbr_transient_detector(
291*15dc779aSAndroid Build Coastguard Worker &pstr_env->str_sbr_trans_detector, pstr_sbr_cfg->sample_freq,
292*15dc779aSAndroid Build Coastguard Worker params->codec_settings.standard_bitrate * params->codec_settings.num_channels,
293*15dc779aSAndroid Build Coastguard Worker params->codec_settings.bit_rate, params->tran_thr, params->tran_det_mode, tran_fc,
294*15dc779aSAndroid Build Coastguard Worker params->frame_flag_480, params->is_ld_sbr, params->sbr_ratio_idx, params->sbr_codec,
295*15dc779aSAndroid Build Coastguard Worker pstr_sbr_cfg->ptr_freq_band_tab[0][0]);
296*15dc779aSAndroid Build Coastguard Worker
297*15dc779aSAndroid Build Coastguard Worker pstr_sbr_cfg->xpos_control_switch = params->sbr_xpos_ctrl;
298*15dc779aSAndroid Build Coastguard Worker pstr_env->enc_env_data.no_harmonics = pstr_sbr_cfg->num_scf[HI];
299*15dc779aSAndroid Build Coastguard Worker pstr_env->enc_env_data.synthetic_coding = pstr_sbr_cfg->detect_missing_harmonics;
300*15dc779aSAndroid Build Coastguard Worker pstr_env->enc_env_data.add_harmonic_flag = 0;
301*15dc779aSAndroid Build Coastguard Worker ixheaace_init_esbr_inter_tes(&pstr_env->str_inter_tes_enc, params->sbr_ratio_idx);
302*15dc779aSAndroid Build Coastguard Worker pstr_env->enc_env_data.ptr_sbr_inter_tes_shape = pstr_env->str_inter_tes_enc.bs_tes_shape;
303*15dc779aSAndroid Build Coastguard Worker pstr_env->enc_env_data.ptr_sbr_inter_tes_shape_mode =
304*15dc779aSAndroid Build Coastguard Worker pstr_env->str_inter_tes_enc.bs_tes_shape_mode;
305*15dc779aSAndroid Build Coastguard Worker
306*15dc779aSAndroid Build Coastguard Worker if (params->sbr_codec == USAC_SBR) {
307*15dc779aSAndroid Build Coastguard Worker pstr_env->enc_env_data.harmonic_sbr = pstr_sbr_hdr->sbr_harmonic;
308*15dc779aSAndroid Build Coastguard Worker if (1 == pstr_env->enc_env_data.harmonic_sbr) {
309*15dc779aSAndroid Build Coastguard Worker WORD32 persist_mem_used = 0, bd;
310*15dc779aSAndroid Build Coastguard Worker WORD32 upsamp_4_flag, num_aac_samples, num_out_samples;
311*15dc779aSAndroid Build Coastguard Worker switch (pstr_sbr_cfg->sbr_ratio_idx) {
312*15dc779aSAndroid Build Coastguard Worker case USAC_SBR_RATIO_INDEX_2_1:
313*15dc779aSAndroid Build Coastguard Worker upsamp_4_flag = 0;
314*15dc779aSAndroid Build Coastguard Worker num_aac_samples = 1024;
315*15dc779aSAndroid Build Coastguard Worker num_out_samples = 2048;
316*15dc779aSAndroid Build Coastguard Worker break;
317*15dc779aSAndroid Build Coastguard Worker case USAC_SBR_RATIO_INDEX_4_1:
318*15dc779aSAndroid Build Coastguard Worker upsamp_4_flag = 1;
319*15dc779aSAndroid Build Coastguard Worker num_aac_samples = 1024;
320*15dc779aSAndroid Build Coastguard Worker num_out_samples = 4096;
321*15dc779aSAndroid Build Coastguard Worker break;
322*15dc779aSAndroid Build Coastguard Worker case USAC_SBR_RATIO_INDEX_8_3:
323*15dc779aSAndroid Build Coastguard Worker upsamp_4_flag = 0;
324*15dc779aSAndroid Build Coastguard Worker num_aac_samples = 768;
325*15dc779aSAndroid Build Coastguard Worker num_out_samples = 2048;
326*15dc779aSAndroid Build Coastguard Worker break;
327*15dc779aSAndroid Build Coastguard Worker default:
328*15dc779aSAndroid Build Coastguard Worker upsamp_4_flag = 0;
329*15dc779aSAndroid Build Coastguard Worker num_aac_samples = 1024;
330*15dc779aSAndroid Build Coastguard Worker num_out_samples = 2048;
331*15dc779aSAndroid Build Coastguard Worker break;
332*15dc779aSAndroid Build Coastguard Worker }
333*15dc779aSAndroid Build Coastguard Worker
334*15dc779aSAndroid Build Coastguard Worker ixheaace_esbr_hbe_data_init(
335*15dc779aSAndroid Build Coastguard Worker pstr_env->pstr_hbe_enc->pstr_hbe_txposer, num_aac_samples, upsamp_4_flag,
336*15dc779aSAndroid Build Coastguard Worker num_out_samples, pstr_env->pstr_hbe_enc->ptr_hbe_txposer_buffers, &persist_mem_used);
337*15dc779aSAndroid Build Coastguard Worker
338*15dc779aSAndroid Build Coastguard Worker ixheaace_esbr_qmf_init(&(pstr_env->pstr_hbe_enc->str_codec_qmf_bank),
339*15dc779aSAndroid Build Coastguard Worker pstr_sbr_cfg->sbr_ratio_idx, num_out_samples);
340*15dc779aSAndroid Build Coastguard Worker
341*15dc779aSAndroid Build Coastguard Worker for (bd = 0; bd < (IXHEAACE_MAX_FREQ_COEFFS / 2 + 1); bd++) {
342*15dc779aSAndroid Build Coastguard Worker pstr_env->pstr_hbe_enc->pstr_hbe_txposer->freq_band_tbl_lo[bd] =
343*15dc779aSAndroid Build Coastguard Worker pstr_sbr_cfg->sbr_freq_band_tab_lo[bd];
344*15dc779aSAndroid Build Coastguard Worker pstr_env->pstr_hbe_enc->pstr_hbe_txposer->freq_band_tbl_hi[bd] =
345*15dc779aSAndroid Build Coastguard Worker pstr_sbr_cfg->sbr_freq_band_tab_hi[bd];
346*15dc779aSAndroid Build Coastguard Worker }
347*15dc779aSAndroid Build Coastguard Worker
348*15dc779aSAndroid Build Coastguard Worker for (; bd < (IXHEAACE_MAX_FREQ_COEFFS + 1); bd++) {
349*15dc779aSAndroid Build Coastguard Worker pstr_env->pstr_hbe_enc->pstr_hbe_txposer->freq_band_tbl_hi[bd] =
350*15dc779aSAndroid Build Coastguard Worker pstr_sbr_cfg->sbr_freq_band_tab_hi[bd];
351*15dc779aSAndroid Build Coastguard Worker }
352*15dc779aSAndroid Build Coastguard Worker
353*15dc779aSAndroid Build Coastguard Worker pstr_env->pstr_hbe_enc->pstr_hbe_txposer->ptr_freq_band_tab[LO] =
354*15dc779aSAndroid Build Coastguard Worker pstr_env->pstr_hbe_enc->pstr_hbe_txposer->freq_band_tbl_lo;
355*15dc779aSAndroid Build Coastguard Worker pstr_env->pstr_hbe_enc->pstr_hbe_txposer->ptr_freq_band_tab[HI] =
356*15dc779aSAndroid Build Coastguard Worker pstr_env->pstr_hbe_enc->pstr_hbe_txposer->freq_band_tbl_hi;
357*15dc779aSAndroid Build Coastguard Worker pstr_env->pstr_hbe_enc->pstr_hbe_txposer->num_sf_bands[0] =
358*15dc779aSAndroid Build Coastguard Worker (WORD16)pstr_sbr_cfg->num_scf[0];
359*15dc779aSAndroid Build Coastguard Worker pstr_env->pstr_hbe_enc->pstr_hbe_txposer->num_sf_bands[1] =
360*15dc779aSAndroid Build Coastguard Worker (WORD16)pstr_sbr_cfg->num_scf[1];
361*15dc779aSAndroid Build Coastguard Worker pstr_env->pstr_hbe_enc->pstr_hbe_txposer->upsamp_4_flag = upsamp_4_flag;
362*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_dft_hbe_data_reinit(pstr_env->pstr_hbe_enc->pstr_hbe_txposer);
363*15dc779aSAndroid Build Coastguard Worker if (err_code) {
364*15dc779aSAndroid Build Coastguard Worker return err_code;
365*15dc779aSAndroid Build Coastguard Worker }
366*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_qmf_hbe_data_reinit(pstr_env->pstr_hbe_enc->pstr_hbe_txposer);
367*15dc779aSAndroid Build Coastguard Worker if (err_code) {
368*15dc779aSAndroid Build Coastguard Worker return err_code;
369*15dc779aSAndroid Build Coastguard Worker }
370*15dc779aSAndroid Build Coastguard Worker }
371*15dc779aSAndroid Build Coastguard Worker } else
372*15dc779aSAndroid Build Coastguard Worker
373*15dc779aSAndroid Build Coastguard Worker {
374*15dc779aSAndroid Build Coastguard Worker pstr_env->enc_env_data.harmonic_sbr = 0;
375*15dc779aSAndroid Build Coastguard Worker }
376*15dc779aSAndroid Build Coastguard Worker
377*15dc779aSAndroid Build Coastguard Worker return err_code;
378*15dc779aSAndroid Build Coastguard Worker }
379*15dc779aSAndroid Build Coastguard Worker
380*15dc779aSAndroid Build Coastguard Worker UWORD32
ixheaace_is_sbr_setting_available(UWORD32 bitrate,UWORD32 num_output_channels,UWORD32 sample_rate_input,UWORD32 * ptr_core_sr,ixheaace_str_qmf_tabs * pstr_qmf_tab,WORD32 aot)381*15dc779aSAndroid Build Coastguard Worker ixheaace_is_sbr_setting_available(UWORD32 bitrate, UWORD32 num_output_channels,
382*15dc779aSAndroid Build Coastguard Worker UWORD32 sample_rate_input, UWORD32 *ptr_core_sr,
383*15dc779aSAndroid Build Coastguard Worker ixheaace_str_qmf_tabs *pstr_qmf_tab, WORD32 aot) {
384*15dc779aSAndroid Build Coastguard Worker FLAG table_found = IXHEAACE_TABLE_IDX_NOT_FOUND;
385*15dc779aSAndroid Build Coastguard Worker WORD32 idx_sr;
386*15dc779aSAndroid Build Coastguard Worker WORD32 idx_ch;
387*15dc779aSAndroid Build Coastguard Worker WORD32 idx_entry;
388*15dc779aSAndroid Build Coastguard Worker
389*15dc779aSAndroid Build Coastguard Worker switch (num_output_channels) {
390*15dc779aSAndroid Build Coastguard Worker case MONO:
391*15dc779aSAndroid Build Coastguard Worker if (sample_rate_input < 16000 || sample_rate_input > 48000) {
392*15dc779aSAndroid Build Coastguard Worker return 0;
393*15dc779aSAndroid Build Coastguard Worker }
394*15dc779aSAndroid Build Coastguard Worker case STEREO:
395*15dc779aSAndroid Build Coastguard Worker if (sample_rate_input < 32000 || sample_rate_input > 48000) {
396*15dc779aSAndroid Build Coastguard Worker return 0;
397*15dc779aSAndroid Build Coastguard Worker }
398*15dc779aSAndroid Build Coastguard Worker }
399*15dc779aSAndroid Build Coastguard Worker
400*15dc779aSAndroid Build Coastguard Worker *ptr_core_sr = sample_rate_input / 2;
401*15dc779aSAndroid Build Coastguard Worker
402*15dc779aSAndroid Build Coastguard Worker table_found = ia_enhaacplus_enc_get_sbr_tuning_table_idx(
403*15dc779aSAndroid Build Coastguard Worker bitrate, num_output_channels, *ptr_core_sr, pstr_qmf_tab, NULL, &idx_sr, &idx_ch,
404*15dc779aSAndroid Build Coastguard Worker &idx_entry,
405*15dc779aSAndroid Build Coastguard Worker ((AOT_AAC_ELD == aot) ? pstr_qmf_tab->sbr_tuning_table_ld
406*15dc779aSAndroid Build Coastguard Worker : pstr_qmf_tab->sbr_tuning_table_lc));
407*15dc779aSAndroid Build Coastguard Worker
408*15dc779aSAndroid Build Coastguard Worker return (table_found == IXHEAACE_TABLE_IDX_NOT_FOUND) ? 0 : 1;
409*15dc779aSAndroid Build Coastguard Worker }
410*15dc779aSAndroid Build Coastguard Worker
ixheaace_sbr_limit_bitrate(UWORD32 bit_rate,UWORD32 num_ch,UWORD32 core_sample_rate,ixheaace_str_qmf_tabs * pstr_qmf_tab,WORD32 aot)411*15dc779aSAndroid Build Coastguard Worker UWORD32 ixheaace_sbr_limit_bitrate(UWORD32 bit_rate, UWORD32 num_ch, UWORD32 core_sample_rate,
412*15dc779aSAndroid Build Coastguard Worker ixheaace_str_qmf_tabs *pstr_qmf_tab, WORD32 aot) {
413*15dc779aSAndroid Build Coastguard Worker UWORD32 new_bit_rate;
414*15dc779aSAndroid Build Coastguard Worker WORD32 index;
415*15dc779aSAndroid Build Coastguard Worker WORD32 idx_sr;
416*15dc779aSAndroid Build Coastguard Worker WORD32 idx_ch;
417*15dc779aSAndroid Build Coastguard Worker WORD32 idx_entry;
418*15dc779aSAndroid Build Coastguard Worker
419*15dc779aSAndroid Build Coastguard Worker index = ia_enhaacplus_enc_get_sbr_tuning_table_idx(
420*15dc779aSAndroid Build Coastguard Worker bit_rate, num_ch, core_sample_rate, pstr_qmf_tab, &new_bit_rate, &idx_sr, &idx_ch,
421*15dc779aSAndroid Build Coastguard Worker &idx_entry,
422*15dc779aSAndroid Build Coastguard Worker ((AOT_AAC_ELD == aot) ? pstr_qmf_tab->sbr_tuning_table_ld
423*15dc779aSAndroid Build Coastguard Worker : pstr_qmf_tab->sbr_tuning_table_lc));
424*15dc779aSAndroid Build Coastguard Worker if (index != IXHEAACE_TABLE_IDX_NOT_FOUND) {
425*15dc779aSAndroid Build Coastguard Worker new_bit_rate = bit_rate;
426*15dc779aSAndroid Build Coastguard Worker }
427*15dc779aSAndroid Build Coastguard Worker
428*15dc779aSAndroid Build Coastguard Worker return new_bit_rate;
429*15dc779aSAndroid Build Coastguard Worker }
430*15dc779aSAndroid Build Coastguard Worker
ixheaace_adjust_sbr_settings(const ixheaace_pstr_sbr_cfg pstr_config,UWORD32 bit_rate,UWORD32 num_ch,UWORD32 fs_core,UWORD32 trans_fac,UWORD32 std_br,ixheaace_str_qmf_tabs * pstr_qmf_tab,WORD32 aot)431*15dc779aSAndroid Build Coastguard Worker VOID ixheaace_adjust_sbr_settings(const ixheaace_pstr_sbr_cfg pstr_config, UWORD32 bit_rate,
432*15dc779aSAndroid Build Coastguard Worker UWORD32 num_ch, UWORD32 fs_core, UWORD32 trans_fac,
433*15dc779aSAndroid Build Coastguard Worker UWORD32 std_br, ixheaace_str_qmf_tabs *pstr_qmf_tab,
434*15dc779aSAndroid Build Coastguard Worker WORD32 aot) {
435*15dc779aSAndroid Build Coastguard Worker FLAG table_found = IXHEAACE_TABLE_IDX_NOT_FOUND;
436*15dc779aSAndroid Build Coastguard Worker WORD32 idx_sr = 0;
437*15dc779aSAndroid Build Coastguard Worker WORD32 idx_ch = 0;
438*15dc779aSAndroid Build Coastguard Worker WORD32 idx_entry = 0;
439*15dc779aSAndroid Build Coastguard Worker /* set the codec settings */
440*15dc779aSAndroid Build Coastguard Worker pstr_config->codec_settings.bit_rate = bit_rate;
441*15dc779aSAndroid Build Coastguard Worker pstr_config->codec_settings.num_channels = num_ch;
442*15dc779aSAndroid Build Coastguard Worker pstr_config->codec_settings.sample_freq = fs_core;
443*15dc779aSAndroid Build Coastguard Worker pstr_config->codec_settings.trans_fac = trans_fac;
444*15dc779aSAndroid Build Coastguard Worker pstr_config->codec_settings.standard_bitrate = std_br;
445*15dc779aSAndroid Build Coastguard Worker
446*15dc779aSAndroid Build Coastguard Worker if (bit_rate <= 20000) {
447*15dc779aSAndroid Build Coastguard Worker pstr_config->parametric_coding = 0;
448*15dc779aSAndroid Build Coastguard Worker pstr_config->use_speech_config = 1;
449*15dc779aSAndroid Build Coastguard Worker }
450*15dc779aSAndroid Build Coastguard Worker
451*15dc779aSAndroid Build Coastguard Worker table_found = ia_enhaacplus_enc_get_sbr_tuning_table_idx(
452*15dc779aSAndroid Build Coastguard Worker bit_rate, num_ch, fs_core, pstr_qmf_tab, NULL, &idx_sr, &idx_ch, &idx_entry,
453*15dc779aSAndroid Build Coastguard Worker ((AOT_AAC_ELD == aot) ? pstr_qmf_tab->sbr_tuning_table_ld
454*15dc779aSAndroid Build Coastguard Worker : pstr_qmf_tab->sbr_tuning_table_lc));
455*15dc779aSAndroid Build Coastguard Worker
456*15dc779aSAndroid Build Coastguard Worker if (table_found == IXHEAACE_TABLE_IDX_NOT_FOUND) {
457*15dc779aSAndroid Build Coastguard Worker if (aot == AOT_USAC) {
458*15dc779aSAndroid Build Coastguard Worker if (num_ch == 1) {
459*15dc779aSAndroid Build Coastguard Worker if (bit_rate >= 30000) {
460*15dc779aSAndroid Build Coastguard Worker pstr_config->start_freq = 7;
461*15dc779aSAndroid Build Coastguard Worker pstr_config->stop_freq = 9;
462*15dc779aSAndroid Build Coastguard Worker } else {
463*15dc779aSAndroid Build Coastguard Worker pstr_config->start_freq = 5;
464*15dc779aSAndroid Build Coastguard Worker pstr_config->stop_freq = 7;
465*15dc779aSAndroid Build Coastguard Worker }
466*15dc779aSAndroid Build Coastguard Worker } else {
467*15dc779aSAndroid Build Coastguard Worker pstr_config->start_freq = 12;
468*15dc779aSAndroid Build Coastguard Worker pstr_config->stop_freq = 9;
469*15dc779aSAndroid Build Coastguard Worker }
470*15dc779aSAndroid Build Coastguard Worker }
471*15dc779aSAndroid Build Coastguard Worker } else {
472*15dc779aSAndroid Build Coastguard Worker switch (aot) {
473*15dc779aSAndroid Build Coastguard Worker case AOT_AAC_ELD: {
474*15dc779aSAndroid Build Coastguard Worker pstr_config->start_freq =
475*15dc779aSAndroid Build Coastguard Worker pstr_qmf_tab->sbr_tuning_table_ld[idx_sr][idx_ch][idx_entry].freq_band.start_freq;
476*15dc779aSAndroid Build Coastguard Worker pstr_config->stop_freq =
477*15dc779aSAndroid Build Coastguard Worker pstr_qmf_tab->sbr_tuning_table_ld[idx_sr][idx_ch][idx_entry].freq_band.stop_freq;
478*15dc779aSAndroid Build Coastguard Worker
479*15dc779aSAndroid Build Coastguard Worker pstr_config->sbr_noise_bands =
480*15dc779aSAndroid Build Coastguard Worker pstr_qmf_tab->sbr_tuning_table_ld[idx_sr][idx_ch][idx_entry].noise.num_noise_bands;
481*15dc779aSAndroid Build Coastguard Worker
482*15dc779aSAndroid Build Coastguard Worker pstr_config->noise_floor_offset =
483*15dc779aSAndroid Build Coastguard Worker pstr_qmf_tab->sbr_tuning_table_ld[idx_sr][idx_ch][idx_entry].noise.noise_floor_offset;
484*15dc779aSAndroid Build Coastguard Worker
485*15dc779aSAndroid Build Coastguard Worker pstr_config->ana_max_level =
486*15dc779aSAndroid Build Coastguard Worker pstr_qmf_tab->sbr_tuning_table_ld[idx_sr][idx_ch][idx_entry].noise.noise_max_level;
487*15dc779aSAndroid Build Coastguard Worker pstr_config->stereo_mode =
488*15dc779aSAndroid Build Coastguard Worker pstr_qmf_tab->sbr_tuning_table_ld[idx_sr][idx_ch][idx_entry].stereo_mode;
489*15dc779aSAndroid Build Coastguard Worker pstr_config->freq_scale =
490*15dc779aSAndroid Build Coastguard Worker pstr_qmf_tab->sbr_tuning_table_ld[idx_sr][idx_ch][idx_entry].freq_scale;
491*15dc779aSAndroid Build Coastguard Worker break;
492*15dc779aSAndroid Build Coastguard Worker }
493*15dc779aSAndroid Build Coastguard Worker default: {
494*15dc779aSAndroid Build Coastguard Worker pstr_config->start_freq =
495*15dc779aSAndroid Build Coastguard Worker pstr_qmf_tab->sbr_tuning_table_lc[idx_sr][idx_ch][idx_entry].freq_band.start_freq;
496*15dc779aSAndroid Build Coastguard Worker pstr_config->stop_freq =
497*15dc779aSAndroid Build Coastguard Worker pstr_qmf_tab->sbr_tuning_table_lc[idx_sr][idx_ch][idx_entry].freq_band.stop_freq;
498*15dc779aSAndroid Build Coastguard Worker
499*15dc779aSAndroid Build Coastguard Worker pstr_config->sbr_noise_bands =
500*15dc779aSAndroid Build Coastguard Worker pstr_qmf_tab->sbr_tuning_table_lc[idx_sr][idx_ch][idx_entry].noise.num_noise_bands;
501*15dc779aSAndroid Build Coastguard Worker
502*15dc779aSAndroid Build Coastguard Worker pstr_config->noise_floor_offset =
503*15dc779aSAndroid Build Coastguard Worker pstr_qmf_tab->sbr_tuning_table_lc[idx_sr][idx_ch][idx_entry].noise.noise_floor_offset;
504*15dc779aSAndroid Build Coastguard Worker
505*15dc779aSAndroid Build Coastguard Worker pstr_config->ana_max_level =
506*15dc779aSAndroid Build Coastguard Worker pstr_qmf_tab->sbr_tuning_table_lc[idx_sr][idx_ch][idx_entry].noise.noise_max_level;
507*15dc779aSAndroid Build Coastguard Worker pstr_config->stereo_mode =
508*15dc779aSAndroid Build Coastguard Worker pstr_qmf_tab->sbr_tuning_table_lc[idx_sr][idx_ch][idx_entry].stereo_mode;
509*15dc779aSAndroid Build Coastguard Worker pstr_config->freq_scale =
510*15dc779aSAndroid Build Coastguard Worker pstr_qmf_tab->sbr_tuning_table_lc[idx_sr][idx_ch][idx_entry].freq_scale;
511*15dc779aSAndroid Build Coastguard Worker break;
512*15dc779aSAndroid Build Coastguard Worker }
513*15dc779aSAndroid Build Coastguard Worker }
514*15dc779aSAndroid Build Coastguard Worker
515*15dc779aSAndroid Build Coastguard Worker if (pstr_config->sbr_codec == ELD_SBR) {
516*15dc779aSAndroid Build Coastguard Worker pstr_config->send_header_data_time = -1;
517*15dc779aSAndroid Build Coastguard Worker if ((num_ch == NUM_CHANS_MONO) && (bit_rate <= 22000)) {
518*15dc779aSAndroid Build Coastguard Worker pstr_config->use_low_freq_res = 1;
519*15dc779aSAndroid Build Coastguard Worker }
520*15dc779aSAndroid Build Coastguard Worker if ((num_ch == NUM_CHANS_STEREO) && (bit_rate <= 48000)) {
521*15dc779aSAndroid Build Coastguard Worker pstr_config->use_low_freq_res = 1;
522*15dc779aSAndroid Build Coastguard Worker }
523*15dc779aSAndroid Build Coastguard Worker }
524*15dc779aSAndroid Build Coastguard Worker else {
525*15dc779aSAndroid Build Coastguard Worker if ((num_ch == NUM_CHANS_MONO) && (bit_rate <= 18000)) {
526*15dc779aSAndroid Build Coastguard Worker pstr_config->use_low_freq_res = 1;
527*15dc779aSAndroid Build Coastguard Worker }
528*15dc779aSAndroid Build Coastguard Worker if ((num_ch == NUM_CHANS_STEREO) && (bit_rate <= 28000)) {
529*15dc779aSAndroid Build Coastguard Worker pstr_config->use_low_freq_res = 1;
530*15dc779aSAndroid Build Coastguard Worker }
531*15dc779aSAndroid Build Coastguard Worker }
532*15dc779aSAndroid Build Coastguard Worker if (bit_rate <= 20000) {
533*15dc779aSAndroid Build Coastguard Worker pstr_config->parametric_coding = 0;
534*15dc779aSAndroid Build Coastguard Worker pstr_config->use_speech_config = 1;
535*15dc779aSAndroid Build Coastguard Worker }
536*15dc779aSAndroid Build Coastguard Worker
537*15dc779aSAndroid Build Coastguard Worker if (pstr_config->use_ps) {
538*15dc779aSAndroid Build Coastguard Worker pstr_config->ps_mode = ixheaace_get_ps_mode(bit_rate);
539*15dc779aSAndroid Build Coastguard Worker }
540*15dc779aSAndroid Build Coastguard Worker }
541*15dc779aSAndroid Build Coastguard Worker }
542*15dc779aSAndroid Build Coastguard Worker
ixheaace_initialize_sbr_defaults(ixheaace_pstr_sbr_cfg pstr_config)543*15dc779aSAndroid Build Coastguard Worker VOID ixheaace_initialize_sbr_defaults(ixheaace_pstr_sbr_cfg pstr_config) {
544*15dc779aSAndroid Build Coastguard Worker pstr_config->send_header_data_time = 500;
545*15dc779aSAndroid Build Coastguard Worker pstr_config->crc_sbr = 0;
546*15dc779aSAndroid Build Coastguard Worker pstr_config->tran_thr = 13000;
547*15dc779aSAndroid Build Coastguard Worker pstr_config->detect_missing_harmonics = 1;
548*15dc779aSAndroid Build Coastguard Worker pstr_config->parametric_coding = 1;
549*15dc779aSAndroid Build Coastguard Worker pstr_config->use_speech_config = 0;
550*15dc779aSAndroid Build Coastguard Worker
551*15dc779aSAndroid Build Coastguard Worker pstr_config->sbr_data_extra = 0;
552*15dc779aSAndroid Build Coastguard Worker pstr_config->amp_res = IXHEAACE_SBR_AMP_RES_3_0;
553*15dc779aSAndroid Build Coastguard Worker pstr_config->tran_fc = 0;
554*15dc779aSAndroid Build Coastguard Worker pstr_config->tran_det_mode = 1;
555*15dc779aSAndroid Build Coastguard Worker pstr_config->spread = 1;
556*15dc779aSAndroid Build Coastguard Worker pstr_config->stat = 0;
557*15dc779aSAndroid Build Coastguard Worker pstr_config->e = 1;
558*15dc779aSAndroid Build Coastguard Worker pstr_config->delta_t_across_frames = 1;
559*15dc779aSAndroid Build Coastguard Worker pstr_config->df_edge_1st_env = 0.3f;
560*15dc779aSAndroid Build Coastguard Worker pstr_config->df_edge_incr = 0.3f;
561*15dc779aSAndroid Build Coastguard Worker
562*15dc779aSAndroid Build Coastguard Worker pstr_config->sbr_invf_mode = IXHEAACE_INVF_SWITCHED;
563*15dc779aSAndroid Build Coastguard Worker pstr_config->sbr_xpos_mode = IXHEAACE_XPOS_LC;
564*15dc779aSAndroid Build Coastguard Worker pstr_config->sbr_xpos_ctrl = SBR_XPOS_CTRL_DEFAULT;
565*15dc779aSAndroid Build Coastguard Worker pstr_config->sbr_xpos_lvl = 0;
566*15dc779aSAndroid Build Coastguard Worker
567*15dc779aSAndroid Build Coastguard Worker pstr_config->use_ps = 0;
568*15dc779aSAndroid Build Coastguard Worker pstr_config->ps_mode = -1;
569*15dc779aSAndroid Build Coastguard Worker
570*15dc779aSAndroid Build Coastguard Worker pstr_config->stereo_mode = IXHEAACE_SBR_MODE_SWITCH_LRC;
571*15dc779aSAndroid Build Coastguard Worker pstr_config->ana_max_level = 6;
572*15dc779aSAndroid Build Coastguard Worker pstr_config->noise_floor_offset = 0;
573*15dc779aSAndroid Build Coastguard Worker pstr_config->start_freq = 5;
574*15dc779aSAndroid Build Coastguard Worker pstr_config->stop_freq = 9;
575*15dc779aSAndroid Build Coastguard Worker
576*15dc779aSAndroid Build Coastguard Worker pstr_config->freq_scale = SBR_FREQ_SCALE_DEFAULT;
577*15dc779aSAndroid Build Coastguard Worker pstr_config->alter_scale = SBR_ALTER_SCALE_DEFAULT;
578*15dc779aSAndroid Build Coastguard Worker pstr_config->sbr_noise_bands = SBR_NOISE_BANDS_DEFAULT;
579*15dc779aSAndroid Build Coastguard Worker
580*15dc779aSAndroid Build Coastguard Worker pstr_config->sbr_limiter_bands = SBR_LIMITER_BANDS_DEFAULT;
581*15dc779aSAndroid Build Coastguard Worker pstr_config->sbr_limiter_gains = SBR_LIMITER_GAINS_DEFAULT;
582*15dc779aSAndroid Build Coastguard Worker pstr_config->sbr_interpol_freq = SBR_INTERPOL_FREQ_DEFAULT;
583*15dc779aSAndroid Build Coastguard Worker pstr_config->sbr_smoothing_length = SBR_SMOOTHING_LENGTH_DEFAULT;
584*15dc779aSAndroid Build Coastguard Worker pstr_config->is_ld_sbr = 0;
585*15dc779aSAndroid Build Coastguard Worker pstr_config->is_esbr = 0;
586*15dc779aSAndroid Build Coastguard Worker pstr_config->frame_flag_960 = 0;
587*15dc779aSAndroid Build Coastguard Worker pstr_config->frame_flag_480 = 0;
588*15dc779aSAndroid Build Coastguard Worker pstr_config->hq_esbr = 0;
589*15dc779aSAndroid Build Coastguard Worker pstr_config->sbr_pvc_active = 0;
590*15dc779aSAndroid Build Coastguard Worker pstr_config->sbr_harmonic = 0;
591*15dc779aSAndroid Build Coastguard Worker pstr_config->sbr_ratio_idx = 0; // NO_SBR
592*15dc779aSAndroid Build Coastguard Worker pstr_config->use_low_freq_res = 0;
593*15dc779aSAndroid Build Coastguard Worker }
594*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_update_freq_band_tab(ixheaace_pstr_sbr_config_data pstr_sbr_cfg,ixheaace_pstr_sbr_hdr_data pstr_sbr_hdr,WORD32 num_qmf_ch)595*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ia_enhaacplus_enc_update_freq_band_tab(
596*15dc779aSAndroid Build Coastguard Worker ixheaace_pstr_sbr_config_data pstr_sbr_cfg, ixheaace_pstr_sbr_hdr_data pstr_sbr_hdr,
597*15dc779aSAndroid Build Coastguard Worker WORD32 num_qmf_ch) {
598*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err_code = IA_NO_ERROR;
599*15dc779aSAndroid Build Coastguard Worker WORD32 k0, k2;
600*15dc779aSAndroid Build Coastguard Worker WORD32 samp_freq = pstr_sbr_cfg->sample_freq;
601*15dc779aSAndroid Build Coastguard Worker if ((pstr_sbr_cfg->sbr_codec == USAC_SBR) &&
602*15dc779aSAndroid Build Coastguard Worker (pstr_sbr_cfg->sbr_ratio_idx == USAC_SBR_RATIO_INDEX_4_1)) {
603*15dc779aSAndroid Build Coastguard Worker samp_freq = samp_freq / 2;
604*15dc779aSAndroid Build Coastguard Worker }
605*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_find_start_and_stop_band(
606*15dc779aSAndroid Build Coastguard Worker samp_freq, num_qmf_ch, pstr_sbr_hdr->sbr_start_freq, pstr_sbr_hdr->sbr_stop_freq,
607*15dc779aSAndroid Build Coastguard Worker pstr_sbr_hdr->sample_rate_mode, &k0, &k2, pstr_sbr_cfg->sbr_ratio_idx,
608*15dc779aSAndroid Build Coastguard Worker pstr_sbr_cfg->sbr_codec);
609*15dc779aSAndroid Build Coastguard Worker if (err_code) {
610*15dc779aSAndroid Build Coastguard Worker return err_code;
611*15dc779aSAndroid Build Coastguard Worker }
612*15dc779aSAndroid Build Coastguard Worker
613*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_update_freq_scale(
614*15dc779aSAndroid Build Coastguard Worker pstr_sbr_cfg->ptr_v_k_master, &pstr_sbr_cfg->num_master, k0, k2, pstr_sbr_hdr->freq_scale,
615*15dc779aSAndroid Build Coastguard Worker pstr_sbr_hdr->alter_scale, pstr_sbr_hdr->sample_rate_mode);
616*15dc779aSAndroid Build Coastguard Worker if (err_code) {
617*15dc779aSAndroid Build Coastguard Worker return err_code;
618*15dc779aSAndroid Build Coastguard Worker }
619*15dc779aSAndroid Build Coastguard Worker
620*15dc779aSAndroid Build Coastguard Worker pstr_sbr_hdr->sbr_xover_band = 0;
621*15dc779aSAndroid Build Coastguard Worker
622*15dc779aSAndroid Build Coastguard Worker ixheaace_update_high_res(pstr_sbr_cfg->ptr_freq_band_tab[HI], &pstr_sbr_cfg->num_scf[HI],
623*15dc779aSAndroid Build Coastguard Worker pstr_sbr_cfg->ptr_v_k_master, pstr_sbr_cfg->num_master,
624*15dc779aSAndroid Build Coastguard Worker &pstr_sbr_hdr->sbr_xover_band, pstr_sbr_hdr->sample_rate_mode,
625*15dc779aSAndroid Build Coastguard Worker num_qmf_ch);
626*15dc779aSAndroid Build Coastguard Worker
627*15dc779aSAndroid Build Coastguard Worker ixheaace_update_low_res(pstr_sbr_cfg->ptr_freq_band_tab[LO], &pstr_sbr_cfg->num_scf[LO],
628*15dc779aSAndroid Build Coastguard Worker pstr_sbr_cfg->ptr_freq_band_tab[HI], pstr_sbr_cfg->num_scf[HI]);
629*15dc779aSAndroid Build Coastguard Worker
630*15dc779aSAndroid Build Coastguard Worker pstr_sbr_cfg->xover_freq =
631*15dc779aSAndroid Build Coastguard Worker (pstr_sbr_cfg->ptr_freq_band_tab[LOW_RES][0] * pstr_sbr_cfg->sample_freq / num_qmf_ch +
632*15dc779aSAndroid Build Coastguard Worker 1) >>
633*15dc779aSAndroid Build Coastguard Worker 1;
634*15dc779aSAndroid Build Coastguard Worker
635*15dc779aSAndroid Build Coastguard Worker return err_code;
636*15dc779aSAndroid Build Coastguard Worker }
637*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_init_sbr_tabs(ixheaace_str_sbr_tabs * pstr_sbr_tabs)638*15dc779aSAndroid Build Coastguard Worker VOID ia_enhaacplus_enc_init_sbr_tabs(ixheaace_str_sbr_tabs *pstr_sbr_tabs) {
639*15dc779aSAndroid Build Coastguard Worker pstr_sbr_tabs->ptr_ps_tab = (ixheaace_str_ps_tab *)&ia_enhaacplus_enc_ps_tab;
640*15dc779aSAndroid Build Coastguard Worker pstr_sbr_tabs->ptr_qmf_tab = (ixheaace_str_qmf_tabs *)&ixheaace_qmf_tab;
641*15dc779aSAndroid Build Coastguard Worker pstr_sbr_tabs->ptr_sbr_huff_tab = (ixheaace_str_sbr_huff_tabs *)&ixheaace_sbr_huff_tab;
642*15dc779aSAndroid Build Coastguard Worker pstr_sbr_tabs->ptr_resamp_tab =
643*15dc779aSAndroid Build Coastguard Worker (ixheaace_resampler_table *)&ixheaace_resamp_2_to_1_iir_filt_params;
644*15dc779aSAndroid Build Coastguard Worker pstr_sbr_tabs->ptr_esbr_sfb_tab = (ixheaace_str_esbr_sfb_bin_tabs *)&ia_esbr_sfb_bin_tabs;
645*15dc779aSAndroid Build Coastguard Worker }
646*15dc779aSAndroid Build Coastguard Worker
647*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE
ixheaace_env_encode_frame(ixheaace_pstr_sbr_enc pstr_env_encoder,FLOAT32 * ptr_samples,FLOAT32 * ptr_core_buffer,UWORD32 time_sn_stride,UWORD8 * ptr_num_anc_bytes,UWORD8 * ptr_anc_data,ixheaace_str_sbr_tabs * pstr_sbr_tab,ixheaace_comm_tables * pstr_common_tab,UWORD8 * ptr_mps_data,WORD32 mps_bits,WORD32 flag_fl_small,WORD32 * usac_stat_bits)648*15dc779aSAndroid Build Coastguard Worker ixheaace_env_encode_frame(ixheaace_pstr_sbr_enc pstr_env_encoder, FLOAT32 *ptr_samples,
649*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_core_buffer, UWORD32 time_sn_stride,
650*15dc779aSAndroid Build Coastguard Worker UWORD8 *ptr_num_anc_bytes, UWORD8 *ptr_anc_data,
651*15dc779aSAndroid Build Coastguard Worker ixheaace_str_sbr_tabs *pstr_sbr_tab,
652*15dc779aSAndroid Build Coastguard Worker ixheaace_comm_tables *pstr_common_tab, UWORD8 *ptr_mps_data,
653*15dc779aSAndroid Build Coastguard Worker WORD32 mps_bits, WORD32 flag_fl_small, WORD32 *usac_stat_bits) {
654*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err_code = IA_NO_ERROR;
655*15dc779aSAndroid Build Coastguard Worker
656*15dc779aSAndroid Build Coastguard Worker if (pstr_env_encoder != NULL) {
657*15dc779aSAndroid Build Coastguard Worker ixheaace_pstr_sbr_bitstream_data pstr_sbr_bs = &pstr_env_encoder->str_sbr_bs;
658*15dc779aSAndroid Build Coastguard Worker
659*15dc779aSAndroid Build Coastguard Worker pstr_sbr_bs->header_active = 0;
660*15dc779aSAndroid Build Coastguard Worker if ((pstr_env_encoder->str_sbr_cfg.is_ld_sbr) &&
661*15dc779aSAndroid Build Coastguard Worker (pstr_sbr_bs->count_send_header_data == pstr_sbr_bs->nr_send_header_data - 1)) {
662*15dc779aSAndroid Build Coastguard Worker pstr_sbr_bs->header_active = 1;
663*15dc779aSAndroid Build Coastguard Worker }
664*15dc779aSAndroid Build Coastguard Worker
665*15dc779aSAndroid Build Coastguard Worker if (pstr_sbr_bs->count_send_header_data == 0) {
666*15dc779aSAndroid Build Coastguard Worker pstr_sbr_bs->header_active = 1;
667*15dc779aSAndroid Build Coastguard Worker }
668*15dc779aSAndroid Build Coastguard Worker
669*15dc779aSAndroid Build Coastguard Worker if (pstr_sbr_bs->nr_send_header_data == 0) {
670*15dc779aSAndroid Build Coastguard Worker pstr_sbr_bs->count_send_header_data = 1;
671*15dc779aSAndroid Build Coastguard Worker } else {
672*15dc779aSAndroid Build Coastguard Worker if (pstr_env_encoder->str_sbr_cfg.is_ld_sbr) {
673*15dc779aSAndroid Build Coastguard Worker if (pstr_sbr_bs->count_send_header_data >= 0) {
674*15dc779aSAndroid Build Coastguard Worker pstr_sbr_bs->count_send_header_data++;
675*15dc779aSAndroid Build Coastguard Worker
676*15dc779aSAndroid Build Coastguard Worker pstr_sbr_bs->count_send_header_data %= pstr_sbr_bs->nr_send_header_data;
677*15dc779aSAndroid Build Coastguard Worker }
678*15dc779aSAndroid Build Coastguard Worker } else {
679*15dc779aSAndroid Build Coastguard Worker pstr_sbr_bs->count_send_header_data++;
680*15dc779aSAndroid Build Coastguard Worker
681*15dc779aSAndroid Build Coastguard Worker pstr_sbr_bs->count_send_header_data %= pstr_sbr_bs->nr_send_header_data;
682*15dc779aSAndroid Build Coastguard Worker }
683*15dc779aSAndroid Build Coastguard Worker }
684*15dc779aSAndroid Build Coastguard Worker
685*15dc779aSAndroid Build Coastguard Worker ixheaace_init_sbr_bitstream(
686*15dc779aSAndroid Build Coastguard Worker &pstr_env_encoder->str_cmon_data, (UWORD8 *)pstr_env_encoder->sbr_payload,
687*15dc779aSAndroid Build Coastguard Worker sizeof(pstr_env_encoder->sbr_payload), pstr_env_encoder->str_sbr_bs.crc_active,
688*15dc779aSAndroid Build Coastguard Worker pstr_env_encoder->str_sbr_cfg.sbr_codec);
689*15dc779aSAndroid Build Coastguard Worker
690*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_extract_sbr_envelope(ptr_samples, ptr_core_buffer, time_sn_stride,
691*15dc779aSAndroid Build Coastguard Worker pstr_env_encoder, pstr_sbr_tab, pstr_common_tab,
692*15dc779aSAndroid Build Coastguard Worker flag_fl_small);
693*15dc779aSAndroid Build Coastguard Worker if (err_code) {
694*15dc779aSAndroid Build Coastguard Worker return err_code;
695*15dc779aSAndroid Build Coastguard Worker }
696*15dc779aSAndroid Build Coastguard Worker
697*15dc779aSAndroid Build Coastguard Worker if (mps_bits) {
698*15dc779aSAndroid Build Coastguard Worker WORD32 num_bytes;
699*15dc779aSAndroid Build Coastguard Worker if (pstr_env_encoder->str_sbr_cfg.sbr_codec == ELD_SBR) {
700*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(&pstr_env_encoder->str_cmon_data.str_sbr_bit_buf,
701*15dc779aSAndroid Build Coastguard Worker IXHEAACE_MPS_EXT_LDSAC_DATA, 4);
702*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(&pstr_env_encoder->str_cmon_data.str_sbr_bit_buf, *ptr_mps_data++, 4);
703*15dc779aSAndroid Build Coastguard Worker }
704*15dc779aSAndroid Build Coastguard Worker num_bytes = mps_bits >> 3;
705*15dc779aSAndroid Build Coastguard Worker for (WORD32 k = 0; k < num_bytes; k++) {
706*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(&pstr_env_encoder->str_cmon_data.str_sbr_bit_buf, *ptr_mps_data++, 8);
707*15dc779aSAndroid Build Coastguard Worker }
708*15dc779aSAndroid Build Coastguard Worker if (mps_bits & 0x7) {
709*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(&pstr_env_encoder->str_cmon_data.str_sbr_bit_buf,
710*15dc779aSAndroid Build Coastguard Worker (*ptr_mps_data++) >> (8 - (mps_bits & 0x7)), mps_bits & 0x7);
711*15dc779aSAndroid Build Coastguard Worker }
712*15dc779aSAndroid Build Coastguard Worker }
713*15dc779aSAndroid Build Coastguard Worker
714*15dc779aSAndroid Build Coastguard Worker ixheaace_assemble_sbr_bitstream(&pstr_env_encoder->str_cmon_data,
715*15dc779aSAndroid Build Coastguard Worker pstr_env_encoder->str_sbr_cfg.sbr_codec);
716*15dc779aSAndroid Build Coastguard Worker
717*15dc779aSAndroid Build Coastguard Worker pstr_env_encoder->sbr_payload_size =
718*15dc779aSAndroid Build Coastguard Worker ((ia_enhaacplus_enc_get_bits_available(&pstr_env_encoder->str_cmon_data.str_sbr_bit_buf) +
719*15dc779aSAndroid Build Coastguard Worker 7) /
720*15dc779aSAndroid Build Coastguard Worker 8);
721*15dc779aSAndroid Build Coastguard Worker
722*15dc779aSAndroid Build Coastguard Worker if (pstr_env_encoder->sbr_payload_size > IXHEAACE_MAX_PAYLOAD_SIZE) {
723*15dc779aSAndroid Build Coastguard Worker pstr_env_encoder->sbr_payload_size = 0;
724*15dc779aSAndroid Build Coastguard Worker }
725*15dc779aSAndroid Build Coastguard Worker
726*15dc779aSAndroid Build Coastguard Worker if (ptr_anc_data) {
727*15dc779aSAndroid Build Coastguard Worker *ptr_num_anc_bytes = (UWORD8)pstr_env_encoder->sbr_payload_size;
728*15dc779aSAndroid Build Coastguard Worker memcpy(ptr_anc_data, pstr_env_encoder->sbr_payload, pstr_env_encoder->sbr_payload_size);
729*15dc779aSAndroid Build Coastguard Worker }
730*15dc779aSAndroid Build Coastguard Worker if (usac_stat_bits) {
731*15dc779aSAndroid Build Coastguard Worker *usac_stat_bits = pstr_env_encoder->str_cmon_data.sbr_hdr_bits +
732*15dc779aSAndroid Build Coastguard Worker pstr_env_encoder->str_cmon_data.sbr_data_bits;
733*15dc779aSAndroid Build Coastguard Worker }
734*15dc779aSAndroid Build Coastguard Worker }
735*15dc779aSAndroid Build Coastguard Worker return err_code;
736*15dc779aSAndroid Build Coastguard Worker }
737*15dc779aSAndroid Build Coastguard Worker
ixheaace_sbr_enc_scr_size(VOID)738*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaace_sbr_enc_scr_size(VOID) {
739*15dc779aSAndroid Build Coastguard Worker return IXHEAAC_GET_SIZE_ALIGNED(sizeof(ixheaace_str_sbr_enc_scratch), BYTE_ALIGN_8);
740*15dc779aSAndroid Build Coastguard Worker }
741*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_get_scratch_bufs(VOID * ptr_scr,FLOAT32 ** ptr_shared_buf1,FLOAT32 ** ptr_shared_buf2)742*15dc779aSAndroid Build Coastguard Worker VOID ia_enhaacplus_enc_get_scratch_bufs(VOID *ptr_scr, FLOAT32 **ptr_shared_buf1,
743*15dc779aSAndroid Build Coastguard Worker FLOAT32 **ptr_shared_buf2) {
744*15dc779aSAndroid Build Coastguard Worker ixheaace_str_sbr_enc_scratch *ptr_sbr_enc_scr = (ixheaace_str_sbr_enc_scratch *)ptr_scr;
745*15dc779aSAndroid Build Coastguard Worker
746*15dc779aSAndroid Build Coastguard Worker *ptr_shared_buf1 = ptr_sbr_enc_scr->sbr_env_r_buf;
747*15dc779aSAndroid Build Coastguard Worker *ptr_shared_buf2 = ptr_sbr_enc_scr->sbr_env_i_buf;
748*15dc779aSAndroid Build Coastguard Worker }
749*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_get_shared_bufs(VOID * ptr_scr,WORD32 ** ptr_shared_buf1,WORD32 ** ptr_shared_buf2,WORD32 ** ptr_shared_buf3,WORD8 ** ptr_shared_buf4,WORD32 aacenc_blocksize)750*15dc779aSAndroid Build Coastguard Worker VOID ia_enhaacplus_enc_get_shared_bufs(VOID *ptr_scr, WORD32 **ptr_shared_buf1,
751*15dc779aSAndroid Build Coastguard Worker WORD32 **ptr_shared_buf2, WORD32 **ptr_shared_buf3,
752*15dc779aSAndroid Build Coastguard Worker WORD8 **ptr_shared_buf4, WORD32 aacenc_blocksize) {
753*15dc779aSAndroid Build Coastguard Worker ixheaace_str_sbr_enc_scratch *ptr_sbr_enc_scr = (ixheaace_str_sbr_enc_scratch *)ptr_scr;
754*15dc779aSAndroid Build Coastguard Worker
755*15dc779aSAndroid Build Coastguard Worker *ptr_shared_buf1 = (WORD32 *)ptr_sbr_enc_scr->ps_buf3;
756*15dc779aSAndroid Build Coastguard Worker *ptr_shared_buf2 = (WORD32 *)ptr_sbr_enc_scr->sbr_env_r_buf;
757*15dc779aSAndroid Build Coastguard Worker *ptr_shared_buf3 = (WORD32 *)ptr_sbr_enc_scr->sbr_env_i_buf;
758*15dc779aSAndroid Build Coastguard Worker *ptr_shared_buf4 =
759*15dc779aSAndroid Build Coastguard Worker (WORD8 *)&ptr_sbr_enc_scr
760*15dc779aSAndroid Build Coastguard Worker ->sbr_env_i_buf[IXHEAACE_QMF_TIME_SLOTS * IXHEAACE_QMF_CHANNELS + aacenc_blocksize];
761*15dc779aSAndroid Build Coastguard Worker }
762*15dc779aSAndroid Build Coastguard Worker
ixheaace_sbr_set_scratch_ptr(ixheaace_pstr_sbr_enc pstr_env_enc,VOID * ptr_scr)763*15dc779aSAndroid Build Coastguard Worker VOID ixheaace_sbr_set_scratch_ptr(ixheaace_pstr_sbr_enc pstr_env_enc, VOID *ptr_scr) {
764*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->ptr_sbr_enc_scr = ptr_scr;
765*15dc779aSAndroid Build Coastguard Worker }
766*15dc779aSAndroid Build Coastguard Worker
ixheaace_sbr_enc_pers_size(WORD32 num_ch,WORD32 use_ps,WORD32 harmonic_sbr)767*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaace_sbr_enc_pers_size(WORD32 num_ch, WORD32 use_ps, WORD32 harmonic_sbr) {
768*15dc779aSAndroid Build Coastguard Worker WORD32 num_bytes;
769*15dc779aSAndroid Build Coastguard Worker num_bytes = IXHEAAC_GET_SIZE_ALIGNED(sizeof(struct ixheaace_str_sbr_enc), BYTE_ALIGN_8);
770*15dc779aSAndroid Build Coastguard Worker num_bytes += (IXHEAAC_GET_SIZE_ALIGNED(sizeof(struct ixheaace_str_enc_channel), BYTE_ALIGN_8) *
771*15dc779aSAndroid Build Coastguard Worker num_ch);
772*15dc779aSAndroid Build Coastguard Worker num_bytes += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ixheaace_pvc_enc), BYTE_ALIGN_8);
773*15dc779aSAndroid Build Coastguard Worker num_bytes += (IXHEAAC_GET_SIZE_ALIGNED(2 * sizeof(FLOAT32) * QMF_FILTER_LENGTH, BYTE_ALIGN_8) *
774*15dc779aSAndroid Build Coastguard Worker num_ch);
775*15dc779aSAndroid Build Coastguard Worker if (1 == harmonic_sbr) {
776*15dc779aSAndroid Build Coastguard Worker num_bytes += (IXHEAAC_GET_SIZE_ALIGNED(sizeof(ixheaace_str_hbe_enc), BYTE_ALIGN_8) * num_ch);
777*15dc779aSAndroid Build Coastguard Worker num_bytes += (IXHEAAC_GET_SIZE_ALIGNED(sizeof(ixheaace_str_esbr_hbe_txposer), BYTE_ALIGN_8) *
778*15dc779aSAndroid Build Coastguard Worker num_ch);
779*15dc779aSAndroid Build Coastguard Worker num_bytes += (IXHEAAC_GET_SIZE_ALIGNED(IXHEAACE_MAX_HBE_PERSISTENT_SIZE, BYTE_ALIGN_8) *
780*15dc779aSAndroid Build Coastguard Worker num_ch);
781*15dc779aSAndroid Build Coastguard Worker num_bytes += IXHEAAC_GET_SIZE_ALIGNED(ESBR_RESAMP_SAMPLES * sizeof(FLOAT32), BYTE_ALIGN_8);
782*15dc779aSAndroid Build Coastguard Worker }
783*15dc779aSAndroid Build Coastguard Worker num_bytes += (IXHEAAC_GET_SIZE_ALIGNED(sizeof(FLOAT32) * 5 * NO_OF_ESTIMATES *
784*15dc779aSAndroid Build Coastguard Worker MAXIMUM_FREQ_COEFFS, BYTE_ALIGN_8) * num_ch);
785*15dc779aSAndroid Build Coastguard Worker
786*15dc779aSAndroid Build Coastguard Worker num_bytes += (IXHEAAC_GET_SIZE_ALIGNED(sizeof(FLOAT32) * MAX_QMF_TIME_SLOTS *
787*15dc779aSAndroid Build Coastguard Worker IXHEAACE_QMF_CHANNELS, BYTE_ALIGN_8) * num_ch);
788*15dc779aSAndroid Build Coastguard Worker
789*15dc779aSAndroid Build Coastguard Worker if (use_ps) {
790*15dc779aSAndroid Build Coastguard Worker num_bytes += IXHEAAC_GET_SIZE_ALIGNED(sizeof(struct ixheaace_str_enc_channel), BYTE_ALIGN_8);
791*15dc779aSAndroid Build Coastguard Worker num_bytes += IXHEAAC_GET_SIZE_ALIGNED(sizeof(struct ixheaace_ps_enc), BYTE_ALIGN_8);
792*15dc779aSAndroid Build Coastguard Worker num_bytes += IXHEAAC_GET_SIZE_ALIGNED(sizeof(FLOAT32) * QMF_FILTER_LENGTH, BYTE_ALIGN_8);
793*15dc779aSAndroid Build Coastguard Worker
794*15dc779aSAndroid Build Coastguard Worker num_bytes += IXHEAAC_GET_SIZE_ALIGNED(sizeof(WORD32) * 5 * NO_OF_ESTIMATES *
795*15dc779aSAndroid Build Coastguard Worker MAXIMUM_FREQ_COEFFS, BYTE_ALIGN_8);
796*15dc779aSAndroid Build Coastguard Worker
797*15dc779aSAndroid Build Coastguard Worker /*shared between spectral_band_replication_envYBuffer_fix and IIC IDD PS data buffers*/
798*15dc779aSAndroid Build Coastguard Worker num_bytes += IXHEAAC_GET_SIZE_ALIGNED(sizeof(WORD32) * IXHEAACE_QMF_TIME_SLOTS *
799*15dc779aSAndroid Build Coastguard Worker IXHEAACE_QMF_CHANNELS, BYTE_ALIGN_8);
800*15dc779aSAndroid Build Coastguard Worker }
801*15dc779aSAndroid Build Coastguard Worker num_bytes += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ixheaace_str_sbr_qmf_filter_bank), BYTE_ALIGN_8);
802*15dc779aSAndroid Build Coastguard Worker return num_bytes;
803*15dc779aSAndroid Build Coastguard Worker }
804*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_sbr_set_persist_buf(WORD8 * ptr_base,WORD32 num_ch,WORD32 use_ps,WORD32 harmonic_sbr)805*15dc779aSAndroid Build Coastguard Worker VOID ia_enhaacplus_enc_sbr_set_persist_buf(WORD8 *ptr_base, WORD32 num_ch, WORD32 use_ps,
806*15dc779aSAndroid Build Coastguard Worker WORD32 harmonic_sbr) {
807*15dc779aSAndroid Build Coastguard Worker struct ixheaace_str_sbr_enc *pstr_env_enc;
808*15dc779aSAndroid Build Coastguard Worker WORD8 *ptr_curr_mem = ptr_base +
809*15dc779aSAndroid Build Coastguard Worker IXHEAAC_GET_SIZE_ALIGNED(sizeof(struct ixheaace_str_sbr_enc), BYTE_ALIGN_8);
810*15dc779aSAndroid Build Coastguard Worker WORD32 i;
811*15dc779aSAndroid Build Coastguard Worker
812*15dc779aSAndroid Build Coastguard Worker pstr_env_enc = (struct ixheaace_str_sbr_enc *)ptr_base;
813*15dc779aSAndroid Build Coastguard Worker
814*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_ch; i++) {
815*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->pstr_env_channel[i] = (struct ixheaace_str_enc_channel *)(ptr_curr_mem);
816*15dc779aSAndroid Build Coastguard Worker ptr_curr_mem = ptr_curr_mem +
817*15dc779aSAndroid Build Coastguard Worker IXHEAAC_GET_SIZE_ALIGNED(sizeof(struct ixheaace_str_enc_channel), BYTE_ALIGN_8);
818*15dc779aSAndroid Build Coastguard Worker }
819*15dc779aSAndroid Build Coastguard Worker
820*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_ch; i++) {
821*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->pstr_env_channel[i]->str_sbr_qmf.ptr_sbr_qmf_states_ana =
822*15dc779aSAndroid Build Coastguard Worker (FLOAT32 *)ptr_curr_mem;
823*15dc779aSAndroid Build Coastguard Worker ptr_curr_mem += IXHEAAC_GET_SIZE_ALIGNED(
824*15dc779aSAndroid Build Coastguard Worker sizeof(pstr_env_enc->pstr_env_channel[i]->str_sbr_qmf.ptr_sbr_qmf_states_ana[0]) *
825*15dc779aSAndroid Build Coastguard Worker QMF_FILTER_LENGTH, BYTE_ALIGN_8);
826*15dc779aSAndroid Build Coastguard Worker }
827*15dc779aSAndroid Build Coastguard Worker if (!use_ps) {
828*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->ptr_common_buffer1 = (WORD32 *)ptr_curr_mem;
829*15dc779aSAndroid Build Coastguard Worker ptr_curr_mem += IXHEAAC_GET_SIZE_ALIGNED(sizeof(pstr_env_enc->ptr_common_buffer1[0]) *
830*15dc779aSAndroid Build Coastguard Worker num_ch * 5 * NO_OF_ESTIMATES * MAXIMUM_FREQ_COEFFS, BYTE_ALIGN_8);
831*15dc779aSAndroid Build Coastguard Worker
832*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->ptr_common_buffer2 = (WORD32 *)ptr_curr_mem;
833*15dc779aSAndroid Build Coastguard Worker ptr_curr_mem += IXHEAAC_GET_SIZE_ALIGNED(sizeof(pstr_env_enc->ptr_common_buffer2[0]) *
834*15dc779aSAndroid Build Coastguard Worker num_ch * MAX_QMF_TIME_SLOTS * IXHEAACE_QMF_CHANNELS, BYTE_ALIGN_8);
835*15dc779aSAndroid Build Coastguard Worker } else {
836*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->ptr_common_buffer1 = (WORD32 *)ptr_curr_mem;
837*15dc779aSAndroid Build Coastguard Worker ptr_curr_mem += IXHEAAC_GET_SIZE_ALIGNED(2 * sizeof(pstr_env_enc->ptr_common_buffer1[0]) *
838*15dc779aSAndroid Build Coastguard Worker 5 * NO_OF_ESTIMATES * MAXIMUM_FREQ_COEFFS, BYTE_ALIGN_8);
839*15dc779aSAndroid Build Coastguard Worker
840*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->ptr_common_buffer2 = (WORD32 *)ptr_curr_mem;
841*15dc779aSAndroid Build Coastguard Worker ptr_curr_mem += IXHEAAC_GET_SIZE_ALIGNED(2 * sizeof(pstr_env_enc->ptr_common_buffer2[0]) *
842*15dc779aSAndroid Build Coastguard Worker IXHEAACE_QMF_TIME_SLOTS * IXHEAACE_QMF_CHANNELS, BYTE_ALIGN_8);
843*15dc779aSAndroid Build Coastguard Worker }
844*15dc779aSAndroid Build Coastguard Worker // PVC encoder
845*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->pstr_pvc_enc = (ixheaace_pvc_enc *)ptr_curr_mem;
846*15dc779aSAndroid Build Coastguard Worker ptr_curr_mem = ptr_curr_mem + IXHEAAC_GET_SIZE_ALIGNED(sizeof(ixheaace_pvc_enc), BYTE_ALIGN_8);
847*15dc779aSAndroid Build Coastguard Worker // Harmonic SBR
848*15dc779aSAndroid Build Coastguard Worker if (1 == harmonic_sbr) {
849*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_ch; i++) {
850*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->pstr_env_channel[i]->pstr_hbe_enc = (ixheaace_str_hbe_enc *)ptr_curr_mem;
851*15dc779aSAndroid Build Coastguard Worker ptr_curr_mem = ptr_curr_mem +
852*15dc779aSAndroid Build Coastguard Worker IXHEAAC_GET_SIZE_ALIGNED(sizeof(ixheaace_str_hbe_enc), BYTE_ALIGN_8);
853*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->pstr_env_channel[i]->pstr_hbe_enc->pstr_hbe_txposer =
854*15dc779aSAndroid Build Coastguard Worker (ixheaace_str_esbr_hbe_txposer *)ptr_curr_mem;
855*15dc779aSAndroid Build Coastguard Worker ptr_curr_mem = ptr_curr_mem +
856*15dc779aSAndroid Build Coastguard Worker IXHEAAC_GET_SIZE_ALIGNED(sizeof(ixheaace_str_esbr_hbe_txposer), BYTE_ALIGN_8);
857*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->pstr_env_channel[i]->pstr_hbe_enc->ptr_hbe_txposer_buffers =
858*15dc779aSAndroid Build Coastguard Worker (VOID *)ptr_curr_mem;
859*15dc779aSAndroid Build Coastguard Worker ptr_curr_mem = ptr_curr_mem + IXHEAACE_MAX_HBE_PERSISTENT_SIZE;
860*15dc779aSAndroid Build Coastguard Worker }
861*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->ptr_hbe_resample_buf = (FLOAT32 *)ptr_curr_mem;
862*15dc779aSAndroid Build Coastguard Worker ptr_curr_mem = ptr_curr_mem + IXHEAAC_GET_SIZE_ALIGNED(
863*15dc779aSAndroid Build Coastguard Worker (ESBR_RESAMP_SAMPLES * sizeof(pstr_env_enc->ptr_hbe_resample_buf[0])), BYTE_ALIGN_8);
864*15dc779aSAndroid Build Coastguard Worker }
865*15dc779aSAndroid Build Coastguard Worker if (use_ps) {
866*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->pstr_env_channel[1] = (struct ixheaace_str_enc_channel *)(ptr_curr_mem);
867*15dc779aSAndroid Build Coastguard Worker ptr_curr_mem = ptr_curr_mem +
868*15dc779aSAndroid Build Coastguard Worker IXHEAAC_GET_SIZE_ALIGNED(sizeof(struct ixheaace_str_enc_channel), BYTE_ALIGN_8);
869*15dc779aSAndroid Build Coastguard Worker memset(pstr_env_enc->pstr_env_channel[1], 0, sizeof(struct ixheaace_str_enc_channel));
870*15dc779aSAndroid Build Coastguard Worker
871*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->pstr_env_channel[1]->str_sbr_qmf.ptr_sbr_qmf_states_ana =
872*15dc779aSAndroid Build Coastguard Worker (FLOAT32 *)ptr_curr_mem;
873*15dc779aSAndroid Build Coastguard Worker ptr_curr_mem += IXHEAAC_GET_SIZE_ALIGNED(
874*15dc779aSAndroid Build Coastguard Worker sizeof(pstr_env_enc->pstr_env_channel[1]->str_sbr_qmf.ptr_sbr_qmf_states_ana[0]) *
875*15dc779aSAndroid Build Coastguard Worker QMF_FILTER_LENGTH, BYTE_ALIGN_8);
876*15dc779aSAndroid Build Coastguard Worker memset(pstr_env_enc->pstr_env_channel[1]->str_sbr_qmf.ptr_sbr_qmf_states_ana, 0,
877*15dc779aSAndroid Build Coastguard Worker sizeof(pstr_env_enc->pstr_env_channel[1]->str_sbr_qmf.ptr_sbr_qmf_states_ana[0]) *
878*15dc779aSAndroid Build Coastguard Worker QMF_FILTER_LENGTH);
879*15dc779aSAndroid Build Coastguard Worker
880*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->pstr_ps_enc = (struct ixheaace_ps_enc *)(ptr_curr_mem);
881*15dc779aSAndroid Build Coastguard Worker ptr_curr_mem = ptr_curr_mem +
882*15dc779aSAndroid Build Coastguard Worker IXHEAAC_GET_SIZE_ALIGNED(sizeof(struct ixheaace_ps_enc), BYTE_ALIGN_8);
883*15dc779aSAndroid Build Coastguard Worker memset(pstr_env_enc->pstr_ps_enc, 0, sizeof(struct ixheaace_ps_enc));
884*15dc779aSAndroid Build Coastguard Worker }
885*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->pstr_synthesis_qmf_bank = (ixheaace_str_sbr_qmf_filter_bank *)(ptr_curr_mem);
886*15dc779aSAndroid Build Coastguard Worker memset(pstr_env_enc->pstr_synthesis_qmf_bank, 0, sizeof(ixheaace_str_sbr_qmf_filter_bank));
887*15dc779aSAndroid Build Coastguard Worker
888*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->pstr_synthesis_qmf_bank->ptr_sbr_qmf_states_ana = NULL;
889*15dc779aSAndroid Build Coastguard Worker }
890*15dc779aSAndroid Build Coastguard Worker
891*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE
ixheaace_env_open(ixheaace_pstr_sbr_enc * pstr_env_encoder,ixheaace_pstr_sbr_cfg params,WORD32 * ptr_core_bw,WORD8 * ptr_sbr_scratch,ixheaace_str_sbr_tabs * pstr_sbr_tab,ixheaace_pstr_sbr_hdr_data * pstr_sbr_config)892*15dc779aSAndroid Build Coastguard Worker ixheaace_env_open(ixheaace_pstr_sbr_enc *pstr_env_encoder, ixheaace_pstr_sbr_cfg params,
893*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr_core_bw, WORD8 *ptr_sbr_scratch,
894*15dc779aSAndroid Build Coastguard Worker ixheaace_str_sbr_tabs *pstr_sbr_tab,
895*15dc779aSAndroid Build Coastguard Worker ixheaace_pstr_sbr_hdr_data *pstr_sbr_config) {
896*15dc779aSAndroid Build Coastguard Worker ixheaace_pstr_sbr_enc pstr_env_enc;
897*15dc779aSAndroid Build Coastguard Worker WORD32 ch;
898*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err_code = IA_NO_ERROR;
899*15dc779aSAndroid Build Coastguard Worker
900*15dc779aSAndroid Build Coastguard Worker pstr_env_enc = *pstr_env_encoder;
901*15dc779aSAndroid Build Coastguard Worker
902*15dc779aSAndroid Build Coastguard Worker memset(pstr_env_enc, 0, sizeof(struct ixheaace_str_sbr_enc));
903*15dc779aSAndroid Build Coastguard Worker
904*15dc779aSAndroid Build Coastguard Worker *pstr_sbr_config = &pstr_env_enc->str_sbr_hdr;
905*15dc779aSAndroid Build Coastguard Worker
906*15dc779aSAndroid Build Coastguard Worker ixheaace_sbr_set_scratch_ptr(pstr_env_enc, ptr_sbr_scratch);
907*15dc779aSAndroid Build Coastguard Worker
908*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_sbr_set_persist_buf((WORD8 *)pstr_env_enc,
909*15dc779aSAndroid Build Coastguard Worker params->codec_settings.num_channels, params->use_ps,
910*15dc779aSAndroid Build Coastguard Worker params->sbr_harmonic);
911*15dc779aSAndroid Build Coastguard Worker
912*15dc779aSAndroid Build Coastguard Worker if ((params->codec_settings.num_channels < 1) ||
913*15dc779aSAndroid Build Coastguard Worker (params->codec_settings.num_channels > IXHEAACE_MAX_CH_IN_BS_ELE)) {
914*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_INIT_FATAL_SBR_INVALID_NUM_CHANNELS;
915*15dc779aSAndroid Build Coastguard Worker }
916*15dc779aSAndroid Build Coastguard Worker
917*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_cfg.ptr_freq_band_tab[LO] =
918*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_cfg.sbr_freq_band_tab_lo;
919*15dc779aSAndroid Build Coastguard Worker
920*15dc779aSAndroid Build Coastguard Worker memset(
921*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_cfg.ptr_freq_band_tab[LO], 0,
922*15dc779aSAndroid Build Coastguard Worker sizeof(pstr_env_enc->str_sbr_cfg.ptr_freq_band_tab[LO][0]) * (MAXIMUM_FREQ_COEFFS / 2 + 1));
923*15dc779aSAndroid Build Coastguard Worker
924*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_cfg.ptr_freq_band_tab[HI] =
925*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_cfg.sbr_freq_band_tab_hi;
926*15dc779aSAndroid Build Coastguard Worker
927*15dc779aSAndroid Build Coastguard Worker memset(pstr_env_enc->str_sbr_cfg.ptr_freq_band_tab[HI], 0,
928*15dc779aSAndroid Build Coastguard Worker sizeof(pstr_env_enc->str_sbr_cfg.ptr_freq_band_tab[HI][0]) * (MAXIMUM_FREQ_COEFFS + 1));
929*15dc779aSAndroid Build Coastguard Worker
930*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_cfg.ptr_v_k_master = pstr_env_enc->str_sbr_cfg.sbr_v_k_master;
931*15dc779aSAndroid Build Coastguard Worker
932*15dc779aSAndroid Build Coastguard Worker memset(pstr_env_enc->str_sbr_cfg.ptr_v_k_master, 0,
933*15dc779aSAndroid Build Coastguard Worker sizeof(pstr_env_enc->str_sbr_cfg.ptr_v_k_master[0]) * (MAXIMUM_FREQ_COEFFS + 1));
934*15dc779aSAndroid Build Coastguard Worker
935*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_create_bitbuffer(&pstr_env_enc->str_cmon_data.str_sbr_bit_buf,
936*15dc779aSAndroid Build Coastguard Worker (UWORD8 *)pstr_env_enc->sbr_payload,
937*15dc779aSAndroid Build Coastguard Worker sizeof(pstr_env_enc->sbr_payload));
938*15dc779aSAndroid Build Coastguard Worker
939*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_cmon_data.prev_bit_buf_read_offset = 0;
940*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_cmon_data.prev_bit_buf_write_offset = 0;
941*15dc779aSAndroid Build Coastguard Worker
942*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_create_bitbuffer(&pstr_env_enc->str_cmon_data.str_sbr_bit_buf_prev,
943*15dc779aSAndroid Build Coastguard Worker (UWORD8 *)pstr_env_enc->sbr_payload_prev,
944*15dc779aSAndroid Build Coastguard Worker sizeof(pstr_env_enc->sbr_payload));
945*15dc779aSAndroid Build Coastguard Worker
946*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_cmon_data.str_sbr_bit_buf_prev.ptr_read_next =
947*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_cmon_data.str_sbr_bit_buf_prev.ptr_bit_buf_base +
948*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_cmon_data.prev_bit_buf_read_offset;
949*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_cmon_data.str_sbr_bit_buf_prev.ptr_write_next =
950*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_cmon_data.str_sbr_bit_buf_prev.ptr_bit_buf_base +
951*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_cmon_data.prev_bit_buf_write_offset;
952*15dc779aSAndroid Build Coastguard Worker
953*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_cfg.num_ch = params->codec_settings.num_channels;
954*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_cfg.is_ld_sbr = params->is_ld_sbr;
955*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_cfg.sbr_codec = params->sbr_codec;
956*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_cfg.is_esbr = params->is_esbr;
957*15dc779aSAndroid Build Coastguard Worker if (pstr_env_enc->str_sbr_cfg.sbr_codec == USAC_SBR) {
958*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_cfg.sbr_ratio_idx = params->sbr_ratio_idx;
959*15dc779aSAndroid Build Coastguard Worker }
960*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_cfg.stereo_mode =
961*15dc779aSAndroid Build Coastguard Worker (params->codec_settings.num_channels == 2) ? params->stereo_mode : IXHEAACE_SBR_MODE_MONO;
962*15dc779aSAndroid Build Coastguard Worker
963*15dc779aSAndroid Build Coastguard Worker if (params->codec_settings.sample_freq <= 24000) {
964*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_hdr.sample_rate_mode = IXHEAACE_DUAL_RATE;
965*15dc779aSAndroid Build Coastguard Worker if (params->sbr_codec == USAC_SBR) {
966*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_cfg.sample_freq = 2 * params->codec_settings.sample_freq;
967*15dc779aSAndroid Build Coastguard Worker if (USAC_SBR_RATIO_INDEX_4_1 == params->sbr_ratio_idx) {
968*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_cfg.sample_freq = 4 * params->codec_settings.sample_freq;
969*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_hdr.sample_rate_mode = IXHEAACE_QUAD_RATE;
970*15dc779aSAndroid Build Coastguard Worker }
971*15dc779aSAndroid Build Coastguard Worker } else {
972*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_cfg.sample_freq = 2 * params->codec_settings.sample_freq;
973*15dc779aSAndroid Build Coastguard Worker }
974*15dc779aSAndroid Build Coastguard Worker } else {
975*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_hdr.sample_rate_mode = IXHEAACE_SINGLE_RATE;
976*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_cfg.sample_freq = params->codec_settings.sample_freq;
977*15dc779aSAndroid Build Coastguard Worker }
978*15dc779aSAndroid Build Coastguard Worker if (params->is_ld_sbr) {
979*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_bs.count_send_header_data = -1;
980*15dc779aSAndroid Build Coastguard Worker } else {
981*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_bs.count_send_header_data = 0;
982*15dc779aSAndroid Build Coastguard Worker }
983*15dc779aSAndroid Build Coastguard Worker if (params->send_header_data_time > 0) {
984*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_bs.nr_send_header_data = (WORD32)(
985*15dc779aSAndroid Build Coastguard Worker params->send_header_data_time * 0.001 * pstr_env_enc->str_sbr_cfg.sample_freq / 2048);
986*15dc779aSAndroid Build Coastguard Worker
987*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_bs.nr_send_header_data =
988*15dc779aSAndroid Build Coastguard Worker ixheaac_max32(pstr_env_enc->str_sbr_bs.nr_send_header_data, 1);
989*15dc779aSAndroid Build Coastguard Worker } else {
990*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_bs.nr_send_header_data = 0;
991*15dc779aSAndroid Build Coastguard Worker }
992*15dc779aSAndroid Build Coastguard Worker
993*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_hdr.sbr_data_extra = params->sbr_data_extra;
994*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_bs.crc_active = params->crc_sbr;
995*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_bs.header_active = 0;
996*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_hdr.sbr_start_freq = params->start_freq;
997*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_hdr.sbr_stop_freq = params->stop_freq;
998*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_hdr.sbr_xover_band = 0;
999*15dc779aSAndroid Build Coastguard Worker
1000*15dc779aSAndroid Build Coastguard Worker if (params->sbr_xpos_ctrl != SBR_XPOS_CTRL_DEFAULT) {
1001*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_hdr.sbr_data_extra = 1;
1002*15dc779aSAndroid Build Coastguard Worker }
1003*15dc779aSAndroid Build Coastguard Worker
1004*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_hdr.protocol_version = SI_SBR_PROTOCOL_VERSION_ID;
1005*15dc779aSAndroid Build Coastguard Worker
1006*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_hdr.sbr_amp_res = (ixheaace_amp_res)params->amp_res;
1007*15dc779aSAndroid Build Coastguard Worker
1008*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_hdr.freq_scale = params->freq_scale;
1009*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_hdr.alter_scale = params->alter_scale;
1010*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_hdr.sbr_noise_bands = params->sbr_noise_bands;
1011*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_hdr.header_extra_1 = 0;
1012*15dc779aSAndroid Build Coastguard Worker
1013*15dc779aSAndroid Build Coastguard Worker if ((params->freq_scale != SBR_FREQ_SCALE_DEFAULT) ||
1014*15dc779aSAndroid Build Coastguard Worker (params->alter_scale != SBR_ALTER_SCALE_DEFAULT) ||
1015*15dc779aSAndroid Build Coastguard Worker (params->sbr_noise_bands != SBR_NOISE_BANDS_DEFAULT)) {
1016*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_hdr.header_extra_1 = 1;
1017*15dc779aSAndroid Build Coastguard Worker }
1018*15dc779aSAndroid Build Coastguard Worker
1019*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_hdr.sbr_limiter_bands = params->sbr_limiter_bands;
1020*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_hdr.sbr_limiter_gains = params->sbr_limiter_gains;
1021*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_hdr.sbr_interpol_freq = params->sbr_interpol_freq;
1022*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_hdr.sbr_smoothing_length = params->sbr_smoothing_length;
1023*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_hdr.header_extra_2 = 0;
1024*15dc779aSAndroid Build Coastguard Worker
1025*15dc779aSAndroid Build Coastguard Worker if ((params->sbr_limiter_bands != SBR_LIMITER_BANDS_DEFAULT) ||
1026*15dc779aSAndroid Build Coastguard Worker (params->sbr_limiter_gains != SBR_LIMITER_GAINS_DEFAULT) ||
1027*15dc779aSAndroid Build Coastguard Worker (params->sbr_interpol_freq != SBR_INTERPOL_FREQ_DEFAULT) ||
1028*15dc779aSAndroid Build Coastguard Worker (params->sbr_smoothing_length != SBR_SMOOTHING_LENGTH_DEFAULT)) {
1029*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_hdr.header_extra_2 = 1;
1030*15dc779aSAndroid Build Coastguard Worker }
1031*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_hdr.sbr_harmonic = params->sbr_harmonic;
1032*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_hdr.sbr_pvc_active = params->sbr_pvc_active;
1033*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_hdr.hq_esbr = params->hq_esbr;
1034*15dc779aSAndroid Build Coastguard Worker
1035*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_cfg.detect_missing_harmonics = params->detect_missing_harmonics;
1036*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_sbr_cfg.use_parametric_coding = params->parametric_coding;
1037*15dc779aSAndroid Build Coastguard Worker
1038*15dc779aSAndroid Build Coastguard Worker err_code = ia_enhaacplus_enc_update_freq_band_tab(
1039*15dc779aSAndroid Build Coastguard Worker &pstr_env_enc->str_sbr_cfg, &pstr_env_enc->str_sbr_hdr, IXHEAACE_QMF_CHANNELS);
1040*15dc779aSAndroid Build Coastguard Worker if (err_code) {
1041*15dc779aSAndroid Build Coastguard Worker return err_code;
1042*15dc779aSAndroid Build Coastguard Worker }
1043*15dc779aSAndroid Build Coastguard Worker ch = 0;
1044*15dc779aSAndroid Build Coastguard Worker while (ch < pstr_env_enc->str_sbr_cfg.num_ch) {
1045*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_sbr_env_r_buf = &pstr_env_enc->ptr_sbr_enc_scr->sbr_env_r_buf[0];
1046*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_sbr_env_i_buf = &pstr_env_enc->ptr_sbr_enc_scr->sbr_env_i_buf[0];
1047*15dc779aSAndroid Build Coastguard Worker if (!params->use_ps) {
1048*15dc779aSAndroid Build Coastguard Worker ptr_sbr_env_r_buf = &pstr_env_enc->ptr_sbr_enc_scr->sbr_env_r_buffer[0];
1049*15dc779aSAndroid Build Coastguard Worker ptr_sbr_env_i_buf = &pstr_env_enc->ptr_sbr_enc_scr->sbr_env_i_buffer[0];
1050*15dc779aSAndroid Build Coastguard Worker }
1051*15dc779aSAndroid Build Coastguard Worker
1052*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_create_env_channel(
1053*15dc779aSAndroid Build Coastguard Worker ch, &pstr_env_enc->str_sbr_cfg, &pstr_env_enc->str_sbr_hdr,
1054*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->pstr_env_channel[ch], params, pstr_env_enc->ptr_common_buffer1,
1055*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->ptr_common_buffer2, ptr_sbr_env_r_buf, ptr_sbr_env_i_buf, pstr_sbr_tab);
1056*15dc779aSAndroid Build Coastguard Worker if (err_code) {
1057*15dc779aSAndroid Build Coastguard Worker return err_code;
1058*15dc779aSAndroid Build Coastguard Worker }
1059*15dc779aSAndroid Build Coastguard Worker ch++;
1060*15dc779aSAndroid Build Coastguard Worker }
1061*15dc779aSAndroid Build Coastguard Worker
1062*15dc779aSAndroid Build Coastguard Worker if (params->use_ps) {
1063*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_create_env_channel(
1064*15dc779aSAndroid Build Coastguard Worker 1, &pstr_env_enc->str_sbr_cfg, &pstr_env_enc->str_sbr_hdr,
1065*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->pstr_env_channel[1], params, pstr_env_enc->ptr_common_buffer1,
1066*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->ptr_common_buffer2, pstr_env_enc->ptr_sbr_enc_scr->sbr_env_r_buf,
1067*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->ptr_sbr_enc_scr->sbr_env_i_buf, pstr_sbr_tab);
1068*15dc779aSAndroid Build Coastguard Worker if (err_code) {
1069*15dc779aSAndroid Build Coastguard Worker return err_code;
1070*15dc779aSAndroid Build Coastguard Worker }
1071*15dc779aSAndroid Build Coastguard Worker
1072*15dc779aSAndroid Build Coastguard Worker ixheaace_create_synthesis_qmf_bank(pstr_env_enc->pstr_synthesis_qmf_bank,
1073*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->ptr_common_buffer1, pstr_sbr_tab);
1074*15dc779aSAndroid Build Coastguard Worker
1075*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_create_ps_enc(pstr_env_enc->pstr_ps_enc, params->ps_mode,
1076*15dc779aSAndroid Build Coastguard Worker (FLOAT32 *)pstr_env_enc->ptr_common_buffer1,
1077*15dc779aSAndroid Build Coastguard Worker (FLOAT32 *)pstr_env_enc->ptr_common_buffer2,
1078*15dc779aSAndroid Build Coastguard Worker (FLOAT32 *)pstr_env_enc->ptr_sbr_enc_scr->ps_buf3);
1079*15dc779aSAndroid Build Coastguard Worker if (err_code) {
1080*15dc779aSAndroid Build Coastguard Worker return err_code;
1081*15dc779aSAndroid Build Coastguard Worker }
1082*15dc779aSAndroid Build Coastguard Worker }
1083*15dc779aSAndroid Build Coastguard Worker
1084*15dc779aSAndroid Build Coastguard Worker pstr_env_enc->str_cmon_data.sbr_num_channels = pstr_env_enc->str_sbr_cfg.num_ch;
1085*15dc779aSAndroid Build Coastguard Worker if (USAC_SBR == params->sbr_codec) {
1086*15dc779aSAndroid Build Coastguard Worker ixheaace_pvc_enc_init(pstr_env_enc->pstr_pvc_enc, params->sbr_pvc_rate);
1087*15dc779aSAndroid Build Coastguard Worker }
1088*15dc779aSAndroid Build Coastguard Worker *pstr_env_encoder = pstr_env_enc;
1089*15dc779aSAndroid Build Coastguard Worker *ptr_core_bw = pstr_env_enc->str_sbr_cfg.xover_freq;
1090*15dc779aSAndroid Build Coastguard Worker
1091*15dc779aSAndroid Build Coastguard Worker return err_code;
1092*15dc779aSAndroid Build Coastguard Worker }
1093