xref: /aosp_15_r20/external/libxaac/encoder/ixheaace_enc_init.c (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker  *                                                                            *
3*15dc779aSAndroid Build Coastguard Worker  * Copyright (C) 2023 The Android Open Source Project
4*15dc779aSAndroid Build Coastguard Worker  *
5*15dc779aSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*15dc779aSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*15dc779aSAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*15dc779aSAndroid Build Coastguard Worker  *
9*15dc779aSAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*15dc779aSAndroid Build Coastguard Worker  *
11*15dc779aSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*15dc779aSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*15dc779aSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*15dc779aSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*15dc779aSAndroid Build Coastguard Worker  * limitations under the License.
16*15dc779aSAndroid Build Coastguard Worker  *
17*15dc779aSAndroid Build Coastguard Worker  *****************************************************************************
18*15dc779aSAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*15dc779aSAndroid Build Coastguard Worker  */
20*15dc779aSAndroid Build Coastguard Worker 
21*15dc779aSAndroid Build Coastguard Worker #include <string.h>
22*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_aac_constants.h"
25*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_common_enc.h"
26*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc.h"
27*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_tables.h"
28*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_api.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_api.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_error_codes.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_psy_const.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_tns.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_tns_params.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_rom.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_rom.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_bitbuffer.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops.h"
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_adjust_threshold_data.h"
42*15dc779aSAndroid Build Coastguard Worker 
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_dynamic_bits.h"
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_qc_data.h"
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_channel_map.h"
46*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_block_switch.h"
47*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_psy_data.h"
48*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_interface.h"
49*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_write_bitstream.h"
50*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_psy_configuration.h"
51*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_psy_mod.h"
52*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_stereo_preproc.h"
53*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_enc_main.h"
54*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_qc_util.h"
55*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_config_params.h"
56*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_utils.h"
57*15dc779aSAndroid Build Coastguard Worker #define ALIGNMENT_DEFINE __attribute__((aligned(8)))
58*15dc779aSAndroid Build Coastguard Worker 
ixheaace_calculate_bandwidth(const WORD32 sample_rate,const WORD32 channel_bit_rate,const WORD32 num_ch,WORD32 aot)59*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaace_calculate_bandwidth(const WORD32 sample_rate,
60*15dc779aSAndroid Build Coastguard Worker                                            const WORD32 channel_bit_rate, const WORD32 num_ch,
61*15dc779aSAndroid Build Coastguard Worker                                            WORD32 aot) {
62*15dc779aSAndroid Build Coastguard Worker   WORD32 bandwidth = -1;
63*15dc779aSAndroid Build Coastguard Worker   const ixheaace_bandwidth_table *pstr_bandwidth_table = NULL;
64*15dc779aSAndroid Build Coastguard Worker   WORD32 bandwidth_table_size = 0;
65*15dc779aSAndroid Build Coastguard Worker   if (aot == AOT_AAC_LC || aot == AOT_SBR || aot == AOT_PS) {
66*15dc779aSAndroid Build Coastguard Worker     pstr_bandwidth_table = bandwidth_table_lc;
67*15dc779aSAndroid Build Coastguard Worker     bandwidth_table_size = sizeof(bandwidth_table_lc) / sizeof(ixheaace_bandwidth_table);
68*15dc779aSAndroid Build Coastguard Worker   } else if (aot == AOT_AAC_LD || aot == AOT_AAC_ELD) {
69*15dc779aSAndroid Build Coastguard Worker     switch (sample_rate) {
70*15dc779aSAndroid Build Coastguard Worker       case 48000:
71*15dc779aSAndroid Build Coastguard Worker       case 64000:
72*15dc779aSAndroid Build Coastguard Worker       case 88200:
73*15dc779aSAndroid Build Coastguard Worker       case 96000:
74*15dc779aSAndroid Build Coastguard Worker         pstr_bandwidth_table = bandwidth_table_ld_48000;
75*15dc779aSAndroid Build Coastguard Worker         bandwidth_table_size =
76*15dc779aSAndroid Build Coastguard Worker             sizeof(bandwidth_table_ld_48000) / sizeof(ixheaace_bandwidth_table);
77*15dc779aSAndroid Build Coastguard Worker         break;
78*15dc779aSAndroid Build Coastguard Worker       case 44100:
79*15dc779aSAndroid Build Coastguard Worker         pstr_bandwidth_table = bandwidth_table_ld_44100;
80*15dc779aSAndroid Build Coastguard Worker         bandwidth_table_size =
81*15dc779aSAndroid Build Coastguard Worker             sizeof(bandwidth_table_ld_44100) / sizeof(ixheaace_bandwidth_table);
82*15dc779aSAndroid Build Coastguard Worker         break;
83*15dc779aSAndroid Build Coastguard Worker       case 32000:
84*15dc779aSAndroid Build Coastguard Worker         pstr_bandwidth_table = bandwidth_table_ld_32000;
85*15dc779aSAndroid Build Coastguard Worker         bandwidth_table_size =
86*15dc779aSAndroid Build Coastguard Worker             sizeof(bandwidth_table_ld_32000) / sizeof(ixheaace_bandwidth_table);
87*15dc779aSAndroid Build Coastguard Worker         break;
88*15dc779aSAndroid Build Coastguard Worker       case 24000:
89*15dc779aSAndroid Build Coastguard Worker         pstr_bandwidth_table = bandwidth_table_ld_24000;
90*15dc779aSAndroid Build Coastguard Worker         bandwidth_table_size =
91*15dc779aSAndroid Build Coastguard Worker             sizeof(bandwidth_table_ld_24000) / sizeof(ixheaace_bandwidth_table);
92*15dc779aSAndroid Build Coastguard Worker         break;
93*15dc779aSAndroid Build Coastguard Worker       case 8000:
94*15dc779aSAndroid Build Coastguard Worker       case 11025:
95*15dc779aSAndroid Build Coastguard Worker       case 12000:
96*15dc779aSAndroid Build Coastguard Worker       case 16000:
97*15dc779aSAndroid Build Coastguard Worker       case 22050:
98*15dc779aSAndroid Build Coastguard Worker         pstr_bandwidth_table = bandwidth_table_ld_22050;
99*15dc779aSAndroid Build Coastguard Worker         bandwidth_table_size =
100*15dc779aSAndroid Build Coastguard Worker             sizeof(bandwidth_table_ld_22050) / sizeof(ixheaace_bandwidth_table);
101*15dc779aSAndroid Build Coastguard Worker         break;
102*15dc779aSAndroid Build Coastguard Worker     }
103*15dc779aSAndroid Build Coastguard Worker   }
104*15dc779aSAndroid Build Coastguard Worker   for (WORD32 i = 0; i < bandwidth_table_size - 1; i++) {
105*15dc779aSAndroid Build Coastguard Worker     if (channel_bit_rate >= 96000) {
106*15dc779aSAndroid Build Coastguard Worker       if (aot == AOT_AAC_LC || aot == AOT_SBR || aot == AOT_PS) {
107*15dc779aSAndroid Build Coastguard Worker         bandwidth = 20000;
108*15dc779aSAndroid Build Coastguard Worker       } else {
109*15dc779aSAndroid Build Coastguard Worker         if (num_ch == 1) {
110*15dc779aSAndroid Build Coastguard Worker           bandwidth = 19000;
111*15dc779aSAndroid Build Coastguard Worker         } else {
112*15dc779aSAndroid Build Coastguard Worker           bandwidth = 22000;
113*15dc779aSAndroid Build Coastguard Worker         }
114*15dc779aSAndroid Build Coastguard Worker       }
115*15dc779aSAndroid Build Coastguard Worker       break;
116*15dc779aSAndroid Build Coastguard Worker     } else if (channel_bit_rate >= pstr_bandwidth_table[i].channel_bit_rate &&
117*15dc779aSAndroid Build Coastguard Worker                channel_bit_rate < pstr_bandwidth_table[i + 1].channel_bit_rate) {
118*15dc779aSAndroid Build Coastguard Worker       if (aot == AOT_AAC_LC || aot == AOT_SBR || aot == AOT_PS) {
119*15dc779aSAndroid Build Coastguard Worker         bandwidth = (num_ch == 1) ? pstr_bandwidth_table[i].bandwidth_mono
120*15dc779aSAndroid Build Coastguard Worker                                   : pstr_bandwidth_table[i].bandwidth_stereo;
121*15dc779aSAndroid Build Coastguard Worker         bandwidth = bandwidth - (pstr_bandwidth_table[i].channel_bit_rate / 32);
122*15dc779aSAndroid Build Coastguard Worker         break;
123*15dc779aSAndroid Build Coastguard Worker       } else if (aot == AOT_AAC_LD || aot == AOT_AAC_ELD) {
124*15dc779aSAndroid Build Coastguard Worker         WORD32 start_bandwidth, end_bandwidth, start_bitrate, end_bitrate;
125*15dc779aSAndroid Build Coastguard Worker         FLOAT32 bandwidth_fac;
126*15dc779aSAndroid Build Coastguard Worker         start_bandwidth = (num_ch == 1) ? pstr_bandwidth_table[i].bandwidth_mono
127*15dc779aSAndroid Build Coastguard Worker                                         : pstr_bandwidth_table[i].bandwidth_stereo;
128*15dc779aSAndroid Build Coastguard Worker         start_bandwidth = start_bandwidth - (pstr_bandwidth_table[i].channel_bit_rate / 32);
129*15dc779aSAndroid Build Coastguard Worker         end_bandwidth = (num_ch == 1) ? pstr_bandwidth_table[i + 1].bandwidth_mono
130*15dc779aSAndroid Build Coastguard Worker                                       : pstr_bandwidth_table[i + 1].bandwidth_stereo;
131*15dc779aSAndroid Build Coastguard Worker         end_bandwidth = end_bandwidth - (pstr_bandwidth_table[i + 1].channel_bit_rate / 32);
132*15dc779aSAndroid Build Coastguard Worker         start_bitrate = pstr_bandwidth_table[i].channel_bit_rate;
133*15dc779aSAndroid Build Coastguard Worker         end_bitrate = pstr_bandwidth_table[i + 1].channel_bit_rate;
134*15dc779aSAndroid Build Coastguard Worker         bandwidth_fac =
135*15dc779aSAndroid Build Coastguard Worker             (FLOAT32)((channel_bit_rate - start_bitrate) / (end_bitrate - start_bitrate));
136*15dc779aSAndroid Build Coastguard Worker         bandwidth = (WORD32)(bandwidth_fac * (end_bandwidth - start_bandwidth) + start_bandwidth);
137*15dc779aSAndroid Build Coastguard Worker         break;
138*15dc779aSAndroid Build Coastguard Worker       }
139*15dc779aSAndroid Build Coastguard Worker     }
140*15dc779aSAndroid Build Coastguard Worker   }
141*15dc779aSAndroid Build Coastguard Worker   return bandwidth;
142*15dc779aSAndroid Build Coastguard Worker }
143*15dc779aSAndroid Build Coastguard Worker 
ixheaace_determine_bandwidth(const WORD32 proposed_bandwidth,const WORD32 bitrate,const WORD32 sample_rate,const WORD32 channels,WORD32 * const bandwidth,WORD32 aot)144*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_determine_bandwidth(const WORD32 proposed_bandwidth, const WORD32 bitrate,
145*15dc779aSAndroid Build Coastguard Worker                                          const WORD32 sample_rate, const WORD32 channels,
146*15dc779aSAndroid Build Coastguard Worker                                          WORD32 *const bandwidth, WORD32 aot) {
147*15dc779aSAndroid Build Coastguard Worker   WORD32 channel_bit_rate = bitrate / channels;
148*15dc779aSAndroid Build Coastguard Worker   if (proposed_bandwidth == 0) {
149*15dc779aSAndroid Build Coastguard Worker     *bandwidth = ixheaace_calculate_bandwidth(sample_rate, channel_bit_rate, channels, aot);
150*15dc779aSAndroid Build Coastguard Worker   } else {
151*15dc779aSAndroid Build Coastguard Worker     *bandwidth = MIN(proposed_bandwidth, MIN(20000, sample_rate >> 1));
152*15dc779aSAndroid Build Coastguard Worker   }
153*15dc779aSAndroid Build Coastguard Worker   *bandwidth = MIN(*bandwidth, sample_rate / 2);
154*15dc779aSAndroid Build Coastguard Worker }
155*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_aac_enc_pers_size(WORD32 num_aac_chan,WORD32 aot)156*15dc779aSAndroid Build Coastguard Worker WORD32 ia_enhaacplus_enc_aac_enc_pers_size(WORD32 num_aac_chan, WORD32 aot) {
157*15dc779aSAndroid Build Coastguard Worker   WORD32 num_bytes;
158*15dc779aSAndroid Build Coastguard Worker   num_bytes = IXHEAAC_GET_SIZE_ALIGNED(sizeof(iexheaac_encoder_str), BYTE_ALIGN_8);
159*15dc779aSAndroid Build Coastguard Worker   num_bytes += (num_aac_chan *
160*15dc779aSAndroid Build Coastguard Worker     IXHEAAC_GET_SIZE_ALIGNED(sizeof(ixheaace_psy_out_channel), BYTE_ALIGN_8));
161*15dc779aSAndroid Build Coastguard Worker   num_bytes += (num_aac_chan *
162*15dc779aSAndroid Build Coastguard Worker     IXHEAAC_GET_SIZE_ALIGNED(sizeof(ixheaace_psy_data), BYTE_ALIGN_8));
163*15dc779aSAndroid Build Coastguard Worker   num_bytes += (num_aac_chan *
164*15dc779aSAndroid Build Coastguard Worker     IXHEAAC_GET_SIZE_ALIGNED(sizeof(ixheaace_temporal_noise_shaping_data), BYTE_ALIGN_8));
165*15dc779aSAndroid Build Coastguard Worker   if (aot == AOT_AAC_LC || aot == AOT_SBR || aot == AOT_PS) {
166*15dc779aSAndroid Build Coastguard Worker     num_bytes += (num_aac_chan *
167*15dc779aSAndroid Build Coastguard Worker       IXHEAAC_GET_SIZE_ALIGNED(BLK_SWITCH_OFFSET_LC_128 * sizeof(FLOAT32), BYTE_ALIGN_8));
168*15dc779aSAndroid Build Coastguard Worker   } else if (aot == AOT_AAC_LD || aot == AOT_AAC_ELD) {
169*15dc779aSAndroid Build Coastguard Worker     num_bytes += (num_aac_chan *
170*15dc779aSAndroid Build Coastguard Worker       IXHEAAC_GET_SIZE_ALIGNED(BLK_SWITCH_OFFSET_LD * sizeof(FLOAT32), BYTE_ALIGN_8));
171*15dc779aSAndroid Build Coastguard Worker   }
172*15dc779aSAndroid Build Coastguard Worker 
173*15dc779aSAndroid Build Coastguard Worker   num_bytes += (num_aac_chan *
174*15dc779aSAndroid Build Coastguard Worker     IXHEAAC_GET_SIZE_ALIGNED(sizeof(ixheaace_qc_out_channel), BYTE_ALIGN_8));
175*15dc779aSAndroid Build Coastguard Worker   return num_bytes;
176*15dc779aSAndroid Build Coastguard Worker }
177*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_aac_enc_scr_size(VOID)178*15dc779aSAndroid Build Coastguard Worker WORD32 ia_enhaacplus_enc_aac_enc_scr_size(VOID) {
179*15dc779aSAndroid Build Coastguard Worker   return IXHEAAC_GET_SIZE_ALIGNED(sizeof(iaace_scratch), BYTE_ALIGN_8);
180*15dc779aSAndroid Build Coastguard Worker }
181*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_set_shared_bufs(iaace_scratch * scr,WORD32 ** shared_buf1,WORD32 ** shared_buf2,WORD32 ** shared_buf3,WORD8 ** shared_buf5)182*15dc779aSAndroid Build Coastguard Worker VOID ia_enhaacplus_enc_set_shared_bufs(iaace_scratch *scr, WORD32 **shared_buf1,
183*15dc779aSAndroid Build Coastguard Worker                                        WORD32 **shared_buf2, WORD32 **shared_buf3,
184*15dc779aSAndroid Build Coastguard Worker                                        WORD8 **shared_buf5) {
185*15dc779aSAndroid Build Coastguard Worker   iaace_scratch *pstr_aac_enc_scratch = scr;
186*15dc779aSAndroid Build Coastguard Worker   /* Fill addresses of shared buffers */
187*15dc779aSAndroid Build Coastguard Worker   pstr_aac_enc_scratch->shared_buffer1 = *shared_buf1;
188*15dc779aSAndroid Build Coastguard Worker   pstr_aac_enc_scratch->shared_buffer_2 = *shared_buf2;
189*15dc779aSAndroid Build Coastguard Worker   pstr_aac_enc_scratch->shared_buffer3 = *shared_buf3;
190*15dc779aSAndroid Build Coastguard Worker   pstr_aac_enc_scratch->shared_buffer5 = (WORD8 *)*shared_buf5;
191*15dc779aSAndroid Build Coastguard Worker }
192*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_aac_init_default_config(iaace_config * config,WORD32 aot)193*15dc779aSAndroid Build Coastguard Worker VOID ia_enhaacplus_enc_aac_init_default_config(iaace_config *config, WORD32 aot) {
194*15dc779aSAndroid Build Coastguard Worker   memset(config, 0, sizeof(iaace_config));
195*15dc779aSAndroid Build Coastguard Worker 
196*15dc779aSAndroid Build Coastguard Worker   /* default configurations */
197*15dc779aSAndroid Build Coastguard Worker   config->bit_rate = AAC_BITRATE_DEFAULT_VALUE;
198*15dc779aSAndroid Build Coastguard Worker   config->band_width = 0;
199*15dc779aSAndroid Build Coastguard Worker   if (aot == AOT_AAC_LC || aot == AOT_SBR || aot == AOT_PS) {
200*15dc779aSAndroid Build Coastguard Worker     config->inv_quant = 0;
201*15dc779aSAndroid Build Coastguard Worker     config->bitreservoir_size = BITRESERVOIR_SIZE_CONFIG_PARAM_DEFAULT_VALUE_LC;
202*15dc779aSAndroid Build Coastguard Worker   } else if (aot == AOT_AAC_LD || aot == AOT_AAC_ELD) {
203*15dc779aSAndroid Build Coastguard Worker     config->inv_quant = 2;
204*15dc779aSAndroid Build Coastguard Worker     config->bitreservoir_size = BITRESERVOIR_SIZE_CONFIG_PARAM_DEFAULT_VALUE_LD;
205*15dc779aSAndroid Build Coastguard Worker   }
206*15dc779aSAndroid Build Coastguard Worker   config->use_tns = 0;
207*15dc779aSAndroid Build Coastguard Worker   config->flag_framelength_small =
208*15dc779aSAndroid Build Coastguard Worker       USE_FRAMELENGTH_SMALL_PARAM_DEFAULT_VALUE;  // assume framelength large
209*15dc779aSAndroid Build Coastguard Worker }
210*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_aac_set_scratch_ptr(iexheaac_encoder_str * pstr_exheaac_encoder,iaace_scratch * pstr_scr)211*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_aac_set_scratch_ptr(iexheaac_encoder_str *pstr_exheaac_encoder,
212*15dc779aSAndroid Build Coastguard Worker                                                   iaace_scratch *pstr_scr) {
213*15dc779aSAndroid Build Coastguard Worker   pstr_exheaac_encoder->pstr_aac_scratch = pstr_scr;
214*15dc779aSAndroid Build Coastguard Worker }
215*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_init_aac_tabs(ixheaace_aac_tables * pstr_aac_tabs)216*15dc779aSAndroid Build Coastguard Worker VOID ia_enhaacplus_enc_init_aac_tabs(ixheaace_aac_tables *pstr_aac_tabs) {
217*15dc779aSAndroid Build Coastguard Worker   pstr_aac_tabs->pstr_mdct_tab = (ixheaace_mdct_tables *)&ixheaace_enc_mdct_tab;
218*15dc779aSAndroid Build Coastguard Worker   pstr_aac_tabs->pstr_huff_tab = (ixheaace_huffman_tables *)&ixheaace_enc_huff_tab;
219*15dc779aSAndroid Build Coastguard Worker   pstr_aac_tabs->pstr_psycho_tab = (ixheaace_psycho_tables *)&ixheaace_enc_psycho_tab;
220*15dc779aSAndroid Build Coastguard Worker   pstr_aac_tabs->pstr_quant_tab = (ixheaace_quant_tables *)&ixheaace_enc_quant_tab;
221*15dc779aSAndroid Build Coastguard Worker   pstr_aac_tabs->pstr_tns_tab =
222*15dc779aSAndroid Build Coastguard Worker       (ixheaace_temporal_noise_shaping_tables *)&ixheaace_enhaacplus_enc_tns_tab;
223*15dc779aSAndroid Build Coastguard Worker }
224*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_aac_set_persist_buf(WORD8 * ptr_base,WORD32 num_chan,WORD32 aot)225*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_aac_set_persist_buf(WORD8 *ptr_base, WORD32 num_chan, WORD32 aot) {
226*15dc779aSAndroid Build Coastguard Worker   iexheaac_encoder_str *pstr_exheaac_encoder;
227*15dc779aSAndroid Build Coastguard Worker   WORD8 *ptr_curr_mem = ptr_base +
228*15dc779aSAndroid Build Coastguard Worker     IXHEAAC_GET_SIZE_ALIGNED(sizeof(iexheaac_encoder_str), BYTE_ALIGN_8);
229*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
230*15dc779aSAndroid Build Coastguard Worker 
231*15dc779aSAndroid Build Coastguard Worker   pstr_exheaac_encoder = (iexheaac_encoder_str *)ptr_base;
232*15dc779aSAndroid Build Coastguard Worker 
233*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < num_chan; i++) {
234*15dc779aSAndroid Build Coastguard Worker     pstr_exheaac_encoder->psy_out.psy_out_ch[i] = (ixheaace_psy_out_channel *)(ptr_curr_mem);
235*15dc779aSAndroid Build Coastguard Worker     ptr_curr_mem = ptr_curr_mem +
236*15dc779aSAndroid Build Coastguard Worker       IXHEAAC_GET_SIZE_ALIGNED(sizeof(ixheaace_psy_out_channel), BYTE_ALIGN_8);
237*15dc779aSAndroid Build Coastguard Worker   }
238*15dc779aSAndroid Build Coastguard Worker 
239*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < num_chan; i++) {
240*15dc779aSAndroid Build Coastguard Worker     pstr_exheaac_encoder->psy_kernel.psy_data[i] = (ixheaace_psy_data *)(ptr_curr_mem);
241*15dc779aSAndroid Build Coastguard Worker     ptr_curr_mem = ptr_curr_mem +
242*15dc779aSAndroid Build Coastguard Worker       IXHEAAC_GET_SIZE_ALIGNED(sizeof(ixheaace_psy_data), BYTE_ALIGN_8);
243*15dc779aSAndroid Build Coastguard Worker   }
244*15dc779aSAndroid Build Coastguard Worker 
245*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < num_chan; i++) {
246*15dc779aSAndroid Build Coastguard Worker     pstr_exheaac_encoder->psy_kernel.temporal_noise_shaping_data[i] =
247*15dc779aSAndroid Build Coastguard Worker         (ixheaace_temporal_noise_shaping_data *)(ptr_curr_mem);
248*15dc779aSAndroid Build Coastguard Worker     ptr_curr_mem = ptr_curr_mem +
249*15dc779aSAndroid Build Coastguard Worker       IXHEAAC_GET_SIZE_ALIGNED(sizeof(ixheaace_temporal_noise_shaping_data), BYTE_ALIGN_8);
250*15dc779aSAndroid Build Coastguard Worker   }
251*15dc779aSAndroid Build Coastguard Worker 
252*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < num_chan; i++) {
253*15dc779aSAndroid Build Coastguard Worker     switch (aot) {
254*15dc779aSAndroid Build Coastguard Worker       case AOT_AAC_LC:
255*15dc779aSAndroid Build Coastguard Worker       case AOT_SBR:
256*15dc779aSAndroid Build Coastguard Worker       case AOT_PS:
257*15dc779aSAndroid Build Coastguard Worker         pstr_exheaac_encoder->psy_kernel.psy_data[i]->ptr_mdct_delay_buf =
258*15dc779aSAndroid Build Coastguard Worker             (FLOAT32 *)(ptr_curr_mem);
259*15dc779aSAndroid Build Coastguard Worker         ptr_curr_mem = ptr_curr_mem +
260*15dc779aSAndroid Build Coastguard Worker           IXHEAAC_GET_SIZE_ALIGNED(sizeof(FLOAT32) * BLK_SWITCH_OFFSET_LC_128, BYTE_ALIGN_8);
261*15dc779aSAndroid Build Coastguard Worker         break;
262*15dc779aSAndroid Build Coastguard Worker 
263*15dc779aSAndroid Build Coastguard Worker       case AOT_AAC_LD:
264*15dc779aSAndroid Build Coastguard Worker       case AOT_AAC_ELD:
265*15dc779aSAndroid Build Coastguard Worker         pstr_exheaac_encoder->psy_kernel.psy_data[i]->ptr_mdct_delay_buf =
266*15dc779aSAndroid Build Coastguard Worker             (FLOAT32 *)(ptr_curr_mem);
267*15dc779aSAndroid Build Coastguard Worker         ptr_curr_mem = ptr_curr_mem +
268*15dc779aSAndroid Build Coastguard Worker           IXHEAAC_GET_SIZE_ALIGNED(sizeof(FLOAT32) * BLK_SWITCH_OFFSET_LD, BYTE_ALIGN_8);
269*15dc779aSAndroid Build Coastguard Worker         break;
270*15dc779aSAndroid Build Coastguard Worker     }
271*15dc779aSAndroid Build Coastguard Worker   }
272*15dc779aSAndroid Build Coastguard Worker 
273*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < num_chan; i++) {
274*15dc779aSAndroid Build Coastguard Worker     pstr_exheaac_encoder->qc_out.qc_channel[i] = (ixheaace_qc_out_channel *)(ptr_curr_mem);
275*15dc779aSAndroid Build Coastguard Worker     ptr_curr_mem = ptr_curr_mem +
276*15dc779aSAndroid Build Coastguard Worker       IXHEAAC_GET_SIZE_ALIGNED(sizeof(ixheaace_qc_out_channel), BYTE_ALIGN_8);
277*15dc779aSAndroid Build Coastguard Worker   }
278*15dc779aSAndroid Build Coastguard Worker }
279*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_aac_enc_open(iexheaac_encoder_str ** ppstr_exheaac_encoder,const iaace_config config,iaace_scratch * pstr_aac_scratch,ixheaace_aac_tables * pstr_aac_tabs,WORD32 ele_type,WORD32 element_instance_tag,WORD32 aot)280*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ia_enhaacplus_enc_aac_enc_open(iexheaac_encoder_str **ppstr_exheaac_encoder,
281*15dc779aSAndroid Build Coastguard Worker                                             const iaace_config config,
282*15dc779aSAndroid Build Coastguard Worker                                             iaace_scratch *pstr_aac_scratch,
283*15dc779aSAndroid Build Coastguard Worker                                             ixheaace_aac_tables *pstr_aac_tabs, WORD32 ele_type,
284*15dc779aSAndroid Build Coastguard Worker                                             WORD32 element_instance_tag, WORD32 aot) {
285*15dc779aSAndroid Build Coastguard Worker   IA_ERRORCODE error = IA_NO_ERROR;
286*15dc779aSAndroid Build Coastguard Worker   WORD32 profile = 1;
287*15dc779aSAndroid Build Coastguard Worker   ixheaace_element_info *pstr_element_info = NULL;
288*15dc779aSAndroid Build Coastguard Worker   iexheaac_encoder_str *pstr_exheaac_encoder;
289*15dc779aSAndroid Build Coastguard Worker   WORD32 frame_len_long = FRAME_LEN_1024;
290*15dc779aSAndroid Build Coastguard Worker   switch (aot) {
291*15dc779aSAndroid Build Coastguard Worker     case AOT_AAC_LC:
292*15dc779aSAndroid Build Coastguard Worker     case AOT_SBR:
293*15dc779aSAndroid Build Coastguard Worker     case AOT_PS:
294*15dc779aSAndroid Build Coastguard Worker       if (config.flag_framelength_small) {
295*15dc779aSAndroid Build Coastguard Worker         frame_len_long = FRAME_LEN_960;
296*15dc779aSAndroid Build Coastguard Worker       } else {
297*15dc779aSAndroid Build Coastguard Worker         frame_len_long = FRAME_LEN_1024;
298*15dc779aSAndroid Build Coastguard Worker       }
299*15dc779aSAndroid Build Coastguard Worker       break;
300*15dc779aSAndroid Build Coastguard Worker 
301*15dc779aSAndroid Build Coastguard Worker     case AOT_AAC_LD:
302*15dc779aSAndroid Build Coastguard Worker     case AOT_AAC_ELD:
303*15dc779aSAndroid Build Coastguard Worker       if (config.flag_framelength_small) {
304*15dc779aSAndroid Build Coastguard Worker         frame_len_long = FRAME_LEN_480;
305*15dc779aSAndroid Build Coastguard Worker       } else {
306*15dc779aSAndroid Build Coastguard Worker         frame_len_long = FRAME_LEN_512;
307*15dc779aSAndroid Build Coastguard Worker       }
308*15dc779aSAndroid Build Coastguard Worker       break;
309*15dc779aSAndroid Build Coastguard Worker   }
310*15dc779aSAndroid Build Coastguard Worker 
311*15dc779aSAndroid Build Coastguard Worker   if ((config.num_in_channels < 1) || (config.num_out_channels > IXHEAACE_MAX_CH_IN_BS_ELE) ||
312*15dc779aSAndroid Build Coastguard Worker     (config.num_out_channels < 1) || (config.num_in_channels < config.num_out_channels)) {
313*15dc779aSAndroid Build Coastguard Worker     return IA_EXHEAACE_INIT_FATAL_INVALID_NUM_CHANNELS_IN_ELE;
314*15dc779aSAndroid Build Coastguard Worker   }
315*15dc779aSAndroid Build Coastguard Worker   if ((config.bit_rate != 0) && ((config.bit_rate / config.num_out_channels < 8000) ||
316*15dc779aSAndroid Build Coastguard Worker     (config.bit_rate / config.num_out_channels > 576000))) {
317*15dc779aSAndroid Build Coastguard Worker     error = IA_EXHEAACE_INIT_FATAL_BITRATE_NOT_SUPPORTED;
318*15dc779aSAndroid Build Coastguard Worker   }
319*15dc779aSAndroid Build Coastguard Worker   if (error != IA_NO_ERROR) {
320*15dc779aSAndroid Build Coastguard Worker     return error;
321*15dc779aSAndroid Build Coastguard Worker   }
322*15dc779aSAndroid Build Coastguard Worker 
323*15dc779aSAndroid Build Coastguard Worker   pstr_exheaac_encoder = *ppstr_exheaac_encoder;
324*15dc779aSAndroid Build Coastguard Worker 
325*15dc779aSAndroid Build Coastguard Worker   memset(pstr_exheaac_encoder, 0, sizeof(iexheaac_encoder_str));
326*15dc779aSAndroid Build Coastguard Worker 
327*15dc779aSAndroid Build Coastguard Worker   ia_enhaacplus_enc_aac_set_scratch_ptr(pstr_exheaac_encoder, pstr_aac_scratch);
328*15dc779aSAndroid Build Coastguard Worker 
329*15dc779aSAndroid Build Coastguard Worker   ia_enhaacplus_enc_aac_set_persist_buf((WORD8 *)pstr_exheaac_encoder, config.num_out_channels,
330*15dc779aSAndroid Build Coastguard Worker                                         aot);
331*15dc779aSAndroid Build Coastguard Worker 
332*15dc779aSAndroid Build Coastguard Worker   /* check sample rate */
333*15dc779aSAndroid Build Coastguard Worker 
334*15dc779aSAndroid Build Coastguard Worker   switch (config.core_sample_rate) {
335*15dc779aSAndroid Build Coastguard Worker     case 8000:
336*15dc779aSAndroid Build Coastguard Worker     case 11025:
337*15dc779aSAndroid Build Coastguard Worker     case 12000:
338*15dc779aSAndroid Build Coastguard Worker     case 16000:
339*15dc779aSAndroid Build Coastguard Worker     case 22050:
340*15dc779aSAndroid Build Coastguard Worker     case 24000:
341*15dc779aSAndroid Build Coastguard Worker     case 32000:
342*15dc779aSAndroid Build Coastguard Worker     case 44100:
343*15dc779aSAndroid Build Coastguard Worker     case 48000:
344*15dc779aSAndroid Build Coastguard Worker     case 64000:
345*15dc779aSAndroid Build Coastguard Worker     case 88200:
346*15dc779aSAndroid Build Coastguard Worker     case 96000:
347*15dc779aSAndroid Build Coastguard Worker       break;
348*15dc779aSAndroid Build Coastguard Worker 
349*15dc779aSAndroid Build Coastguard Worker     default:
350*15dc779aSAndroid Build Coastguard Worker       return IA_EXHEAACE_INIT_FATAL_INVALID_CORE_SAMPLE_RATE;
351*15dc779aSAndroid Build Coastguard Worker       break;
352*15dc779aSAndroid Build Coastguard Worker   }
353*15dc779aSAndroid Build Coastguard Worker 
354*15dc779aSAndroid Build Coastguard Worker   pstr_exheaac_encoder->config = config;
355*15dc779aSAndroid Build Coastguard Worker 
356*15dc779aSAndroid Build Coastguard Worker   error = ia_enhaacplus_enc_init_element_info(config.num_out_channels,
357*15dc779aSAndroid Build Coastguard Worker                                               &pstr_exheaac_encoder->element_info, ele_type,
358*15dc779aSAndroid Build Coastguard Worker                                               element_instance_tag);
359*15dc779aSAndroid Build Coastguard Worker   if (error != IA_NO_ERROR) {
360*15dc779aSAndroid Build Coastguard Worker     return error;
361*15dc779aSAndroid Build Coastguard Worker   }
362*15dc779aSAndroid Build Coastguard Worker 
363*15dc779aSAndroid Build Coastguard Worker   pstr_element_info = &pstr_exheaac_encoder->element_info;
364*15dc779aSAndroid Build Coastguard Worker 
365*15dc779aSAndroid Build Coastguard Worker   /* allocate the Psy aud Psy Out structure */
366*15dc779aSAndroid Build Coastguard Worker 
367*15dc779aSAndroid Build Coastguard Worker   error = (ia_enhaacplus_enc_psy_new(
368*15dc779aSAndroid Build Coastguard Worker       &pstr_exheaac_encoder->psy_kernel, pstr_element_info->n_channels_in_el,
369*15dc779aSAndroid Build Coastguard Worker       pstr_exheaac_encoder->pstr_aac_scratch->shared_buffer_2, frame_len_long));
370*15dc779aSAndroid Build Coastguard Worker 
371*15dc779aSAndroid Build Coastguard Worker   if (error != IA_NO_ERROR) {
372*15dc779aSAndroid Build Coastguard Worker     return error;
373*15dc779aSAndroid Build Coastguard Worker   }
374*15dc779aSAndroid Build Coastguard Worker 
375*15dc779aSAndroid Build Coastguard Worker   WORD32 tns_mask = config.use_tns;
376*15dc779aSAndroid Build Coastguard Worker   if (config.full_bandwidth) {
377*15dc779aSAndroid Build Coastguard Worker     pstr_exheaac_encoder->config.band_width = config.core_sample_rate >> 2;
378*15dc779aSAndroid Build Coastguard Worker   } else {
379*15dc779aSAndroid Build Coastguard Worker     ixheaace_determine_bandwidth(pstr_exheaac_encoder->config.band_width, config.bit_rate,
380*15dc779aSAndroid Build Coastguard Worker                                  config.core_sample_rate, pstr_element_info->n_channels_in_el,
381*15dc779aSAndroid Build Coastguard Worker                                  &pstr_exheaac_encoder->config.band_width, aot);
382*15dc779aSAndroid Build Coastguard Worker   }
383*15dc779aSAndroid Build Coastguard Worker   pstr_exheaac_encoder->bandwidth_90_dB = (WORD32)pstr_exheaac_encoder->config.band_width;
384*15dc779aSAndroid Build Coastguard Worker   if (ele_type == ID_LFE) {
385*15dc779aSAndroid Build Coastguard Worker     tns_mask = 0;
386*15dc779aSAndroid Build Coastguard Worker   }
387*15dc779aSAndroid Build Coastguard Worker 
388*15dc779aSAndroid Build Coastguard Worker   error = ia_enhaacplus_enc_psy_main_init(
389*15dc779aSAndroid Build Coastguard Worker       &pstr_exheaac_encoder->psy_kernel, config.core_sample_rate, config.bit_rate,
390*15dc779aSAndroid Build Coastguard Worker       pstr_element_info->n_channels_in_el, tns_mask, pstr_exheaac_encoder->bandwidth_90_dB, aot,
391*15dc779aSAndroid Build Coastguard Worker       pstr_aac_tabs, frame_len_long);
392*15dc779aSAndroid Build Coastguard Worker   if (error != IA_NO_ERROR) {
393*15dc779aSAndroid Build Coastguard Worker     return error;
394*15dc779aSAndroid Build Coastguard Worker   }
395*15dc779aSAndroid Build Coastguard Worker 
396*15dc779aSAndroid Build Coastguard Worker   /* allocate the Q&C Out structure */
397*15dc779aSAndroid Build Coastguard Worker   error = ia_enhaacplus_enc_qc_out_new(
398*15dc779aSAndroid Build Coastguard Worker       &pstr_exheaac_encoder->qc_out, pstr_element_info->n_channels_in_el,
399*15dc779aSAndroid Build Coastguard Worker       pstr_exheaac_encoder->pstr_aac_scratch->shared_buffer1,
400*15dc779aSAndroid Build Coastguard Worker       pstr_exheaac_encoder->pstr_aac_scratch->shared_buffer3, frame_len_long);
401*15dc779aSAndroid Build Coastguard Worker 
402*15dc779aSAndroid Build Coastguard Worker   if (error != IA_NO_ERROR) {
403*15dc779aSAndroid Build Coastguard Worker     return error;
404*15dc779aSAndroid Build Coastguard Worker   }
405*15dc779aSAndroid Build Coastguard Worker 
406*15dc779aSAndroid Build Coastguard Worker   /* allocate the Q&C kernel */
407*15dc779aSAndroid Build Coastguard Worker   error = ia_enhaacplus_enc_qc_new(&pstr_exheaac_encoder->qc_kernel,
408*15dc779aSAndroid Build Coastguard Worker                                    pstr_exheaac_encoder->pstr_aac_scratch->shared_buffer_2,
409*15dc779aSAndroid Build Coastguard Worker                                    frame_len_long);
410*15dc779aSAndroid Build Coastguard Worker   if (error != IA_NO_ERROR) {
411*15dc779aSAndroid Build Coastguard Worker     return error;
412*15dc779aSAndroid Build Coastguard Worker   }
413*15dc779aSAndroid Build Coastguard Worker 
414*15dc779aSAndroid Build Coastguard Worker   ixheaace_qc_init qc_init;
415*15dc779aSAndroid Build Coastguard Worker 
416*15dc779aSAndroid Build Coastguard Worker   qc_init.pstr_element_info = &pstr_exheaac_encoder->element_info;
417*15dc779aSAndroid Build Coastguard Worker 
418*15dc779aSAndroid Build Coastguard Worker   if (aot == AOT_AAC_LC || aot == AOT_SBR || aot == AOT_PS) {
419*15dc779aSAndroid Build Coastguard Worker     if (config.flag_framelength_small) {
420*15dc779aSAndroid Build Coastguard Worker       qc_init.max_bits = MAXIMUM_CHANNEL_BITS_960 * pstr_element_info->n_channels_in_el;
421*15dc779aSAndroid Build Coastguard Worker     } else {
422*15dc779aSAndroid Build Coastguard Worker       qc_init.max_bits = MAXIMUM_CHANNEL_BITS_1024 * pstr_element_info->n_channels_in_el;
423*15dc779aSAndroid Build Coastguard Worker     }
424*15dc779aSAndroid Build Coastguard Worker 
425*15dc779aSAndroid Build Coastguard Worker     qc_init.bit_res = qc_init.max_bits;
426*15dc779aSAndroid Build Coastguard Worker   }
427*15dc779aSAndroid Build Coastguard Worker 
428*15dc779aSAndroid Build Coastguard Worker   qc_init.average_bits = (config.bit_rate * frame_len_long) / config.core_sample_rate;
429*15dc779aSAndroid Build Coastguard Worker 
430*15dc779aSAndroid Build Coastguard Worker   if (aot == AOT_AAC_LD || aot == AOT_AAC_ELD) {
431*15dc779aSAndroid Build Coastguard Worker     if (pstr_exheaac_encoder->config.bitreservoir_size != -1) {
432*15dc779aSAndroid Build Coastguard Worker       qc_init.max_bits = (pstr_exheaac_encoder->config.bitreservoir_size * 8) *
433*15dc779aSAndroid Build Coastguard Worker                          pstr_element_info->n_channels_in_el;
434*15dc779aSAndroid Build Coastguard Worker       if (qc_init.max_bits > qc_init.average_bits) {
435*15dc779aSAndroid Build Coastguard Worker         qc_init.bit_res = (pstr_exheaac_encoder->config.bitreservoir_size * 8) *
436*15dc779aSAndroid Build Coastguard Worker                           pstr_element_info->n_channels_in_el;
437*15dc779aSAndroid Build Coastguard Worker       } else {
438*15dc779aSAndroid Build Coastguard Worker         qc_init.max_bits = qc_init.average_bits;
439*15dc779aSAndroid Build Coastguard Worker         qc_init.bit_res = 0;
440*15dc779aSAndroid Build Coastguard Worker       }
441*15dc779aSAndroid Build Coastguard Worker     } else {
442*15dc779aSAndroid Build Coastguard Worker       qc_init.max_bits = qc_init.average_bits;
443*15dc779aSAndroid Build Coastguard Worker       qc_init.bit_res = 0;
444*15dc779aSAndroid Build Coastguard Worker     }
445*15dc779aSAndroid Build Coastguard Worker   }
446*15dc779aSAndroid Build Coastguard Worker 
447*15dc779aSAndroid Build Coastguard Worker   qc_init.padding.padding_rest = config.core_sample_rate;
448*15dc779aSAndroid Build Coastguard Worker 
449*15dc779aSAndroid Build Coastguard Worker   qc_init.mean_pe = ((FLOAT32)10 * frame_len_long * pstr_exheaac_encoder->bandwidth_90_dB * 2) /
450*15dc779aSAndroid Build Coastguard Worker                     config.core_sample_rate;
451*15dc779aSAndroid Build Coastguard Worker 
452*15dc779aSAndroid Build Coastguard Worker   switch (aot) {
453*15dc779aSAndroid Build Coastguard Worker     case AOT_AAC_LC:
454*15dc779aSAndroid Build Coastguard Worker     case AOT_SBR:
455*15dc779aSAndroid Build Coastguard Worker     case AOT_PS:
456*15dc779aSAndroid Build Coastguard Worker       if (config.flag_framelength_small) {
457*15dc779aSAndroid Build Coastguard Worker         qc_init.max_bit_fac =
458*15dc779aSAndroid Build Coastguard Worker             (float)(MAXIMUM_CHANNEL_BITS_960 * pstr_element_info->n_channels_in_el) /
459*15dc779aSAndroid Build Coastguard Worker             (float)(qc_init.average_bits ? qc_init.average_bits : 1);
460*15dc779aSAndroid Build Coastguard Worker       } else {
461*15dc779aSAndroid Build Coastguard Worker         qc_init.max_bit_fac =
462*15dc779aSAndroid Build Coastguard Worker             (float)(MAXIMUM_CHANNEL_BITS_1024 * pstr_element_info->n_channels_in_el) /
463*15dc779aSAndroid Build Coastguard Worker             (float)(qc_init.average_bits ? qc_init.average_bits : 1);
464*15dc779aSAndroid Build Coastguard Worker       }
465*15dc779aSAndroid Build Coastguard Worker       break;
466*15dc779aSAndroid Build Coastguard Worker 
467*15dc779aSAndroid Build Coastguard Worker     case AOT_AAC_LD:
468*15dc779aSAndroid Build Coastguard Worker     case AOT_AAC_ELD:
469*15dc779aSAndroid Build Coastguard Worker       if (config.flag_framelength_small) {
470*15dc779aSAndroid Build Coastguard Worker         qc_init.max_bit_fac = (FLOAT32)((MAXIMUM_CHANNEL_BITS_480)*pstr_element_info
471*15dc779aSAndroid Build Coastguard Worker                                             ->n_channels_in_el);  // no anc data in aacld
472*15dc779aSAndroid Build Coastguard Worker       } else {
473*15dc779aSAndroid Build Coastguard Worker         qc_init.max_bit_fac = (FLOAT32)((MAXIMUM_CHANNEL_BITS_512)*pstr_element_info
474*15dc779aSAndroid Build Coastguard Worker                                             ->n_channels_in_el);  // no anc data in aacld
475*15dc779aSAndroid Build Coastguard Worker       }
476*15dc779aSAndroid Build Coastguard Worker       qc_init.max_bit_fac =
477*15dc779aSAndroid Build Coastguard Worker           qc_init.max_bit_fac / (qc_init.average_bits ? qc_init.average_bits : 1);
478*15dc779aSAndroid Build Coastguard Worker       break;
479*15dc779aSAndroid Build Coastguard Worker   }
480*15dc779aSAndroid Build Coastguard Worker 
481*15dc779aSAndroid Build Coastguard Worker   qc_init.bitrate = config.bit_rate;
482*15dc779aSAndroid Build Coastguard Worker   qc_init.inv_quant = config.inv_quant;
483*15dc779aSAndroid Build Coastguard Worker 
484*15dc779aSAndroid Build Coastguard Worker   error = ia_enhaacplus_enc_qc_init(&pstr_exheaac_encoder->qc_kernel, aot, &qc_init,
485*15dc779aSAndroid Build Coastguard Worker                                     config.flag_framelength_small);
486*15dc779aSAndroid Build Coastguard Worker   if (error != IA_NO_ERROR) {
487*15dc779aSAndroid Build Coastguard Worker     return error;
488*15dc779aSAndroid Build Coastguard Worker   }
489*15dc779aSAndroid Build Coastguard Worker 
490*15dc779aSAndroid Build Coastguard Worker   /* init bitstream encoder */
491*15dc779aSAndroid Build Coastguard Worker   pstr_exheaac_encoder->bse_init.num_channels = pstr_element_info->n_channels_in_el;
492*15dc779aSAndroid Build Coastguard Worker   pstr_exheaac_encoder->bse_init.bitrate = config.bit_rate;
493*15dc779aSAndroid Build Coastguard Worker   pstr_exheaac_encoder->bse_init.sample_rate = config.core_sample_rate;
494*15dc779aSAndroid Build Coastguard Worker   pstr_exheaac_encoder->bse_init.profile = profile;
495*15dc779aSAndroid Build Coastguard Worker 
496*15dc779aSAndroid Build Coastguard Worker   if (config.num_in_channels > config.num_out_channels) {
497*15dc779aSAndroid Build Coastguard Worker     pstr_exheaac_encoder->downmix = 1;
498*15dc779aSAndroid Build Coastguard Worker     pstr_exheaac_encoder->downmix_fac = config.num_in_channels / config.num_out_channels;
499*15dc779aSAndroid Build Coastguard Worker   }
500*15dc779aSAndroid Build Coastguard Worker 
501*15dc779aSAndroid Build Coastguard Worker   if (pstr_element_info->el_type == ID_CPE &&
502*15dc779aSAndroid Build Coastguard Worker       (config.core_sample_rate <= 24000 &&
503*15dc779aSAndroid Build Coastguard Worker        (config.bit_rate / pstr_element_info->n_channels_in_el * 2) < 60000)) {
504*15dc779aSAndroid Build Coastguard Worker     FLOAT32 scf_used_ratio = (FLOAT32)pstr_exheaac_encoder->psy_kernel.psy_conf_long.sfb_active /
505*15dc779aSAndroid Build Coastguard Worker                              pstr_exheaac_encoder->psy_kernel.psy_conf_long.sfb_cnt;
506*15dc779aSAndroid Build Coastguard Worker 
507*15dc779aSAndroid Build Coastguard Worker     error = iaace_init_stereo_pre_processing(&(pstr_exheaac_encoder->str_stereo_pre_pro),
508*15dc779aSAndroid Build Coastguard Worker                                              pstr_element_info->n_channels_in_el, config.bit_rate,
509*15dc779aSAndroid Build Coastguard Worker                                              config.core_sample_rate, scf_used_ratio);
510*15dc779aSAndroid Build Coastguard Worker   }
511*15dc779aSAndroid Build Coastguard Worker 
512*15dc779aSAndroid Build Coastguard Worker   if (error != IA_NO_ERROR) {
513*15dc779aSAndroid Build Coastguard Worker     return error;
514*15dc779aSAndroid Build Coastguard Worker   }
515*15dc779aSAndroid Build Coastguard Worker 
516*15dc779aSAndroid Build Coastguard Worker   *ppstr_exheaac_encoder = pstr_exheaac_encoder;
517*15dc779aSAndroid Build Coastguard Worker 
518*15dc779aSAndroid Build Coastguard Worker   return IA_NO_ERROR;
519*15dc779aSAndroid Build Coastguard Worker }
520