xref: /aosp_15_r20/external/libxaac/decoder/ixheaacd_initfuncs.c (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
1 /******************************************************************************
2  *                                                                            *
3  * Copyright (C) 2018 The Android Open Source Project
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at:
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  *****************************************************************************
18  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19 */
20 #include <string.h>
21 #include "ixheaac_type_def.h"
22 
23 #include "ixheaacd_sbr_common.h"
24 
25 #include "ixheaac_constants.h"
26 #include "ixheaac_basic_ops32.h"
27 #include "ixheaac_basic_ops16.h"
28 #include "ixheaac_basic_ops40.h"
29 #include "ixheaac_basic_ops.h"
30 #include "ixheaacd_bitbuffer.h"
31 
32 #include "ixheaac_basic_op.h"
33 #include "ixheaacd_intrinsics.h"
34 
35 #include "ixheaacd_defines.h"
36 
37 #include "ixheaacd_aac_rom.h"
38 
39 #include "ixheaacd_definitions.h"
40 
41 #include "ixheaacd_error_codes.h"
42 
43 #include "ixheaacd_pulsedata.h"
44 
45 #include "ixheaacd_pns.h"
46 #include "ixheaacd_drc_data_struct.h"
47 
48 #include "ixheaacd_lt_predict.h"
49 #include "ixheaacd_cnst.h"
50 #include "ixheaacd_ec_defines.h"
51 #include "ixheaacd_ec_struct_def.h"
52 
53 #include "ixheaacd_channelinfo.h"
54 #include "ixheaacd_drc_dec.h"
55 
56 #include "ixheaacd_sbrdecoder.h"
57 #include "ixheaacd_block.h"
58 #include "ixheaacd_channel.h"
59 
60 #include "ixheaacd_sbr_payload.h"
61 #include "ixheaacd_common_rom.h"
62 #include "ixheaacd_sbrdecsettings.h"
63 #include "ixheaacd_sbr_scale.h"
64 #include "ixheaacd_env_extr_part.h"
65 #include "ixheaacd_sbr_rom.h"
66 
67 #include "ixheaacd_lpp_tran.h"
68 #include "ixheaacd_hybrid.h"
69 #include "ixheaacd_ps_dec.h"
70 
71 #include "ixheaacd_env_extr.h"
72 #include "ixheaacd_adts.h"
73 #include "ixheaacd_audioobjtypes.h"
74 #include "ixheaacd_memory_standards.h"
75 
76 #include "ixheaacd_latmdemux.h"
77 
78 #include "ixheaacd_aacdec.h"
79 #include "ixheaacd_mps_polyphase.h"
80 #include "ixheaacd_config.h"
81 #include "ixheaacd_qmf_dec.h"
82 #include "ixheaacd_mps_macro_def.h"
83 #include "ixheaacd_mps_struct_def.h"
84 #include "ixheaacd_mps_res_rom.h"
85 #include "ixheaacd_mps_aac_struct.h"
86 #include "ixheaacd_mps_dec.h"
87 
88 #include "ixheaacd_struct_def.h"
89 
90 #include "ixheaacd_multichannel.h"
91 
92 #define ALIGN_SIZE64(x) ((((x) + 7) >> 3) << 3)
93 
ixheaacd_set_aac_persistent_buffers(VOID * aac_persistent_mem_v,WORD32 num_channel)94 WORD32 ixheaacd_set_aac_persistent_buffers(VOID *aac_persistent_mem_v,
95                                            WORD32 num_channel) {
96   WORD32 persistent_used;
97 
98   struct ia_aac_persistent_struct *aac_persistent_mem =
99       (struct ia_aac_persistent_struct *)aac_persistent_mem_v;
100 
101   persistent_used =
102       IXHEAAC_GET_SIZE_ALIGNED(sizeof(struct ia_aac_persistent_struct), BYTE_ALIGN_8);
103 
104   memset(aac_persistent_mem, 0,
105          IXHEAAC_GET_SIZE_ALIGNED(sizeof(struct ia_aac_persistent_struct), BYTE_ALIGN_8));
106   aac_persistent_mem->overlap_buffer =
107       (WORD32 *)((WORD8 *)aac_persistent_mem_v + persistent_used);
108 
109   memset(
110       (WORD32 *)((WORD8 *)aac_persistent_mem_v + persistent_used), 0,
111       IXHEAAC_GET_SIZE_ALIGNED(
112           4 * 512 * num_channel * sizeof(aac_persistent_mem->overlap_buffer[0]), BYTE_ALIGN_8));
113 
114   persistent_used += IXHEAAC_GET_SIZE_ALIGNED(
115       4 * 512 * num_channel * sizeof(aac_persistent_mem->overlap_buffer[0]), BYTE_ALIGN_8);
116 
117   aac_persistent_mem->sbr_payload_buffer =
118       (WORD8 *)((WORD8 *)aac_persistent_mem_v + persistent_used);
119 
120   memset((WORD16 *)((WORD8 *)aac_persistent_mem_v + persistent_used), 0,
121          num_channel *
122              IXHEAAC_GET_SIZE_ALIGNED(
123                  MAXSBRBYTES * sizeof(aac_persistent_mem->sbr_payload_buffer[0]), BYTE_ALIGN_8));
124 
125   persistent_used +=
126       num_channel *
127       IXHEAAC_GET_SIZE_ALIGNED(MAXSBRBYTES * sizeof(aac_persistent_mem->sbr_payload_buffer[0]),
128                                BYTE_ALIGN_8);
129 
130   aac_persistent_mem->prev_sbr_payload_buffer =
131       (WORD8 *)((WORD8 *)aac_persistent_mem_v + persistent_used);
132 
133   memset((WORD8 *)aac_persistent_mem->prev_sbr_payload_buffer, 0,
134          num_channel * IXHEAAC_GET_SIZE_ALIGNED(
135                            MAXSBRBYTES * sizeof(*(aac_persistent_mem->prev_sbr_payload_buffer)),
136                            BYTE_ALIGN_8));
137 
138   persistent_used +=
139       num_channel *
140       IXHEAAC_GET_SIZE_ALIGNED(
141           MAXSBRBYTES * sizeof(*(aac_persistent_mem->prev_sbr_payload_buffer)), BYTE_ALIGN_8);
142 
143   {
144     WORD32 i;
145 
146     for (i = 0; i < num_channel; i++) {
147       aac_persistent_mem->ltp_buf[i] =
148           (WORD16 *)((WORD8 *)aac_persistent_mem_v + persistent_used);
149 
150       memset((WORD16 *)((WORD8 *)aac_persistent_mem_v + persistent_used), 0,
151              IXHEAAC_GET_SIZE_ALIGNED(ltp_buffer_size * sizeof(aac_persistent_mem->ltp_buf[i][0]),
152                                       BYTE_ALIGN_8));
153 
154       persistent_used += IXHEAAC_GET_SIZE_ALIGNED(
155           ltp_buffer_size * sizeof(aac_persistent_mem->ltp_buf[i][0]), BYTE_ALIGN_8);
156 
157       aac_persistent_mem->ptr_aac_dec_static_channel_info[i] =
158           (ia_aac_dec_channel_info *)((WORD8 *)aac_persistent_mem_v + persistent_used);
159       persistent_used += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_aac_dec_channel_info), BYTE_ALIGN_8);
160 
161       aac_persistent_mem->ptr_aac_dec_static_channel_info[i]
162           ->overlap_add_data.win_shape = 0;
163       aac_persistent_mem->ptr_aac_dec_static_channel_info[i]
164           ->overlap_add_data.win_seq = 0;
165 
166       aac_persistent_mem->ptr_aac_dec_static_channel_info[i]
167           ->overlap_add_data.ptr_overlap_buf =
168           &aac_persistent_mem->overlap_buffer[i * OVERLAP_BUFFER_SIZE];
169     }
170   }
171 
172   return persistent_used;
173 }
174 
ixheaacd_huff_tables_create(ia_aac_dec_tables_struct * ptr_aac_tables)175 VOID ixheaacd_huff_tables_create(ia_aac_dec_tables_struct *ptr_aac_tables) {
176   ptr_aac_tables->code_book[0] = 0;
177   ptr_aac_tables->code_book[1] =
178       (UWORD16 *)ptr_aac_tables->pstr_huffmann_tables->input_table_cb1;
179   ptr_aac_tables->code_book[2] =
180       (UWORD16 *)ptr_aac_tables->pstr_huffmann_tables->input_table_cb2;
181   ptr_aac_tables->code_book[3] =
182       (UWORD16 *)ptr_aac_tables->pstr_huffmann_tables->input_table_cb3;
183   ptr_aac_tables->code_book[4] =
184       (UWORD16 *)ptr_aac_tables->pstr_huffmann_tables->input_table_cb4;
185   ptr_aac_tables->code_book[5] =
186       (UWORD16 *)ptr_aac_tables->pstr_huffmann_tables->input_table_cb5;
187   ptr_aac_tables->code_book[6] =
188       (UWORD16 *)ptr_aac_tables->pstr_huffmann_tables->input_table_cb6;
189   ptr_aac_tables->code_book[7] =
190       (UWORD16 *)ptr_aac_tables->pstr_huffmann_tables->input_table_cb7;
191   ptr_aac_tables->code_book[8] =
192       (UWORD16 *)ptr_aac_tables->pstr_huffmann_tables->input_table_cb8;
193   ptr_aac_tables->code_book[9] =
194       (UWORD16 *)ptr_aac_tables->pstr_huffmann_tables->input_table_cb9;
195   ptr_aac_tables->code_book[10] =
196       (UWORD16 *)ptr_aac_tables->pstr_huffmann_tables->input_table_cb10;
197   ptr_aac_tables->code_book[11] =
198       (UWORD16 *)ptr_aac_tables->pstr_huffmann_tables->input_table_cb10;
199   ptr_aac_tables->code_book[12] =
200       (UWORD16 *)ptr_aac_tables->pstr_huffmann_tables->input_table_cb10;
201 
202   ptr_aac_tables->index_table[1] =
203       (UWORD32 *)ptr_aac_tables->pstr_huffmann_tables->idx_table_hf1;
204   ptr_aac_tables->index_table[2] =
205       (UWORD32 *)ptr_aac_tables->pstr_huffmann_tables->idx_table_hf2;
206   ptr_aac_tables->index_table[3] =
207       (UWORD32 *)ptr_aac_tables->pstr_huffmann_tables->idx_table_hf3;
208   ptr_aac_tables->index_table[4] =
209       (UWORD32 *)ptr_aac_tables->pstr_huffmann_tables->idx_table_hf4;
210   ptr_aac_tables->index_table[5] =
211       (UWORD32 *)ptr_aac_tables->pstr_huffmann_tables->idx_table_hf5;
212   ptr_aac_tables->index_table[6] =
213       (UWORD32 *)ptr_aac_tables->pstr_huffmann_tables->idx_table_hf6;
214   ptr_aac_tables->index_table[7] =
215       (UWORD32 *)ptr_aac_tables->pstr_huffmann_tables->idx_table_hf7;
216   ptr_aac_tables->index_table[8] =
217       (UWORD32 *)ptr_aac_tables->pstr_huffmann_tables->idx_table_hf8;
218   ptr_aac_tables->index_table[9] =
219       (UWORD32 *)ptr_aac_tables->pstr_huffmann_tables->idx_table_hf9;
220   ptr_aac_tables->index_table[10] =
221       (UWORD32 *)ptr_aac_tables->pstr_huffmann_tables->idx_table_hf10;
222   ptr_aac_tables->index_table[11] =
223       (UWORD32 *)ptr_aac_tables->pstr_huffmann_tables->idx_table_hf10;
224   ptr_aac_tables->index_table[12] =
225       (UWORD32 *)ptr_aac_tables->pstr_huffmann_tables->idx_table_hf10;
226 
227   ptr_aac_tables->scale_factor_bands_short[0] =
228       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_96_128;
229   ptr_aac_tables->scale_factor_bands_short[1] =
230       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_96_128;
231   ptr_aac_tables->scale_factor_bands_short[2] =
232       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_96_128;
233   ptr_aac_tables->scale_factor_bands_short[3] =
234       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_128;
235   ptr_aac_tables->scale_factor_bands_short[4] =
236       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_128;
237   ptr_aac_tables->scale_factor_bands_short[5] =
238       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_128;
239   ptr_aac_tables->scale_factor_bands_short[6] =
240       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_128;
241   ptr_aac_tables->scale_factor_bands_short[7] =
242       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_128;
243   ptr_aac_tables->scale_factor_bands_short[8] =
244       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_16_128;
245   ptr_aac_tables->scale_factor_bands_short[9] =
246       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_16_128;
247   ptr_aac_tables->scale_factor_bands_short[10] =
248       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_16_128;
249   ptr_aac_tables->scale_factor_bands_short[11] =
250       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_8_128;
251 
252   ptr_aac_tables->scale_factor_bands_short[12] =
253       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_96_120;
254   ptr_aac_tables->scale_factor_bands_short[13] =
255       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_96_120;
256   ptr_aac_tables->scale_factor_bands_short[14] =
257       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_96_120;
258   ptr_aac_tables->scale_factor_bands_short[15] =
259       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_120;
260   ptr_aac_tables->scale_factor_bands_short[16] =
261       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_120;
262   ptr_aac_tables->scale_factor_bands_short[17] =
263       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_120;
264   ptr_aac_tables->scale_factor_bands_short[18] =
265       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_120;
266   ptr_aac_tables->scale_factor_bands_short[19] =
267       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_120;
268   ptr_aac_tables->scale_factor_bands_short[20] =
269       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_16_120;
270   ptr_aac_tables->scale_factor_bands_short[21] =
271       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_16_120;
272   ptr_aac_tables->scale_factor_bands_short[22] =
273       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_16_120;
274   ptr_aac_tables->scale_factor_bands_short[23] =
275       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_8_120;
276 
277   ptr_aac_tables->scale_factor_bands_long[0] =
278       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_96_1024;
279   ptr_aac_tables->scale_factor_bands_long[1] =
280       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_96_1024;
281   ptr_aac_tables->scale_factor_bands_long[2] =
282       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_64_1024;
283   ptr_aac_tables->scale_factor_bands_long[3] =
284       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_1024;
285   ptr_aac_tables->scale_factor_bands_long[4] =
286       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_1024;
287   ptr_aac_tables->scale_factor_bands_long[5] =
288       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_32_1024;
289   ptr_aac_tables->scale_factor_bands_long[6] =
290       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_1024;
291   ptr_aac_tables->scale_factor_bands_long[7] =
292       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_1024;
293   ptr_aac_tables->scale_factor_bands_long[8] =
294       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_16_1024;
295   ptr_aac_tables->scale_factor_bands_long[9] =
296       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_16_1024;
297   ptr_aac_tables->scale_factor_bands_long[10] =
298       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_16_1024;
299   ptr_aac_tables->scale_factor_bands_long[11] =
300       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_8_1024;
301 
302   ptr_aac_tables->scale_factor_bands_long[12] =
303       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_96_960;
304   ptr_aac_tables->scale_factor_bands_long[13] =
305       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_96_960;
306   ptr_aac_tables->scale_factor_bands_long[14] =
307       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_64_960;
308   ptr_aac_tables->scale_factor_bands_long[15] =
309       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_960;
310   ptr_aac_tables->scale_factor_bands_long[16] =
311       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_960;
312   ptr_aac_tables->scale_factor_bands_long[17] =
313       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_960;
314   ptr_aac_tables->scale_factor_bands_long[18] =
315       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_960;
316   ptr_aac_tables->scale_factor_bands_long[19] =
317       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_960;
318   ptr_aac_tables->scale_factor_bands_long[20] =
319       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_16_960;
320   ptr_aac_tables->scale_factor_bands_long[21] =
321       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_16_960;
322   ptr_aac_tables->scale_factor_bands_long[22] =
323       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_16_960;
324   ptr_aac_tables->scale_factor_bands_long[23] =
325       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_8_960;
326 
327   ptr_aac_tables->scale_fac_bands_512[0] =
328       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_512;
329   ptr_aac_tables->scale_fac_bands_512[1] =
330       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_512;
331   ptr_aac_tables->scale_fac_bands_512[2] =
332       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_512;
333   ptr_aac_tables->scale_fac_bands_512[3] =
334       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_512;
335   ptr_aac_tables->scale_fac_bands_512[4] =
336       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_512;
337   ptr_aac_tables->scale_fac_bands_512[5] =
338       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_32_512;
339   ptr_aac_tables->scale_fac_bands_512[6] =
340       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_512;
341   ptr_aac_tables->scale_fac_bands_512[7] =
342       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_512;
343   ptr_aac_tables->scale_fac_bands_512[8] =
344       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_512;
345   ptr_aac_tables->scale_fac_bands_512[9] =
346       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_512;
347   ptr_aac_tables->scale_fac_bands_512[10] =
348       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_512;
349   ptr_aac_tables->scale_fac_bands_512[11] =
350       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_512;
351   ptr_aac_tables->scale_fac_bands_512[12] =
352       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_512;
353   ptr_aac_tables->scale_fac_bands_512[13] =
354       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_512;
355   ptr_aac_tables->scale_fac_bands_512[14] =
356       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_512;
357   ptr_aac_tables->scale_fac_bands_512[15] =
358       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_512;
359 
360   ptr_aac_tables->scale_fac_bands_480[0] =
361       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_480;
362   ptr_aac_tables->scale_fac_bands_480[1] =
363       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_480;
364   ptr_aac_tables->scale_fac_bands_480[2] =
365       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_480;
366   ptr_aac_tables->scale_fac_bands_480[3] =
367       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_480;
368   ptr_aac_tables->scale_fac_bands_480[4] =
369       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_480;
370   ptr_aac_tables->scale_fac_bands_480[5] =
371       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_32_480;
372   ptr_aac_tables->scale_fac_bands_480[6] =
373       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_480;
374   ptr_aac_tables->scale_fac_bands_480[7] =
375       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_480;
376   ptr_aac_tables->scale_fac_bands_480[8] =
377       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_480;
378   ptr_aac_tables->scale_fac_bands_480[9] =
379       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_480;
380   ptr_aac_tables->scale_fac_bands_480[10] =
381       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_480;
382   ptr_aac_tables->scale_fac_bands_480[11] =
383       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_480;
384   ptr_aac_tables->scale_fac_bands_480[12] =
385       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_480;
386   ptr_aac_tables->scale_fac_bands_480[13] =
387       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_480;
388   ptr_aac_tables->scale_fac_bands_480[14] =
389       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_480;
390   ptr_aac_tables->scale_fac_bands_480[15] =
391       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_480;
392 }
393 
ixheaacd_aac_decoder_init(ia_aac_dec_state_struct * p_state_enhaacplus_dec,ia_aac_dec_sbr_bitstream_struct * ptr_sbr_bitstream,WORD channels,VOID * aac_persistent_mem_v,WORD32 frame_length)394 ia_aac_decoder_struct *ixheaacd_aac_decoder_init(
395     ia_aac_dec_state_struct *p_state_enhaacplus_dec,
396     ia_aac_dec_sbr_bitstream_struct *ptr_sbr_bitstream, WORD channels,
397     VOID *aac_persistent_mem_v, WORD32 frame_length) {
398   WORD i, ch;
399   struct ia_aac_persistent_struct *aac_persistent_mem;
400   aac_persistent_mem = (struct ia_aac_persistent_struct *)aac_persistent_mem_v;
401 
402   aac_persistent_mem->str_aac_decoder.pstr_sbr_bitstream = ptr_sbr_bitstream;
403 
404   for (ch = 0; ch < channels; ch++) {
405     ia_aac_decoder_struct *aac_dec_handle =
406         &aac_persistent_mem->str_aac_decoder;
407     aac_dec_handle->pstr_aac_dec_overlap_info[ch] =
408         &aac_persistent_mem->str_aac_dec_overlap_info[ch];
409     aac_dec_handle->pstr_pns_rand_vec_data =
410         &aac_persistent_mem->str_pns_rand_vec_data;
411 
412     aac_dec_handle->pstr_aac_dec_overlap_info[ch]->window_shape = 0;
413     aac_dec_handle->pstr_aac_dec_overlap_info[ch]->window_sequence = 0;
414     if (p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_ELD)
415       aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_overlap_buf =
416           &aac_persistent_mem->overlap_buffer[ch * 4 * OVERLAP_BUFFER_SIZE];
417     else
418       aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_overlap_buf =
419           &aac_persistent_mem->overlap_buffer[ch * OVERLAP_BUFFER_SIZE];
420 
421     {
422       WORD32 *ptr_overlap_buf =
423           aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_overlap_buf;
424       memset(ptr_overlap_buf, 0,
425              IXHEAAC_GET_SIZE_ALIGNED(sizeof(ptr_overlap_buf[0]) * 4 * 512, BYTE_ALIGN_8));
426     }
427     aac_persistent_mem->str_aac_decoder.ptr_aac_dec_static_channel_info[ch] =
428         aac_persistent_mem->ptr_aac_dec_static_channel_info[ch];
429     aac_persistent_mem->str_aac_decoder.ptr_aac_dec_static_channel_info[ch]
430         ->ltp_buf = aac_persistent_mem->ltp_buf[ch];
431   }
432 
433   for (i = 0; i < 1; i++) {
434     ia_aac_dec_sbr_bitstream_struct *ptr_sbr_bitstream =
435         &aac_persistent_mem->str_aac_decoder.pstr_sbr_bitstream[i];
436 
437     ptr_sbr_bitstream->no_elements = 0;
438     ptr_sbr_bitstream->str_sbr_ele[0].ptr_sbr_data =
439         &aac_persistent_mem->sbr_payload_buffer[ALIGN_SIZE64(MAXSBRBYTES) * i];
440     ptr_sbr_bitstream->str_sbr_ele[0].ptr_prev_sbr_data =
441         &aac_persistent_mem->prev_sbr_payload_buffer[ALIGN_SIZE64(MAXSBRBYTES) * i];
442     ptr_sbr_bitstream->str_sbr_ele[0].sbr_ele_id = ID_SCE;
443     ptr_sbr_bitstream->str_sbr_ele[0].size_payload = 0;
444     ptr_sbr_bitstream->str_sbr_ele[0].prev_size_payload = 0;
445     ptr_sbr_bitstream->str_sbr_ele[0].prev_sbr_ele_id = ID_SCE;
446     ptr_sbr_bitstream->str_sbr_ele[0].size_payload_old = 0;
447   }
448 
449   {
450     ia_aac_dec_tables_struct *ptr_aac_tables =
451         aac_persistent_mem->str_aac_decoder.pstr_aac_tables;
452     ia_aac_dec_huffman_tables_struct *pstr_huffmann_tables =
453         ptr_aac_tables->pstr_huffmann_tables;
454 
455     WORD num_entries = sizeof(pstr_huffmann_tables->str_sample_rate_info) /
456                        sizeof(ia_sampling_rate_info_struct);
457 
458     WORD32 sampling_rate = p_state_enhaacplus_dec->sampling_rate;
459     WORD sfidx;
460 
461     i = 0;
462     while ((i < num_entries) &&
463            sampling_rate != ((pstr_huffmann_tables->str_sample_rate_info[i]
464                                   .sampling_frequency))) {
465       i++;
466     }
467     if (i == 12) {
468       i = i - 1;
469     }
470 
471     if (i == num_entries) {
472       return NULL;
473     }
474     sfidx = i;
475 
476     if (frame_length == 1024 || frame_length == 960) {
477       WORD16 *psfb_table_idx[2];
478       const WORD8 *psfb_width[2];
479       WORD width_idx;
480       WORD32 j;
481 
482       if (frame_length == 960)
483         sfidx += 12;
484 
485       psfb_table_idx[0] = ptr_aac_tables->sfb_long_table;
486       psfb_table_idx[1] = ptr_aac_tables->sfb_short_table;
487 
488       psfb_width[0] = ptr_aac_tables->scale_factor_bands_long[sfidx];
489       psfb_width[1] = ptr_aac_tables->scale_factor_bands_short[sfidx];
490 
491       for (j = 1; j >= 0; j--) {
492         const WORD8 *ptr_width = psfb_width[j];
493         WORD16 *ptable_idx = psfb_table_idx[j];
494         width_idx = 0;
495         *ptable_idx++ = width_idx;
496         do {
497           width_idx += (*ptr_width++);
498           *ptable_idx++ = width_idx;
499         } while (*ptr_width != -1);
500 
501         aac_persistent_mem->str_aac_decoder.num_swb_window[j] =
502             (WORD8)(ptr_width - psfb_width[j]);
503       }
504 
505       {
506         ptr_aac_tables->str_aac_sfb_info[0].sfb_index =
507             ptr_aac_tables->sfb_long_table;
508         ptr_aac_tables->str_aac_sfb_info[1].sfb_index =
509             ptr_aac_tables->sfb_long_table;
510         ptr_aac_tables->str_aac_sfb_info[3].sfb_index =
511             ptr_aac_tables->sfb_long_table;
512 
513         ptr_aac_tables->str_aac_sfb_info[2].sfb_index =
514             ptr_aac_tables->sfb_short_table;
515 
516         ptr_aac_tables->str_aac_sfb_info[0].sfb_width = (WORD8 *)psfb_width[0];
517         ptr_aac_tables->str_aac_sfb_info[1].sfb_width = (WORD8 *)psfb_width[0];
518         ptr_aac_tables->str_aac_sfb_info[3].sfb_width = (WORD8 *)psfb_width[0];
519 
520         ptr_aac_tables->str_aac_sfb_info[2].sfb_width = (WORD8 *)psfb_width[1];
521       }
522     } else {
523       WORD16 *ptr_sfb_idx[2];
524       const WORD8 *ptr_sfb_width[2] = {0};
525       WORD width_idx;
526       WORD32 j;
527 
528       ptr_sfb_idx[0] = ptr_aac_tables->sfb_long_table;
529       ptr_sfb_idx[1] = ptr_aac_tables->sfb_short_table;
530 
531       if (frame_length == 512)
532         ptr_sfb_width[0] = ptr_aac_tables->scale_fac_bands_512[i];
533       else
534         ptr_sfb_width[0] = ptr_aac_tables->scale_fac_bands_480[i];
535 
536       for (j = 0; j >= 0; j--) {
537         const WORD8 *ptr_width = ptr_sfb_width[j];
538         WORD16 *ptr_idx = ptr_sfb_idx[j];
539         width_idx = 0;
540         *ptr_idx++ = width_idx;
541         do {
542           width_idx += (*ptr_width++);
543           *ptr_idx++ = width_idx;
544         } while (*ptr_width != -1);
545 
546         aac_persistent_mem->str_aac_decoder.num_swb_window[j] =
547             (WORD8)(ptr_width - ptr_sfb_width[j]);
548       }
549 
550       {
551         ptr_aac_tables->str_aac_sfb_info[0].sfb_index =
552             ptr_aac_tables->sfb_long_table;
553         ptr_aac_tables->str_aac_sfb_info[1].sfb_index =
554             ptr_aac_tables->sfb_long_table;
555         ptr_aac_tables->str_aac_sfb_info[3].sfb_index =
556             ptr_aac_tables->sfb_long_table;
557         ptr_aac_tables->str_aac_sfb_info[2].sfb_index =
558             ptr_aac_tables->sfb_short_table;
559 
560         ptr_aac_tables->str_aac_sfb_info[0].sfb_width =
561             (WORD8 *)ptr_sfb_width[0];
562         ptr_aac_tables->str_aac_sfb_info[1].sfb_width =
563             (WORD8 *)ptr_sfb_width[0];
564         ptr_aac_tables->str_aac_sfb_info[3].sfb_width =
565             (WORD8 *)ptr_sfb_width[0];
566         ptr_aac_tables->str_aac_sfb_info[2].sfb_width =
567             (WORD8 *)ptr_sfb_width[1];
568       }
569     }
570     {
571       ia_aac_decoder_struct *aac_dec_handle =
572           &aac_persistent_mem->str_aac_decoder;
573       aac_dec_handle->sampling_rate_index = (WORD16)i;
574       aac_dec_handle->sampling_rate = sampling_rate;
575       aac_dec_handle->channels = 1;
576       aac_dec_handle->block_number = 0;
577       aac_dec_handle->samples_per_frame = frame_length;
578     }
579   }
580 
581   return &(aac_persistent_mem->str_aac_decoder);
582 }
583