1 /******************************************************************************
2 * *
3 * Copyright (C) 2023 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 *****************************************************************************
18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19 */
20
21 #include <stddef.h>
22 #include "iusace_type_def.h"
23 #include "iusace_bitbuffer.h"
24 /* DRC */
25 #include "impd_drc_common_enc.h"
26 #include "impd_drc_uni_drc.h"
27 #include "impd_drc_tables.h"
28 #include "impd_drc_api.h"
29 #include "impd_drc_uni_drc_eq.h"
30 #include "impd_drc_uni_drc_filter_bank.h"
31 #include "impd_drc_gain_enc.h"
32 #include "impd_drc_struct_def.h"
33 #include "iusace_cnst.h"
34
35 #include "ixheaace_api.h"
36 #include "iusace_tns_usac.h"
37 #include "iusace_psy_mod.h"
38 #include "ixheaace_sbr_header.h"
39 #include "ixheaace_config.h"
40 #include "iusace_config.h"
41 #include "ixheaace_asc_write.h"
42 #include "iusace_block_switch_const.h"
43 #include "iusace_rom.h"
44 #include "ixheaac_constants.h"
45 #include "ixheaace_aac_constants.h"
46 #include "ixheaace_sbr_def.h"
47 #include "ixheaace_common_rom.h"
48 #include "ixheaace_error_codes.h"
49
ixheaace_spatial_specific_config(ia_bit_buf_struct * pstr_it_bit_buff,ia_aace_config_struct * pstr_eld_config)50 static WORD32 ixheaace_spatial_specific_config(ia_bit_buf_struct *pstr_it_bit_buff,
51 ia_aace_config_struct *pstr_eld_config) {
52 WORD32 bit_cnt = 0, cnt = 0;
53 WORD32 num_bytes = pstr_eld_config->num_sac_cfg_bits >> 3;
54 for (cnt = 0; cnt < num_bytes; cnt++) {
55 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, (pstr_eld_config->sac_cfg_data[cnt]), 8);
56 }
57 if (pstr_eld_config->num_sac_cfg_bits & 0x7) {
58 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, (pstr_eld_config->sac_cfg_data[cnt]),
59 (pstr_eld_config->num_sac_cfg_bits & 0x7));
60 }
61
62 return bit_cnt;
63 }
iusace_config_extension(ia_bit_buf_struct * pstr_it_bit_buff,ia_usac_config_struct * pstr_usac_config)64 static WORD32 iusace_config_extension(ia_bit_buf_struct *pstr_it_bit_buff,
65 ia_usac_config_struct *pstr_usac_config) {
66 WORD32 bit_cnt = 0;
67 UWORD32 i, j;
68 UWORD32 fill_byte_val = 0xa5;
69
70 bit_cnt += iusace_write_escape_value(pstr_it_bit_buff,
71 pstr_usac_config->num_config_extensions - 1, 2, 4, 8);
72
73 for (j = 0; j < pstr_usac_config->num_config_extensions; j++) {
74 bit_cnt += iusace_write_escape_value(pstr_it_bit_buff,
75 pstr_usac_config->usac_config_ext_type[j], 4, 8, 16);
76
77 bit_cnt += iusace_write_escape_value(pstr_it_bit_buff,
78 pstr_usac_config->usac_config_ext_len[j], 4, 8, 16);
79
80 switch (pstr_usac_config->usac_config_ext_type[j]) {
81 case ID_CONFIG_EXT_FILL:
82 for (i = 0; i < pstr_usac_config->usac_config_ext_len[j]; i++) {
83 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, fill_byte_val, 8);
84 }
85 break;
86 case ID_CONFIG_EXT_LOUDNESS_INFO:
87 for (i = 0; i < pstr_usac_config->usac_config_ext_len[j]; i++) {
88 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff,
89 pstr_usac_config->usac_config_ext_buf[j][i], 8);
90 }
91 break;
92 case ID_CONFIG_EXT_STREAM_ID:
93 bit_cnt +=
94 iusace_write_bits_buf(pstr_it_bit_buff, pstr_usac_config->stream_identifier, 16);
95 break;
96 default:
97 for (i = 0; i < pstr_usac_config->usac_config_ext_len[j]; i++) {
98 bit_cnt += iusace_write_bits_buf(
99 pstr_it_bit_buff, (UWORD32)pstr_usac_config->usac_cfg_ext_info_buf[j][i], 8);
100 }
101 break;
102 }
103 }
104 return bit_cnt;
105 }
106
iusace_sbr_config(ia_bit_buf_struct * pstr_it_bit_buff,ia_usac_enc_sbr_config_struct * pstr_usac_sbr_config)107 static WORD32 iusace_sbr_config(ia_bit_buf_struct *pstr_it_bit_buff,
108 ia_usac_enc_sbr_config_struct *pstr_usac_sbr_config) {
109 WORD32 bit_cnt = 0;
110
111 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, (pstr_usac_sbr_config->harmonic_sbr), 1);
112 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, (pstr_usac_sbr_config->bs_inter_tes), 1);
113 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, (pstr_usac_sbr_config->bs_pvc), 1);
114 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, (pstr_usac_sbr_config->dflt_start_freq), 4);
115 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, (pstr_usac_sbr_config->dflt_stop_freq), 4);
116 bit_cnt +=
117 iusace_write_bits_buf(pstr_it_bit_buff, (pstr_usac_sbr_config->dflt_header_extra1), 1);
118 bit_cnt +=
119 iusace_write_bits_buf(pstr_it_bit_buff, (pstr_usac_sbr_config->dflt_header_extra2), 1);
120
121 if (pstr_usac_sbr_config->dflt_header_extra1) {
122 bit_cnt +=
123 iusace_write_bits_buf(pstr_it_bit_buff, (pstr_usac_sbr_config->dflt_freq_scale), 2);
124 bit_cnt +=
125 iusace_write_bits_buf(pstr_it_bit_buff, (pstr_usac_sbr_config->dflt_alter_scale), 2);
126 bit_cnt +=
127 iusace_write_bits_buf(pstr_it_bit_buff, (pstr_usac_sbr_config->dflt_noise_bands), 2);
128 }
129
130 if (pstr_usac_sbr_config->dflt_header_extra2) {
131 bit_cnt +=
132 iusace_write_bits_buf(pstr_it_bit_buff, (pstr_usac_sbr_config->dflt_limiter_bands), 2);
133 bit_cnt +=
134 iusace_write_bits_buf(pstr_it_bit_buff, (pstr_usac_sbr_config->dflt_limiter_gains), 2);
135 bit_cnt +=
136 iusace_write_bits_buf(pstr_it_bit_buff, (pstr_usac_sbr_config->dflt_interpol_freq), 1);
137 bit_cnt +=
138 iusace_write_bits_buf(pstr_it_bit_buff, (pstr_usac_sbr_config->dflt_smoothing_mode), 1);
139 }
140
141 return bit_cnt;
142 }
143
iusace_cpe_config(ia_bit_buf_struct * pstr_it_bit_buff,ia_usac_enc_element_config_struct * pstr_usac_enc_conf,WORD32 sbr_ratio_idx,ia_aace_config_struct * pstr_eld_config)144 static WORD32 iusace_cpe_config(ia_bit_buf_struct *pstr_it_bit_buff,
145 ia_usac_enc_element_config_struct *pstr_usac_enc_conf,
146 WORD32 sbr_ratio_idx, ia_aace_config_struct *pstr_eld_config) {
147 WORD32 bit_count = 0;
148
149 if (sbr_ratio_idx > 0) {
150 bit_count += iusace_sbr_config(pstr_it_bit_buff, &(pstr_usac_enc_conf->str_usac_sbr_config));
151 bit_count +=
152 iusace_write_bits_buf(pstr_it_bit_buff, (pstr_usac_enc_conf->stereo_config_index), 2);
153 }
154
155 if (pstr_usac_enc_conf->stereo_config_index > 0) {
156 if (pstr_eld_config->num_sac_cfg_bits) {
157 {
158 bit_count += ixheaace_spatial_specific_config(pstr_it_bit_buff, pstr_eld_config);
159 }
160 }
161 }
162
163 return bit_count;
164 }
iusace_ext_element_config(ia_bit_buf_struct * pstr_it_bit_buff,ia_usac_enc_element_config_struct * pstr_usac_enc_conf)165 static WORD32 iusace_ext_element_config(ia_bit_buf_struct *pstr_it_bit_buff,
166 ia_usac_enc_element_config_struct *pstr_usac_enc_conf) {
167 WORD32 bit_count = 0;
168
169 bit_count += iusace_write_escape_value(pstr_it_bit_buff, pstr_usac_enc_conf->usac_ext_ele_type,
170 4, 8, 16);
171 bit_count += iusace_write_escape_value(pstr_it_bit_buff,
172 pstr_usac_enc_conf->usac_ext_ele_cfg_len, 4, 8, 16);
173 bit_count += iusace_write_bits_buf(pstr_it_bit_buff,
174 (pstr_usac_enc_conf->usac_ext_ele_dflt_len_present), 1);
175
176 if (pstr_usac_enc_conf->usac_ext_ele_dflt_len_present) {
177 bit_count += iusace_write_escape_value(
178 pstr_it_bit_buff, pstr_usac_enc_conf->usac_ext_ele_dflt_len - 1, 8, 16, 0);
179 }
180 bit_count += iusace_write_bits_buf(pstr_it_bit_buff,
181 (pstr_usac_enc_conf->usac_ext_ele_payload_present), 1);
182
183 switch (pstr_usac_enc_conf->usac_ext_ele_type) {
184 case ID_EXT_ELE_FILL:
185 break;
186 case ID_EXT_ELE_UNI_DRC: {
187 UWORD32 i;
188 for (i = 0; i < pstr_usac_enc_conf->usac_ext_ele_cfg_len; i++) {
189 bit_count +=
190 iusace_write_bits_buf(pstr_it_bit_buff, pstr_usac_enc_conf->drc_config_data[i], 8);
191 }
192 } break;
193 default:
194 break;
195 }
196
197 return bit_count;
198 }
199
iusace_encoder_config(ia_bit_buf_struct * pstr_it_bit_buff,ia_usac_config_struct * pstr_usac_cfg,WORD32 sbr_ratio_idx,ia_aace_config_struct * pstr_eld_config)200 static WORD32 iusace_encoder_config(ia_bit_buf_struct *pstr_it_bit_buff,
201 ia_usac_config_struct *pstr_usac_cfg, WORD32 sbr_ratio_idx,
202 ia_aace_config_struct *pstr_eld_config) {
203 WORD32 bit_cnt = 0;
204 UWORD32 elem_idx = 0;
205 ia_usac_enc_element_config_struct *pstr_usac_enc_conf;
206
207 bit_cnt +=
208 iusace_write_escape_value(pstr_it_bit_buff, pstr_usac_cfg->num_elements - 1, 4, 8, 16);
209
210 for (elem_idx = 0; elem_idx < pstr_usac_cfg->num_elements; elem_idx++) {
211 unsigned long tmp = pstr_usac_cfg->usac_element_type[elem_idx];
212 pstr_usac_enc_conf = &pstr_usac_cfg->str_usac_element_config[elem_idx];
213 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, tmp, 2);
214
215 switch (pstr_usac_cfg->usac_element_type[elem_idx]) {
216 case ID_USAC_SCE:
217 bit_cnt += iusace_write_bits_buf(
218 pstr_it_bit_buff, (pstr_usac_enc_conf->tw_mdct),
219 1); // For extended HE AAC profile tw_mdct shall be encoded with 0.
220 bit_cnt +=
221 iusace_write_bits_buf(pstr_it_bit_buff, (pstr_usac_enc_conf->noise_filling), 1);
222 if (sbr_ratio_idx > 0) {
223 bit_cnt +=
224 iusace_sbr_config(pstr_it_bit_buff, &(pstr_usac_enc_conf->str_usac_sbr_config));
225 }
226 break;
227 case ID_USAC_CPE:
228 bit_cnt += iusace_write_bits_buf(
229 pstr_it_bit_buff, (pstr_usac_enc_conf->tw_mdct),
230 1); // For extended HE AAC profile tw_mdct shall be encoded with 0.
231 bit_cnt +=
232 iusace_write_bits_buf(pstr_it_bit_buff, (pstr_usac_enc_conf->noise_filling), 1);
233 bit_cnt += iusace_cpe_config(pstr_it_bit_buff, pstr_usac_enc_conf, sbr_ratio_idx,
234 pstr_eld_config);
235 break;
236 case ID_USAC_EXT:
237 bit_cnt += iusace_ext_element_config(pstr_it_bit_buff, pstr_usac_enc_conf);
238 break;
239 default:
240 return IA_EXHEAACE_INIT_FATAL_USAC_INVALID_ELEMENT_TYPE;
241 break;
242 }
243 }
244
245 return bit_cnt;
246 }
247
ixheaace_sbr_ratio(UWORD32 core_sbr_framelength_idx)248 static UWORD32 ixheaace_sbr_ratio(UWORD32 core_sbr_framelength_idx) {
249 UWORD32 sbr_ratio_index = 0x0FF;
250
251 switch (core_sbr_framelength_idx) {
252 case 0:
253 case 1:
254 sbr_ratio_index = USAC_SBR_RATIO_NO_SBR;
255 break;
256 case 2:
257 sbr_ratio_index = USAC_SBR_RATIO_INDEX_8_3;
258 break;
259 case 3:
260 sbr_ratio_index = USAC_SBR_RATIO_INDEX_2_1;
261 break;
262 case 4:
263 sbr_ratio_index = USAC_SBR_RATIO_INDEX_4_1;
264 break;
265 }
266
267 return sbr_ratio_index;
268 }
sbr_header(ia_bit_buf_struct * pstr_it_bit_buff,ixheaace_pstr_sbr_hdr_data pstr_sbr_config)269 static WORD32 sbr_header(ia_bit_buf_struct *pstr_it_bit_buff,
270 ixheaace_pstr_sbr_hdr_data pstr_sbr_config) {
271 WORD32 bit_cnt = 0;
272 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, (pstr_sbr_config->sbr_amp_res), 1);
273 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, (pstr_sbr_config->sbr_start_freq), 4);
274 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, (pstr_sbr_config->sbr_stop_freq), 4);
275 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, (pstr_sbr_config->sbr_xover_band), 3);
276 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, (0), 2); // reserved bits
277 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, (pstr_sbr_config->header_extra_1), 1);
278 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, (pstr_sbr_config->header_extra_2), 1);
279 if (pstr_sbr_config->header_extra_1) {
280 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, (pstr_sbr_config->freq_scale), 2);
281 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, (pstr_sbr_config->alter_scale), 1);
282 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, (pstr_sbr_config->sbr_noise_bands), 2);
283 }
284
285 if (pstr_sbr_config->header_extra_2) {
286 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, (pstr_sbr_config->sbr_limiter_bands), 2);
287 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, (pstr_sbr_config->sbr_limiter_gains), 2);
288 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, (pstr_sbr_config->sbr_interpol_freq), 1);
289 bit_cnt +=
290 iusace_write_bits_buf(pstr_it_bit_buff, (pstr_sbr_config->sbr_smoothing_length), 1);
291 }
292 return bit_cnt;
293 }
294
ld_sbr_header(ia_bit_buf_struct * pstr_it_bit_buff,ixheaace_pstr_sbr_hdr_data pstr_sbr_config,WORD32 channel_configuration)295 static WORD32 ld_sbr_header(ia_bit_buf_struct *pstr_it_bit_buff,
296 ixheaace_pstr_sbr_hdr_data pstr_sbr_config,
297 WORD32 channel_configuration) {
298 WORD32 num_sbr_header, el, bit_cnt = 0;
299 switch (channel_configuration) {
300 case 1:
301 case 2:
302 num_sbr_header = 1;
303 break;
304 case 3:
305 num_sbr_header = 2;
306 break;
307 case 4:
308 case 5:
309 case 6:
310 num_sbr_header = 3;
311 break;
312 case 7:
313 num_sbr_header = 4;
314 break;
315 default:
316 num_sbr_header = 0;
317 break;
318 }
319 for (el = 0; el < num_sbr_header; el++) {
320 bit_cnt += sbr_header(pstr_it_bit_buff, pstr_sbr_config);
321 }
322 return bit_cnt;
323 }
324
iaace_get_eld_specific_config_bytes(ia_bit_buf_struct * pstr_it_bit_buff,ia_aace_config_struct * pstr_eld_config,WORD32 channel_configuration)325 static WORD32 iaace_get_eld_specific_config_bytes(ia_bit_buf_struct *pstr_it_bit_buff,
326 ia_aace_config_struct *pstr_eld_config,
327 WORD32 channel_configuration) {
328 WORD32 bit_cnt = 0;
329 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, (pstr_eld_config->frame_length_flag), 1);
330 bit_cnt +=
331 iusace_write_bits_buf(pstr_it_bit_buff, (pstr_eld_config->aac_sec_data_resilience_flag), 1);
332 bit_cnt +=
333 iusace_write_bits_buf(pstr_it_bit_buff, (pstr_eld_config->aac_sf_data_resilience_flag), 1);
334 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff,
335 (pstr_eld_config->aac_spec_data_resilience_flag), 1);
336 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, (pstr_eld_config->ld_sbr_present_flag), 1);
337
338 if (pstr_eld_config->ld_sbr_present_flag) {
339 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, (pstr_eld_config->ld_sbr_sample_rate), 1);
340 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, (pstr_eld_config->ld_sbr_crc_flag), 1);
341 bit_cnt +=
342 ld_sbr_header(pstr_it_bit_buff, pstr_eld_config->sbr_config, channel_configuration);
343 }
344
345 if (pstr_eld_config->num_sac_cfg_bits) {
346 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, (pstr_eld_config->eld_ext_type[0]), 4);
347 bit_cnt +=
348 iusace_write_escape_value(pstr_it_bit_buff, (pstr_eld_config->eld_ext_len[0]), 4, 8, 16);
349 if (IAAC_ELDEXT_LDSAC == pstr_eld_config->eld_ext_type[0]) {
350 bit_cnt += ixheaace_spatial_specific_config(pstr_it_bit_buff, pstr_eld_config);
351 }
352 }
353 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, (IAAC_ELDEXT_TERM), 4);
354
355 return bit_cnt;
356 }
357
iaace_ga_specific_config_bytes(ia_bit_buf_struct * pstr_it_bit_buff,ia_aace_config_struct * pstr_ga_specific_config,WORD32 channel_configuration,WORD32 aot)358 static WORD32 iaace_ga_specific_config_bytes(ia_bit_buf_struct *pstr_it_bit_buff,
359 ia_aace_config_struct *pstr_ga_specific_config,
360 WORD32 channel_configuration, WORD32 aot) {
361 WORD32 bit_cnt = 0;
362 bit_cnt +=
363 iusace_write_bits_buf(pstr_it_bit_buff, (pstr_ga_specific_config->frame_length_flag), 1);
364 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff,
365 (pstr_ga_specific_config->depends_on_core_coder), 1);
366 if (pstr_ga_specific_config->depends_on_core_coder) {
367 bit_cnt +=
368 iusace_write_bits_buf(pstr_it_bit_buff, (pstr_ga_specific_config->core_coder_delay), 14);
369 }
370 if (!channel_configuration) {
371 }
372
373 if (AOT_AAC_LD == aot) {
374 pstr_ga_specific_config->extension_flag = 1;
375 }
376 if (AOT_AAC_LC == aot) {
377 pstr_ga_specific_config->extension_flag = 0;
378 }
379 bit_cnt +=
380 iusace_write_bits_buf(pstr_it_bit_buff, (pstr_ga_specific_config->extension_flag), 1);
381
382 if ((pstr_ga_specific_config->extension_flag) && ((AOT_AAC_LD == aot))) {
383 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff,
384 (pstr_ga_specific_config->aac_sec_data_resilience_flag), 1);
385 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff,
386 (pstr_ga_specific_config->aac_sf_data_resilience_flag), 1);
387 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff,
388 (pstr_ga_specific_config->aac_spec_data_resilience_flag), 1);
389
390 // extension flag 3
391 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, 0, 1);
392 }
393 return bit_cnt;
394 }
395
ixheaace_get_audiospecific_config_bytes(ia_bit_buf_struct * pstr_it_bit_buff,ixheaace_audio_specific_config_struct * pstr_audio_specific_config,WORD32 aot,WORD32 ccfl_idx)396 WORD32 ixheaace_get_audiospecific_config_bytes(
397 ia_bit_buf_struct *pstr_it_bit_buff,
398 ixheaace_audio_specific_config_struct *pstr_audio_specific_config, WORD32 aot,
399 WORD32 ccfl_idx) {
400 WORD32 bit_cnt = 0, i;
401 UWORD32 tmp = 0x0f; // initialized to indicate no sampling frequency index field
402 WORD32 ext_aot = -1;
403 WORD32 ext_id = 0;
404 WORD32 sbr_present_flag = 0, ps_present_flag = 0;
405
406 if (((AOT_AAC_ELD == aot) &&
407 (1 == pstr_audio_specific_config->str_aac_config.ld_sbr_sample_rate)) ||
408 (AOT_SBR == aot) || (AOT_PS == aot)) {
409 // dual rate
410 pstr_audio_specific_config->ext_sampling_frequency =
411 pstr_audio_specific_config->sampling_frequency;
412 pstr_audio_specific_config->sampling_frequency /= 2;
413
414 if ((AOT_SBR == aot) || (AOT_PS == aot)) {
415 aot = AOT_AAC_LC;
416 }
417 }
418 pstr_audio_specific_config->audio_object_type = aot;
419 if (aot == AOT_USAC) {
420 for (i = 0; i < sizeof(iusace_sampl_freq_idx_table) / sizeof(iusace_sampl_freq_idx_table[0]);
421 i++) {
422 if (pstr_audio_specific_config->sampling_frequency == iusace_sampl_freq_idx_table[i]) {
423 tmp = i;
424 break;
425 }
426 }
427 } else {
428 for (i = 0; i < sizeof(ia_sampl_freq_table) / sizeof(ia_sampl_freq_table[0]); i++) {
429 if (ia_sampl_freq_table[i] == pstr_audio_specific_config->sampling_frequency) {
430 tmp = i;
431 break;
432 }
433 }
434 }
435
436 pstr_audio_specific_config->samp_freq_index = (UWORD32)tmp;
437
438 // Write Audio Object Type
439 if (pstr_audio_specific_config->audio_object_type > 31) {
440 tmp = pstr_audio_specific_config->audio_object_type - 32;
441 pstr_audio_specific_config->audio_object_type = 31;
442 }
443 bit_cnt +=
444 iusace_write_bits_buf(pstr_it_bit_buff, (pstr_audio_specific_config->audio_object_type), 5);
445 if (pstr_audio_specific_config->audio_object_type == 31) {
446 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, tmp, 6);
447 pstr_audio_specific_config->audio_object_type = tmp + 32;
448 }
449
450 // Write Audio Object Type
451 bit_cnt +=
452 iusace_write_bits_buf(pstr_it_bit_buff, (pstr_audio_specific_config->samp_freq_index), 4);
453 if (pstr_audio_specific_config->samp_freq_index == 0xf) {
454 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff,
455 (pstr_audio_specific_config->sampling_frequency), 24);
456 } else if (AOT_USAC != aot) {
457 pstr_audio_specific_config->sampling_frequency =
458 ia_sampl_freq_table[pstr_audio_specific_config->samp_freq_index];
459 }
460 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff,
461 (pstr_audio_specific_config->channel_configuration), 4);
462
463 if ((AOT_SBR == aot) || (AOT_PS == aot)) {
464 ext_aot = AOT_SBR;
465 sbr_present_flag = 1;
466 tmp = 0x0f;
467 for (i = 0; i < sizeof(ia_sampl_freq_table) / sizeof(ia_sampl_freq_table[0]); i++) {
468 if (ia_sampl_freq_table[i] == pstr_audio_specific_config->ext_sampling_frequency) {
469 tmp = i;
470 break;
471 }
472 }
473 pstr_audio_specific_config->ext_samp_freq_index = (UWORD32)tmp;
474 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff,
475 (pstr_audio_specific_config->ext_samp_freq_index), 4);
476 if (pstr_audio_specific_config->ext_samp_freq_index == 0xf) {
477 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff,
478 (pstr_audio_specific_config->ext_sampling_frequency), 24);
479 }
480 if (AOT_PS == aot) {
481 ps_present_flag = 1;
482 }
483
484 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, AOT_AAC_LC, 5);
485 }
486 switch (aot) {
487 case AOT_AAC_ELD: {
488 bit_cnt += iaace_get_eld_specific_config_bytes(
489 pstr_it_bit_buff, &pstr_audio_specific_config->str_aac_config,
490 pstr_audio_specific_config->channel_configuration);
491 break;
492 }
493 case AOT_AAC_LD:
494 case AOT_AAC_LC:
495 case AOT_SBR:
496 case AOT_PS: {
497 bit_cnt += iaace_ga_specific_config_bytes(
498 pstr_it_bit_buff, &pstr_audio_specific_config->str_aac_config,
499 pstr_audio_specific_config->channel_configuration, aot);
500
501 if (AOT_AAC_LD == aot) {
502 // epconfig
503 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, 0, 2);
504 }
505 if (AOT_SBR == ext_aot) {
506 ext_id = 0x2b7;
507 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, ext_id, 11);
508
509 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, aot, 5);
510 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, sbr_present_flag, 1);
511 if (sbr_present_flag) {
512 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff,
513 (pstr_audio_specific_config->ext_samp_freq_index), 4);
514 if (pstr_audio_specific_config->ext_samp_freq_index == 0xf) {
515 bit_cnt += iusace_write_bits_buf(
516 pstr_it_bit_buff, (pstr_audio_specific_config->ext_sampling_frequency), 24);
517 }
518
519 if (AOT_PS == aot) {
520 ext_id = 0x548;
521 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, ext_id, 11);
522 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, ps_present_flag, 1);
523 }
524 }
525 }
526 break;
527 }
528
529 case AOT_USAC: {
530 WORD32 sbr_ratio_idx;
531 ia_usac_config_struct *pstr_usac_config = &(pstr_audio_specific_config->str_usac_config);
532 WORD32 ia_ccfl_tbl[5] = {768, 1024, 768, 1024, 1024};
533 pstr_audio_specific_config->core_sbr_framelength_index =
534 ccfl_idx; // 768 core coder frame length without SBR
535 pstr_usac_config->ccfl =
536 ia_ccfl_tbl[pstr_audio_specific_config->core_sbr_framelength_index];
537 tmp = 0x1f;
538 for (i = 0; i < sizeof(ia_usac_sampl_freq_table) / sizeof(ia_usac_sampl_freq_table[0]);
539 i++) {
540 if (ia_usac_sampl_freq_table[i] == pstr_audio_specific_config->sampling_frequency) {
541 tmp = i;
542 break;
543 }
544 }
545 pstr_audio_specific_config->samp_freq_index = (UWORD32)tmp;
546
547 if (pstr_audio_specific_config->samp_freq_index == 0x1f) {
548 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, 0x1f, 5);
549 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff,
550 (pstr_audio_specific_config->sampling_frequency), 24);
551 } else {
552 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff,
553 (pstr_audio_specific_config->samp_freq_index), 5);
554 }
555
556 bit_cnt += iusace_write_bits_buf(
557 pstr_it_bit_buff, (pstr_audio_specific_config->core_sbr_framelength_index), 3);
558
559 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff,
560 (pstr_audio_specific_config->channel_configuration), 5);
561
562 if (pstr_audio_specific_config->channel_configuration == 0) {
563 bit_cnt += iusace_write_escape_value(
564 pstr_it_bit_buff, pstr_audio_specific_config->num_audio_channels, 5, 8, 16);
565
566 for (i = 0; i < pstr_audio_specific_config->num_audio_channels; i++) {
567 tmp = pstr_audio_specific_config->output_channel_pos[i];
568 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, tmp, 5);
569 }
570 }
571
572 sbr_ratio_idx = ixheaace_sbr_ratio(pstr_audio_specific_config->core_sbr_framelength_index);
573
574 bit_cnt += iusace_encoder_config(pstr_it_bit_buff, pstr_usac_config, sbr_ratio_idx,
575 &pstr_audio_specific_config->str_aac_config);
576
577 bit_cnt +=
578 iusace_write_bits_buf(pstr_it_bit_buff, pstr_usac_config->usac_cfg_ext_present, 1);
579 if (pstr_usac_config->usac_cfg_ext_present) {
580 bit_cnt += iusace_config_extension(pstr_it_bit_buff, pstr_usac_config);
581 }
582
583 if (sbr_ratio_idx)
584 pstr_audio_specific_config->sbr_present_flag = 1;
585 else
586 pstr_audio_specific_config->sbr_present_flag = 0;
587
588 pstr_audio_specific_config->ext_audio_object_type = 0;
589
590 if (pstr_audio_specific_config->ext_audio_object_type == AOT_SBR) {
591 pstr_audio_specific_config->ext_sync_word = 0x2b7;
592 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff,
593 (pstr_audio_specific_config->ext_sync_word), 11);
594
595 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff,
596 (pstr_audio_specific_config->ext_audio_object_type), 5);
597
598 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff,
599 (pstr_audio_specific_config->sbr_present_flag), 1);
600
601 if (pstr_audio_specific_config->sbr_present_flag == 1) {
602 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff,
603 (pstr_audio_specific_config->ext_samp_freq_index), 4);
604
605 if (pstr_audio_specific_config->ext_samp_freq_index == 0xf) {
606 bit_cnt += iusace_write_bits_buf(
607 pstr_it_bit_buff, (pstr_audio_specific_config->ext_sampling_frequency), 24);
608 }
609 }
610 }
611 }
612 default:
613 break;
614 }
615 return bit_cnt;
616 }
617
ixheaace_get_usac_config_bytes(ia_bit_buf_struct * pstr_it_bit_buff,ixheaace_audio_specific_config_struct * pstr_audio_specific_config,WORD32 ccfl_idx)618 WORD32 ixheaace_get_usac_config_bytes(
619 ia_bit_buf_struct *pstr_it_bit_buff,
620 ixheaace_audio_specific_config_struct *pstr_audio_specific_config, WORD32 ccfl_idx) {
621 WORD32 sbr_ratio_idx;
622 ia_usac_config_struct *pstr_usac_config = &(pstr_audio_specific_config->str_usac_config);
623 WORD32 ia_ccfl_tbl[5] = {768, 1024, 768, 1024, 1024};
624 WORD32 i, tmp, bit_cnt = 0;
625 pstr_audio_specific_config->core_sbr_framelength_index =
626 ccfl_idx; // 768 core coder frame length without SBR
627 pstr_usac_config->ccfl = ia_ccfl_tbl[pstr_audio_specific_config->core_sbr_framelength_index];
628 tmp = 0x1f;
629 for (i = 0; i < sizeof(ia_usac_sampl_freq_table) / sizeof(ia_usac_sampl_freq_table[0]); i++) {
630 if (ia_usac_sampl_freq_table[i] == pstr_audio_specific_config->sampling_frequency) {
631 tmp = i;
632 break;
633 }
634 }
635 pstr_audio_specific_config->samp_freq_index = (UWORD32)tmp;
636
637 if (pstr_audio_specific_config->samp_freq_index == 0x1f) {
638 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, 0x1f, 5);
639 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff,
640 (pstr_audio_specific_config->sampling_frequency), 24);
641 } else {
642 bit_cnt +=
643 iusace_write_bits_buf(pstr_it_bit_buff, (pstr_audio_specific_config->samp_freq_index), 5);
644 }
645
646 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff,
647 (pstr_audio_specific_config->core_sbr_framelength_index), 3);
648
649 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff,
650 (pstr_audio_specific_config->channel_configuration), 5);
651
652 if (pstr_audio_specific_config->channel_configuration == 0) {
653 bit_cnt += iusace_write_escape_value(
654 pstr_it_bit_buff, pstr_audio_specific_config->num_audio_channels, 5, 8, 16);
655
656 for (i = 0; i < pstr_audio_specific_config->num_audio_channels; i++) {
657 tmp = pstr_audio_specific_config->output_channel_pos[i];
658 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, tmp, 5);
659 }
660 }
661
662 sbr_ratio_idx = ixheaace_sbr_ratio(pstr_audio_specific_config->core_sbr_framelength_index);
663
664 bit_cnt += iusace_encoder_config(pstr_it_bit_buff, pstr_usac_config, sbr_ratio_idx,
665 &pstr_audio_specific_config->str_aac_config);
666
667 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, pstr_usac_config->usac_cfg_ext_present, 1);
668 if (pstr_usac_config->usac_cfg_ext_present) {
669 bit_cnt += iusace_config_extension(pstr_it_bit_buff, pstr_usac_config);
670 }
671
672 if (sbr_ratio_idx)
673 pstr_audio_specific_config->sbr_present_flag = 1;
674 else
675 pstr_audio_specific_config->sbr_present_flag = 0;
676
677 pstr_audio_specific_config->ext_audio_object_type = 0;
678
679 if (pstr_audio_specific_config->ext_audio_object_type == AOT_SBR) {
680 pstr_audio_specific_config->ext_sync_word = 0x2b7;
681 bit_cnt +=
682 iusace_write_bits_buf(pstr_it_bit_buff, (pstr_audio_specific_config->ext_sync_word), 11);
683
684 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff,
685 (pstr_audio_specific_config->ext_audio_object_type), 5);
686
687 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff,
688 (pstr_audio_specific_config->sbr_present_flag), 1);
689
690 if (pstr_audio_specific_config->sbr_present_flag == 1) {
691 bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff,
692 (pstr_audio_specific_config->ext_samp_freq_index), 4);
693
694 if (pstr_audio_specific_config->ext_samp_freq_index == 0xf) {
695 bit_cnt += iusace_write_bits_buf(
696 pstr_it_bit_buff, (pstr_audio_specific_config->ext_sampling_frequency), 24);
697 }
698 }
699 }
700 return bit_cnt;
701 }