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