xref: /aosp_15_r20/external/libxaac/encoder/ixheaace_asc_write.c (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
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 }