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 <stdio.h>
23*15dc779aSAndroid Build Coastguard Worker #include <math.h>
24*15dc779aSAndroid Build Coastguard Worker
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
26*15dc779aSAndroid Build Coastguard Worker #include "iusace_type_def.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_adjust_threshold_data.h"
28*15dc779aSAndroid Build Coastguard Worker #include "iusace_bitbuffer.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_bitbuffer.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_common_define.h"
31*15dc779aSAndroid Build Coastguard Worker
32*15dc779aSAndroid Build Coastguard Worker /* DRC */
33*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_common_enc.h"
34*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc.h"
35*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_tables.h"
36*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_api.h"
37*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc_eq.h"
38*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc_filter_bank.h"
39*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_gain_enc.h"
40*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_struct_def.h"
41*15dc779aSAndroid Build Coastguard Worker
42*15dc779aSAndroid Build Coastguard Worker #include "iusace_cnst.h"
43*15dc779aSAndroid Build Coastguard Worker #include "iusace_tns_usac.h"
44*15dc779aSAndroid Build Coastguard Worker #include "iusace_psy_mod.h"
45*15dc779aSAndroid Build Coastguard Worker #include "iusace_psy_utils.h"
46*15dc779aSAndroid Build Coastguard Worker #include "iusace_fd_qc_util.h"
47*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_memory_standards.h"
48*15dc779aSAndroid Build Coastguard Worker #include "iusace_tns_usac.h"
49*15dc779aSAndroid Build Coastguard Worker #include "iusace_config.h"
50*15dc779aSAndroid Build Coastguard Worker #include "iusace_arith_enc.h"
51*15dc779aSAndroid Build Coastguard Worker #include "iusace_fd_quant.h"
52*15dc779aSAndroid Build Coastguard Worker #include "iusace_ms.h"
53*15dc779aSAndroid Build Coastguard Worker #include "iusace_block_switch_const.h"
54*15dc779aSAndroid Build Coastguard Worker #include "iusace_block_switch_struct_def.h"
55*15dc779aSAndroid Build Coastguard Worker #include "iusace_signal_classifier.h"
56*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_header.h"
57*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_config.h"
58*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_asc_write.h"
59*15dc779aSAndroid Build Coastguard Worker #include "iusace_main.h"
60*15dc779aSAndroid Build Coastguard Worker #include "iusace_write_bitstream.h"
61*15dc779aSAndroid Build Coastguard Worker #include "iusace_windowing.h"
62*15dc779aSAndroid Build Coastguard Worker #include "iusace_fd_enc.h"
63*15dc779aSAndroid Build Coastguard Worker #include "iusace_fd_qc_adjthr.h"
64*15dc779aSAndroid Build Coastguard Worker #include "iusace_config.h"
65*15dc779aSAndroid Build Coastguard Worker #include "iusace_tcx_mdct.h"
66*15dc779aSAndroid Build Coastguard Worker #include "iusace_func_prototypes.h"
67*15dc779aSAndroid Build Coastguard Worker #include "iusace_block_switch.h"
68*15dc779aSAndroid Build Coastguard Worker #include "iusace_rom.h"
69*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_error_codes.h"
70*15dc779aSAndroid Build Coastguard Worker
71*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_header.h"
72*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_def.h"
73*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_resampler.h"
74*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_rom.h"
75*15dc779aSAndroid Build Coastguard Worker
76*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_header.h"
77*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_def.h"
78*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_resampler.h"
79*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_rom.h"
80*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_rom.h"
81*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_hbe.h"
82*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_qmf_enc.h"
83*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_tran_det.h"
84*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_frame_info_gen.h"
85*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_env_est.h"
86*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_code_envelope.h"
87*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_rom.h"
88*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_main.h"
89*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_rom.h"
90*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_missing_harmonics_det.h"
91*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_inv_filtering_estimation.h"
92*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_noise_floor_est.h"
93*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_ton_corr.h"
94*15dc779aSAndroid Build Coastguard Worker #include "iusace_esbr_pvc.h"
95*15dc779aSAndroid Build Coastguard Worker #include "iusace_esbr_inter_tes.h"
96*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr.h"
97*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_cmondata.h"
98*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_crc.h"
99*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_enc_struct.h"
100*15dc779aSAndroid Build Coastguard Worker
101*15dc779aSAndroid Build Coastguard Worker #include "iusace_esbr_pvc.h"
102*15dc779aSAndroid Build Coastguard Worker #include "iusace_esbr_inter_tes.h"
103*15dc779aSAndroid Build Coastguard Worker
iusace_get_num_elements(WORD32 num_channels)104*15dc779aSAndroid Build Coastguard Worker static WORD32 iusace_get_num_elements(WORD32 num_channels) {
105*15dc779aSAndroid Build Coastguard Worker WORD32 num_of_elements = 0;
106*15dc779aSAndroid Build Coastguard Worker
107*15dc779aSAndroid Build Coastguard Worker switch (num_channels) {
108*15dc779aSAndroid Build Coastguard Worker case 1:
109*15dc779aSAndroid Build Coastguard Worker case 2:
110*15dc779aSAndroid Build Coastguard Worker num_of_elements = 1;
111*15dc779aSAndroid Build Coastguard Worker break;
112*15dc779aSAndroid Build Coastguard Worker default:
113*15dc779aSAndroid Build Coastguard Worker num_of_elements = num_channels;
114*15dc779aSAndroid Build Coastguard Worker break;
115*15dc779aSAndroid Build Coastguard Worker }
116*15dc779aSAndroid Build Coastguard Worker
117*15dc779aSAndroid Build Coastguard Worker return num_of_elements;
118*15dc779aSAndroid Build Coastguard Worker }
119*15dc779aSAndroid Build Coastguard Worker
iusace_get_element_type(WORD32 elem_idx,WORD32 num_channels)120*15dc779aSAndroid Build Coastguard Worker static UWORD32 iusace_get_element_type(WORD32 elem_idx, WORD32 num_channels) {
121*15dc779aSAndroid Build Coastguard Worker UWORD32 elem_type = (UWORD32)USAC_ELEMENT_TYPE_INVALID;
122*15dc779aSAndroid Build Coastguard Worker (VOID) elem_idx;
123*15dc779aSAndroid Build Coastguard Worker
124*15dc779aSAndroid Build Coastguard Worker switch (num_channels) {
125*15dc779aSAndroid Build Coastguard Worker case 1:
126*15dc779aSAndroid Build Coastguard Worker elem_type = USAC_ELEMENT_TYPE_SCE;
127*15dc779aSAndroid Build Coastguard Worker break;
128*15dc779aSAndroid Build Coastguard Worker case 2:
129*15dc779aSAndroid Build Coastguard Worker elem_type = USAC_ELEMENT_TYPE_CPE;
130*15dc779aSAndroid Build Coastguard Worker break;
131*15dc779aSAndroid Build Coastguard Worker default:
132*15dc779aSAndroid Build Coastguard Worker elem_type = USAC_ELEMENT_TYPE_SCE;
133*15dc779aSAndroid Build Coastguard Worker break;
134*15dc779aSAndroid Build Coastguard Worker }
135*15dc779aSAndroid Build Coastguard Worker
136*15dc779aSAndroid Build Coastguard Worker return elem_type;
137*15dc779aSAndroid Build Coastguard Worker }
138*15dc779aSAndroid Build Coastguard Worker
iusace_bw_init(ia_usac_encoder_config_struct * ptr_usac_config,ixheaace_audio_specific_config_struct * pstr_asc,WORD32 ele_idx)139*15dc779aSAndroid Build Coastguard Worker static VOID iusace_bw_init(ia_usac_encoder_config_struct *ptr_usac_config,
140*15dc779aSAndroid Build Coastguard Worker ixheaace_audio_specific_config_struct *pstr_asc, WORD32 ele_idx) {
141*15dc779aSAndroid Build Coastguard Worker ptr_usac_config->bw_limit[ele_idx] = 20000;
142*15dc779aSAndroid Build Coastguard Worker (VOID) pstr_asc;
143*15dc779aSAndroid Build Coastguard Worker ptr_usac_config->bw_limit[ele_idx] =
144*15dc779aSAndroid Build Coastguard Worker MIN(ptr_usac_config->bw_limit[ele_idx], ptr_usac_config->core_sample_rate / 2);
145*15dc779aSAndroid Build Coastguard Worker
146*15dc779aSAndroid Build Coastguard Worker return;
147*15dc779aSAndroid Build Coastguard Worker }
148*15dc779aSAndroid Build Coastguard Worker
iusace_scratch_mem_init(ia_usac_data_struct * usac_data,WORD32 total_ch,WORD32 sr)149*15dc779aSAndroid Build Coastguard Worker VOID iusace_scratch_mem_init(ia_usac_data_struct *usac_data, WORD32 total_ch, WORD32 sr) {
150*15dc779aSAndroid Build Coastguard Worker iusace_scratch_mem *pstr_scratch = &usac_data->str_scratch;
151*15dc779aSAndroid Build Coastguard Worker UWORD8 *temp_ptr = pstr_scratch->ptr_scratch_buf;
152*15dc779aSAndroid Build Coastguard Worker
153*15dc779aSAndroid Build Coastguard Worker pstr_scratch->ptr_stack_mem = (FLOAT32 *)(temp_ptr);
154*15dc779aSAndroid Build Coastguard Worker temp_ptr += USACE_SCR_STACK;
155*15dc779aSAndroid Build Coastguard Worker
156*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_fd_mdct_windowed_long_buf = (FLOAT64 *)(temp_ptr);
157*15dc779aSAndroid Build Coastguard Worker temp_ptr += (2 * FRAME_LEN_LONG) * sizeof(FLOAT64);
158*15dc779aSAndroid Build Coastguard Worker
159*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_fd_mdct_windowed_short_buf = (FLOAT64 *)(temp_ptr);
160*15dc779aSAndroid Build Coastguard Worker // Size needed for above pointer is (2 * FRAME_LEN_LONG) * sizeof(FLOAT64)
161*15dc779aSAndroid Build Coastguard Worker
162*15dc779aSAndroid Build Coastguard Worker temp_ptr = (UWORD8 *)pstr_scratch->p_fd_mdct_windowed_short_buf;
163*15dc779aSAndroid Build Coastguard Worker
164*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_tns_filter = (FLOAT64 *)(temp_ptr);
165*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FRAME_LEN_LONG) * sizeof(FLOAT64);
166*15dc779aSAndroid Build Coastguard Worker
167*15dc779aSAndroid Build Coastguard Worker pstr_scratch->ptr_tns_scratch = (FLOAT64 *)(temp_ptr);
168*15dc779aSAndroid Build Coastguard Worker temp_ptr +=
169*15dc779aSAndroid Build Coastguard Worker (MAX_SHIFT_LEN_LONG + (TNS_MAX_ORDER + 1) * 2) * sizeof(pstr_scratch->ptr_tns_scratch[0]);
170*15dc779aSAndroid Build Coastguard Worker
171*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_left_fac_time_data = (FLOAT64 *)(temp_ptr);
172*15dc779aSAndroid Build Coastguard Worker temp_ptr += (2 * FAC_LENGTH + ORDER) * sizeof(FLOAT64);
173*15dc779aSAndroid Build Coastguard Worker
174*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_fac_win = (FLOAT64 *)(temp_ptr);
175*15dc779aSAndroid Build Coastguard Worker // Size needed for above pointer is (2 * FAC_LENGTH) * sizeof(FLOAT64)
176*15dc779aSAndroid Build Coastguard Worker
177*15dc779aSAndroid Build Coastguard Worker temp_ptr = (UWORD8 *)pstr_scratch->p_left_fac_time_data;
178*15dc779aSAndroid Build Coastguard Worker
179*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_sort_grouping_scratch = (FLOAT64 *)(temp_ptr);
180*15dc779aSAndroid Build Coastguard Worker // Size needed for above pointer is (LN2) * sizeof(FLOAT64)
181*15dc779aSAndroid Build Coastguard Worker
182*15dc779aSAndroid Build Coastguard Worker temp_ptr = (UWORD8 *)pstr_scratch->p_sort_grouping_scratch;
183*15dc779aSAndroid Build Coastguard Worker
184*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_noise_filling_highest_tone = (FLOAT64 *)(temp_ptr);
185*15dc779aSAndroid Build Coastguard Worker temp_ptr += (LN2) * sizeof(FLOAT64);
186*15dc779aSAndroid Build Coastguard Worker
187*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_quant_spectrum_spec_scratch = (FLOAT64 *)(temp_ptr);
188*15dc779aSAndroid Build Coastguard Worker temp_ptr += (2 * FRAME_LEN_LONG) * sizeof(FLOAT64);
189*15dc779aSAndroid Build Coastguard Worker
190*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_cmpx_mdct_temp_buf = (FLOAT64 *)(temp_ptr);
191*15dc779aSAndroid Build Coastguard Worker // Size needed for above pointer is (LN2) * sizeof(FLOAT64)
192*15dc779aSAndroid Build Coastguard Worker
193*15dc779aSAndroid Build Coastguard Worker temp_ptr = (UWORD8 *)pstr_scratch->p_noise_filling_highest_tone;
194*15dc779aSAndroid Build Coastguard Worker
195*15dc779aSAndroid Build Coastguard Worker for (WORD32 i = 0; i < total_ch; i++) {
196*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_reconstructed_time_signal[i] = (FLOAT64 *)(temp_ptr);
197*15dc779aSAndroid Build Coastguard Worker temp_ptr += (4 * FRAME_LEN_LONG) * sizeof(FLOAT64);
198*15dc779aSAndroid Build Coastguard Worker }
199*15dc779aSAndroid Build Coastguard Worker pstr_scratch->ptr_next_win_scratch = (WORD32 *)(temp_ptr);
200*15dc779aSAndroid Build Coastguard Worker temp_ptr += (2 * MAX_TIME_CHANNELS) * sizeof(pstr_scratch->ptr_next_win_scratch[0]);
201*15dc779aSAndroid Build Coastguard Worker
202*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_fft_p2_y = (FLOAT32 *)(temp_ptr);
203*15dc779aSAndroid Build Coastguard Worker temp_ptr += (2 * FRAME_LEN_LONG) * sizeof(FLOAT32);
204*15dc779aSAndroid Build Coastguard Worker
205*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_fft_p3_data_3 = (FLOAT32 *)(temp_ptr);
206*15dc779aSAndroid Build Coastguard Worker temp_ptr += (800) * sizeof(FLOAT32);
207*15dc779aSAndroid Build Coastguard Worker
208*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_fft_p3_y = (FLOAT32 *)(temp_ptr);
209*15dc779aSAndroid Build Coastguard Worker temp_ptr += (2 * FRAME_LEN_LONG) * sizeof(FLOAT32);
210*15dc779aSAndroid Build Coastguard Worker
211*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_time_signal = (FLOAT32 *)(temp_ptr);
212*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FRAME_LEN_LONG) * sizeof(FLOAT32);
213*15dc779aSAndroid Build Coastguard Worker
214*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_complex_fft = (FLOAT32 *)(temp_ptr);
215*15dc779aSAndroid Build Coastguard Worker temp_ptr += (2 * FRAME_LEN_LONG) * sizeof(FLOAT32);
216*15dc779aSAndroid Build Coastguard Worker
217*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_tonal_flag = (WORD32 *)(temp_ptr);
218*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FRAME_LEN_LONG / 2) * sizeof(WORD32);
219*15dc779aSAndroid Build Coastguard Worker
220*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_pow_spec = (FLOAT32 *)(temp_ptr);
221*15dc779aSAndroid Build Coastguard Worker // Size needed for above pointer is (FRAME_LEN_LONG / 2) * sizeof(FLOAT32)
222*15dc779aSAndroid Build Coastguard Worker temp_ptr = (UWORD8 *)pstr_scratch->p_time_signal;
223*15dc779aSAndroid Build Coastguard Worker
224*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_temp_mdct = (FLOAT32 *)(temp_ptr);
225*15dc779aSAndroid Build Coastguard Worker temp_ptr += (1024) * sizeof(FLOAT32);
226*15dc779aSAndroid Build Coastguard Worker
227*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_buf_synthesis_tool = (FLOAT32 *)(temp_ptr);
228*15dc779aSAndroid Build Coastguard Worker temp_ptr += (LEN_FRAME_16K + ORDER_LP_FILT_16K) * sizeof(FLOAT32);
229*15dc779aSAndroid Build Coastguard Worker
230*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_mdct_spec_float = (FLOAT32 *)(temp_ptr);
231*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FRAME_LEN_LONG) * sizeof(FLOAT32);
232*15dc779aSAndroid Build Coastguard Worker
233*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_sq_gain_en = (FLOAT32 *)(temp_ptr);
234*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FRAME_LEN_LONG / 4) * sizeof(FLOAT32);
235*15dc779aSAndroid Build Coastguard Worker
236*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_fft_mdct_buf = (FLOAT32 *)(temp_ptr);
237*15dc779aSAndroid Build Coastguard Worker temp_ptr += (4 * FRAME_LEN_LONG) * sizeof(FLOAT32);
238*15dc779aSAndroid Build Coastguard Worker
239*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_arith_map_prev_scratch = (WORD32 *)(temp_ptr);
240*15dc779aSAndroid Build Coastguard Worker temp_ptr += (516) * sizeof(WORD32);
241*15dc779aSAndroid Build Coastguard Worker
242*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_arith_map_pres_scratch = (WORD32 *)(temp_ptr);
243*15dc779aSAndroid Build Coastguard Worker temp_ptr += (516) * sizeof(WORD32);
244*15dc779aSAndroid Build Coastguard Worker
245*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_ol_pitch_buf_tmp = (FLOAT32 *)(temp_ptr);
246*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FRAME_LEN_LONG) * sizeof(FLOAT32);
247*15dc779aSAndroid Build Coastguard Worker
248*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_ol_pitch_speech_buf = (FLOAT32 *)(temp_ptr);
249*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FRAME_LEN_LONG + LAG_MAX) * sizeof(FLOAT32);
250*15dc779aSAndroid Build Coastguard Worker
251*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_ol_pitch_w_table = (FLOAT32 *)(temp_ptr);
252*15dc779aSAndroid Build Coastguard Worker temp_ptr += (LEN_CORR_R) * sizeof(FLOAT32);
253*15dc779aSAndroid Build Coastguard Worker
254*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_ol_pitch_R = (FLOAT32 *)(temp_ptr);
255*15dc779aSAndroid Build Coastguard Worker temp_ptr += (LEN_CORR_R) * sizeof(FLOAT32);
256*15dc779aSAndroid Build Coastguard Worker
257*15dc779aSAndroid Build Coastguard Worker WORD32 R0_size = (54 + 6 * ((WORD32)(34.f * ((FLOAT32)sr / 2.f) / 12800.f + 0.5f) * 2)) / 2;
258*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_ol_pitch_R0 = (FLOAT32 *)(temp_ptr);
259*15dc779aSAndroid Build Coastguard Worker temp_ptr += (R0_size) * sizeof(FLOAT32);
260*15dc779aSAndroid Build Coastguard Worker
261*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_lpd_frm_enc_scratch = (FLOAT32 *)(temp_ptr);
262*15dc779aSAndroid Build Coastguard Worker temp_ptr += (LEN_FRAME + 1) * sizeof(FLOAT32);
263*15dc779aSAndroid Build Coastguard Worker
264*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_wsig_buf = (FLOAT32 *)(temp_ptr + 128 * sizeof(FLOAT32));
265*15dc779aSAndroid Build Coastguard Worker temp_ptr += (128 + FRAME_LEN_LONG) * sizeof(FLOAT32);
266*15dc779aSAndroid Build Coastguard Worker
267*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_wsyn_tcx_buf = (FLOAT32 *)(temp_ptr + 128 * sizeof(FLOAT32));
268*15dc779aSAndroid Build Coastguard Worker temp_ptr += (128 + FRAME_LEN_LONG) * sizeof(FLOAT32);
269*15dc779aSAndroid Build Coastguard Worker
270*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_synth_tcx_buf = (FLOAT32 *)(temp_ptr + 128 * sizeof(FLOAT32));
271*15dc779aSAndroid Build Coastguard Worker temp_ptr += (128 + FRAME_LEN_LONG) * sizeof(FLOAT32);
272*15dc779aSAndroid Build Coastguard Worker
273*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_wsyn_buf = (FLOAT32 *)(temp_ptr + 128 * sizeof(FLOAT32));
274*15dc779aSAndroid Build Coastguard Worker temp_ptr += (128 + FRAME_LEN_LONG) * sizeof(FLOAT32);
275*15dc779aSAndroid Build Coastguard Worker
276*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_synth_buf = (FLOAT32 *)(temp_ptr + 128 * sizeof(FLOAT32));
277*15dc779aSAndroid Build Coastguard Worker temp_ptr += (128 + FRAME_LEN_LONG) * sizeof(FLOAT32);
278*15dc779aSAndroid Build Coastguard Worker
279*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_temp_wsyn_buf = (FLOAT32 *)temp_ptr;
280*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FRAME_LEN_LONG) * sizeof(FLOAT32);
281*15dc779aSAndroid Build Coastguard Worker
282*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_lp_filter_coeff = (FLOAT32 *)(temp_ptr);
283*15dc779aSAndroid Build Coastguard Worker temp_ptr += ((NUM_SUBFR_SUPERFRAME + 1) * (ORDER + 1)) * sizeof(FLOAT32);
284*15dc779aSAndroid Build Coastguard Worker
285*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_lp_filter_coeff_q = (FLOAT32 *)(temp_ptr);
286*15dc779aSAndroid Build Coastguard Worker temp_ptr += ((NUM_SUBFR_SUPERFRAME + 1) * (ORDER + 1)) * sizeof(FLOAT32);
287*15dc779aSAndroid Build Coastguard Worker
288*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_wsp_prev_buf = (FLOAT32 *)(temp_ptr);
289*15dc779aSAndroid Build Coastguard Worker temp_ptr += ((MAX_PITCH1 / OPL_DECIM) + LEN_FRAME) * sizeof(FLOAT32);
290*15dc779aSAndroid Build Coastguard Worker
291*15dc779aSAndroid Build Coastguard Worker pstr_scratch->ptr_lpd_scratch = (UWORD8 *)temp_ptr;
292*15dc779aSAndroid Build Coastguard Worker temp_ptr += ((2 * (NUM_SUBFR_SUPERFRAME + 1) * (ORDER + 1)) + (4 * (NUM_FRAMES + 1) * ORDER) +
293*15dc779aSAndroid Build Coastguard Worker (((NUM_FRAMES >> 1) + 1) * ORDER) * 4) *
294*15dc779aSAndroid Build Coastguard Worker sizeof(FLOAT32) +
295*15dc779aSAndroid Build Coastguard Worker 100 * sizeof(WORD32) + 6 * sizeof(ia_usac_lpd_scratch);
296*15dc779aSAndroid Build Coastguard Worker
297*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_prm_tcx = (WORD32 *)(temp_ptr);
298*15dc779aSAndroid Build Coastguard Worker temp_ptr += (NUM_TCX80_PRM) * sizeof(WORD32);
299*15dc779aSAndroid Build Coastguard Worker
300*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_buf_speech = (FLOAT32 *)(temp_ptr);
301*15dc779aSAndroid Build Coastguard Worker temp_ptr += (2 * LEN_FRAME + ORDER) * sizeof(FLOAT32);
302*15dc779aSAndroid Build Coastguard Worker
303*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_buf_res = (FLOAT32 *)(temp_ptr);
304*15dc779aSAndroid Build Coastguard Worker temp_ptr += (2 * LEN_FRAME) * sizeof(FLOAT32);
305*15dc779aSAndroid Build Coastguard Worker
306*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_buf_signal = (FLOAT32 *)(temp_ptr);
307*15dc779aSAndroid Build Coastguard Worker temp_ptr += (ORDER + LEN_FRAME) * sizeof(FLOAT32);
308*15dc779aSAndroid Build Coastguard Worker
309*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_xn1_tcx = (FLOAT32 *)(temp_ptr);
310*15dc779aSAndroid Build Coastguard Worker temp_ptr += (2 * FAC_LENGTH) * sizeof(FLOAT32);
311*15dc779aSAndroid Build Coastguard Worker
312*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_xn_buf_tcx = (FLOAT32 *)(temp_ptr);
313*15dc779aSAndroid Build Coastguard Worker temp_ptr += (128 + FRAME_LEN_LONG + 128) * sizeof(FLOAT32);
314*15dc779aSAndroid Build Coastguard Worker
315*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_x_tcx = (FLOAT32 *)(temp_ptr);
316*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FRAME_LEN_LONG) * sizeof(FLOAT32);
317*15dc779aSAndroid Build Coastguard Worker
318*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_x_tmp_tcx = (FLOAT32 *)(temp_ptr);
319*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FRAME_LEN_LONG) * sizeof(FLOAT32);
320*15dc779aSAndroid Build Coastguard Worker
321*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_en_tcx = (FLOAT32 *)(temp_ptr);
322*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FRAME_LEN_LONG) * sizeof(FLOAT32);
323*15dc779aSAndroid Build Coastguard Worker
324*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_alfd_gains_tcx = (FLOAT32 *)(temp_ptr);
325*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FRAME_LEN_LONG / (4 * 8)) * sizeof(FLOAT32);
326*15dc779aSAndroid Build Coastguard Worker
327*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_sq_enc_tcx = (FLOAT32 *)(temp_ptr);
328*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FRAME_LEN_LONG) * sizeof(FLOAT32);
329*15dc779aSAndroid Build Coastguard Worker
330*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_sq_quant_tcx = (WORD32 *)(temp_ptr);
331*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FRAME_LEN_LONG) * sizeof(WORD32);
332*15dc779aSAndroid Build Coastguard Worker
333*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_gain1_tcx = (FLOAT32 *)(temp_ptr);
334*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FRAME_LEN_LONG) * sizeof(FLOAT32);
335*15dc779aSAndroid Build Coastguard Worker
336*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_gain2_tcx = (FLOAT32 *)(temp_ptr);
337*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FRAME_LEN_LONG) * sizeof(FLOAT32);
338*15dc779aSAndroid Build Coastguard Worker
339*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_facelp_tcx = (FLOAT32 *)(temp_ptr);
340*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FAC_LENGTH) * sizeof(FLOAT32);
341*15dc779aSAndroid Build Coastguard Worker
342*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_xn2_tcx = (FLOAT32 *)(temp_ptr);
343*15dc779aSAndroid Build Coastguard Worker temp_ptr += (2 * FAC_LENGTH) * sizeof(FLOAT32);
344*15dc779aSAndroid Build Coastguard Worker
345*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_fac_window_tcx = (FLOAT32 *)(temp_ptr);
346*15dc779aSAndroid Build Coastguard Worker temp_ptr += (2 * FAC_LENGTH) * sizeof(FLOAT32);
347*15dc779aSAndroid Build Coastguard Worker
348*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_x1_tcx = (FLOAT32 *)(temp_ptr);
349*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FAC_LENGTH) * sizeof(FLOAT32);
350*15dc779aSAndroid Build Coastguard Worker
351*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_x2_tcx = (FLOAT32 *)(temp_ptr);
352*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FAC_LENGTH) * sizeof(FLOAT32);
353*15dc779aSAndroid Build Coastguard Worker
354*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_y_tcx = (WORD32 *)(temp_ptr);
355*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FAC_LENGTH) * sizeof(WORD32);
356*15dc779aSAndroid Build Coastguard Worker
357*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_in_out_tcx = (FLOAT32 *)(temp_ptr);
358*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FRAME_LEN_LONG * 2 * 2) * sizeof(FLOAT32);
359*15dc779aSAndroid Build Coastguard Worker
360*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_tcx_input = (FLOAT32 *)(temp_ptr);
361*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FRAME_LEN_LONG) * sizeof(FLOAT32);
362*15dc779aSAndroid Build Coastguard Worker
363*15dc779aSAndroid Build Coastguard Worker pstr_scratch->ptr_tcx_scratch = (FLOAT32 *)(temp_ptr);
364*15dc779aSAndroid Build Coastguard Worker temp_ptr += 3 * (FRAME_LEN_LONG) * sizeof(pstr_scratch->ptr_tcx_scratch[0]);
365*15dc779aSAndroid Build Coastguard Worker
366*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_tcx_output = (FLOAT32 *)(temp_ptr);
367*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FRAME_LEN_LONG) * sizeof(FLOAT32);
368*15dc779aSAndroid Build Coastguard Worker
369*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_buf_aut_corr = (FLOAT32 *)(temp_ptr);
370*15dc779aSAndroid Build Coastguard Worker // Size needed for above pointer is (LEN_WIN_PLUS) * sizeof(FLOAT32)
371*15dc779aSAndroid Build Coastguard Worker temp_ptr = (UWORD8 *)pstr_scratch->p_buf_aut_corr;
372*15dc779aSAndroid Build Coastguard Worker
373*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_xn2 = (FLOAT32 *)(temp_ptr);
374*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FAC_LENGTH + ORDER) * sizeof(FLOAT32);
375*15dc779aSAndroid Build Coastguard Worker
376*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_fac_dec = (FLOAT32 *)(temp_ptr);
377*15dc779aSAndroid Build Coastguard Worker temp_ptr += (2 * FAC_LENGTH) * sizeof(FLOAT32);
378*15dc779aSAndroid Build Coastguard Worker
379*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_right_fac_spec = (FLOAT32 *)(temp_ptr);
380*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FAC_LENGTH) * sizeof(FLOAT32);
381*15dc779aSAndroid Build Coastguard Worker
382*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_x2 = (FLOAT32 *)(temp_ptr);
383*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FAC_LENGTH) * sizeof(FLOAT32);
384*15dc779aSAndroid Build Coastguard Worker
385*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_param = (WORD32 *)(temp_ptr);
386*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FAC_LENGTH + 1) * sizeof(WORD32);
387*15dc779aSAndroid Build Coastguard Worker
388*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_x = (FLOAT32 *)(temp_ptr);
389*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FAC_LENGTH) * sizeof(FLOAT32);
390*15dc779aSAndroid Build Coastguard Worker
391*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_xn_2 = (FLOAT32 *)(temp_ptr);
392*15dc779aSAndroid Build Coastguard Worker temp_ptr += (2 * FAC_LENGTH + ORDER) * sizeof(FLOAT32);
393*15dc779aSAndroid Build Coastguard Worker
394*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_fac_window = (FLOAT32 *)(temp_ptr);
395*15dc779aSAndroid Build Coastguard Worker temp_ptr += (2 * FAC_LENGTH) * sizeof(FLOAT32);
396*15dc779aSAndroid Build Coastguard Worker
397*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_fir_sig_buf = (FLOAT32 *)(temp_ptr);
398*15dc779aSAndroid Build Coastguard Worker // Size needed for above pointer is (3 + LEN_FRAME) * sizeof(FLOAT32)
399*15dc779aSAndroid Build Coastguard Worker temp_ptr = (UWORD8 *)pstr_scratch->p_fir_sig_buf;
400*15dc779aSAndroid Build Coastguard Worker
401*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_acelp_ir_buf = (FLOAT32 *)(temp_ptr);
402*15dc779aSAndroid Build Coastguard Worker
403*15dc779aSAndroid Build Coastguard Worker temp_ptr += (4 * LEN_SUBFR) * sizeof(FLOAT32);
404*15dc779aSAndroid Build Coastguard Worker
405*15dc779aSAndroid Build Coastguard Worker pstr_scratch->ptr_acelp_scratch = (FLOAT32 *)(temp_ptr);
406*15dc779aSAndroid Build Coastguard Worker temp_ptr += ((11 * LEN_SUBFR) + (ORDER + LEN_SUBFR + 8) + 1024) *
407*15dc779aSAndroid Build Coastguard Worker sizeof(pstr_scratch->ptr_acelp_scratch[0]);
408*15dc779aSAndroid Build Coastguard Worker
409*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_acelp_exc_buf = (FLOAT32 *)(temp_ptr);
410*15dc779aSAndroid Build Coastguard Worker // Size needed for above pointer is ((3 * LEN_FRAME) + 1 + 41) * sizeof(FLOAT32)
411*15dc779aSAndroid Build Coastguard Worker
412*15dc779aSAndroid Build Coastguard Worker temp_ptr = (UWORD8 *)pstr_scratch->p_lpd_frm_enc_scratch;
413*15dc779aSAndroid Build Coastguard Worker
414*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_fac_bits_word = (WORD16 *)(temp_ptr);
415*15dc779aSAndroid Build Coastguard Worker temp_ptr += (5000) * sizeof(WORD16);
416*15dc779aSAndroid Build Coastguard Worker
417*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_left_fac_timedata_flt = (FLOAT32 *)(temp_ptr);
418*15dc779aSAndroid Build Coastguard Worker temp_ptr += (2 * FAC_LENGTH + ORDER) * sizeof(FLOAT32);
419*15dc779aSAndroid Build Coastguard Worker
420*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_left_fac_spec = (FLOAT32 *)(temp_ptr);
421*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FAC_LENGTH) * sizeof(FLOAT32);
422*15dc779aSAndroid Build Coastguard Worker
423*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_fac_prm = (WORD32 *)(temp_ptr);
424*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FAC_LENGTH + 1) * sizeof(WORD32);
425*15dc779aSAndroid Build Coastguard Worker
426*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_acelp_folded_scratch = (FLOAT32 *)(temp_ptr);
427*15dc779aSAndroid Build Coastguard Worker // Size needed for above pointer is (FAC_LENGTH) * sizeof(FLOAT32)
428*15dc779aSAndroid Build Coastguard Worker
429*15dc779aSAndroid Build Coastguard Worker temp_ptr = (UWORD8 *)pstr_scratch->p_fac_bits_word;
430*15dc779aSAndroid Build Coastguard Worker
431*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_exp_spec = (FLOAT32 *)(temp_ptr);
432*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FRAME_LEN_LONG) * sizeof(FLOAT32);
433*15dc779aSAndroid Build Coastguard Worker
434*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_adjthr_ptr_exp_spec = (FLOAT32 *)(temp_ptr);
435*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FRAME_LEN_LONG) * sizeof(FLOAT32);
436*15dc779aSAndroid Build Coastguard Worker
437*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_adjthr_mdct_spec_float = (FLOAT32 *)(temp_ptr);
438*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FRAME_LEN_LONG) * sizeof(FLOAT32);
439*15dc779aSAndroid Build Coastguard Worker
440*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_adjthr_quant_spec_temp = (WORD16 *)(temp_ptr);
441*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FRAME_LEN_LONG) * sizeof(WORD16);
442*15dc779aSAndroid Build Coastguard Worker
443*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_degroup_scratch = (WORD32 *)(temp_ptr);
444*15dc779aSAndroid Build Coastguard Worker temp_ptr += (FRAME_LEN_LONG) * sizeof(WORD32);
445*15dc779aSAndroid Build Coastguard Worker
446*15dc779aSAndroid Build Coastguard Worker /*Newly added*/
447*15dc779aSAndroid Build Coastguard Worker pstr_scratch->ptr_drc_scratch_buf = (UWORD8 *)(temp_ptr);
448*15dc779aSAndroid Build Coastguard Worker
449*15dc779aSAndroid Build Coastguard Worker pstr_scratch->ptr_num_fac_bits = (WORD32 *)temp_ptr;
450*15dc779aSAndroid Build Coastguard Worker temp_ptr += MAX_TIME_CHANNELS * sizeof(pstr_scratch->ptr_num_fac_bits[0]);
451*15dc779aSAndroid Build Coastguard Worker pstr_scratch->ptr_tns_data_present = (WORD32 *)temp_ptr;
452*15dc779aSAndroid Build Coastguard Worker temp_ptr += MAX_TIME_CHANNELS * sizeof(pstr_scratch->ptr_tns_data_present[0]);
453*15dc779aSAndroid Build Coastguard Worker
454*15dc779aSAndroid Build Coastguard Worker pstr_scratch->ptr_tmp_lp_res = (FLOAT32 *)temp_ptr;
455*15dc779aSAndroid Build Coastguard Worker temp_ptr += FAC_LENGTH * sizeof(pstr_scratch->ptr_tmp_lp_res[0]);
456*15dc779aSAndroid Build Coastguard Worker
457*15dc779aSAndroid Build Coastguard Worker for (WORD32 i = 0; i < total_ch; i++) {
458*15dc779aSAndroid Build Coastguard Worker pstr_scratch->ptr_sfb_form_fac[i] = (FLOAT32 *)temp_ptr;
459*15dc779aSAndroid Build Coastguard Worker temp_ptr += (MAX_NUM_GROUPED_SFB) * sizeof(FLOAT32);
460*15dc779aSAndroid Build Coastguard Worker }
461*15dc779aSAndroid Build Coastguard Worker for (WORD32 i = 0; i < total_ch; i++) {
462*15dc779aSAndroid Build Coastguard Worker pstr_scratch->ptr_sfb_num_relevant_lines[i] = (FLOAT32 *)temp_ptr;
463*15dc779aSAndroid Build Coastguard Worker temp_ptr += (MAX_NUM_GROUPED_SFB) * sizeof(FLOAT32);
464*15dc779aSAndroid Build Coastguard Worker }
465*15dc779aSAndroid Build Coastguard Worker for (WORD32 i = 0; i < total_ch; i++) {
466*15dc779aSAndroid Build Coastguard Worker pstr_scratch->ptr_sfb_ld_energy[i] = (FLOAT32 *)temp_ptr;
467*15dc779aSAndroid Build Coastguard Worker temp_ptr += (MAX_NUM_GROUPED_SFB) * sizeof(FLOAT32);
468*15dc779aSAndroid Build Coastguard Worker }
469*15dc779aSAndroid Build Coastguard Worker pstr_scratch->ptr_num_scfs = (WORD32 *)temp_ptr;
470*15dc779aSAndroid Build Coastguard Worker temp_ptr += (MAX_TIME_CHANNELS) * sizeof(pstr_scratch->ptr_num_scfs[0]);
471*15dc779aSAndroid Build Coastguard Worker
472*15dc779aSAndroid Build Coastguard Worker pstr_scratch->ptr_max_ch_dyn_bits = (WORD32 *)temp_ptr;
473*15dc779aSAndroid Build Coastguard Worker temp_ptr += (MAX_TIME_CHANNELS) * sizeof(pstr_scratch->ptr_max_ch_dyn_bits[0]);
474*15dc779aSAndroid Build Coastguard Worker pstr_scratch->ptr_ch_bit_dist = (FLOAT32 *)temp_ptr;
475*15dc779aSAndroid Build Coastguard Worker temp_ptr += (MAX_TIME_CHANNELS) * sizeof(pstr_scratch->ptr_ch_bit_dist[0]);
476*15dc779aSAndroid Build Coastguard Worker pstr_scratch->ptr_fd_scratch = (UWORD8 *)temp_ptr;
477*15dc779aSAndroid Build Coastguard Worker // Size needed for above pointer is (IXHEAACE_MAX_CH_IN_BS_ELE * MAX_NUM_GROUPED_SFB * 3) *
478*15dc779aSAndroid Build Coastguard Worker // sizeof(WORD32)
479*15dc779aSAndroid Build Coastguard Worker
480*15dc779aSAndroid Build Coastguard Worker return;
481*15dc779aSAndroid Build Coastguard Worker }
482*15dc779aSAndroid Build Coastguard Worker
iusace_limitbitrate(WORD32 core_sample_rate,WORD32 frame_len,WORD32 num_ch,WORD32 bit_rate)483*15dc779aSAndroid Build Coastguard Worker WORD32 iusace_limitbitrate(WORD32 core_sample_rate, WORD32 frame_len, WORD32 num_ch,
484*15dc779aSAndroid Build Coastguard Worker WORD32 bit_rate) {
485*15dc779aSAndroid Build Coastguard Worker WORD32 transport_bits, prev_bit_rate, shift = 0, iter = 0;
486*15dc779aSAndroid Build Coastguard Worker
487*15dc779aSAndroid Build Coastguard Worker while ((frame_len & ~((1 << (shift + 1)) - 1)) == frame_len &&
488*15dc779aSAndroid Build Coastguard Worker (core_sample_rate & ~((1 << (shift + 1)) - 1)) == core_sample_rate) {
489*15dc779aSAndroid Build Coastguard Worker shift++;
490*15dc779aSAndroid Build Coastguard Worker }
491*15dc779aSAndroid Build Coastguard Worker
492*15dc779aSAndroid Build Coastguard Worker do {
493*15dc779aSAndroid Build Coastguard Worker prev_bit_rate = bit_rate;
494*15dc779aSAndroid Build Coastguard Worker /* Assume some worst case */
495*15dc779aSAndroid Build Coastguard Worker transport_bits = 208;
496*15dc779aSAndroid Build Coastguard Worker
497*15dc779aSAndroid Build Coastguard Worker bit_rate =
498*15dc779aSAndroid Build Coastguard Worker MAX(bit_rate, ((((40 * num_ch) + transport_bits) * (core_sample_rate)) / frame_len));
499*15dc779aSAndroid Build Coastguard Worker bit_rate =
500*15dc779aSAndroid Build Coastguard Worker MIN(bit_rate, ((num_ch * 6144) * (core_sample_rate >> shift)) / (frame_len >> shift));
501*15dc779aSAndroid Build Coastguard Worker
502*15dc779aSAndroid Build Coastguard Worker } while (prev_bit_rate != bit_rate && iter++ < 3);
503*15dc779aSAndroid Build Coastguard Worker
504*15dc779aSAndroid Build Coastguard Worker return bit_rate;
505*15dc779aSAndroid Build Coastguard Worker }
506*15dc779aSAndroid Build Coastguard Worker
iusace_map_sample_rate(WORD32 sample_rate)507*15dc779aSAndroid Build Coastguard Worker WORD32 iusace_map_sample_rate(WORD32 sample_rate)
508*15dc779aSAndroid Build Coastguard Worker {
509*15dc779aSAndroid Build Coastguard Worker WORD32 mapped_sample_rate = sample_rate;
510*15dc779aSAndroid Build Coastguard Worker
511*15dc779aSAndroid Build Coastguard Worker if ((mapped_sample_rate >= 0) && (mapped_sample_rate < 9391))
512*15dc779aSAndroid Build Coastguard Worker {
513*15dc779aSAndroid Build Coastguard Worker mapped_sample_rate = 8000;
514*15dc779aSAndroid Build Coastguard Worker }
515*15dc779aSAndroid Build Coastguard Worker else if ((mapped_sample_rate >= 9391) && (mapped_sample_rate < 11502))
516*15dc779aSAndroid Build Coastguard Worker {
517*15dc779aSAndroid Build Coastguard Worker mapped_sample_rate = 11025;
518*15dc779aSAndroid Build Coastguard Worker }
519*15dc779aSAndroid Build Coastguard Worker else if ((mapped_sample_rate >= 11502) && (mapped_sample_rate < 13856))
520*15dc779aSAndroid Build Coastguard Worker {
521*15dc779aSAndroid Build Coastguard Worker mapped_sample_rate = 12000;
522*15dc779aSAndroid Build Coastguard Worker }
523*15dc779aSAndroid Build Coastguard Worker else if ((mapped_sample_rate >= 13856) && (mapped_sample_rate < 18783))
524*15dc779aSAndroid Build Coastguard Worker {
525*15dc779aSAndroid Build Coastguard Worker mapped_sample_rate = 16000;
526*15dc779aSAndroid Build Coastguard Worker }
527*15dc779aSAndroid Build Coastguard Worker else if ((mapped_sample_rate >= 18783) && (mapped_sample_rate < 23004))
528*15dc779aSAndroid Build Coastguard Worker {
529*15dc779aSAndroid Build Coastguard Worker mapped_sample_rate = 22050;
530*15dc779aSAndroid Build Coastguard Worker }
531*15dc779aSAndroid Build Coastguard Worker else if ((mapped_sample_rate >= 23004) && (mapped_sample_rate < 27713))
532*15dc779aSAndroid Build Coastguard Worker {
533*15dc779aSAndroid Build Coastguard Worker mapped_sample_rate = 24000;
534*15dc779aSAndroid Build Coastguard Worker }
535*15dc779aSAndroid Build Coastguard Worker else if ((mapped_sample_rate >= 27713) && (mapped_sample_rate < 37566))
536*15dc779aSAndroid Build Coastguard Worker {
537*15dc779aSAndroid Build Coastguard Worker mapped_sample_rate = 32000;
538*15dc779aSAndroid Build Coastguard Worker }
539*15dc779aSAndroid Build Coastguard Worker else if ((mapped_sample_rate >= 37566) && (mapped_sample_rate < 46009))
540*15dc779aSAndroid Build Coastguard Worker {
541*15dc779aSAndroid Build Coastguard Worker mapped_sample_rate = 44100;
542*15dc779aSAndroid Build Coastguard Worker }
543*15dc779aSAndroid Build Coastguard Worker else if ((mapped_sample_rate >= 46009) && (mapped_sample_rate < 55426))
544*15dc779aSAndroid Build Coastguard Worker {
545*15dc779aSAndroid Build Coastguard Worker mapped_sample_rate = 48000;
546*15dc779aSAndroid Build Coastguard Worker }
547*15dc779aSAndroid Build Coastguard Worker else if ((mapped_sample_rate >= 55426) && (mapped_sample_rate < 75132))
548*15dc779aSAndroid Build Coastguard Worker {
549*15dc779aSAndroid Build Coastguard Worker mapped_sample_rate = 64000;
550*15dc779aSAndroid Build Coastguard Worker }
551*15dc779aSAndroid Build Coastguard Worker else if ((mapped_sample_rate >= 75132) && (mapped_sample_rate < 92017))
552*15dc779aSAndroid Build Coastguard Worker {
553*15dc779aSAndroid Build Coastguard Worker mapped_sample_rate = 88200;
554*15dc779aSAndroid Build Coastguard Worker }
555*15dc779aSAndroid Build Coastguard Worker else if (mapped_sample_rate >= 92017)
556*15dc779aSAndroid Build Coastguard Worker {
557*15dc779aSAndroid Build Coastguard Worker mapped_sample_rate = 96000;
558*15dc779aSAndroid Build Coastguard Worker }
559*15dc779aSAndroid Build Coastguard Worker else
560*15dc779aSAndroid Build Coastguard Worker {
561*15dc779aSAndroid Build Coastguard Worker mapped_sample_rate = 48000;
562*15dc779aSAndroid Build Coastguard Worker }
563*15dc779aSAndroid Build Coastguard Worker return mapped_sample_rate;
564*15dc779aSAndroid Build Coastguard Worker }
565*15dc779aSAndroid Build Coastguard Worker
566*15dc779aSAndroid Build Coastguard Worker /**
567*15dc779aSAndroid Build Coastguard Worker * iusace_enc_init
568*15dc779aSAndroid Build Coastguard Worker *
569*15dc779aSAndroid Build Coastguard Worker * \brief Enocder initialization
570*15dc779aSAndroid Build Coastguard Worker *
571*15dc779aSAndroid Build Coastguard Worker * \param [in] ptr_usac_config Pointer to encoder config structure
572*15dc779aSAndroid Build Coastguard Worker * \param [in] ptr_asc Pointer to audio specific config strcuture
573*15dc779aSAndroid Build Coastguard Worker * \param [in] pstr_state Poniter to encoder handle structure
574*15dc779aSAndroid Build Coastguard Worker *
575*15dc779aSAndroid Build Coastguard Worker * \return IA_ERRORCODE Error code
576*15dc779aSAndroid Build Coastguard Worker */
iusace_enc_init(ia_usac_encoder_config_struct * ptr_usac_config,ixheaace_audio_specific_config_struct * pstr_asc,ia_usac_data_struct * pstr_state)577*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE iusace_enc_init(ia_usac_encoder_config_struct *ptr_usac_config,
578*15dc779aSAndroid Build Coastguard Worker ixheaace_audio_specific_config_struct *pstr_asc,
579*15dc779aSAndroid Build Coastguard Worker ia_usac_data_struct *pstr_state) {
580*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err_code = IA_NO_ERROR;
581*15dc779aSAndroid Build Coastguard Worker WORD32 i, j, k, idx, i_ch;
582*15dc779aSAndroid Build Coastguard Worker UWORD32 elem_idx = 0;
583*15dc779aSAndroid Build Coastguard Worker ia_usac_data_struct *usac_data = (pstr_state);
584*15dc779aSAndroid Build Coastguard Worker ixheaace_audio_specific_config_struct *p_audio_specific_config = pstr_asc;
585*15dc779aSAndroid Build Coastguard Worker ia_usac_config_struct *pstr_asc_usac_config = &(p_audio_specific_config->str_usac_config);
586*15dc779aSAndroid Build Coastguard Worker WORD32 nbuff = 2048;
587*15dc779aSAndroid Build Coastguard Worker usac_data->usac_independency_flag_count = 0;
588*15dc779aSAndroid Build Coastguard Worker usac_data->usac_independency_flag_interval = 25;
589*15dc779aSAndroid Build Coastguard Worker usac_data->use_acelp_only = ptr_usac_config->use_acelp_only;
590*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < MAX_TIME_CHANNELS; j++) {
591*15dc779aSAndroid Build Coastguard Worker memset(usac_data->overlap_buf[j], 0, nbuff * sizeof(FLOAT64 *));
592*15dc779aSAndroid Build Coastguard Worker
593*15dc779aSAndroid Build Coastguard Worker usac_data->str_ms_info[j].ms_mask = 0;
594*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < MAX_SHORT_WINDOWS; i++) {
595*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < MAX_SFB_LONG; k++) {
596*15dc779aSAndroid Build Coastguard Worker usac_data->str_ms_info[j].ms_used[i][k] = 0;
597*15dc779aSAndroid Build Coastguard Worker }
598*15dc779aSAndroid Build Coastguard Worker }
599*15dc779aSAndroid Build Coastguard Worker }
600*15dc779aSAndroid Build Coastguard Worker
601*15dc779aSAndroid Build Coastguard Worker iusace_scratch_mem_init(usac_data, ptr_usac_config->channels,
602*15dc779aSAndroid Build Coastguard Worker ptr_usac_config->core_sample_rate);
603*15dc779aSAndroid Build Coastguard Worker
604*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < MAX_TIME_CHANNELS; i++) {
605*15dc779aSAndroid Build Coastguard Worker if (ptr_usac_config->cmplx_pred_flag) {
606*15dc779aSAndroid Build Coastguard Worker usac_data->str_ms_info[i].ms_mask = 3;
607*15dc779aSAndroid Build Coastguard Worker }
608*15dc779aSAndroid Build Coastguard Worker usac_data->ptr_dmx_re_save[i] = &usac_data->arr_dmx_save_float[i][0];
609*15dc779aSAndroid Build Coastguard Worker usac_data->ptr_dmx_im[i] = &usac_data->arr_dmx_im[i][0];
610*15dc779aSAndroid Build Coastguard Worker }
611*15dc779aSAndroid Build Coastguard Worker
612*15dc779aSAndroid Build Coastguard Worker pstr_asc_usac_config->num_elements = 0;
613*15dc779aSAndroid Build Coastguard Worker pstr_asc_usac_config->usac_cfg_ext_present = 0;
614*15dc779aSAndroid Build Coastguard Worker pstr_asc_usac_config->num_config_extensions = 0;
615*15dc779aSAndroid Build Coastguard Worker
616*15dc779aSAndroid Build Coastguard Worker if (ptr_usac_config->channels > 0) {
617*15dc779aSAndroid Build Coastguard Worker if (ptr_usac_config->channels < 7) {
618*15dc779aSAndroid Build Coastguard Worker p_audio_specific_config->channel_configuration = ptr_usac_config->channels;
619*15dc779aSAndroid Build Coastguard Worker }
620*15dc779aSAndroid Build Coastguard Worker }
621*15dc779aSAndroid Build Coastguard Worker ia_usac_enc_element_config_struct *pstr_usac_elem_config =
622*15dc779aSAndroid Build Coastguard Worker &(pstr_asc_usac_config->str_usac_element_config[pstr_asc_usac_config->num_elements]);
623*15dc779aSAndroid Build Coastguard Worker pstr_asc_usac_config->usac_element_type[pstr_asc_usac_config->num_elements] = ID_USAC_EXT;
624*15dc779aSAndroid Build Coastguard Worker pstr_usac_elem_config->usac_ext_ele_type = ID_EXT_ELE_AUDIOPREROLL;
625*15dc779aSAndroid Build Coastguard Worker pstr_usac_elem_config->usac_ext_ele_dflt_len_present = 0;
626*15dc779aSAndroid Build Coastguard Worker pstr_usac_elem_config->usac_ext_ele_payload_present = 0;
627*15dc779aSAndroid Build Coastguard Worker pstr_usac_elem_config->usac_ext_ele_cfg_len = 0;
628*15dc779aSAndroid Build Coastguard Worker pstr_asc_usac_config->num_elements++;
629*15dc779aSAndroid Build Coastguard Worker // DRC Config
630*15dc779aSAndroid Build Coastguard Worker if (ptr_usac_config->use_drc_element) {
631*15dc779aSAndroid Build Coastguard Worker ptr_usac_config->str_drc_cfg.str_uni_drc_config.str_channel_layout.base_ch_count =
632*15dc779aSAndroid Build Coastguard Worker ptr_usac_config->channels;
633*15dc779aSAndroid Build Coastguard Worker
634*15dc779aSAndroid Build Coastguard Worker memset(&usac_data->str_drc_state, 0, sizeof(ia_drc_enc_state));
635*15dc779aSAndroid Build Coastguard Worker
636*15dc779aSAndroid Build Coastguard Worker err_code = impd_drc_enc_init(&usac_data->str_drc_state, pstr_state->str_scratch.drc_scratch,
637*15dc779aSAndroid Build Coastguard Worker &ptr_usac_config->str_drc_cfg);
638*15dc779aSAndroid Build Coastguard Worker if (err_code & IA_FATAL_ERROR) {
639*15dc779aSAndroid Build Coastguard Worker return err_code;
640*15dc779aSAndroid Build Coastguard Worker }
641*15dc779aSAndroid Build Coastguard Worker if (err_code) {
642*15dc779aSAndroid Build Coastguard Worker ptr_usac_config->use_drc_element = 0;
643*15dc779aSAndroid Build Coastguard Worker err_code = IA_NO_ERROR;
644*15dc779aSAndroid Build Coastguard Worker }
645*15dc779aSAndroid Build Coastguard Worker
646*15dc779aSAndroid Build Coastguard Worker if (ptr_usac_config->use_drc_element) {
647*15dc779aSAndroid Build Coastguard Worker ia_usac_enc_element_config_struct *pstr_usac_elem_config =
648*15dc779aSAndroid Build Coastguard Worker &(pstr_asc_usac_config->str_usac_element_config[pstr_asc_usac_config->num_elements]);
649*15dc779aSAndroid Build Coastguard Worker pstr_asc_usac_config->usac_element_type[pstr_asc_usac_config->num_elements] = ID_USAC_EXT;
650*15dc779aSAndroid Build Coastguard Worker pstr_usac_elem_config->usac_ext_ele_type = ID_EXT_ELE_UNI_DRC;
651*15dc779aSAndroid Build Coastguard Worker pstr_usac_elem_config->usac_ext_ele_dflt_len_present = 0;
652*15dc779aSAndroid Build Coastguard Worker pstr_usac_elem_config->usac_ext_ele_payload_present = 0;
653*15dc779aSAndroid Build Coastguard Worker pstr_usac_elem_config->drc_config_data = usac_data->str_drc_state.bit_buf_base_cfg;
654*15dc779aSAndroid Build Coastguard Worker pstr_usac_elem_config->usac_ext_ele_cfg_len =
655*15dc779aSAndroid Build Coastguard Worker (usac_data->str_drc_state.drc_config_data_size_bit + 7) >> 3;
656*15dc779aSAndroid Build Coastguard Worker pstr_asc_usac_config->num_elements++;
657*15dc779aSAndroid Build Coastguard Worker }
658*15dc779aSAndroid Build Coastguard Worker } else {
659*15dc779aSAndroid Build Coastguard Worker err_code =
660*15dc779aSAndroid Build Coastguard Worker impd_loudness_info_init(&usac_data->str_drc_state, &ptr_usac_config->str_drc_cfg);
661*15dc779aSAndroid Build Coastguard Worker if (err_code) {
662*15dc779aSAndroid Build Coastguard Worker return err_code;
663*15dc779aSAndroid Build Coastguard Worker }
664*15dc779aSAndroid Build Coastguard Worker }
665*15dc779aSAndroid Build Coastguard Worker
666*15dc779aSAndroid Build Coastguard Worker pstr_asc_usac_config->usac_config_ext_type[pstr_asc_usac_config->num_config_extensions] =
667*15dc779aSAndroid Build Coastguard Worker ID_CONFIG_EXT_STREAM_ID;
668*15dc779aSAndroid Build Coastguard Worker pstr_asc_usac_config->usac_config_ext_len[pstr_asc_usac_config->num_config_extensions] =
669*15dc779aSAndroid Build Coastguard Worker CONFIG_EXT_LEN_STREAM_ID;
670*15dc779aSAndroid Build Coastguard Worker pstr_asc_usac_config->num_config_extensions++;
671*15dc779aSAndroid Build Coastguard Worker pstr_asc_usac_config->stream_identifier = ptr_usac_config->stream_id;
672*15dc779aSAndroid Build Coastguard Worker
673*15dc779aSAndroid Build Coastguard Worker pstr_asc_usac_config->usac_config_ext_type[pstr_asc_usac_config->num_config_extensions] =
674*15dc779aSAndroid Build Coastguard Worker ID_CONFIG_EXT_LOUDNESS_INFO;
675*15dc779aSAndroid Build Coastguard Worker pstr_asc_usac_config->usac_config_ext_len[pstr_asc_usac_config->num_config_extensions] =
676*15dc779aSAndroid Build Coastguard Worker (usac_data->str_drc_state.drc_config_ext_data_size_bit + 7) >> 3;
677*15dc779aSAndroid Build Coastguard Worker pstr_asc_usac_config->usac_config_ext_buf[pstr_asc_usac_config->num_config_extensions] =
678*15dc779aSAndroid Build Coastguard Worker usac_data->str_drc_state.bit_buf_base_cfg_ext;
679*15dc779aSAndroid Build Coastguard Worker pstr_asc_usac_config->num_config_extensions++;
680*15dc779aSAndroid Build Coastguard Worker
681*15dc779aSAndroid Build Coastguard Worker if (pstr_asc_usac_config->num_config_extensions) {
682*15dc779aSAndroid Build Coastguard Worker pstr_asc_usac_config->usac_cfg_ext_present = 1;
683*15dc779aSAndroid Build Coastguard Worker }
684*15dc779aSAndroid Build Coastguard Worker
685*15dc779aSAndroid Build Coastguard Worker p_audio_specific_config->sampling_frequency = ptr_usac_config->native_sample_rate;
686*15dc779aSAndroid Build Coastguard Worker p_audio_specific_config->num_audio_channels = ptr_usac_config->channels;
687*15dc779aSAndroid Build Coastguard Worker elem_idx = pstr_asc_usac_config->num_elements;
688*15dc779aSAndroid Build Coastguard Worker ptr_usac_config->num_ext_elements = elem_idx;
689*15dc779aSAndroid Build Coastguard Worker pstr_asc_usac_config->num_ext_elements = elem_idx;
690*15dc779aSAndroid Build Coastguard Worker i = elem_idx;
691*15dc779aSAndroid Build Coastguard Worker
692*15dc779aSAndroid Build Coastguard Worker if (ptr_usac_config->channels != 0) {
693*15dc779aSAndroid Build Coastguard Worker ptr_usac_config->num_elements = iusace_get_num_elements(ptr_usac_config->channels);
694*15dc779aSAndroid Build Coastguard Worker pstr_asc_usac_config->num_elements += ptr_usac_config->num_elements;
695*15dc779aSAndroid Build Coastguard Worker
696*15dc779aSAndroid Build Coastguard Worker for (; i < (WORD32)pstr_asc_usac_config->num_elements; i++) {
697*15dc779aSAndroid Build Coastguard Worker pstr_asc_usac_config->usac_element_type[i] = iusace_get_element_type(
698*15dc779aSAndroid Build Coastguard Worker (i - ptr_usac_config->num_ext_elements), ptr_usac_config->channels);
699*15dc779aSAndroid Build Coastguard Worker }
700*15dc779aSAndroid Build Coastguard Worker }
701*15dc779aSAndroid Build Coastguard Worker
702*15dc779aSAndroid Build Coastguard Worker WORD32 count = ptr_usac_config->num_elements;
703*15dc779aSAndroid Build Coastguard Worker ptr_usac_config->num_elements = pstr_asc_usac_config->num_elements;
704*15dc779aSAndroid Build Coastguard Worker iusace_qc_create(&usac_data->str_qc_main);
705*15dc779aSAndroid Build Coastguard Worker
706*15dc779aSAndroid Build Coastguard Worker if (count > 2) {
707*15dc779aSAndroid Build Coastguard Worker WORD32 num_mono = 0, num_stereo = 0, num_lfe = 0;
708*15dc779aSAndroid Build Coastguard Worker
709*15dc779aSAndroid Build Coastguard Worker for (WORD8 ch_idx = 0; ch_idx < count; ch_idx++) {
710*15dc779aSAndroid Build Coastguard Worker switch (
711*15dc779aSAndroid Build Coastguard Worker pstr_asc_usac_config->usac_element_type[ch_idx + ptr_usac_config->num_ext_elements]) {
712*15dc779aSAndroid Build Coastguard Worker case ID_USAC_SCE:
713*15dc779aSAndroid Build Coastguard Worker num_mono++;
714*15dc779aSAndroid Build Coastguard Worker break;
715*15dc779aSAndroid Build Coastguard Worker case ID_USAC_CPE:
716*15dc779aSAndroid Build Coastguard Worker num_stereo++;
717*15dc779aSAndroid Build Coastguard Worker break;
718*15dc779aSAndroid Build Coastguard Worker case ID_USAC_EXT:
719*15dc779aSAndroid Build Coastguard Worker break;
720*15dc779aSAndroid Build Coastguard Worker default:
721*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_INIT_FATAL_USAC_INVALID_ELEMENT_TYPE;
722*15dc779aSAndroid Build Coastguard Worker }
723*15dc779aSAndroid Build Coastguard Worker }
724*15dc779aSAndroid Build Coastguard Worker
725*15dc779aSAndroid Build Coastguard Worker WORD32 bitrate_per_stereo = (WORD32)((ptr_usac_config->basic_bitrate - (num_lfe)*8000) /
726*15dc779aSAndroid Build Coastguard Worker (num_mono * 0.625 + num_stereo));
727*15dc779aSAndroid Build Coastguard Worker WORD32 bitrate_per_mono = (WORD32)(0.625 * bitrate_per_stereo);
728*15dc779aSAndroid Build Coastguard Worker
729*15dc779aSAndroid Build Coastguard Worker for (WORD8 ch_idx = 0; ch_idx < count; ch_idx++) {
730*15dc779aSAndroid Build Coastguard Worker switch (
731*15dc779aSAndroid Build Coastguard Worker pstr_asc_usac_config->usac_element_type[ch_idx + ptr_usac_config->num_ext_elements]) {
732*15dc779aSAndroid Build Coastguard Worker case ID_USAC_SCE:
733*15dc779aSAndroid Build Coastguard Worker usac_data->str_qc_main.str_qc_data[ch_idx].ch_bitrate = bitrate_per_mono;
734*15dc779aSAndroid Build Coastguard Worker break;
735*15dc779aSAndroid Build Coastguard Worker case ID_USAC_CPE:
736*15dc779aSAndroid Build Coastguard Worker usac_data->str_qc_main.str_qc_data[ch_idx].ch_bitrate = bitrate_per_stereo;
737*15dc779aSAndroid Build Coastguard Worker break;
738*15dc779aSAndroid Build Coastguard Worker case ID_USAC_EXT:
739*15dc779aSAndroid Build Coastguard Worker break;
740*15dc779aSAndroid Build Coastguard Worker default:
741*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_INIT_FATAL_USAC_INVALID_ELEMENT_TYPE;
742*15dc779aSAndroid Build Coastguard Worker }
743*15dc779aSAndroid Build Coastguard Worker
744*15dc779aSAndroid Build Coastguard Worker usac_data->str_qc_main.str_qc_data[ch_idx].num_ch = 1;
745*15dc779aSAndroid Build Coastguard Worker if (ID_USAC_CPE ==
746*15dc779aSAndroid Build Coastguard Worker pstr_asc_usac_config->usac_element_type[ch_idx + ptr_usac_config->num_ext_elements]) {
747*15dc779aSAndroid Build Coastguard Worker usac_data->str_qc_main.str_qc_data[ch_idx].num_ch = 2;
748*15dc779aSAndroid Build Coastguard Worker }
749*15dc779aSAndroid Build Coastguard Worker
750*15dc779aSAndroid Build Coastguard Worker usac_data->str_qc_main.str_qc_data[ch_idx].ch_bitrate =
751*15dc779aSAndroid Build Coastguard Worker MIN(360000 * usac_data->str_qc_main.str_qc_data[ch_idx].num_ch,
752*15dc779aSAndroid Build Coastguard Worker usac_data->str_qc_main.str_qc_data[ch_idx].ch_bitrate);
753*15dc779aSAndroid Build Coastguard Worker usac_data->str_qc_main.str_qc_data[ch_idx].ch_bitrate =
754*15dc779aSAndroid Build Coastguard Worker MAX(8000 * usac_data->str_qc_main.str_qc_data[ch_idx].num_ch,
755*15dc779aSAndroid Build Coastguard Worker usac_data->str_qc_main.str_qc_data[ch_idx].ch_bitrate);
756*15dc779aSAndroid Build Coastguard Worker
757*15dc779aSAndroid Build Coastguard Worker usac_data->str_qc_main.str_qc_data[ch_idx].ch_bitrate =
758*15dc779aSAndroid Build Coastguard Worker iusace_limitbitrate(ptr_usac_config->core_sample_rate, 512,
759*15dc779aSAndroid Build Coastguard Worker usac_data->str_qc_main.str_qc_data[ch_idx].num_ch,
760*15dc779aSAndroid Build Coastguard Worker usac_data->str_qc_main.str_qc_data[ch_idx].ch_bitrate);
761*15dc779aSAndroid Build Coastguard Worker
762*15dc779aSAndroid Build Coastguard Worker usac_data->str_qc_main.str_qc_data[ch_idx].avg_bits =
763*15dc779aSAndroid Build Coastguard Worker (usac_data->str_qc_main.str_qc_data[ch_idx].ch_bitrate * ptr_usac_config->ccfl) /
764*15dc779aSAndroid Build Coastguard Worker ptr_usac_config->core_sample_rate;
765*15dc779aSAndroid Build Coastguard Worker }
766*15dc779aSAndroid Build Coastguard Worker } else {
767*15dc779aSAndroid Build Coastguard Worker for (WORD8 ch_idx = 0; ch_idx < count; ch_idx++) {
768*15dc779aSAndroid Build Coastguard Worker usac_data->str_qc_main.str_qc_data[ch_idx].num_ch = (WORD8)ptr_usac_config->channels;
769*15dc779aSAndroid Build Coastguard Worker usac_data->str_qc_main.str_qc_data[ch_idx].ch_bitrate = ptr_usac_config->basic_bitrate;
770*15dc779aSAndroid Build Coastguard Worker usac_data->str_qc_main.str_qc_data[ch_idx].avg_bits =
771*15dc779aSAndroid Build Coastguard Worker (usac_data->str_qc_main.str_qc_data[ch_idx].ch_bitrate * ptr_usac_config->ccfl) /
772*15dc779aSAndroid Build Coastguard Worker ptr_usac_config->core_sample_rate;
773*15dc779aSAndroid Build Coastguard Worker }
774*15dc779aSAndroid Build Coastguard Worker }
775*15dc779aSAndroid Build Coastguard Worker
776*15dc779aSAndroid Build Coastguard Worker for (i_ch = 0;
777*15dc779aSAndroid Build Coastguard Worker i_ch < (WORD32)(ptr_usac_config->num_elements - ptr_usac_config->num_ext_elements);
778*15dc779aSAndroid Build Coastguard Worker i_ch++) {
779*15dc779aSAndroid Build Coastguard Worker iusace_bw_init(ptr_usac_config, p_audio_specific_config, i_ch);
780*15dc779aSAndroid Build Coastguard Worker
781*15dc779aSAndroid Build Coastguard Worker usac_data->noise_filling[i_ch] = ptr_usac_config->flag_noiseFilling;
782*15dc779aSAndroid Build Coastguard Worker }
783*15dc779aSAndroid Build Coastguard Worker
784*15dc779aSAndroid Build Coastguard Worker memset(&usac_data->str_psy_mod.str_psy_out_data, 0,
785*15dc779aSAndroid Build Coastguard Worker sizeof(ia_psy_mod_out_data_struct) * MAX_TIME_CHANNELS);
786*15dc779aSAndroid Build Coastguard Worker
787*15dc779aSAndroid Build Coastguard Worker i_ch = 0;
788*15dc779aSAndroid Build Coastguard Worker for (UWORD32 ch_idx = 0;
789*15dc779aSAndroid Build Coastguard Worker ch_idx < pstr_asc_usac_config->num_elements - ptr_usac_config->num_ext_elements;
790*15dc779aSAndroid Build Coastguard Worker ch_idx++) {
791*15dc779aSAndroid Build Coastguard Worker iusace_psy_mod_init(
792*15dc779aSAndroid Build Coastguard Worker &usac_data->str_psy_mod,
793*15dc779aSAndroid Build Coastguard Worker ((LEN_SUPERFRAME_768 == ptr_usac_config->ccfl) && (0 == ptr_usac_config->sbr_enable)) ?
794*15dc779aSAndroid Build Coastguard Worker (iusace_map_sample_rate((ptr_usac_config->core_sample_rate * 4) / 3)) :
795*15dc779aSAndroid Build Coastguard Worker (ptr_usac_config->core_sample_rate),
796*15dc779aSAndroid Build Coastguard Worker usac_data->str_qc_main.str_qc_data[ch_idx].ch_bitrate, ptr_usac_config->bw_limit[ch_idx],
797*15dc779aSAndroid Build Coastguard Worker usac_data->str_qc_main.str_qc_data[ch_idx].num_ch, i_ch, ch_idx, ptr_usac_config->ccfl);
798*15dc779aSAndroid Build Coastguard Worker i_ch += usac_data->str_qc_main.str_qc_data[ch_idx].num_ch;
799*15dc779aSAndroid Build Coastguard Worker }
800*15dc779aSAndroid Build Coastguard Worker
801*15dc779aSAndroid Build Coastguard Worker for (; elem_idx < pstr_asc_usac_config->num_elements; elem_idx++) {
802*15dc779aSAndroid Build Coastguard Worker idx = elem_idx - pstr_asc_usac_config->num_ext_elements;
803*15dc779aSAndroid Build Coastguard Worker pstr_asc_usac_config->str_usac_element_config[elem_idx].noise_filling =
804*15dc779aSAndroid Build Coastguard Worker usac_data->noise_filling[idx];
805*15dc779aSAndroid Build Coastguard Worker usac_data->channel_elem_type[idx] = pstr_asc_usac_config->usac_element_type[elem_idx];
806*15dc779aSAndroid Build Coastguard Worker }
807*15dc779aSAndroid Build Coastguard Worker
808*15dc779aSAndroid Build Coastguard Worker if (ptr_usac_config->use_fill_element) {
809*15dc779aSAndroid Build Coastguard Worker ia_usac_enc_element_config_struct *pstr_usac_elem_config =
810*15dc779aSAndroid Build Coastguard Worker &(pstr_asc_usac_config->str_usac_element_config[pstr_asc_usac_config->num_elements]);
811*15dc779aSAndroid Build Coastguard Worker pstr_asc_usac_config->usac_element_type[pstr_asc_usac_config->num_elements] = ID_USAC_EXT;
812*15dc779aSAndroid Build Coastguard Worker pstr_usac_elem_config->usac_ext_ele_type = ID_EXT_ELE_FILL;
813*15dc779aSAndroid Build Coastguard Worker pstr_usac_elem_config->usac_ext_ele_cfg_len = 0;
814*15dc779aSAndroid Build Coastguard Worker pstr_usac_elem_config->usac_ext_ele_dflt_len_present = 0;
815*15dc779aSAndroid Build Coastguard Worker pstr_usac_elem_config->usac_ext_ele_payload_present = 0;
816*15dc779aSAndroid Build Coastguard Worker pstr_asc_usac_config->num_elements++;
817*15dc779aSAndroid Build Coastguard Worker ptr_usac_config->num_ext_elements++;
818*15dc779aSAndroid Build Coastguard Worker ptr_usac_config->num_elements++;
819*15dc779aSAndroid Build Coastguard Worker }
820*15dc779aSAndroid Build Coastguard Worker
821*15dc779aSAndroid Build Coastguard Worker if (ptr_usac_config->codec_mode == USAC_SWITCHED) {
822*15dc779aSAndroid Build Coastguard Worker iusace_init_classification(&usac_data->str_sig_class_data);
823*15dc779aSAndroid Build Coastguard Worker }
824*15dc779aSAndroid Build Coastguard Worker
825*15dc779aSAndroid Build Coastguard Worker i_ch = 0;
826*15dc779aSAndroid Build Coastguard Worker for (UWORD32 ch_idx = 0;
827*15dc779aSAndroid Build Coastguard Worker ch_idx < pstr_asc_usac_config->num_elements - ptr_usac_config->num_ext_elements;
828*15dc779aSAndroid Build Coastguard Worker ch_idx++) {
829*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < usac_data->str_qc_main.str_qc_data[ch_idx].num_ch; idx++, i_ch++) {
830*15dc779aSAndroid Build Coastguard Worker iusace_init_block_switching(&usac_data->block_switch_ctrl[i_ch],
831*15dc779aSAndroid Build Coastguard Worker usac_data->str_qc_main.str_qc_data[ch_idx].ch_bitrate,
832*15dc779aSAndroid Build Coastguard Worker usac_data->str_qc_main.str_qc_data[ch_idx].num_ch);
833*15dc779aSAndroid Build Coastguard Worker }
834*15dc779aSAndroid Build Coastguard Worker }
835*15dc779aSAndroid Build Coastguard Worker
836*15dc779aSAndroid Build Coastguard Worker pstr_asc_usac_config->str_usac_element_config[elem_idx].stereo_config_index = 0;
837*15dc779aSAndroid Build Coastguard Worker
838*15dc779aSAndroid Build Coastguard Worker for (i_ch = 0; i_ch < ptr_usac_config->channels; i_ch++) {
839*15dc779aSAndroid Build Coastguard Worker ptr_usac_config->window_sequence[i_ch] = ONLY_LONG_SEQUENCE;
840*15dc779aSAndroid Build Coastguard Worker ptr_usac_config->window_shape_prev[i_ch] = WIN_SEL_0;
841*15dc779aSAndroid Build Coastguard Worker }
842*15dc779aSAndroid Build Coastguard Worker
843*15dc779aSAndroid Build Coastguard Worker for (i_ch = 0; i_ch < ptr_usac_config->channels; i_ch++) {
844*15dc779aSAndroid Build Coastguard Worker memset(usac_data->td_in_buf[i_ch], 0,
845*15dc779aSAndroid Build Coastguard Worker (FRAME_LEN_LONG + LEN_NEXT_HIGH_RATE) * sizeof(usac_data->td_in_buf[i_ch][0]));
846*15dc779aSAndroid Build Coastguard Worker }
847*15dc779aSAndroid Build Coastguard Worker
848*15dc779aSAndroid Build Coastguard Worker usac_data->max_bitreservoir_bits = MAX_CHANNEL_BITS * ptr_usac_config->channels;
849*15dc779aSAndroid Build Coastguard Worker usac_data->available_bitreservoir_bits = usac_data->max_bitreservoir_bits;
850*15dc779aSAndroid Build Coastguard Worker usac_data->available_bitreservoir_bits -=
851*15dc779aSAndroid Build Coastguard Worker (ptr_usac_config->bit_rate * ptr_usac_config->ccfl) / ptr_usac_config->core_sample_rate;
852*15dc779aSAndroid Build Coastguard Worker
853*15dc779aSAndroid Build Coastguard Worker if (usac_data->available_bitreservoir_bits < 0) {
854*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_INIT_FATAL_USAC_BITRES_SIZE_TOO_SMALL;
855*15dc779aSAndroid Build Coastguard Worker }
856*15dc779aSAndroid Build Coastguard Worker i_ch = 0;
857*15dc779aSAndroid Build Coastguard Worker for (UWORD32 ch_idx = 0;
858*15dc779aSAndroid Build Coastguard Worker ch_idx < pstr_asc_usac_config->num_elements - ptr_usac_config->num_ext_elements;
859*15dc779aSAndroid Build Coastguard Worker ch_idx++) {
860*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < usac_data->str_qc_main.str_qc_data[ch_idx].num_ch; idx++, i_ch++) {
861*15dc779aSAndroid Build Coastguard Worker usac_data->td_encoder[i_ch]->max_sfb_short =
862*15dc779aSAndroid Build Coastguard Worker usac_data->str_psy_mod.str_psy_short_config[ch_idx].sfb_count;
863*15dc779aSAndroid Build Coastguard Worker if (ptr_usac_config->tns_select == 0) {
864*15dc779aSAndroid Build Coastguard Worker usac_data->pstr_tns_info[i_ch] = NULL;
865*15dc779aSAndroid Build Coastguard Worker } else {
866*15dc779aSAndroid Build Coastguard Worker usac_data->pstr_tns_info[i_ch]->sfb_offset_table_short =
867*15dc779aSAndroid Build Coastguard Worker usac_data->str_psy_mod.str_psy_short_config[ch_idx].sfb_offset;
868*15dc779aSAndroid Build Coastguard Worker usac_data->pstr_tns_info[i_ch]->sfb_offset_table_long =
869*15dc779aSAndroid Build Coastguard Worker usac_data->str_psy_mod.str_psy_long_config[ch_idx].sfb_offset;
870*15dc779aSAndroid Build Coastguard Worker usac_data->pstr_tns_info[i_ch]->max_sfb_short =
871*15dc779aSAndroid Build Coastguard Worker usac_data->str_psy_mod.str_psy_short_config[ch_idx].sfb_count;
872*15dc779aSAndroid Build Coastguard Worker usac_data->pstr_tns_info[i_ch]->max_sfb_long =
873*15dc779aSAndroid Build Coastguard Worker usac_data->str_psy_mod.str_psy_long_config[ch_idx].sfb_count;
874*15dc779aSAndroid Build Coastguard Worker
875*15dc779aSAndroid Build Coastguard Worker err_code = iusace_tns_init(ptr_usac_config->core_sample_rate,
876*15dc779aSAndroid Build Coastguard Worker usac_data->str_qc_main.str_qc_data[ch_idx].ch_bitrate /
877*15dc779aSAndroid Build Coastguard Worker usac_data->str_qc_main.str_qc_data[ch_idx].num_ch,
878*15dc779aSAndroid Build Coastguard Worker usac_data->pstr_tns_info[i_ch],
879*15dc779aSAndroid Build Coastguard Worker usac_data->str_qc_main.str_qc_data[ch_idx].num_ch);
880*15dc779aSAndroid Build Coastguard Worker if (err_code) {
881*15dc779aSAndroid Build Coastguard Worker return err_code;
882*15dc779aSAndroid Build Coastguard Worker }
883*15dc779aSAndroid Build Coastguard Worker }
884*15dc779aSAndroid Build Coastguard Worker }
885*15dc779aSAndroid Build Coastguard Worker }
886*15dc779aSAndroid Build Coastguard Worker
887*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < MAX_TIME_CHANNELS; i++) usac_data->str_quant_info[i].reset = 1;
888*15dc779aSAndroid Build Coastguard Worker
889*15dc779aSAndroid Build Coastguard Worker if (ptr_usac_config->codec_mode == USAC_SWITCHED ||
890*15dc779aSAndroid Build Coastguard Worker ptr_usac_config->codec_mode == USAC_ONLY_TD) {
891*15dc779aSAndroid Build Coastguard Worker for (i_ch = 0; i_ch < ptr_usac_config->channels; i_ch++) {
892*15dc779aSAndroid Build Coastguard Worker if ((ptr_usac_config->core_sample_rate) < SR_MIN ||
893*15dc779aSAndroid Build Coastguard Worker (ptr_usac_config->core_sample_rate) > SR_MAX) {
894*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_CONFIG_FATAL_USAC_SAMP_FREQ;
895*15dc779aSAndroid Build Coastguard Worker } else {
896*15dc779aSAndroid Build Coastguard Worker usac_data->td_encoder[i_ch]->fscale = ptr_usac_config->core_sample_rate;
897*15dc779aSAndroid Build Coastguard Worker
898*15dc779aSAndroid Build Coastguard Worker iusace_init_td_data(usac_data->td_encoder[i_ch], ptr_usac_config->ccfl);
899*15dc779aSAndroid Build Coastguard Worker }
900*15dc779aSAndroid Build Coastguard Worker
901*15dc779aSAndroid Build Coastguard Worker usac_data->td_bitrate[i_ch] = ptr_usac_config->bit_rate;
902*15dc779aSAndroid Build Coastguard Worker usac_data->td_bitrate[i_ch] /= ptr_usac_config->channels;
903*15dc779aSAndroid Build Coastguard Worker iusace_config_acelp_core_mode(usac_data->td_encoder[i_ch],
904*15dc779aSAndroid Build Coastguard Worker ptr_usac_config->core_sample_rate,
905*15dc779aSAndroid Build Coastguard Worker usac_data->td_bitrate[i_ch]);
906*15dc779aSAndroid Build Coastguard Worker
907*15dc779aSAndroid Build Coastguard Worker usac_data->acelp_core_mode[i_ch] = (usac_data->td_encoder[i_ch])->acelp_core_mode;
908*15dc779aSAndroid Build Coastguard Worker if (ptr_usac_config->core_sample_rate == 8000) {
909*15dc779aSAndroid Build Coastguard Worker usac_data->use_acelp_only = 1;
910*15dc779aSAndroid Build Coastguard Worker }
911*15dc779aSAndroid Build Coastguard Worker }
912*15dc779aSAndroid Build Coastguard Worker } else {
913*15dc779aSAndroid Build Coastguard Worker usac_data->acelp_core_mode[0] = 0;
914*15dc779aSAndroid Build Coastguard Worker }
915*15dc779aSAndroid Build Coastguard Worker
916*15dc779aSAndroid Build Coastguard Worker for (UWORD32 ch = 0;
917*15dc779aSAndroid Build Coastguard Worker ch < pstr_asc_usac_config->num_elements - ptr_usac_config->num_ext_elements; ch++) {
918*15dc779aSAndroid Build Coastguard Worker iusace_qc_init(&usac_data->str_qc_main.str_qc_data[ch], MAX_CHANNEL_BITS,
919*15dc779aSAndroid Build Coastguard Worker ptr_usac_config->core_sample_rate, ptr_usac_config->bw_limit[ch],
920*15dc779aSAndroid Build Coastguard Worker usac_data->str_qc_main.str_qc_data[ch].num_ch, ptr_usac_config->ccfl);
921*15dc779aSAndroid Build Coastguard Worker }
922*15dc779aSAndroid Build Coastguard Worker
923*15dc779aSAndroid Build Coastguard Worker return err_code;
924*15dc779aSAndroid Build Coastguard Worker }
925*15dc779aSAndroid Build Coastguard Worker
iexheaax_append_bitstream(ixheaace_bit_buf_handle hdl_bitbuf_write,ixheaace_bit_buf_handle hdl_bitbuf_read,WORD32 num_bits)926*15dc779aSAndroid Build Coastguard Worker static WORD32 iexheaax_append_bitstream(ixheaace_bit_buf_handle hdl_bitbuf_write,
927*15dc779aSAndroid Build Coastguard Worker ixheaace_bit_buf_handle hdl_bitbuf_read,
928*15dc779aSAndroid Build Coastguard Worker WORD32 num_bits) {
929*15dc779aSAndroid Build Coastguard Worker WORD32 idx;
930*15dc779aSAndroid Build Coastguard Worker UWORD32 value;
931*15dc779aSAndroid Build Coastguard Worker
932*15dc779aSAndroid Build Coastguard Worker if (num_bits > 16) {
933*15dc779aSAndroid Build Coastguard Worker WORD32 cnt, rem;
934*15dc779aSAndroid Build Coastguard Worker cnt = num_bits >> 4;
935*15dc779aSAndroid Build Coastguard Worker rem = num_bits % 16;
936*15dc779aSAndroid Build Coastguard Worker
937*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < cnt; idx++) {
938*15dc779aSAndroid Build Coastguard Worker value = ixheaace_readbits(hdl_bitbuf_read, 16);
939*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(hdl_bitbuf_write, value, 16);
940*15dc779aSAndroid Build Coastguard Worker }
941*15dc779aSAndroid Build Coastguard Worker if (rem) {
942*15dc779aSAndroid Build Coastguard Worker value = ixheaace_readbits(hdl_bitbuf_read, (UWORD8)rem);
943*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(hdl_bitbuf_write, value, (UWORD8)rem);
944*15dc779aSAndroid Build Coastguard Worker }
945*15dc779aSAndroid Build Coastguard Worker } else {
946*15dc779aSAndroid Build Coastguard Worker value = ixheaace_readbits(hdl_bitbuf_read, (UWORD8)num_bits);
947*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(hdl_bitbuf_write, value, (UWORD8)num_bits);
948*15dc779aSAndroid Build Coastguard Worker }
949*15dc779aSAndroid Build Coastguard Worker
950*15dc779aSAndroid Build Coastguard Worker return num_bits;
951*15dc779aSAndroid Build Coastguard Worker }
952*15dc779aSAndroid Build Coastguard Worker
iusace_enc_ext_elemts(UWORD32 usac_ext_ele_type,ia_usac_encoder_config_struct * pstr_usac_config,ia_usac_data_struct * pstr_usac_data,ixheaace_audio_specific_config_struct * pstr_asc,FLOAT32 ** pptr_input,ia_bit_buf_struct * it_bit_buff,WORD32 * num_bits_written)953*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE iusace_enc_ext_elemts(UWORD32 usac_ext_ele_type,
954*15dc779aSAndroid Build Coastguard Worker ia_usac_encoder_config_struct *pstr_usac_config,
955*15dc779aSAndroid Build Coastguard Worker ia_usac_data_struct *pstr_usac_data,
956*15dc779aSAndroid Build Coastguard Worker ixheaace_audio_specific_config_struct *pstr_asc,
957*15dc779aSAndroid Build Coastguard Worker FLOAT32 **pptr_input, ia_bit_buf_struct *it_bit_buff,
958*15dc779aSAndroid Build Coastguard Worker WORD32 *num_bits_written) {
959*15dc779aSAndroid Build Coastguard Worker WORD8 idx = 0;
960*15dc779aSAndroid Build Coastguard Worker LOOPIDX idx_2 = 0;
961*15dc779aSAndroid Build Coastguard Worker WORD32 num_bits_payload = 0;
962*15dc779aSAndroid Build Coastguard Worker WORD32 num_byts_payload = 0;
963*15dc779aSAndroid Build Coastguard Worker ia_usac_config_struct *pstr_asc_usac_config = &(pstr_asc->str_usac_config);
964*15dc779aSAndroid Build Coastguard Worker VOID *pstr_scratch = &pstr_usac_data->str_scratch;
965*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err_code = IA_NO_ERROR;
966*15dc779aSAndroid Build Coastguard Worker
967*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < (WORD32)pstr_asc_usac_config->num_elements; idx++) {
968*15dc779aSAndroid Build Coastguard Worker if (ID_USAC_EXT != pstr_asc_usac_config->usac_element_type[idx]) {
969*15dc779aSAndroid Build Coastguard Worker continue;
970*15dc779aSAndroid Build Coastguard Worker }
971*15dc779aSAndroid Build Coastguard Worker
972*15dc779aSAndroid Build Coastguard Worker ia_usac_enc_element_config_struct *pstr_usac_elem_config =
973*15dc779aSAndroid Build Coastguard Worker &(pstr_asc_usac_config->str_usac_element_config[idx]);
974*15dc779aSAndroid Build Coastguard Worker
975*15dc779aSAndroid Build Coastguard Worker if (usac_ext_ele_type != pstr_usac_elem_config->usac_ext_ele_type) {
976*15dc779aSAndroid Build Coastguard Worker continue;
977*15dc779aSAndroid Build Coastguard Worker }
978*15dc779aSAndroid Build Coastguard Worker
979*15dc779aSAndroid Build Coastguard Worker switch (pstr_usac_elem_config->usac_ext_ele_type) {
980*15dc779aSAndroid Build Coastguard Worker case ID_EXT_ELE_UNI_DRC: {
981*15dc779aSAndroid Build Coastguard Worker if (pstr_usac_data->str_drc_state.is_first_drc_process_complete == 0) {
982*15dc779aSAndroid Build Coastguard Worker iusace_reset_bit_buffer(&pstr_usac_data->str_drc_state.str_bit_buf_out);
983*15dc779aSAndroid Build Coastguard Worker err_code = impd_drc_enc(&pstr_usac_data->str_drc_state, pptr_input, 0,
984*15dc779aSAndroid Build Coastguard Worker &num_bits_payload, pstr_scratch);
985*15dc779aSAndroid Build Coastguard Worker if (err_code) {
986*15dc779aSAndroid Build Coastguard Worker return err_code;
987*15dc779aSAndroid Build Coastguard Worker }
988*15dc779aSAndroid Build Coastguard Worker pstr_usac_data->str_drc_state.is_first_drc_process_complete = 1;
989*15dc779aSAndroid Build Coastguard Worker num_bits_payload = 0;
990*15dc779aSAndroid Build Coastguard Worker }
991*15dc779aSAndroid Build Coastguard Worker
992*15dc779aSAndroid Build Coastguard Worker iusace_reset_bit_buffer(&pstr_usac_data->str_drc_state.str_bit_buf_out);
993*15dc779aSAndroid Build Coastguard Worker err_code =
994*15dc779aSAndroid Build Coastguard Worker impd_drc_enc(&pstr_usac_data->str_drc_state, pptr_input,
995*15dc779aSAndroid Build Coastguard Worker pstr_usac_config->drc_frame_size, &num_bits_payload, pstr_scratch);
996*15dc779aSAndroid Build Coastguard Worker if (err_code) {
997*15dc779aSAndroid Build Coastguard Worker return err_code;
998*15dc779aSAndroid Build Coastguard Worker }
999*15dc779aSAndroid Build Coastguard Worker num_byts_payload = (num_bits_payload + 7) >> 3;
1000*15dc779aSAndroid Build Coastguard Worker } break;
1001*15dc779aSAndroid Build Coastguard Worker default: {
1002*15dc779aSAndroid Build Coastguard Worker } break;
1003*15dc779aSAndroid Build Coastguard Worker }
1004*15dc779aSAndroid Build Coastguard Worker
1005*15dc779aSAndroid Build Coastguard Worker if (num_byts_payload <= 0) {
1006*15dc779aSAndroid Build Coastguard Worker *num_bits_written += iusace_write_bits_buf(it_bit_buff, 0, 1); // usacExtElementPresent
1007*15dc779aSAndroid Build Coastguard Worker } else {
1008*15dc779aSAndroid Build Coastguard Worker *num_bits_written += iusace_write_bits_buf(it_bit_buff, 1, 1); // usacExtElementPresent
1009*15dc779aSAndroid Build Coastguard Worker
1010*15dc779aSAndroid Build Coastguard Worker *num_bits_written +=
1011*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buff, 0, 1); // usacExtElementUseDefaultLength
1012*15dc779aSAndroid Build Coastguard Worker
1013*15dc779aSAndroid Build Coastguard Worker if (num_byts_payload >= 255) {
1014*15dc779aSAndroid Build Coastguard Worker *num_bits_written +=
1015*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buff, 255, 8); // usacExtElementPayloadLength
1016*15dc779aSAndroid Build Coastguard Worker
1017*15dc779aSAndroid Build Coastguard Worker UWORD16 value_add = (UWORD16)(num_byts_payload - 255 + 2);
1018*15dc779aSAndroid Build Coastguard Worker *num_bits_written += iusace_write_bits_buf(it_bit_buff, value_add, 16);
1019*15dc779aSAndroid Build Coastguard Worker } else {
1020*15dc779aSAndroid Build Coastguard Worker *num_bits_written += iusace_write_bits_buf(it_bit_buff, num_byts_payload,
1021*15dc779aSAndroid Build Coastguard Worker 8); // usacExtElementPayloadLength
1022*15dc779aSAndroid Build Coastguard Worker }
1023*15dc779aSAndroid Build Coastguard Worker
1024*15dc779aSAndroid Build Coastguard Worker switch (pstr_usac_elem_config->usac_ext_ele_type) {
1025*15dc779aSAndroid Build Coastguard Worker case ID_EXT_ELE_UNI_DRC: {
1026*15dc779aSAndroid Build Coastguard Worker for (idx_2 = 0; idx_2 < num_byts_payload; idx_2++) {
1027*15dc779aSAndroid Build Coastguard Worker *num_bits_written += iusace_write_bits_buf(
1028*15dc779aSAndroid Build Coastguard Worker it_bit_buff, pstr_usac_data->str_drc_state.bit_buf_base_out[idx_2], 8);
1029*15dc779aSAndroid Build Coastguard Worker }
1030*15dc779aSAndroid Build Coastguard Worker } break;
1031*15dc779aSAndroid Build Coastguard Worker default: {
1032*15dc779aSAndroid Build Coastguard Worker } break;
1033*15dc779aSAndroid Build Coastguard Worker }
1034*15dc779aSAndroid Build Coastguard Worker }
1035*15dc779aSAndroid Build Coastguard Worker }
1036*15dc779aSAndroid Build Coastguard Worker
1037*15dc779aSAndroid Build Coastguard Worker return err_code;
1038*15dc779aSAndroid Build Coastguard Worker }
1039*15dc779aSAndroid Build Coastguard Worker
ixheaace_usac_encode(FLOAT32 ** ptr_input,ia_usac_encoder_config_struct * ptr_usac_config,ia_usac_data_struct * pstr_state,ixheaace_audio_specific_config_struct * pstr_asc,ia_bit_buf_struct * pstr_it_bit_buff,ixheaace_pstr_sbr_enc ptr_env_encoder,FLOAT32 ** pp_drc_inp,WORD32 * is_quant_spec_zero,WORD32 * is_gain_limited)1040*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaace_usac_encode(FLOAT32 **ptr_input,
1041*15dc779aSAndroid Build Coastguard Worker ia_usac_encoder_config_struct *ptr_usac_config,
1042*15dc779aSAndroid Build Coastguard Worker ia_usac_data_struct *pstr_state,
1043*15dc779aSAndroid Build Coastguard Worker ixheaace_audio_specific_config_struct *pstr_asc,
1044*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct *pstr_it_bit_buff,
1045*15dc779aSAndroid Build Coastguard Worker ixheaace_pstr_sbr_enc ptr_env_encoder, FLOAT32 **pp_drc_inp,
1046*15dc779aSAndroid Build Coastguard Worker WORD32 *is_quant_spec_zero, WORD32 *is_gain_limited) {
1047*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err = IA_NO_ERROR;
1048*15dc779aSAndroid Build Coastguard Worker WORD32 i_ch, i, k;
1049*15dc779aSAndroid Build Coastguard Worker ia_usac_data_struct *ptr_usac_data = pstr_state;
1050*15dc779aSAndroid Build Coastguard Worker iusace_scratch_mem *pstr_scratch = &ptr_usac_data->str_scratch;
1051*15dc779aSAndroid Build Coastguard Worker WORD32 bits_written = 0;
1052*15dc779aSAndroid Build Coastguard Worker
1053*15dc779aSAndroid Build Coastguard Worker WORD32 *next_window_sequence = pstr_scratch->ptr_next_win_scratch;
1054*15dc779aSAndroid Build Coastguard Worker WORD32 *new_win_seq = pstr_scratch->ptr_next_win_scratch + MAX_TIME_CHANNELS;
1055*15dc779aSAndroid Build Coastguard Worker memset(next_window_sequence, 0, MAX_TIME_CHANNELS * sizeof(next_window_sequence));
1056*15dc779aSAndroid Build Coastguard Worker memset(new_win_seq, 0, MAX_TIME_CHANNELS * sizeof(new_win_seq));
1057*15dc779aSAndroid Build Coastguard Worker ia_sfb_params_struct *pstr_sfb_prms = &ptr_usac_config->str_sfb_prms;
1058*15dc779aSAndroid Build Coastguard Worker memset(pstr_sfb_prms, 0, sizeof(ia_sfb_params_struct));
1059*15dc779aSAndroid Build Coastguard Worker
1060*15dc779aSAndroid Build Coastguard Worker WORD32 *num_window_groups = pstr_sfb_prms->num_window_groups;
1061*15dc779aSAndroid Build Coastguard Worker WORD32 average_bits_total;
1062*15dc779aSAndroid Build Coastguard Worker WORD32 num_bits;
1063*15dc779aSAndroid Build Coastguard Worker WORD32 padding_bits;
1064*15dc779aSAndroid Build Coastguard Worker WORD32 *common_win = pstr_sfb_prms->common_win;
1065*15dc779aSAndroid Build Coastguard Worker WORD32 usac_independency_flg;
1066*15dc779aSAndroid Build Coastguard Worker WORD32 mod[NUM_FRAMES] = {0};
1067*15dc779aSAndroid Build Coastguard Worker WORD32 len_frame;
1068*15dc779aSAndroid Build Coastguard Worker WORD32 len_lpc0;
1069*15dc779aSAndroid Build Coastguard Worker WORD32 len_next_high_rate;
1070*15dc779aSAndroid Build Coastguard Worker WORD8 elem_idx, nr_core_coder_channels = 0, chn = 0;
1071*15dc779aSAndroid Build Coastguard Worker WORD32 ch_offset = 0;
1072*15dc779aSAndroid Build Coastguard Worker WORD32 elem_idx_max = ptr_usac_config->num_elements - ptr_usac_config->num_ext_elements;
1073*15dc779aSAndroid Build Coastguard Worker WORD32 td_buffer_offset = (TD_BUFFER_OFFSET * ptr_usac_config->ccfl) / FRAME_LEN_LONG;
1074*15dc779aSAndroid Build Coastguard Worker usac_independency_flg = ptr_usac_data->usac_independency_flag;
1075*15dc779aSAndroid Build Coastguard Worker
1076*15dc779aSAndroid Build Coastguard Worker len_frame = ptr_usac_config->ccfl;
1077*15dc779aSAndroid Build Coastguard Worker len_lpc0 = (LEN_LPC0 * len_frame) / FRAME_LEN_LONG;
1078*15dc779aSAndroid Build Coastguard Worker len_next_high_rate = (LEN_NEXT_HIGH_RATE * len_frame) / FRAME_LEN_LONG;
1079*15dc779aSAndroid Build Coastguard Worker
1080*15dc779aSAndroid Build Coastguard Worker average_bits_total =
1081*15dc779aSAndroid Build Coastguard Worker (ptr_usac_config->bit_rate * ptr_usac_config->ccfl) / ptr_usac_config->core_sample_rate;
1082*15dc779aSAndroid Build Coastguard Worker
1083*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->min_bits_needed =
1084*15dc779aSAndroid Build Coastguard Worker (long)(ptr_usac_data->available_bitreservoir_bits + 2 * average_bits_total -
1085*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->max_bitreservoir_bits);
1086*15dc779aSAndroid Build Coastguard Worker if (ptr_usac_data->min_bits_needed < 0) {
1087*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->min_bits_needed = 0;
1088*15dc779aSAndroid Build Coastguard Worker }
1089*15dc779aSAndroid Build Coastguard Worker
1090*15dc779aSAndroid Build Coastguard Worker num_bits = 0;
1091*15dc779aSAndroid Build Coastguard Worker if (ptr_usac_config->preroll_flag) {
1092*15dc779aSAndroid Build Coastguard Worker if (ptr_usac_config->iframes_interval != ptr_usac_config->num_preroll_frames) {
1093*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(pstr_it_bit_buff, usac_independency_flg, 1);
1094*15dc779aSAndroid Build Coastguard Worker num_bits++;
1095*15dc779aSAndroid Build Coastguard Worker }
1096*15dc779aSAndroid Build Coastguard Worker } else {
1097*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(pstr_it_bit_buff, usac_independency_flg, 1);
1098*15dc779aSAndroid Build Coastguard Worker num_bits++;
1099*15dc779aSAndroid Build Coastguard Worker }
1100*15dc779aSAndroid Build Coastguard Worker for (elem_idx = 0; elem_idx < elem_idx_max; elem_idx++) {
1101*15dc779aSAndroid Build Coastguard Worker switch (ptr_usac_data->channel_elem_type[elem_idx]) {
1102*15dc779aSAndroid Build Coastguard Worker case USAC_ELEMENT_TYPE_SCE:
1103*15dc779aSAndroid Build Coastguard Worker nr_core_coder_channels = 1;
1104*15dc779aSAndroid Build Coastguard Worker break;
1105*15dc779aSAndroid Build Coastguard Worker case USAC_ELEMENT_TYPE_CPE:
1106*15dc779aSAndroid Build Coastguard Worker nr_core_coder_channels = 2;
1107*15dc779aSAndroid Build Coastguard Worker break;
1108*15dc779aSAndroid Build Coastguard Worker }
1109*15dc779aSAndroid Build Coastguard Worker
1110*15dc779aSAndroid Build Coastguard Worker if (ptr_usac_data->core_mode[0] == CORE_MODE_FD) {
1111*15dc779aSAndroid Build Coastguard Worker for (chn = 0, i_ch = ch_offset; chn < nr_core_coder_channels; chn++, i_ch++) {
1112*15dc779aSAndroid Build Coastguard Worker iusace_block_switching(&ptr_usac_data->block_switch_ctrl[i_ch], ptr_input[i_ch],
1113*15dc779aSAndroid Build Coastguard Worker ptr_usac_config->ccfl);
1114*15dc779aSAndroid Build Coastguard Worker }
1115*15dc779aSAndroid Build Coastguard Worker }
1116*15dc779aSAndroid Build Coastguard Worker
1117*15dc779aSAndroid Build Coastguard Worker i_ch = ch_offset;
1118*15dc779aSAndroid Build Coastguard Worker if (nr_core_coder_channels == 2) {
1119*15dc779aSAndroid Build Coastguard Worker iusace_sync_block_switching(&ptr_usac_data->block_switch_ctrl[i_ch],
1120*15dc779aSAndroid Build Coastguard Worker &ptr_usac_data->block_switch_ctrl[i_ch + 1]);
1121*15dc779aSAndroid Build Coastguard Worker }
1122*15dc779aSAndroid Build Coastguard Worker
1123*15dc779aSAndroid Build Coastguard Worker for (chn = 0, i_ch = ch_offset; chn < nr_core_coder_channels; chn++, i_ch++) {
1124*15dc779aSAndroid Build Coastguard Worker switch (ptr_usac_config->codec_mode) {
1125*15dc779aSAndroid Build Coastguard Worker case USAC_SWITCHED:
1126*15dc779aSAndroid Build Coastguard Worker if (ptr_usac_data->str_sig_class_data.coding_mode == 2) {
1127*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->core_mode_next[i_ch] = CORE_MODE_FD;
1128*15dc779aSAndroid Build Coastguard Worker } else {
1129*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->core_mode_next[i_ch] = CORE_MODE_TD;
1130*15dc779aSAndroid Build Coastguard Worker }
1131*15dc779aSAndroid Build Coastguard Worker break;
1132*15dc779aSAndroid Build Coastguard Worker case USAC_ONLY_FD:
1133*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->core_mode_next[i_ch] = CORE_MODE_FD;
1134*15dc779aSAndroid Build Coastguard Worker break;
1135*15dc779aSAndroid Build Coastguard Worker case USAC_ONLY_TD:
1136*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->core_mode_next[i_ch] = CORE_MODE_TD;
1137*15dc779aSAndroid Build Coastguard Worker break;
1138*15dc779aSAndroid Build Coastguard Worker default:
1139*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_INIT_FATAL_USAC_INVALID_CODEC_MODE;
1140*15dc779aSAndroid Build Coastguard Worker }
1141*15dc779aSAndroid Build Coastguard Worker if (ptr_usac_data->core_mode[i_ch] == CORE_MODE_TD) {
1142*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < ptr_usac_config->ccfl; i++) {
1143*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->ptr_2frame_time_data[i_ch][i] = ptr_usac_data->ptr_time_data[i_ch][i];
1144*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->ptr_2frame_time_data[i_ch][ptr_usac_config->ccfl + i] =
1145*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->ptr_look_ahead_time_data[i_ch][i];
1146*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->ptr_time_data[i_ch][i] =
1147*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->ptr_look_ahead_time_data[i_ch][i];
1148*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->ptr_look_ahead_time_data[i_ch][i] = (FLOAT64)ptr_input[i_ch][i];
1149*15dc779aSAndroid Build Coastguard Worker }
1150*15dc779aSAndroid Build Coastguard Worker } else {
1151*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < ptr_usac_config->ccfl; i++) {
1152*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->ptr_2frame_time_data[i_ch][i] = ptr_usac_data->ptr_time_data[i_ch][i];
1153*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->ptr_2frame_time_data[i_ch][ptr_usac_config->ccfl + i] =
1154*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->ptr_look_ahead_time_data[i_ch][i];
1155*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->ptr_time_data[i_ch][i] = ptr_input[i_ch][i];
1156*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->ptr_look_ahead_time_data[i_ch][i] = (FLOAT64)ptr_input[i_ch][i];
1157*15dc779aSAndroid Build Coastguard Worker }
1158*15dc779aSAndroid Build Coastguard Worker }
1159*15dc779aSAndroid Build Coastguard Worker
1160*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < len_frame + len_next_high_rate; i++) {
1161*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->td_in_buf[i_ch][i] =
1162*15dc779aSAndroid Build Coastguard Worker (FLOAT32)(ptr_usac_data->ptr_2frame_time_data[i_ch][i + td_buffer_offset]);
1163*15dc779aSAndroid Build Coastguard Worker }
1164*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < len_frame + len_next_high_rate + len_lpc0; i++) {
1165*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->td_in_prev_buf[i_ch][i] =
1166*15dc779aSAndroid Build Coastguard Worker (FLOAT32)(ptr_usac_data->ptr_2frame_time_data[i_ch][i + td_buffer_offset - len_lpc0]);
1167*15dc779aSAndroid Build Coastguard Worker }
1168*15dc779aSAndroid Build Coastguard Worker
1169*15dc779aSAndroid Build Coastguard Worker if (ptr_usac_data->core_mode[i_ch] == CORE_MODE_FD) {
1170*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->window_size_samples[i_ch] = ptr_usac_config->ccfl;
1171*15dc779aSAndroid Build Coastguard Worker pstr_sfb_prms->window_sequence[i_ch] = ptr_usac_data->block_switch_ctrl[i_ch].window_seq;
1172*15dc779aSAndroid Build Coastguard Worker ptr_usac_config->window_sequence[i_ch] = pstr_sfb_prms->window_sequence[i_ch];
1173*15dc779aSAndroid Build Coastguard Worker new_win_seq[i_ch] = ptr_usac_data->block_switch_ctrl[i_ch].next_win_seq;
1174*15dc779aSAndroid Build Coastguard Worker }
1175*15dc779aSAndroid Build Coastguard Worker
1176*15dc779aSAndroid Build Coastguard Worker err = iusace_sfb_params_init(((LEN_SUPERFRAME_768 == ptr_usac_config->ccfl) &&
1177*15dc779aSAndroid Build Coastguard Worker (0 == ptr_usac_config->sbr_enable)) ?
1178*15dc779aSAndroid Build Coastguard Worker (iusace_map_sample_rate((ptr_usac_config->core_sample_rate
1179*15dc779aSAndroid Build Coastguard Worker * 4) / 3)) :(ptr_usac_config->core_sample_rate),
1180*15dc779aSAndroid Build Coastguard Worker ptr_usac_config->ccfl, pstr_sfb_prms->sfb_width_table[i_ch],
1181*15dc779aSAndroid Build Coastguard Worker &pstr_sfb_prms->num_sfb[i_ch],
1182*15dc779aSAndroid Build Coastguard Worker pstr_sfb_prms->window_sequence[i_ch]);
1183*15dc779aSAndroid Build Coastguard Worker
1184*15dc779aSAndroid Build Coastguard Worker if (err) {
1185*15dc779aSAndroid Build Coastguard Worker return err;
1186*15dc779aSAndroid Build Coastguard Worker }
1187*15dc779aSAndroid Build Coastguard Worker
1188*15dc779aSAndroid Build Coastguard Worker pstr_sfb_prms->sfb_offset[i_ch][0] = 0;
1189*15dc779aSAndroid Build Coastguard Worker k = 0;
1190*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < pstr_sfb_prms->num_sfb[i_ch]; i++) {
1191*15dc779aSAndroid Build Coastguard Worker pstr_sfb_prms->sfb_offset[i_ch][i] = k;
1192*15dc779aSAndroid Build Coastguard Worker k += pstr_sfb_prms->sfb_width_table[i_ch][i];
1193*15dc779aSAndroid Build Coastguard Worker }
1194*15dc779aSAndroid Build Coastguard Worker pstr_sfb_prms->sfb_offset[i_ch][i] = k;
1195*15dc779aSAndroid Build Coastguard Worker
1196*15dc779aSAndroid Build Coastguard Worker if (ptr_usac_data->core_mode[i_ch] != CORE_MODE_TD) {
1197*15dc779aSAndroid Build Coastguard Worker next_window_sequence[i_ch] = new_win_seq[i_ch];
1198*15dc779aSAndroid Build Coastguard Worker if (ptr_usac_data->core_mode_next[i_ch] == CORE_MODE_TD) {
1199*15dc779aSAndroid Build Coastguard Worker next_window_sequence[i_ch] = EIGHT_SHORT_SEQUENCE;
1200*15dc779aSAndroid Build Coastguard Worker }
1201*15dc779aSAndroid Build Coastguard Worker
1202*15dc779aSAndroid Build Coastguard Worker if (ptr_usac_data->core_mode[i_ch] == CORE_MODE_TD &&
1203*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->core_mode_next[i_ch] != CORE_MODE_TD) {
1204*15dc779aSAndroid Build Coastguard Worker next_window_sequence[i_ch] = LONG_STOP_SEQUENCE;
1205*15dc779aSAndroid Build Coastguard Worker }
1206*15dc779aSAndroid Build Coastguard Worker
1207*15dc779aSAndroid Build Coastguard Worker if (next_window_sequence[i_ch] == EIGHT_SHORT_SEQUENCE) {
1208*15dc779aSAndroid Build Coastguard Worker if (pstr_sfb_prms->window_sequence[i_ch] == ONLY_LONG_SEQUENCE) {
1209*15dc779aSAndroid Build Coastguard Worker pstr_sfb_prms->window_sequence[i_ch] = LONG_START_SEQUENCE;
1210*15dc779aSAndroid Build Coastguard Worker }
1211*15dc779aSAndroid Build Coastguard Worker if (pstr_sfb_prms->window_sequence[i_ch] == LONG_STOP_SEQUENCE) {
1212*15dc779aSAndroid Build Coastguard Worker pstr_sfb_prms->window_sequence[i_ch] = STOP_START_SEQUENCE;
1213*15dc779aSAndroid Build Coastguard Worker }
1214*15dc779aSAndroid Build Coastguard Worker }
1215*15dc779aSAndroid Build Coastguard Worker
1216*15dc779aSAndroid Build Coastguard Worker if (next_window_sequence[i_ch] == ONLY_LONG_SEQUENCE) {
1217*15dc779aSAndroid Build Coastguard Worker if (pstr_sfb_prms->window_sequence[i_ch] == EIGHT_SHORT_SEQUENCE) {
1218*15dc779aSAndroid Build Coastguard Worker next_window_sequence[i_ch] = LONG_STOP_SEQUENCE;
1219*15dc779aSAndroid Build Coastguard Worker }
1220*15dc779aSAndroid Build Coastguard Worker }
1221*15dc779aSAndroid Build Coastguard Worker
1222*15dc779aSAndroid Build Coastguard Worker if (pstr_sfb_prms->window_sequence[i_ch] == EIGHT_SHORT_SEQUENCE) {
1223*15dc779aSAndroid Build Coastguard Worker num_window_groups[i_ch] = ptr_usac_data->block_switch_ctrl[i_ch].tot_grps_cnt;
1224*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < 8; i++) {
1225*15dc779aSAndroid Build Coastguard Worker pstr_sfb_prms->window_group_length[i_ch][i] =
1226*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->block_switch_ctrl[i_ch].group_len[i];
1227*15dc779aSAndroid Build Coastguard Worker }
1228*15dc779aSAndroid Build Coastguard Worker } else {
1229*15dc779aSAndroid Build Coastguard Worker num_window_groups[i_ch] = 1;
1230*15dc779aSAndroid Build Coastguard Worker pstr_sfb_prms->window_group_length[i_ch][0] = 1;
1231*15dc779aSAndroid Build Coastguard Worker }
1232*15dc779aSAndroid Build Coastguard Worker
1233*15dc779aSAndroid Build Coastguard Worker pstr_sfb_prms->window_shape[i_ch] = ptr_usac_config->window_shape_prev[i_ch];
1234*15dc779aSAndroid Build Coastguard Worker
1235*15dc779aSAndroid Build Coastguard Worker err = iusace_fd_mdct(ptr_usac_data, ptr_usac_config, i_ch);
1236*15dc779aSAndroid Build Coastguard Worker
1237*15dc779aSAndroid Build Coastguard Worker if (err) {
1238*15dc779aSAndroid Build Coastguard Worker return err;
1239*15dc779aSAndroid Build Coastguard Worker }
1240*15dc779aSAndroid Build Coastguard Worker
1241*15dc779aSAndroid Build Coastguard Worker if (pstr_sfb_prms->window_sequence[i_ch] != EIGHT_SHORT_SEQUENCE) {
1242*15dc779aSAndroid Build Coastguard Worker iusace_psy_mod_lb(&ptr_usac_data->str_psy_mod, pstr_sfb_prms,
1243*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->spectral_line_vector[i_ch],
1244*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->pstr_tns_info, ptr_usac_config->tns_select, i_ch, chn,
1245*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->channel_elem_type[elem_idx],
1246*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_tns_filter, elem_idx, pstr_scratch->ptr_tns_scratch,
1247*15dc779aSAndroid Build Coastguard Worker ptr_usac_config->ccfl);
1248*15dc779aSAndroid Build Coastguard Worker } else {
1249*15dc779aSAndroid Build Coastguard Worker iusace_psy_mod_sb(&(ptr_usac_data->str_psy_mod), pstr_sfb_prms,
1250*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->spectral_line_vector[i_ch],
1251*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->pstr_tns_info, ptr_usac_config->tns_select, i_ch, chn,
1252*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->channel_elem_type[elem_idx],
1253*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_tns_filter, elem_idx, pstr_scratch->ptr_tns_scratch,
1254*15dc779aSAndroid Build Coastguard Worker ptr_usac_config->ccfl);
1255*15dc779aSAndroid Build Coastguard Worker }
1256*15dc779aSAndroid Build Coastguard Worker
1257*15dc779aSAndroid Build Coastguard Worker pstr_sfb_prms->max_sfb[i_ch] =
1258*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->str_psy_mod.str_psy_out_data[i_ch].max_sfb_per_grp;
1259*15dc779aSAndroid Build Coastguard Worker }
1260*15dc779aSAndroid Build Coastguard Worker }
1261*15dc779aSAndroid Build Coastguard Worker for (chn = 0, i_ch = ch_offset; chn < nr_core_coder_channels; chn++, i_ch++) {
1262*15dc779aSAndroid Build Coastguard Worker if (nr_core_coder_channels == 2) {
1263*15dc779aSAndroid Build Coastguard Worker if ((pstr_sfb_prms->window_shape[i_ch] == pstr_sfb_prms->window_shape[i_ch + 1]) &&
1264*15dc779aSAndroid Build Coastguard Worker (pstr_sfb_prms->window_sequence[i_ch] == pstr_sfb_prms->window_sequence[i_ch + 1]) &&
1265*15dc779aSAndroid Build Coastguard Worker (ptr_usac_data->core_mode[i_ch] == ptr_usac_data->core_mode[i_ch + 1])) {
1266*15dc779aSAndroid Build Coastguard Worker common_win[i_ch] = common_win[i_ch + 1] = 1;
1267*15dc779aSAndroid Build Coastguard Worker } else {
1268*15dc779aSAndroid Build Coastguard Worker common_win[i_ch] = 0;
1269*15dc779aSAndroid Build Coastguard Worker }
1270*15dc779aSAndroid Build Coastguard Worker chn++;
1271*15dc779aSAndroid Build Coastguard Worker } else {
1272*15dc779aSAndroid Build Coastguard Worker common_win[i_ch] = 0;
1273*15dc779aSAndroid Build Coastguard Worker }
1274*15dc779aSAndroid Build Coastguard Worker }
1275*15dc779aSAndroid Build Coastguard Worker if (nr_core_coder_channels == 2) {
1276*15dc779aSAndroid Build Coastguard Worker if (i_ch == (ch_offset + 1)) {
1277*15dc779aSAndroid Build Coastguard Worker if (pstr_sfb_prms->window_sequence[i_ch] != EIGHT_SHORT_SEQUENCE) {
1278*15dc779aSAndroid Build Coastguard Worker iusace_calc_ms_band_energy(
1279*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->spectral_line_vector[ch_offset],
1280*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->spectral_line_vector[ch_offset + 1],
1281*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->str_psy_mod.str_psy_long_config[elem_idx].sfb_offset,
1282*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->str_psy_mod.str_psy_long_config[elem_idx].sfb_active,
1283*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->str_psy_mod.str_psy_data[ch_offset].ptr_sfb_energy_long_ms,
1284*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->str_psy_mod.str_psy_data[ch_offset + 1].ptr_sfb_energy_long_ms);
1285*15dc779aSAndroid Build Coastguard Worker } else {
1286*15dc779aSAndroid Build Coastguard Worker WORD32 frame_len_short = (ptr_usac_config->ccfl * FRAME_LEN_SHORT_128) / FRAME_LEN_LONG;
1287*15dc779aSAndroid Build Coastguard Worker for (WORD32 w = 0; w < MAX_SHORT_WINDOWS; w++) {
1288*15dc779aSAndroid Build Coastguard Worker WORD32 w_offset = w * frame_len_short;
1289*15dc779aSAndroid Build Coastguard Worker
1290*15dc779aSAndroid Build Coastguard Worker iusace_calc_ms_band_energy(
1291*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->spectral_line_vector[ch_offset] + w_offset,
1292*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->spectral_line_vector[ch_offset + 1] + w_offset,
1293*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->str_psy_mod.str_psy_short_config[elem_idx].sfb_offset,
1294*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->str_psy_mod.str_psy_short_config[elem_idx].sfb_active,
1295*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->str_psy_mod.str_psy_data[ch_offset].ptr_sfb_energy_short_ms[w],
1296*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->str_psy_mod.str_psy_data[ch_offset + 1]
1297*15dc779aSAndroid Build Coastguard Worker .ptr_sfb_energy_short_ms[w]);
1298*15dc779aSAndroid Build Coastguard Worker }
1299*15dc779aSAndroid Build Coastguard Worker }
1300*15dc779aSAndroid Build Coastguard Worker }
1301*15dc779aSAndroid Build Coastguard Worker }
1302*15dc779aSAndroid Build Coastguard Worker if ((nr_core_coder_channels == 2)
1303*15dc779aSAndroid Build Coastguard Worker ? ((ptr_usac_data->core_mode[ch_offset] == CORE_MODE_FD) &&
1304*15dc779aSAndroid Build Coastguard Worker (ptr_usac_data->core_mode[ch_offset + 1] == CORE_MODE_FD))
1305*15dc779aSAndroid Build Coastguard Worker : ((ptr_usac_data->core_mode[ch_offset] == CORE_MODE_FD))) {
1306*15dc779aSAndroid Build Coastguard Worker iusace_grouping(pstr_sfb_prms, nr_core_coder_channels, ptr_usac_data, ptr_usac_config,
1307*15dc779aSAndroid Build Coastguard Worker ch_offset, elem_idx);
1308*15dc779aSAndroid Build Coastguard Worker
1309*15dc779aSAndroid Build Coastguard Worker if (nr_core_coder_channels == 2) {
1310*15dc779aSAndroid Build Coastguard Worker err = iusace_stereo_proc(pstr_sfb_prms, usac_independency_flg, ptr_usac_data,
1311*15dc779aSAndroid Build Coastguard Worker ptr_usac_config, ch_offset);
1312*15dc779aSAndroid Build Coastguard Worker if (err != IA_NO_ERROR) {
1313*15dc779aSAndroid Build Coastguard Worker return err;
1314*15dc779aSAndroid Build Coastguard Worker }
1315*15dc779aSAndroid Build Coastguard Worker }
1316*15dc779aSAndroid Build Coastguard Worker }
1317*15dc779aSAndroid Build Coastguard Worker if (ptr_usac_config->preroll_flag) {
1318*15dc779aSAndroid Build Coastguard Worker if (ptr_usac_config->iframes_interval != ptr_usac_config->num_preroll_frames) {
1319*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(pstr_it_bit_buff, 0, 1); // extension element present
1320*15dc779aSAndroid Build Coastguard Worker num_bits++;
1321*15dc779aSAndroid Build Coastguard Worker }
1322*15dc779aSAndroid Build Coastguard Worker }
1323*15dc779aSAndroid Build Coastguard Worker if (ptr_usac_config->use_drc_element) {
1324*15dc779aSAndroid Build Coastguard Worker WORD32 num_bits_ext_elem = 0;
1325*15dc779aSAndroid Build Coastguard Worker err = iusace_enc_ext_elemts(ID_EXT_ELE_UNI_DRC, ptr_usac_config, pstr_state, pstr_asc,
1326*15dc779aSAndroid Build Coastguard Worker pp_drc_inp, pstr_it_bit_buff, &num_bits_ext_elem);
1327*15dc779aSAndroid Build Coastguard Worker if (err & IA_FATAL_ERROR) {
1328*15dc779aSAndroid Build Coastguard Worker return err;
1329*15dc779aSAndroid Build Coastguard Worker }
1330*15dc779aSAndroid Build Coastguard Worker num_bits += num_bits_ext_elem;
1331*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->num_drc_bits = num_bits_ext_elem;
1332*15dc779aSAndroid Build Coastguard Worker #ifdef DRC_BITRATE_CONSIDERATION
1333*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->drc_data_bit_cnt = num_bits_ext_elem;
1334*15dc779aSAndroid Build Coastguard Worker #endif
1335*15dc779aSAndroid Build Coastguard Worker }
1336*15dc779aSAndroid Build Coastguard Worker
1337*15dc779aSAndroid Build Coastguard Worker for (chn = 0, i_ch = ch_offset; chn < nr_core_coder_channels; chn++, i_ch++) {
1338*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(pstr_it_bit_buff, ptr_usac_data->core_mode[i_ch], 1);
1339*15dc779aSAndroid Build Coastguard Worker num_bits++;
1340*15dc779aSAndroid Build Coastguard Worker }
1341*15dc779aSAndroid Build Coastguard Worker
1342*15dc779aSAndroid Build Coastguard Worker for (chn = 0, i_ch = ch_offset; chn < nr_core_coder_channels; chn++, i_ch++) {
1343*15dc779aSAndroid Build Coastguard Worker if (ptr_usac_data->core_mode[i_ch] == CORE_MODE_FD) {
1344*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->window_size_samples[i_ch] = ptr_usac_config->ccfl;
1345*15dc779aSAndroid Build Coastguard Worker pstr_sfb_prms->window_sequence[i_ch] = ptr_usac_data->block_switch_ctrl[i_ch].window_seq;
1346*15dc779aSAndroid Build Coastguard Worker ptr_usac_config->window_sequence[i_ch] = pstr_sfb_prms->window_sequence[i_ch];
1347*15dc779aSAndroid Build Coastguard Worker new_win_seq[i_ch] = ptr_usac_data->block_switch_ctrl[i_ch].next_win_seq;
1348*15dc779aSAndroid Build Coastguard Worker }
1349*15dc779aSAndroid Build Coastguard Worker
1350*15dc779aSAndroid Build Coastguard Worker if (ptr_usac_data->core_mode[i_ch] == CORE_MODE_TD) {
1351*15dc779aSAndroid Build Coastguard Worker WORD32 error;
1352*15dc779aSAndroid Build Coastguard Worker
1353*15dc779aSAndroid Build Coastguard Worker error = iusace_lpd_frm_enc(ptr_usac_data, mod, usac_independency_flg, len_frame, i_ch,
1354*15dc779aSAndroid Build Coastguard Worker pstr_it_bit_buff);
1355*15dc779aSAndroid Build Coastguard Worker if (error) return error;
1356*15dc779aSAndroid Build Coastguard Worker
1357*15dc779aSAndroid Build Coastguard Worker num_bits = pstr_it_bit_buff->cnt_bits;
1358*15dc779aSAndroid Build Coastguard Worker
1359*15dc779aSAndroid Build Coastguard Worker if ((ptr_usac_data->core_mode_prev[i_ch] == CORE_MODE_FD) && (mod[0] == 0)) {
1360*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < ptr_usac_data->num_td_fac_bits[i_ch]; i++) {
1361*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(pstr_it_bit_buff, ptr_usac_data->fac_out_stream[i_ch][i], 1);
1362*15dc779aSAndroid Build Coastguard Worker num_bits++;
1363*15dc779aSAndroid Build Coastguard Worker }
1364*15dc779aSAndroid Build Coastguard Worker }
1365*15dc779aSAndroid Build Coastguard Worker } else {
1366*15dc779aSAndroid Build Coastguard Worker next_window_sequence[i_ch] = new_win_seq[i_ch];
1367*15dc779aSAndroid Build Coastguard Worker if (ptr_usac_data->core_mode_next[i_ch] == CORE_MODE_TD) {
1368*15dc779aSAndroid Build Coastguard Worker next_window_sequence[i_ch] = EIGHT_SHORT_SEQUENCE;
1369*15dc779aSAndroid Build Coastguard Worker }
1370*15dc779aSAndroid Build Coastguard Worker
1371*15dc779aSAndroid Build Coastguard Worker if (ptr_usac_data->core_mode[i_ch] == CORE_MODE_TD &&
1372*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->core_mode_next[i_ch] != CORE_MODE_TD) {
1373*15dc779aSAndroid Build Coastguard Worker next_window_sequence[i_ch] = LONG_STOP_SEQUENCE;
1374*15dc779aSAndroid Build Coastguard Worker }
1375*15dc779aSAndroid Build Coastguard Worker
1376*15dc779aSAndroid Build Coastguard Worker if (next_window_sequence[i_ch] == EIGHT_SHORT_SEQUENCE) {
1377*15dc779aSAndroid Build Coastguard Worker if (pstr_sfb_prms->window_sequence[i_ch] == ONLY_LONG_SEQUENCE) {
1378*15dc779aSAndroid Build Coastguard Worker pstr_sfb_prms->window_sequence[i_ch] = LONG_START_SEQUENCE;
1379*15dc779aSAndroid Build Coastguard Worker }
1380*15dc779aSAndroid Build Coastguard Worker if (pstr_sfb_prms->window_sequence[i_ch] == LONG_STOP_SEQUENCE) {
1381*15dc779aSAndroid Build Coastguard Worker pstr_sfb_prms->window_sequence[i_ch] = STOP_START_SEQUENCE;
1382*15dc779aSAndroid Build Coastguard Worker }
1383*15dc779aSAndroid Build Coastguard Worker }
1384*15dc779aSAndroid Build Coastguard Worker if (next_window_sequence[i_ch] == ONLY_LONG_SEQUENCE) {
1385*15dc779aSAndroid Build Coastguard Worker if (pstr_sfb_prms->window_sequence[i_ch] == EIGHT_SHORT_SEQUENCE) {
1386*15dc779aSAndroid Build Coastguard Worker next_window_sequence[i_ch] = LONG_STOP_SEQUENCE;
1387*15dc779aSAndroid Build Coastguard Worker }
1388*15dc779aSAndroid Build Coastguard Worker }
1389*15dc779aSAndroid Build Coastguard Worker if (pstr_sfb_prms->window_sequence[i_ch] == EIGHT_SHORT_SEQUENCE) {
1390*15dc779aSAndroid Build Coastguard Worker num_window_groups[i_ch] = ptr_usac_data->block_switch_ctrl[i_ch].tot_grps_cnt;
1391*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < 8; i++) {
1392*15dc779aSAndroid Build Coastguard Worker pstr_sfb_prms->window_group_length[i_ch][i] =
1393*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->block_switch_ctrl[i_ch].group_len[i];
1394*15dc779aSAndroid Build Coastguard Worker }
1395*15dc779aSAndroid Build Coastguard Worker } else {
1396*15dc779aSAndroid Build Coastguard Worker num_window_groups[i_ch] = 1;
1397*15dc779aSAndroid Build Coastguard Worker pstr_sfb_prms->window_group_length[i_ch][0] = 1;
1398*15dc779aSAndroid Build Coastguard Worker }
1399*15dc779aSAndroid Build Coastguard Worker pstr_sfb_prms->window_shape[i_ch] = ptr_usac_config->window_shape_prev[i_ch];
1400*15dc779aSAndroid Build Coastguard Worker }
1401*15dc779aSAndroid Build Coastguard Worker }
1402*15dc779aSAndroid Build Coastguard Worker
1403*15dc779aSAndroid Build Coastguard Worker if ((nr_core_coder_channels == 2)
1404*15dc779aSAndroid Build Coastguard Worker ? ((ptr_usac_data->core_mode[ch_offset] == CORE_MODE_FD) &&
1405*15dc779aSAndroid Build Coastguard Worker (ptr_usac_data->core_mode[ch_offset + 1] == CORE_MODE_FD))
1406*15dc779aSAndroid Build Coastguard Worker : ((ptr_usac_data->core_mode[ch_offset] == CORE_MODE_FD))) {
1407*15dc779aSAndroid Build Coastguard Worker err = iusace_fd_encode(pstr_sfb_prms, usac_independency_flg, ptr_usac_data, ptr_usac_config,
1408*15dc779aSAndroid Build Coastguard Worker pstr_it_bit_buff, nr_core_coder_channels, ch_offset, elem_idx,
1409*15dc779aSAndroid Build Coastguard Worker &bits_written, is_quant_spec_zero, is_gain_limited);
1410*15dc779aSAndroid Build Coastguard Worker
1411*15dc779aSAndroid Build Coastguard Worker if (err) {
1412*15dc779aSAndroid Build Coastguard Worker return err;
1413*15dc779aSAndroid Build Coastguard Worker }
1414*15dc779aSAndroid Build Coastguard Worker
1415*15dc779aSAndroid Build Coastguard Worker num_bits += bits_written;
1416*15dc779aSAndroid Build Coastguard Worker }
1417*15dc779aSAndroid Build Coastguard Worker
1418*15dc779aSAndroid Build Coastguard Worker for (chn = 0, i_ch = ch_offset; chn < nr_core_coder_channels; chn++, i_ch++) {
1419*15dc779aSAndroid Build Coastguard Worker ptr_usac_config->window_shape_prev[i_ch] = pstr_sfb_prms->window_shape[i_ch];
1420*15dc779aSAndroid Build Coastguard Worker ptr_usac_config->window_sequence_prev[i_ch] = ptr_usac_config->window_sequence[i_ch];
1421*15dc779aSAndroid Build Coastguard Worker ptr_usac_config->window_sequence[i_ch] = next_window_sequence[i_ch];
1422*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->core_mode_prev[i_ch] = ptr_usac_data->core_mode[i_ch];
1423*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->core_mode[i_ch] = ptr_usac_data->core_mode_next[i_ch];
1424*15dc779aSAndroid Build Coastguard Worker }
1425*15dc779aSAndroid Build Coastguard Worker ch_offset += nr_core_coder_channels;
1426*15dc779aSAndroid Build Coastguard Worker }
1427*15dc779aSAndroid Build Coastguard Worker
1428*15dc779aSAndroid Build Coastguard Worker if (1 == ptr_usac_config->sbr_enable) {
1429*15dc779aSAndroid Build Coastguard Worker // Append SBR bits
1430*15dc779aSAndroid Build Coastguard Worker ixheaace_bit_buf_handle pstr_it_bit_buff_temp =
1431*15dc779aSAndroid Build Coastguard Worker &ptr_env_encoder->str_cmon_data.str_sbr_bit_buf;
1432*15dc779aSAndroid Build Coastguard Worker WORD32 check_num_bits = ia_enhaacplus_enc_get_bits_available(pstr_it_bit_buff_temp);
1433*15dc779aSAndroid Build Coastguard Worker
1434*15dc779aSAndroid Build Coastguard Worker num_bits += iexheaax_append_bitstream((ixheaace_bit_buf_handle)pstr_it_bit_buff,
1435*15dc779aSAndroid Build Coastguard Worker pstr_it_bit_buff_temp, check_num_bits);
1436*15dc779aSAndroid Build Coastguard Worker }
1437*15dc779aSAndroid Build Coastguard Worker
1438*15dc779aSAndroid Build Coastguard Worker if (ptr_usac_config->use_fill_element) {
1439*15dc779aSAndroid Build Coastguard Worker WORD32 full_elem_num_bits = 0;
1440*15dc779aSAndroid Build Coastguard Worker padding_bits = ptr_usac_data->min_bits_needed - num_bits;
1441*15dc779aSAndroid Build Coastguard Worker full_elem_num_bits = iusace_write_fill_ele(pstr_it_bit_buff, padding_bits);
1442*15dc779aSAndroid Build Coastguard Worker num_bits += full_elem_num_bits;
1443*15dc779aSAndroid Build Coastguard Worker }
1444*15dc779aSAndroid Build Coastguard Worker
1445*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->available_bitreservoir_bits -= num_bits;
1446*15dc779aSAndroid Build Coastguard Worker
1447*15dc779aSAndroid Build Coastguard Worker if (num_bits % 8) {
1448*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->available_bitreservoir_bits -= 8 - (num_bits % 8);
1449*15dc779aSAndroid Build Coastguard Worker }
1450*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->available_bitreservoir_bits += average_bits_total;
1451*15dc779aSAndroid Build Coastguard Worker
1452*15dc779aSAndroid Build Coastguard Worker if (ptr_usac_data->available_bitreservoir_bits > ptr_usac_data->max_bitreservoir_bits) {
1453*15dc779aSAndroid Build Coastguard Worker ptr_usac_data->available_bitreservoir_bits = ptr_usac_data->max_bitreservoir_bits;
1454*15dc779aSAndroid Build Coastguard Worker }
1455*15dc779aSAndroid Build Coastguard Worker
1456*15dc779aSAndroid Build Coastguard Worker return err;
1457*15dc779aSAndroid Build Coastguard Worker }