xref: /aosp_15_r20/external/libxaac/decoder/ixheaacd_create.c (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker  *                                                                            *
3*15dc779aSAndroid Build Coastguard Worker  * Copyright (C) 2018 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 #include <stdio.h>
21*15dc779aSAndroid Build Coastguard Worker #include <stdlib.h>
22*15dc779aSAndroid Build Coastguard Worker #include <string.h>
23*15dc779aSAndroid Build Coastguard Worker #include <assert.h>
24*15dc779aSAndroid Build Coastguard Worker 
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_cnst.h"
28*15dc779aSAndroid Build Coastguard Worker 
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_config.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_interface.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_acelp_info.h"
33*15dc779aSAndroid Build Coastguard Worker 
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_tns_usac.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecsettings.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_info.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_struct.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_common.h"
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_data_struct.h"
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_dec.h"
41*15dc779aSAndroid Build Coastguard Worker 
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_scale.h"
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr_part.h"
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_rom.h"
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_hybrid.h"
46*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ps_dec.h"
47*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_common_rom.h"
48*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_qmf_dec.h"
49*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_sbr_const.h"
50*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_lpp_tran.h"
51*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecoder.h"
52*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr.h"
53*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_calc.h"
54*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pvc_dec.h"
55*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_dec.h"
56*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_polyphase.h"
57*15dc779aSAndroid Build Coastguard Worker 
58*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_memory_standards.h"
59*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_defines.h"
60*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aac_rom.h"
61*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
62*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pulsedata.h"
63*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pns.h"
64*15dc779aSAndroid Build Coastguard Worker 
65*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_defines.h"
66*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_struct_def.h"
67*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_main.h"
68*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_channelinfo.h"
69*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec.h"
70*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_audioobjtypes.h"
71*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_latmdemux.h"
72*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aacdec.h"
73*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_struct_def.h"
74*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_res_rom.h"
75*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_aac_struct.h"
76*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_dec.h"
77*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_struct_def.h"
78*15dc779aSAndroid Build Coastguard Worker 
79*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_create.h"
80*15dc779aSAndroid Build Coastguard Worker 
81*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_interface.h"
82*15dc779aSAndroid Build Coastguard Worker 
83*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_func_def.h"
84*15dc779aSAndroid Build Coastguard Worker 
85*15dc779aSAndroid Build Coastguard Worker extern const ia_huff_code_word_struct ixheaacd_huff_book_scl[];
86*15dc779aSAndroid Build Coastguard Worker 
87*15dc779aSAndroid Build Coastguard Worker extern const WORD32 ixheaacd_book_scl_index[];
88*15dc779aSAndroid Build Coastguard Worker extern const WORD16 ixheaacd_book_scl_code_book[];
89*15dc779aSAndroid Build Coastguard Worker 
90*15dc779aSAndroid Build Coastguard Worker extern const ia_usac_samp_rate_info ixheaacd_samp_rate_info[];
91*15dc779aSAndroid Build Coastguard Worker extern const WORD32 ixheaacd_sampling_boundaries[(1 << LEN_SAMP_IDX)];
92*15dc779aSAndroid Build Coastguard Worker 
93*15dc779aSAndroid Build Coastguard Worker const WORD32 ixheaacd_sampl_freq_idx_table[17] = {
94*15dc779aSAndroid Build Coastguard Worker     96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000,
95*15dc779aSAndroid Build Coastguard Worker     12000, 11025, 8000,  7350,  -1,    -1,    -1,    -1};
96*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_info_init(const ia_usac_samp_rate_info * ptr_samp_info,WORD32 block_size_samples,ia_sfb_info_struct * pstr_sfb_info_long,ia_sfb_info_struct * pstr_sfb_info_short,WORD16 * sfb_width_short,WORD16 * sfb_width_long)97*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_info_init(const ia_usac_samp_rate_info *ptr_samp_info,
98*15dc779aSAndroid Build Coastguard Worker                                WORD32 block_size_samples,
99*15dc779aSAndroid Build Coastguard Worker                                ia_sfb_info_struct *pstr_sfb_info_long,
100*15dc779aSAndroid Build Coastguard Worker                                ia_sfb_info_struct *pstr_sfb_info_short,
101*15dc779aSAndroid Build Coastguard Worker                                WORD16 *sfb_width_short,
102*15dc779aSAndroid Build Coastguard Worker                                WORD16 *sfb_width_long) {
103*15dc779aSAndroid Build Coastguard Worker   WORD32 i, j, k, n, ws;
104*15dc779aSAndroid Build Coastguard Worker   const WORD16 *sfbands;
105*15dc779aSAndroid Build Coastguard Worker   ia_sfb_info_struct *pstr_sfb_info_ip;
106*15dc779aSAndroid Build Coastguard Worker 
107*15dc779aSAndroid Build Coastguard Worker   pstr_sfb_info_long->islong = 1;
108*15dc779aSAndroid Build Coastguard Worker   pstr_sfb_info_long->max_win_len = 1;
109*15dc779aSAndroid Build Coastguard Worker   pstr_sfb_info_long->samp_per_bk = block_size_samples;
110*15dc779aSAndroid Build Coastguard Worker 
111*15dc779aSAndroid Build Coastguard Worker   switch (block_size_samples) {
112*15dc779aSAndroid Build Coastguard Worker     case 480:
113*15dc779aSAndroid Build Coastguard Worker       pstr_sfb_info_long->ptr_sfb_tbl = ptr_samp_info->ptr_sfb_480;
114*15dc779aSAndroid Build Coastguard Worker       pstr_sfb_info_long->sfb_per_sbk = ptr_samp_info->num_sfb_480;
115*15dc779aSAndroid Build Coastguard Worker       break;
116*15dc779aSAndroid Build Coastguard Worker     case 512:
117*15dc779aSAndroid Build Coastguard Worker       pstr_sfb_info_long->ptr_sfb_tbl = ptr_samp_info->ptr_sfb_512;
118*15dc779aSAndroid Build Coastguard Worker       pstr_sfb_info_long->sfb_per_sbk = ptr_samp_info->num_sfb_512;
119*15dc779aSAndroid Build Coastguard Worker       break;
120*15dc779aSAndroid Build Coastguard Worker     case 768:
121*15dc779aSAndroid Build Coastguard Worker       pstr_sfb_info_long->sfb_per_sbk = ptr_samp_info->num_sfb_768;
122*15dc779aSAndroid Build Coastguard Worker       pstr_sfb_info_long->ptr_sfb_tbl = ptr_samp_info->ptr_sfb_768;
123*15dc779aSAndroid Build Coastguard Worker       break;
124*15dc779aSAndroid Build Coastguard Worker     case 960:
125*15dc779aSAndroid Build Coastguard Worker       pstr_sfb_info_long->ptr_sfb_tbl = ptr_samp_info->ptr_sfb_960;
126*15dc779aSAndroid Build Coastguard Worker       pstr_sfb_info_long->sfb_per_sbk = ptr_samp_info->num_sfb_960;
127*15dc779aSAndroid Build Coastguard Worker       break;
128*15dc779aSAndroid Build Coastguard Worker     case 1024:
129*15dc779aSAndroid Build Coastguard Worker       pstr_sfb_info_long->sfb_per_sbk = ptr_samp_info->num_sfb_1024;
130*15dc779aSAndroid Build Coastguard Worker       pstr_sfb_info_long->ptr_sfb_tbl = ptr_samp_info->ptr_sfb_1024;
131*15dc779aSAndroid Build Coastguard Worker       break;
132*15dc779aSAndroid Build Coastguard Worker     default:
133*15dc779aSAndroid Build Coastguard Worker       assert(0);
134*15dc779aSAndroid Build Coastguard Worker       break;
135*15dc779aSAndroid Build Coastguard Worker   }
136*15dc779aSAndroid Build Coastguard Worker 
137*15dc779aSAndroid Build Coastguard Worker   pstr_sfb_info_long->sfb_width = sfb_width_long;
138*15dc779aSAndroid Build Coastguard Worker   pstr_sfb_info_long->num_groups = 1;
139*15dc779aSAndroid Build Coastguard Worker   pstr_sfb_info_long->group_len[0] = 1;
140*15dc779aSAndroid Build Coastguard Worker 
141*15dc779aSAndroid Build Coastguard Worker   for (i = 0, j = 0, n = pstr_sfb_info_long->sfb_per_sbk; i < n; i++) {
142*15dc779aSAndroid Build Coastguard Worker     k = pstr_sfb_info_long->ptr_sfb_tbl[i];
143*15dc779aSAndroid Build Coastguard Worker     pstr_sfb_info_long->sfb_width[i] = k - j;
144*15dc779aSAndroid Build Coastguard Worker     j = k;
145*15dc779aSAndroid Build Coastguard Worker   }
146*15dc779aSAndroid Build Coastguard Worker 
147*15dc779aSAndroid Build Coastguard Worker   pstr_sfb_info_short->islong = 0;
148*15dc779aSAndroid Build Coastguard Worker   pstr_sfb_info_short->max_win_len = NSHORT;
149*15dc779aSAndroid Build Coastguard Worker   pstr_sfb_info_short->samp_per_bk = block_size_samples;
150*15dc779aSAndroid Build Coastguard Worker 
151*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < pstr_sfb_info_short->max_win_len; i++) {
152*15dc779aSAndroid Build Coastguard Worker     switch (block_size_samples) {
153*15dc779aSAndroid Build Coastguard Worker       case 768:
154*15dc779aSAndroid Build Coastguard Worker         pstr_sfb_info_short->ptr_sfb_tbl = ptr_samp_info->ptr_sfb_96;
155*15dc779aSAndroid Build Coastguard Worker         pstr_sfb_info_short->sfb_per_sbk = ptr_samp_info->num_sfb_96;
156*15dc779aSAndroid Build Coastguard Worker         break;
157*15dc779aSAndroid Build Coastguard Worker       case 960:
158*15dc779aSAndroid Build Coastguard Worker         pstr_sfb_info_short->ptr_sfb_tbl = ptr_samp_info->ptr_sfb_120;
159*15dc779aSAndroid Build Coastguard Worker         pstr_sfb_info_short->sfb_per_sbk = ptr_samp_info->num_sfb_120;
160*15dc779aSAndroid Build Coastguard Worker         break;
161*15dc779aSAndroid Build Coastguard Worker       case 1024:
162*15dc779aSAndroid Build Coastguard Worker         pstr_sfb_info_short->ptr_sfb_tbl = ptr_samp_info->ptr_sfb_128;
163*15dc779aSAndroid Build Coastguard Worker         pstr_sfb_info_short->sfb_per_sbk = ptr_samp_info->num_sfb_128;
164*15dc779aSAndroid Build Coastguard Worker         break;
165*15dc779aSAndroid Build Coastguard Worker       default:
166*15dc779aSAndroid Build Coastguard Worker         assert(0);
167*15dc779aSAndroid Build Coastguard Worker         break;
168*15dc779aSAndroid Build Coastguard Worker     }
169*15dc779aSAndroid Build Coastguard Worker   }
170*15dc779aSAndroid Build Coastguard Worker 
171*15dc779aSAndroid Build Coastguard Worker   pstr_sfb_info_short->sfb_width = sfb_width_short;
172*15dc779aSAndroid Build Coastguard Worker   for (i = 0, j = 0, n = pstr_sfb_info_short->sfb_per_sbk; i < n; i++) {
173*15dc779aSAndroid Build Coastguard Worker     k = pstr_sfb_info_short->ptr_sfb_tbl[i];
174*15dc779aSAndroid Build Coastguard Worker     pstr_sfb_info_short->sfb_width[i] = k - j;
175*15dc779aSAndroid Build Coastguard Worker     j = k;
176*15dc779aSAndroid Build Coastguard Worker   }
177*15dc779aSAndroid Build Coastguard Worker 
178*15dc779aSAndroid Build Coastguard Worker   pstr_sfb_info_ip = pstr_sfb_info_long;
179*15dc779aSAndroid Build Coastguard Worker   for (ws = 0; ws < 2; ws++) {
180*15dc779aSAndroid Build Coastguard Worker     pstr_sfb_info_ip->sfb_per_bk = 0;
181*15dc779aSAndroid Build Coastguard Worker     k = 0;
182*15dc779aSAndroid Build Coastguard Worker     n = 0;
183*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < pstr_sfb_info_ip->max_win_len; i++) {
184*15dc779aSAndroid Build Coastguard Worker       pstr_sfb_info_ip->bins_per_sbk =
185*15dc779aSAndroid Build Coastguard Worker           pstr_sfb_info_ip->samp_per_bk / pstr_sfb_info_ip->max_win_len;
186*15dc779aSAndroid Build Coastguard Worker 
187*15dc779aSAndroid Build Coastguard Worker       pstr_sfb_info_ip->sfb_per_bk += pstr_sfb_info_ip->sfb_per_sbk;
188*15dc779aSAndroid Build Coastguard Worker 
189*15dc779aSAndroid Build Coastguard Worker       sfbands = pstr_sfb_info_ip->ptr_sfb_tbl;
190*15dc779aSAndroid Build Coastguard Worker       for (j = 0; j < pstr_sfb_info_ip->sfb_per_sbk; j++)
191*15dc779aSAndroid Build Coastguard Worker         pstr_sfb_info_ip->sfb_idx_tbl[j + k] = sfbands[j] + n;
192*15dc779aSAndroid Build Coastguard Worker 
193*15dc779aSAndroid Build Coastguard Worker       n += pstr_sfb_info_ip->bins_per_sbk;
194*15dc779aSAndroid Build Coastguard Worker       k += pstr_sfb_info_ip->sfb_per_sbk;
195*15dc779aSAndroid Build Coastguard Worker     }
196*15dc779aSAndroid Build Coastguard Worker     pstr_sfb_info_ip = pstr_sfb_info_short;
197*15dc779aSAndroid Build Coastguard Worker   }
198*15dc779aSAndroid Build Coastguard Worker }
199*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_decode_init(VOID * handle,WORD32 sample_rate,ia_usac_data_struct * usac_data,ia_audio_specific_config_struct * pstr_stream_config)200*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_decode_init(
201*15dc779aSAndroid Build Coastguard Worker     VOID *handle, WORD32 sample_rate, ia_usac_data_struct *usac_data,
202*15dc779aSAndroid Build Coastguard Worker     ia_audio_specific_config_struct *pstr_stream_config) {
203*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
204*15dc779aSAndroid Build Coastguard Worker   ia_exhaacplus_dec_api_struct *codec_handle =
205*15dc779aSAndroid Build Coastguard Worker       (ia_exhaacplus_dec_api_struct *)handle;
206*15dc779aSAndroid Build Coastguard Worker   ia_aac_dec_state_struct *aac_dec_handle = codec_handle->p_state_aac;
207*15dc779aSAndroid Build Coastguard Worker   WORD32 fscale;
208*15dc779aSAndroid Build Coastguard Worker 
209*15dc779aSAndroid Build Coastguard Worker   WORD32 ele_id = 0;
210*15dc779aSAndroid Build Coastguard Worker 
211*15dc779aSAndroid Build Coastguard Worker   ia_usac_config_struct *ptr_usac_config =
212*15dc779aSAndroid Build Coastguard Worker       &(pstr_stream_config->str_usac_config);
213*15dc779aSAndroid Build Coastguard Worker   ia_usac_decoder_config_struct *ptr_usac_dec_config =
214*15dc779aSAndroid Build Coastguard Worker       &(pstr_stream_config->str_usac_config.str_usac_dec_config);
215*15dc779aSAndroid Build Coastguard Worker   WORD32 num_elements = ptr_usac_dec_config->num_elements;
216*15dc779aSAndroid Build Coastguard Worker   WORD32 chan = 0;
217*15dc779aSAndroid Build Coastguard Worker 
218*15dc779aSAndroid Build Coastguard Worker   usac_data->ec_flag = codec_handle->aac_config.ui_err_conceal;
219*15dc779aSAndroid Build Coastguard Worker   usac_data->huffman_code_book_scl = aac_dec_handle->huffman_code_book_scl;
220*15dc779aSAndroid Build Coastguard Worker   usac_data->huffman_code_book_scl_index =
221*15dc779aSAndroid Build Coastguard Worker       aac_dec_handle->huffman_code_book_scl_index;
222*15dc779aSAndroid Build Coastguard Worker 
223*15dc779aSAndroid Build Coastguard Worker   usac_data->tns_coeff3_32 =
224*15dc779aSAndroid Build Coastguard Worker       aac_dec_handle->pstr_aac_tables->pstr_block_tables->tns_coeff3_32;
225*15dc779aSAndroid Build Coastguard Worker   usac_data->tns_coeff4_32 =
226*15dc779aSAndroid Build Coastguard Worker       aac_dec_handle->pstr_aac_tables->pstr_block_tables->tns_coeff4_32;
227*15dc779aSAndroid Build Coastguard Worker   usac_data->tns_max_bands_tbl_usac =
228*15dc779aSAndroid Build Coastguard Worker       &aac_dec_handle->pstr_aac_tables->pstr_block_tables
229*15dc779aSAndroid Build Coastguard Worker            ->tns_max_bands_tbl_usac;
230*15dc779aSAndroid Build Coastguard Worker   for (WORD32 ch = 0; ch < MAX_NUM_CHANNELS; ch++) {
231*15dc779aSAndroid Build Coastguard Worker     ixheaacd_usac_ec_init(&usac_data->str_error_concealment[ch], usac_data->core_mode);
232*15dc779aSAndroid Build Coastguard Worker     memset(&usac_data->overlap_data_ptr[ch][0], 0, sizeof(usac_data->overlap_data_ptr[ch]));
233*15dc779aSAndroid Build Coastguard Worker   }
234*15dc779aSAndroid Build Coastguard Worker 
235*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < 11; i++) {
236*15dc779aSAndroid Build Coastguard Worker     if (ixheaacd_sampling_boundaries[i] <= sample_rate) break;
237*15dc779aSAndroid Build Coastguard Worker   }
238*15dc779aSAndroid Build Coastguard Worker 
239*15dc779aSAndroid Build Coastguard Worker   if (i == (1 << LEN_SAMP_IDX)) return -1;
240*15dc779aSAndroid Build Coastguard Worker   usac_data->sampling_rate_idx = i;
241*15dc779aSAndroid Build Coastguard Worker 
242*15dc779aSAndroid Build Coastguard Worker   fscale = (WORD32)((double)sample_rate * (double)FSCALE_DENOM / 12800.0f);
243*15dc779aSAndroid Build Coastguard Worker 
244*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < MAX_NUM_CHANNELS; i++) {
245*15dc779aSAndroid Build Coastguard Worker     usac_data->window_shape_prev[i] = 0;
246*15dc779aSAndroid Build Coastguard Worker     usac_data->window_shape[i] = 0;
247*15dc779aSAndroid Build Coastguard Worker   }
248*15dc779aSAndroid Build Coastguard Worker 
249*15dc779aSAndroid Build Coastguard Worker   ixheaacd_hufftab(&ixheaacd_book, ixheaacd_huff_book_scl,
250*15dc779aSAndroid Build Coastguard Worker                    ixheaacd_book_scl_code_book, ixheaacd_book_scl_index, 1, 60,
251*15dc779aSAndroid Build Coastguard Worker                    60, 1, 19);
252*15dc779aSAndroid Build Coastguard Worker 
253*15dc779aSAndroid Build Coastguard Worker   usac_data->pstr_usac_winmap[0] = &usac_data->str_only_long_info;
254*15dc779aSAndroid Build Coastguard Worker   usac_data->pstr_usac_winmap[1] = &usac_data->str_only_long_info;
255*15dc779aSAndroid Build Coastguard Worker   usac_data->pstr_usac_winmap[2] = &usac_data->str_eight_short_info;
256*15dc779aSAndroid Build Coastguard Worker   usac_data->pstr_usac_winmap[3] = &usac_data->str_only_long_info;
257*15dc779aSAndroid Build Coastguard Worker   usac_data->pstr_usac_winmap[4] = &usac_data->str_only_long_info;
258*15dc779aSAndroid Build Coastguard Worker 
259*15dc779aSAndroid Build Coastguard Worker   if ((usac_data->ccfl != 480) && (usac_data->ccfl != 512) &&
260*15dc779aSAndroid Build Coastguard Worker       (usac_data->ccfl != 768) && (usac_data->ccfl != 960) &&
261*15dc779aSAndroid Build Coastguard Worker       (usac_data->ccfl != 1024))
262*15dc779aSAndroid Build Coastguard Worker     return -1;
263*15dc779aSAndroid Build Coastguard Worker   ixheaacd_info_init(&ixheaacd_samp_rate_info[usac_data->sampling_rate_idx],
264*15dc779aSAndroid Build Coastguard Worker                      usac_data->ccfl, usac_data->pstr_usac_winmap[0],
265*15dc779aSAndroid Build Coastguard Worker                      usac_data->pstr_usac_winmap[2], usac_data->sfb_width_short,
266*15dc779aSAndroid Build Coastguard Worker                      usac_data->sfb_width_long);
267*15dc779aSAndroid Build Coastguard Worker 
268*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < MAX_NUM_CHANNELS; i++) {
269*15dc779aSAndroid Build Coastguard Worker     usac_data->str_tddec[i] = &usac_data->arr_str_tddec[i];
270*15dc779aSAndroid Build Coastguard Worker     if (usac_data->ccfl == 768)
271*15dc779aSAndroid Build Coastguard Worker       usac_data->str_tddec[i]->fscale = pstr_stream_config->sampling_frequency;
272*15dc779aSAndroid Build Coastguard Worker     else
273*15dc779aSAndroid Build Coastguard Worker       usac_data->str_tddec[i]->fscale =
274*15dc779aSAndroid Build Coastguard Worker           ((fscale)*usac_data->ccfl) / LEN_SUPERFRAME;
275*15dc779aSAndroid Build Coastguard Worker     usac_data->len_subfrm = usac_data->ccfl / 4;
276*15dc779aSAndroid Build Coastguard Worker 
277*15dc779aSAndroid Build Coastguard Worker     {
278*15dc779aSAndroid Build Coastguard Worker       WORD32 fac_length = usac_data->len_subfrm / 4;
279*15dc779aSAndroid Build Coastguard Worker       if (fac_length & (fac_length - 1)) {
280*15dc779aSAndroid Build Coastguard Worker         if ((fac_length != 48) && (fac_length != 96) && (fac_length != 192) &&
281*15dc779aSAndroid Build Coastguard Worker             (fac_length != 384) && (fac_length != 768)) {
282*15dc779aSAndroid Build Coastguard Worker           return -1;
283*15dc779aSAndroid Build Coastguard Worker         }
284*15dc779aSAndroid Build Coastguard Worker       }
285*15dc779aSAndroid Build Coastguard Worker     }
286*15dc779aSAndroid Build Coastguard Worker     usac_data->num_subfrm = (MAX_NUM_SUBFR * usac_data->ccfl) / LEN_SUPERFRAME;
287*15dc779aSAndroid Build Coastguard Worker 
288*15dc779aSAndroid Build Coastguard Worker     ixheaacd_init_acelp_data(usac_data, usac_data->str_tddec[i]);
289*15dc779aSAndroid Build Coastguard Worker 
290*15dc779aSAndroid Build Coastguard Worker     usac_data->str_tddec[i]->fd_synth =
291*15dc779aSAndroid Build Coastguard Worker         &usac_data->str_tddec[i]->fd_synth_buf[LEN_FRAME];
292*15dc779aSAndroid Build Coastguard Worker   }
293*15dc779aSAndroid Build Coastguard Worker 
294*15dc779aSAndroid Build Coastguard Worker   for (ele_id = 0; ele_id < num_elements; ele_id++) {
295*15dc779aSAndroid Build Coastguard Worker     UWORD32 ele_type;
296*15dc779aSAndroid Build Coastguard Worker     WORD32 stereo_config_index;
297*15dc779aSAndroid Build Coastguard Worker 
298*15dc779aSAndroid Build Coastguard Worker     ia_usac_dec_element_config_struct *ptr_usac_ele_config =
299*15dc779aSAndroid Build Coastguard Worker         &ptr_usac_config->str_usac_dec_config.str_usac_element_config[ele_id];
300*15dc779aSAndroid Build Coastguard Worker 
301*15dc779aSAndroid Build Coastguard Worker     if (ptr_usac_ele_config) {
302*15dc779aSAndroid Build Coastguard Worker       if (usac_data->tw_mdct[ele_id]) {
303*15dc779aSAndroid Build Coastguard Worker         if (usac_data->ec_flag) {
304*15dc779aSAndroid Build Coastguard Worker           usac_data->tw_mdct[ele_id] = 0;
305*15dc779aSAndroid Build Coastguard Worker         } else
306*15dc779aSAndroid Build Coastguard Worker           return -1;
307*15dc779aSAndroid Build Coastguard Worker       }
308*15dc779aSAndroid Build Coastguard Worker 
309*15dc779aSAndroid Build Coastguard Worker       usac_data->noise_filling_config[ele_id] = ptr_usac_ele_config->noise_filling;
310*15dc779aSAndroid Build Coastguard Worker     }
311*15dc779aSAndroid Build Coastguard Worker 
312*15dc779aSAndroid Build Coastguard Worker     ele_type = ptr_usac_config->str_usac_dec_config.usac_element_type[ele_id];
313*15dc779aSAndroid Build Coastguard Worker 
314*15dc779aSAndroid Build Coastguard Worker     stereo_config_index = ptr_usac_ele_config->stereo_config_index;
315*15dc779aSAndroid Build Coastguard Worker 
316*15dc779aSAndroid Build Coastguard Worker     switch (ele_type) {
317*15dc779aSAndroid Build Coastguard Worker       case ID_USAC_SCE:
318*15dc779aSAndroid Build Coastguard Worker       case ID_USAC_LFE:
319*15dc779aSAndroid Build Coastguard Worker 
320*15dc779aSAndroid Build Coastguard Worker         if ((chan + 1) > MAX_NUM_CHANNELS_USAC_LVL2) return -1;
321*15dc779aSAndroid Build Coastguard Worker         usac_data->seed_value[chan] = 0x3039;
322*15dc779aSAndroid Build Coastguard Worker         chan++;
323*15dc779aSAndroid Build Coastguard Worker 
324*15dc779aSAndroid Build Coastguard Worker         break;
325*15dc779aSAndroid Build Coastguard Worker 
326*15dc779aSAndroid Build Coastguard Worker       case ID_USAC_CPE: {
327*15dc779aSAndroid Build Coastguard Worker         static const WORD32 frame_len_tbl[MAX_CORE_SBR_FRAME_LEN_IDX + 1] = {
328*15dc779aSAndroid Build Coastguard Worker             -1, -1, 32, 32, 64};
329*15dc779aSAndroid Build Coastguard Worker 
330*15dc779aSAndroid Build Coastguard Worker         if ((chan + 2) > MAX_NUM_CHANNELS_USAC_LVL2) return -1;
331*15dc779aSAndroid Build Coastguard Worker         usac_data->seed_value[chan] = 0x3039;
332*15dc779aSAndroid Build Coastguard Worker         chan++;
333*15dc779aSAndroid Build Coastguard Worker 
334*15dc779aSAndroid Build Coastguard Worker         usac_data->seed_value[chan] = 0x10932;
335*15dc779aSAndroid Build Coastguard Worker         chan++;
336*15dc779aSAndroid Build Coastguard Worker 
337*15dc779aSAndroid Build Coastguard Worker         if (stereo_config_index > 0) {
338*15dc779aSAndroid Build Coastguard Worker           WORD32 bs_frame_length =
339*15dc779aSAndroid Build Coastguard Worker               frame_len_tbl[ptr_usac_config->core_sbr_framelength_index];
340*15dc779aSAndroid Build Coastguard Worker           WORD32 bs_residual_coding = (stereo_config_index > 1) ? 1 : 0;
341*15dc779aSAndroid Build Coastguard Worker 
342*15dc779aSAndroid Build Coastguard Worker           ia_usac_dec_mps_config_struct *ptr_usac_mps212_config =
343*15dc779aSAndroid Build Coastguard Worker               &(ptr_usac_config->str_usac_dec_config
344*15dc779aSAndroid Build Coastguard Worker                     .str_usac_element_config[ele_id]
345*15dc779aSAndroid Build Coastguard Worker                     .str_usac_mps212_config);
346*15dc779aSAndroid Build Coastguard Worker           aac_dec_handle->mps_dec_handle.ec_flag = aac_dec_handle->ec_enable;
347*15dc779aSAndroid Build Coastguard Worker 
348*15dc779aSAndroid Build Coastguard Worker           if (ixheaacd_mps_create(&aac_dec_handle->mps_dec_handle,
349*15dc779aSAndroid Build Coastguard Worker                                   bs_frame_length, bs_residual_coding,
350*15dc779aSAndroid Build Coastguard Worker                                   ptr_usac_mps212_config)) {
351*15dc779aSAndroid Build Coastguard Worker             return -1;
352*15dc779aSAndroid Build Coastguard Worker           }
353*15dc779aSAndroid Build Coastguard Worker         }
354*15dc779aSAndroid Build Coastguard Worker         break;
355*15dc779aSAndroid Build Coastguard Worker       }
356*15dc779aSAndroid Build Coastguard Worker 
357*15dc779aSAndroid Build Coastguard Worker       break;
358*15dc779aSAndroid Build Coastguard Worker       case ID_USAC_EXT:
359*15dc779aSAndroid Build Coastguard Worker         break;
360*15dc779aSAndroid Build Coastguard Worker       default:
361*15dc779aSAndroid Build Coastguard Worker         return -1;
362*15dc779aSAndroid Build Coastguard Worker         break;
363*15dc779aSAndroid Build Coastguard Worker     }
364*15dc779aSAndroid Build Coastguard Worker   }
365*15dc779aSAndroid Build Coastguard Worker 
366*15dc779aSAndroid Build Coastguard Worker   return 0;
367*15dc779aSAndroid Build Coastguard Worker }
368*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_dec_data_init(VOID * handle,ia_frame_data_struct * pstr_frame_data,ia_usac_data_struct * usac_data)369*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_dec_data_init(VOID *handle,
370*15dc779aSAndroid Build Coastguard Worker                               ia_frame_data_struct *pstr_frame_data,
371*15dc779aSAndroid Build Coastguard Worker                               ia_usac_data_struct *usac_data) {
372*15dc779aSAndroid Build Coastguard Worker   ia_audio_specific_config_struct *pstr_stream_config, *layer_config;
373*15dc779aSAndroid Build Coastguard Worker   WORD32 err_code = 0;
374*15dc779aSAndroid Build Coastguard Worker   WORD32 i_ch, i, ele_id;
375*15dc779aSAndroid Build Coastguard Worker   WORD32 num_elements;
376*15dc779aSAndroid Build Coastguard Worker 
377*15dc779aSAndroid Build Coastguard Worker   WORD32 out_frame_len, sbr_ratio_idx;
378*15dc779aSAndroid Build Coastguard Worker 
379*15dc779aSAndroid Build Coastguard Worker   ia_usac_config_struct *ptr_usac_config =
380*15dc779aSAndroid Build Coastguard Worker       &(pstr_frame_data->str_audio_specific_config.str_usac_config);
381*15dc779aSAndroid Build Coastguard Worker 
382*15dc779aSAndroid Build Coastguard Worker   usac_data->last_frame_ok = 1;
383*15dc779aSAndroid Build Coastguard Worker   usac_data->frame_ok = 1;
384*15dc779aSAndroid Build Coastguard Worker   usac_data->window_shape_prev[0] = WIN_SEL_0;
385*15dc779aSAndroid Build Coastguard Worker   usac_data->window_shape_prev[1] = WIN_SEL_0;
386*15dc779aSAndroid Build Coastguard Worker 
387*15dc779aSAndroid Build Coastguard Worker   pstr_frame_data->str_layer.bit_rate =
388*15dc779aSAndroid Build Coastguard Worker       pstr_frame_data->str_audio_specific_config.avg_bit_rate;
389*15dc779aSAndroid Build Coastguard Worker   pstr_stream_config = &pstr_frame_data->str_audio_specific_config;
390*15dc779aSAndroid Build Coastguard Worker   layer_config = &pstr_frame_data->str_audio_specific_config;
391*15dc779aSAndroid Build Coastguard Worker 
392*15dc779aSAndroid Build Coastguard Worker   sbr_ratio_idx = ixheaacd_sbr_params(
393*15dc779aSAndroid Build Coastguard Worker       ptr_usac_config->core_sbr_framelength_index, &out_frame_len,
394*15dc779aSAndroid Build Coastguard Worker       &usac_data->ccfl, &usac_data->output_samples,
395*15dc779aSAndroid Build Coastguard Worker       &pstr_frame_data->str_layer.sample_rate_layer,
396*15dc779aSAndroid Build Coastguard Worker       &layer_config->samp_frequency_index);
397*15dc779aSAndroid Build Coastguard Worker   if (!pstr_frame_data->str_layer.sample_rate_layer) {
398*15dc779aSAndroid Build Coastguard Worker     return -1;
399*15dc779aSAndroid Build Coastguard Worker   }
400*15dc779aSAndroid Build Coastguard Worker   pstr_stream_config->sampling_frequency =
401*15dc779aSAndroid Build Coastguard Worker       pstr_frame_data->str_layer.sample_rate_layer;
402*15dc779aSAndroid Build Coastguard Worker   pstr_stream_config->samp_frequency_index = layer_config->samp_frequency_index;
403*15dc779aSAndroid Build Coastguard Worker 
404*15dc779aSAndroid Build Coastguard Worker   num_elements = ptr_usac_config->str_usac_dec_config.num_elements;
405*15dc779aSAndroid Build Coastguard Worker 
406*15dc779aSAndroid Build Coastguard Worker   for (ele_id = 0; ele_id < num_elements; ele_id++) {
407*15dc779aSAndroid Build Coastguard Worker     ia_usac_dec_element_config_struct *ptr_usac_ele_config =
408*15dc779aSAndroid Build Coastguard Worker         &(ptr_usac_config->str_usac_dec_config.str_usac_element_config[ele_id]);
409*15dc779aSAndroid Build Coastguard Worker 
410*15dc779aSAndroid Build Coastguard Worker     if (ptr_usac_ele_config) {
411*15dc779aSAndroid Build Coastguard Worker       usac_data->tw_mdct[ele_id] = ptr_usac_ele_config->tw_mdct;
412*15dc779aSAndroid Build Coastguard Worker     }
413*15dc779aSAndroid Build Coastguard Worker 
414*15dc779aSAndroid Build Coastguard Worker     {
415*15dc779aSAndroid Build Coastguard Worker       ia_usac_dec_mps_config_struct *ptr_usac_mps212_config =
416*15dc779aSAndroid Build Coastguard Worker           &ptr_usac_ele_config->str_usac_mps212_config;
417*15dc779aSAndroid Build Coastguard Worker       WORD32 stereo_config_index = ptr_usac_ele_config->stereo_config_index;
418*15dc779aSAndroid Build Coastguard Worker 
419*15dc779aSAndroid Build Coastguard Worker       usac_data->mps_pseudo_lr[ele_id] =
420*15dc779aSAndroid Build Coastguard Worker           (stereo_config_index > 1) ? ptr_usac_mps212_config->bs_pseudo_lr : 0;
421*15dc779aSAndroid Build Coastguard Worker     }
422*15dc779aSAndroid Build Coastguard Worker   }
423*15dc779aSAndroid Build Coastguard Worker 
424*15dc779aSAndroid Build Coastguard Worker   usac_data->sbr_ratio_idx = sbr_ratio_idx;
425*15dc779aSAndroid Build Coastguard Worker   usac_data->esbr_bit_str[0].no_elements = 0;
426*15dc779aSAndroid Build Coastguard Worker   usac_data->esbr_bit_str[1].no_elements = 0;
427*15dc779aSAndroid Build Coastguard Worker 
428*15dc779aSAndroid Build Coastguard Worker   if (usac_data->ccfl == 768)
429*15dc779aSAndroid Build Coastguard Worker     pstr_frame_data->str_layer.sample_rate_layer =
430*15dc779aSAndroid Build Coastguard Worker         4 * pstr_frame_data->str_layer.sample_rate_layer / 3;
431*15dc779aSAndroid Build Coastguard Worker 
432*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < MAX_NUM_CHANNELS; i++) {
433*15dc779aSAndroid Build Coastguard Worker     usac_data->coef_fix[i] = &usac_data->arr_coef_fix[i][0];
434*15dc779aSAndroid Build Coastguard Worker     usac_data->coef[i] = &usac_data->arr_coef[i][0];
435*15dc779aSAndroid Build Coastguard Worker     usac_data->coef_save[i] = &usac_data->arr_coef_save[i][0];
436*15dc779aSAndroid Build Coastguard Worker     usac_data->factors[i] = &usac_data->arr_factors[i][0];
437*15dc779aSAndroid Build Coastguard Worker     usac_data->group_dis[i] = &usac_data->arr_group_dis[i][0];
438*15dc779aSAndroid Build Coastguard Worker     usac_data->pstr_tns[i] = &usac_data->arr_str_tns[i];
439*15dc779aSAndroid Build Coastguard Worker     usac_data->tw_ratio[i] = &usac_data->arr_tw_ratio[i][0];
440*15dc779aSAndroid Build Coastguard Worker     usac_data->ms_used[i] = &usac_data->arr_ms_used[i][0];
441*15dc779aSAndroid Build Coastguard Worker     usac_data->window_shape_prev[i] = WIN_SEL_0;
442*15dc779aSAndroid Build Coastguard Worker 
443*15dc779aSAndroid Build Coastguard Worker     usac_data->seed_value[i] = 0x0;
444*15dc779aSAndroid Build Coastguard Worker 
445*15dc779aSAndroid Build Coastguard Worker     usac_data->fac_data_present[i] = 0;
446*15dc779aSAndroid Build Coastguard Worker   }
447*15dc779aSAndroid Build Coastguard Worker 
448*15dc779aSAndroid Build Coastguard Worker   err_code =
449*15dc779aSAndroid Build Coastguard Worker       ixheaacd_decode_init(handle, pstr_frame_data->str_layer.sample_rate_layer,
450*15dc779aSAndroid Build Coastguard Worker                            usac_data, pstr_stream_config);
451*15dc779aSAndroid Build Coastguard Worker   if (err_code != 0) return err_code;
452*15dc779aSAndroid Build Coastguard Worker 
453*15dc779aSAndroid Build Coastguard Worker   for (i_ch = 0; i_ch < MAX_NUM_CHANNELS; i_ch++) {
454*15dc779aSAndroid Build Coastguard Worker     if (usac_data->tw_mdct[0] == 1) {
455*15dc779aSAndroid Build Coastguard Worker       WORD32 i;
456*15dc779aSAndroid Build Coastguard Worker       for (i = 0; i < 2 * usac_data->ccfl; i++) {
457*15dc779aSAndroid Build Coastguard Worker         usac_data->warp_cont_mem[i_ch][i] = 1.0;
458*15dc779aSAndroid Build Coastguard Worker       }
459*15dc779aSAndroid Build Coastguard Worker       usac_data->warp_sum[i_ch][0] = usac_data->warp_sum[i_ch][1] =
460*15dc779aSAndroid Build Coastguard Worker           (FLOAT32)usac_data->ccfl;
461*15dc779aSAndroid Build Coastguard Worker     }
462*15dc779aSAndroid Build Coastguard Worker   }
463*15dc779aSAndroid Build Coastguard Worker   return err_code;
464*15dc779aSAndroid Build Coastguard Worker }
465*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_count_tracks_per_layer(int * max_layer,int * stream_count,int * tracks_in_layer)466*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_count_tracks_per_layer(int *max_layer, int *stream_count,
467*15dc779aSAndroid Build Coastguard Worker                                             int *tracks_in_layer) {
468*15dc779aSAndroid Build Coastguard Worker   WORD32 stream;
469*15dc779aSAndroid Build Coastguard Worker   WORD32 num_layer;
470*15dc779aSAndroid Build Coastguard Worker   WORD32 num_streams;
471*15dc779aSAndroid Build Coastguard Worker   WORD32 layer = 0;
472*15dc779aSAndroid Build Coastguard Worker 
473*15dc779aSAndroid Build Coastguard Worker   if (stream_count == NULL)
474*15dc779aSAndroid Build Coastguard Worker     num_streams = 0;
475*15dc779aSAndroid Build Coastguard Worker   else
476*15dc779aSAndroid Build Coastguard Worker     num_streams = *stream_count;
477*15dc779aSAndroid Build Coastguard Worker   if (max_layer == NULL)
478*15dc779aSAndroid Build Coastguard Worker     num_layer = num_streams;
479*15dc779aSAndroid Build Coastguard Worker   else
480*15dc779aSAndroid Build Coastguard Worker     num_layer = *max_layer;
481*15dc779aSAndroid Build Coastguard Worker   if (num_layer < 0) num_layer = num_streams;
482*15dc779aSAndroid Build Coastguard Worker 
483*15dc779aSAndroid Build Coastguard Worker   for (stream = 0; (layer <= num_layer) && (stream < num_streams);) {
484*15dc779aSAndroid Build Coastguard Worker     *tracks_in_layer = 1;
485*15dc779aSAndroid Build Coastguard Worker     stream += 1;
486*15dc779aSAndroid Build Coastguard Worker     layer++;
487*15dc779aSAndroid Build Coastguard Worker     if (layer <= num_layer) *tracks_in_layer = 0;
488*15dc779aSAndroid Build Coastguard Worker   }
489*15dc779aSAndroid Build Coastguard Worker 
490*15dc779aSAndroid Build Coastguard Worker   if (max_layer) *max_layer = (layer - 1);
491*15dc779aSAndroid Build Coastguard Worker   if (stream_count) *stream_count = stream;
492*15dc779aSAndroid Build Coastguard Worker }
493*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_frm_data_init(ia_audio_specific_config_struct * pstr_audio_conf,ia_dec_data_struct * pstr_dec_data)494*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_frm_data_init(ia_audio_specific_config_struct *pstr_audio_conf,
495*15dc779aSAndroid Build Coastguard Worker                               ia_dec_data_struct *pstr_dec_data)
496*15dc779aSAndroid Build Coastguard Worker 
497*15dc779aSAndroid Build Coastguard Worker {
498*15dc779aSAndroid Build Coastguard Worker   WORD32 layer;
499*15dc779aSAndroid Build Coastguard Worker   WORD32 track;
500*15dc779aSAndroid Build Coastguard Worker   WORD32 num_dec_streams;
501*15dc779aSAndroid Build Coastguard Worker   ia_frame_data_struct *pstr_frame_data;
502*15dc779aSAndroid Build Coastguard Worker 
503*15dc779aSAndroid Build Coastguard Worker   WORD32 stream_count = 1;
504*15dc779aSAndroid Build Coastguard Worker   WORD32 max_layer = -1;
505*15dc779aSAndroid Build Coastguard Worker 
506*15dc779aSAndroid Build Coastguard Worker   memset(pstr_dec_data, 0, IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_dec_data_struct), BYTE_ALIGN_8));
507*15dc779aSAndroid Build Coastguard Worker   memset(&(pstr_dec_data->str_frame_data), 0,
508*15dc779aSAndroid Build Coastguard Worker          sizeof(pstr_dec_data->str_frame_data));
509*15dc779aSAndroid Build Coastguard Worker 
510*15dc779aSAndroid Build Coastguard Worker   pstr_frame_data = &(pstr_dec_data->str_frame_data);
511*15dc779aSAndroid Build Coastguard Worker 
512*15dc779aSAndroid Build Coastguard Worker   if (max_layer < 0) max_layer = stream_count - 1;
513*15dc779aSAndroid Build Coastguard Worker 
514*15dc779aSAndroid Build Coastguard Worker   ixheaacd_count_tracks_per_layer(&max_layer, &stream_count,
515*15dc779aSAndroid Build Coastguard Worker                                   &pstr_frame_data->tracks_in_layer);
516*15dc779aSAndroid Build Coastguard Worker 
517*15dc779aSAndroid Build Coastguard Worker   pstr_frame_data->scal_out_select = max_layer;
518*15dc779aSAndroid Build Coastguard Worker 
519*15dc779aSAndroid Build Coastguard Worker   pstr_frame_data->stream_count = 0;
520*15dc779aSAndroid Build Coastguard Worker 
521*15dc779aSAndroid Build Coastguard Worker   num_dec_streams = track = 0;
522*15dc779aSAndroid Build Coastguard Worker   for (layer = 0; layer < (signed)pstr_frame_data->scal_out_select + 1;
523*15dc779aSAndroid Build Coastguard Worker        layer++) {
524*15dc779aSAndroid Build Coastguard Worker     WORD32 j;
525*15dc779aSAndroid Build Coastguard Worker     for (j = 0; j < 1; j++, num_dec_streams++) {
526*15dc779aSAndroid Build Coastguard Worker       pstr_frame_data->str_audio_specific_config = *pstr_audio_conf;
527*15dc779aSAndroid Build Coastguard Worker       pstr_frame_data->str_layer.sample_rate_layer =
528*15dc779aSAndroid Build Coastguard Worker           pstr_frame_data->str_audio_specific_config.sampling_frequency;
529*15dc779aSAndroid Build Coastguard Worker       pstr_frame_data->str_layer.bit_rate =
530*15dc779aSAndroid Build Coastguard Worker           pstr_frame_data->str_audio_specific_config.avg_bit_rate;
531*15dc779aSAndroid Build Coastguard Worker     }
532*15dc779aSAndroid Build Coastguard Worker 
533*15dc779aSAndroid Build Coastguard Worker     track += pstr_frame_data->tracks_in_layer;
534*15dc779aSAndroid Build Coastguard Worker   }
535*15dc779aSAndroid Build Coastguard Worker 
536*15dc779aSAndroid Build Coastguard Worker   pstr_frame_data->stream_count = num_dec_streams;
537*15dc779aSAndroid Build Coastguard Worker 
538*15dc779aSAndroid Build Coastguard Worker   return num_dec_streams;
539*15dc779aSAndroid Build Coastguard Worker }
540*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_decode_create(ia_exhaacplus_dec_api_struct * handle,ia_dec_data_struct * pstr_dec_data,WORD32 tracks_for_decoder)541*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_decode_create(ia_exhaacplus_dec_api_struct *handle,
542*15dc779aSAndroid Build Coastguard Worker                               ia_dec_data_struct *pstr_dec_data,
543*15dc779aSAndroid Build Coastguard Worker                               WORD32 tracks_for_decoder) {
544*15dc779aSAndroid Build Coastguard Worker   WORD32 stream;
545*15dc779aSAndroid Build Coastguard Worker 
546*15dc779aSAndroid Build Coastguard Worker   WORD32 err = 0;
547*15dc779aSAndroid Build Coastguard Worker   ia_frame_data_struct *pstr_frame_data;
548*15dc779aSAndroid Build Coastguard Worker   WORD32 stream_count;
549*15dc779aSAndroid Build Coastguard Worker   ia_aac_dec_state_struct *aac_dec_handle = handle->p_state_aac;
550*15dc779aSAndroid Build Coastguard Worker   pstr_frame_data = &(pstr_dec_data->str_frame_data);
551*15dc779aSAndroid Build Coastguard Worker   stream_count = pstr_frame_data->stream_count;
552*15dc779aSAndroid Build Coastguard Worker   pstr_frame_data->stream_count = tracks_for_decoder;
553*15dc779aSAndroid Build Coastguard Worker 
554*15dc779aSAndroid Build Coastguard Worker   for (stream = 0; stream < stream_count; stream++) {
555*15dc779aSAndroid Build Coastguard Worker     UWORD32 aot = pstr_frame_data->str_audio_specific_config.audio_object_type;
556*15dc779aSAndroid Build Coastguard Worker 
557*15dc779aSAndroid Build Coastguard Worker     switch (aot) {
558*15dc779aSAndroid Build Coastguard Worker       case AOT_USAC:
559*15dc779aSAndroid Build Coastguard Worker 
560*15dc779aSAndroid Build Coastguard Worker         err = ixheaacd_dec_data_init(handle, pstr_frame_data,
561*15dc779aSAndroid Build Coastguard Worker                                      &(pstr_dec_data->str_usac_data));
562*15dc779aSAndroid Build Coastguard Worker 
563*15dc779aSAndroid Build Coastguard Worker         if (err != 0) {
564*15dc779aSAndroid Build Coastguard Worker           if (handle->aac_config.ui_err_conceal) {
565*15dc779aSAndroid Build Coastguard Worker             pstr_dec_data->str_usac_data.frame_ok = 0;
566*15dc779aSAndroid Build Coastguard Worker           } else
567*15dc779aSAndroid Build Coastguard Worker             return err;
568*15dc779aSAndroid Build Coastguard Worker         }
569*15dc779aSAndroid Build Coastguard Worker 
570*15dc779aSAndroid Build Coastguard Worker         pstr_dec_data->str_usac_data.sampling_rate = pstr_frame_data->str_layer.sample_rate_layer;
571*15dc779aSAndroid Build Coastguard Worker 
572*15dc779aSAndroid Build Coastguard Worker         switch (pstr_dec_data->str_usac_data.sbr_ratio_idx) {
573*15dc779aSAndroid Build Coastguard Worker           case 0:
574*15dc779aSAndroid Build Coastguard Worker             handle->aac_config.ui_sbr_mode = 0;
575*15dc779aSAndroid Build Coastguard Worker             break;
576*15dc779aSAndroid Build Coastguard Worker           case 1:
577*15dc779aSAndroid Build Coastguard Worker             handle->aac_config.ui_sbr_mode = 1;
578*15dc779aSAndroid Build Coastguard Worker             break;
579*15dc779aSAndroid Build Coastguard Worker           case 2:
580*15dc779aSAndroid Build Coastguard Worker             handle->aac_config.ui_sbr_mode = 1;
581*15dc779aSAndroid Build Coastguard Worker             break;
582*15dc779aSAndroid Build Coastguard Worker           case 3:
583*15dc779aSAndroid Build Coastguard Worker             handle->aac_config.ui_sbr_mode = 3;
584*15dc779aSAndroid Build Coastguard Worker             break;
585*15dc779aSAndroid Build Coastguard Worker 
586*15dc779aSAndroid Build Coastguard Worker           default:
587*15dc779aSAndroid Build Coastguard Worker             handle->aac_config.ui_sbr_mode = 0;
588*15dc779aSAndroid Build Coastguard Worker         }
589*15dc779aSAndroid Build Coastguard Worker 
590*15dc779aSAndroid Build Coastguard Worker         if (!aac_dec_handle->peak_lim_init && !handle->aac_config.peak_limiter_off &&
591*15dc779aSAndroid Build Coastguard Worker             handle->aac_config.ui_err_conceal) {
592*15dc779aSAndroid Build Coastguard Worker           memset(&aac_dec_handle->peak_limiter, 0, sizeof(ia_peak_limiter_struct));
593*15dc779aSAndroid Build Coastguard Worker           ixheaacd_peak_limiter_init(&aac_dec_handle->peak_limiter, MAX_NUM_CHANNELS,
594*15dc779aSAndroid Build Coastguard Worker                                      pstr_dec_data->str_usac_data.sampling_rate,
595*15dc779aSAndroid Build Coastguard Worker                                      &aac_dec_handle->peak_limiter.buffer[0],
596*15dc779aSAndroid Build Coastguard Worker                                      &aac_dec_handle->delay_in_samples);
597*15dc779aSAndroid Build Coastguard Worker           aac_dec_handle->peak_lim_init++;
598*15dc779aSAndroid Build Coastguard Worker         }
599*15dc779aSAndroid Build Coastguard Worker 
600*15dc779aSAndroid Build Coastguard Worker         break;
601*15dc779aSAndroid Build Coastguard Worker 
602*15dc779aSAndroid Build Coastguard Worker       default:
603*15dc779aSAndroid Build Coastguard Worker 
604*15dc779aSAndroid Build Coastguard Worker         break;
605*15dc779aSAndroid Build Coastguard Worker     }
606*15dc779aSAndroid Build Coastguard Worker   }
607*15dc779aSAndroid Build Coastguard Worker 
608*15dc779aSAndroid Build Coastguard Worker   pstr_frame_data->scal_out_object_type =
609*15dc779aSAndroid Build Coastguard Worker       pstr_frame_data->str_audio_specific_config.audio_object_type;
610*15dc779aSAndroid Build Coastguard Worker   pstr_frame_data->scal_out_num_channels =
611*15dc779aSAndroid Build Coastguard Worker       pstr_frame_data->str_audio_specific_config.channel_configuration;
612*15dc779aSAndroid Build Coastguard Worker   pstr_frame_data->scal_out_sampling_frequency =
613*15dc779aSAndroid Build Coastguard Worker       pstr_frame_data->str_audio_specific_config.sampling_frequency;
614*15dc779aSAndroid Build Coastguard Worker 
615*15dc779aSAndroid Build Coastguard Worker   if (&(pstr_dec_data->str_usac_data) != NULL) {
616*15dc779aSAndroid Build Coastguard Worker     ia_sbr_header_data_struct usac_def_header;
617*15dc779aSAndroid Build Coastguard Worker     ia_audio_specific_config_struct *pstr_aud_spec_config =
618*15dc779aSAndroid Build Coastguard Worker         &pstr_frame_data->str_audio_specific_config;
619*15dc779aSAndroid Build Coastguard Worker     ia_usac_config_struct *ptr_usac_config =
620*15dc779aSAndroid Build Coastguard Worker         &(pstr_frame_data->str_audio_specific_config.str_usac_config);
621*15dc779aSAndroid Build Coastguard Worker 
622*15dc779aSAndroid Build Coastguard Worker     WORD32 inter_test_flag = 0;
623*15dc779aSAndroid Build Coastguard Worker     WORD32 bs_pvc_flag = 0;
624*15dc779aSAndroid Build Coastguard Worker     WORD32 harmonic_Sbr_flag = 0;
625*15dc779aSAndroid Build Coastguard Worker 
626*15dc779aSAndroid Build Coastguard Worker     ia_usac_decoder_config_struct *ptr_usac_dec_config =
627*15dc779aSAndroid Build Coastguard Worker         &ptr_usac_config->str_usac_dec_config;
628*15dc779aSAndroid Build Coastguard Worker     WORD32 const num_ele = ptr_usac_dec_config->num_elements;
629*15dc779aSAndroid Build Coastguard Worker     WORD32 elem_idx = 0;
630*15dc779aSAndroid Build Coastguard Worker 
631*15dc779aSAndroid Build Coastguard Worker     memset(&usac_def_header, 0, sizeof(ia_sbr_header_data_struct));
632*15dc779aSAndroid Build Coastguard Worker 
633*15dc779aSAndroid Build Coastguard Worker     for (elem_idx = 0; elem_idx < num_ele; elem_idx++) {
634*15dc779aSAndroid Build Coastguard Worker       UWORD32 usac_ele_type =
635*15dc779aSAndroid Build Coastguard Worker           ptr_usac_config->str_usac_dec_config.usac_element_type[elem_idx];
636*15dc779aSAndroid Build Coastguard Worker       ia_usac_dec_element_config_struct *ptr_usac_ele_config =
637*15dc779aSAndroid Build Coastguard Worker           &ptr_usac_config->str_usac_dec_config
638*15dc779aSAndroid Build Coastguard Worker                .str_usac_element_config[elem_idx];
639*15dc779aSAndroid Build Coastguard Worker 
640*15dc779aSAndroid Build Coastguard Worker       ia_usac_dec_sbr_config_struct *ptr_usac_sbr_config =
641*15dc779aSAndroid Build Coastguard Worker           &(ptr_usac_dec_config->str_usac_element_config[elem_idx]
642*15dc779aSAndroid Build Coastguard Worker                 .str_usac_sbr_config);
643*15dc779aSAndroid Build Coastguard Worker 
644*15dc779aSAndroid Build Coastguard Worker       if (ptr_usac_sbr_config->bs_inter_tes) inter_test_flag = 1;
645*15dc779aSAndroid Build Coastguard Worker       if (ptr_usac_sbr_config->bs_pvc) bs_pvc_flag = 1;
646*15dc779aSAndroid Build Coastguard Worker       if (ptr_usac_sbr_config->harmonic_sbr) harmonic_Sbr_flag = 1;
647*15dc779aSAndroid Build Coastguard Worker 
648*15dc779aSAndroid Build Coastguard Worker       if ((usac_ele_type != ID_USAC_LFE) && (usac_ele_type != ID_USAC_EXT)) {
649*15dc779aSAndroid Build Coastguard Worker         ia_usac_dec_sbr_config_struct *ptr_usac_sbr_config =
650*15dc779aSAndroid Build Coastguard Worker             &(ptr_usac_ele_config->str_usac_sbr_config);
651*15dc779aSAndroid Build Coastguard Worker 
652*15dc779aSAndroid Build Coastguard Worker         usac_def_header.start_freq = ptr_usac_sbr_config->dflt_start_freq;
653*15dc779aSAndroid Build Coastguard Worker         usac_def_header.stop_freq = ptr_usac_sbr_config->dflt_stop_freq;
654*15dc779aSAndroid Build Coastguard Worker         usac_def_header.header_extra_1 =
655*15dc779aSAndroid Build Coastguard Worker             ptr_usac_sbr_config->dflt_header_extra1;
656*15dc779aSAndroid Build Coastguard Worker         usac_def_header.header_extra_2 =
657*15dc779aSAndroid Build Coastguard Worker             ptr_usac_sbr_config->dflt_header_extra2;
658*15dc779aSAndroid Build Coastguard Worker         usac_def_header.freq_scale = ptr_usac_sbr_config->dflt_freq_scale;
659*15dc779aSAndroid Build Coastguard Worker         usac_def_header.alter_scale = ptr_usac_sbr_config->dflt_alter_scale;
660*15dc779aSAndroid Build Coastguard Worker         usac_def_header.noise_bands = ptr_usac_sbr_config->dflt_noise_bands;
661*15dc779aSAndroid Build Coastguard Worker         usac_def_header.limiter_bands = ptr_usac_sbr_config->dflt_limiter_bands;
662*15dc779aSAndroid Build Coastguard Worker         usac_def_header.limiter_gains = ptr_usac_sbr_config->dflt_limiter_gains;
663*15dc779aSAndroid Build Coastguard Worker         usac_def_header.interpol_freq = ptr_usac_sbr_config->dflt_interpol_freq;
664*15dc779aSAndroid Build Coastguard Worker         usac_def_header.smoothing_mode =
665*15dc779aSAndroid Build Coastguard Worker             ptr_usac_sbr_config->dflt_smoothing_mode;
666*15dc779aSAndroid Build Coastguard Worker       }
667*15dc779aSAndroid Build Coastguard Worker     }
668*15dc779aSAndroid Build Coastguard Worker 
669*15dc779aSAndroid Build Coastguard Worker     pstr_dec_data->str_usac_data.down_samp_sbr = 0;
670*15dc779aSAndroid Build Coastguard Worker 
671*15dc779aSAndroid Build Coastguard Worker     if (pstr_dec_data->str_usac_data.sbr_ratio_idx > 0) {
672*15dc779aSAndroid Build Coastguard Worker       if (pstr_aud_spec_config->ext_sampling_frequency ==
673*15dc779aSAndroid Build Coastguard Worker           pstr_aud_spec_config->sampling_frequency) {
674*15dc779aSAndroid Build Coastguard Worker         pstr_dec_data->str_usac_data.down_samp_sbr = 1;
675*15dc779aSAndroid Build Coastguard Worker       }
676*15dc779aSAndroid Build Coastguard Worker       if (pstr_dec_data->str_usac_data.down_samp_sbr == 0) {
677*15dc779aSAndroid Build Coastguard Worker         if (pstr_dec_data->str_usac_data.sbr_ratio_idx == 3) {
678*15dc779aSAndroid Build Coastguard Worker           pstr_frame_data->scal_out_sampling_frequency =
679*15dc779aSAndroid Build Coastguard Worker               4 * pstr_frame_data->scal_out_sampling_frequency;
680*15dc779aSAndroid Build Coastguard Worker         } else {
681*15dc779aSAndroid Build Coastguard Worker           pstr_frame_data->scal_out_sampling_frequency =
682*15dc779aSAndroid Build Coastguard Worker               2 * pstr_frame_data->scal_out_sampling_frequency;
683*15dc779aSAndroid Build Coastguard Worker         }
684*15dc779aSAndroid Build Coastguard Worker       }
685*15dc779aSAndroid Build Coastguard Worker 
686*15dc779aSAndroid Build Coastguard Worker       {
687*15dc779aSAndroid Build Coastguard Worker         void *sbr_persistent_mem_v = aac_dec_handle->sbr_persistent_mem_u;
688*15dc779aSAndroid Build Coastguard Worker 
689*15dc779aSAndroid Build Coastguard Worker         pstr_dec_data->str_usac_data.pstr_esbr_dec = ixheaacd_init_sbr(
690*15dc779aSAndroid Build Coastguard Worker             pstr_frame_data->str_layer.sample_rate_layer,
691*15dc779aSAndroid Build Coastguard Worker             pstr_dec_data->str_usac_data.ccfl,
692*15dc779aSAndroid Build Coastguard Worker             &pstr_dec_data->str_usac_data.down_samp_sbr, sbr_persistent_mem_v,
693*15dc779aSAndroid Build Coastguard Worker             NULL, pstr_frame_data->scal_out_num_channels, 0,
694*15dc779aSAndroid Build Coastguard Worker             pstr_dec_data->str_usac_data.sbr_ratio_idx,
695*15dc779aSAndroid Build Coastguard Worker             pstr_dec_data->str_usac_data.output_samples, &harmonic_Sbr_flag,
696*15dc779aSAndroid Build Coastguard Worker             (void *)&usac_def_header, aac_dec_handle->str_sbr_config,
697*15dc779aSAndroid Build Coastguard Worker             pstr_dec_data->str_usac_data.audio_object_type, 0, 0);
698*15dc779aSAndroid Build Coastguard Worker         pstr_dec_data->str_usac_data.sbr_scratch_mem_base =
699*15dc779aSAndroid Build Coastguard Worker             aac_dec_handle->sbr_scratch_mem_u;
700*15dc779aSAndroid Build Coastguard Worker         if (num_ele)
701*15dc779aSAndroid Build Coastguard Worker           ixheaacd_setesbr_flags(sbr_persistent_mem_v, bs_pvc_flag,
702*15dc779aSAndroid Build Coastguard Worker                                  harmonic_Sbr_flag, inter_test_flag);
703*15dc779aSAndroid Build Coastguard Worker       }
704*15dc779aSAndroid Build Coastguard Worker 
705*15dc779aSAndroid Build Coastguard Worker       if (pstr_dec_data->str_usac_data.pstr_esbr_dec == NULL) {
706*15dc779aSAndroid Build Coastguard Worker         return -1;
707*15dc779aSAndroid Build Coastguard Worker       } else {
708*15dc779aSAndroid Build Coastguard Worker         pstr_dec_data->str_usac_data.pstr_esbr_dec->xaac_jmp_buf =
709*15dc779aSAndroid Build Coastguard Worker             &(aac_dec_handle->xaac_jmp_buf);
710*15dc779aSAndroid Build Coastguard Worker       }
711*15dc779aSAndroid Build Coastguard Worker     }
712*15dc779aSAndroid Build Coastguard Worker   }
713*15dc779aSAndroid Build Coastguard Worker   aac_dec_handle->decode_create_done = 1;
714*15dc779aSAndroid Build Coastguard Worker   return 0;
715*15dc779aSAndroid Build Coastguard Worker }
716