xref: /aosp_15_r20/external/libxaac/decoder/drc_src/impd_drc_api.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 <stdlib.h>
22 #include "impd_type_def.h"
23 #include "impd_error_standards.h"
24 #include "impd_apicmd_standards.h"
25 #include "impd_memory_standards.h"
26 
27 #include "impd_drc_bitbuffer.h"
28 #include "impd_drc_extr_delta_coded_info.h"
29 #include "ixheaac_constants.h"
30 #include "impd_drc_common.h"
31 #include "impd_drc_struct.h"
32 #include "impd_drc_interface.h"
33 #include "impd_parametric_drc_dec.h"
34 #include "impd_drc_gain_dec.h"
35 #include "impd_drc_filter_bank.h"
36 #include "impd_drc_multi_band.h"
37 #include "impd_drc_process_audio.h"
38 #include "impd_drc_eq.h"
39 #include "impd_drc_gain_decoder.h"
40 #include "impd_drc_config_params.h"
41 #include "impd_drc_api_defs.h"
42 #include "impd_drc_definitions.h"
43 #include "impd_drc_hashdefines.h"
44 #include "impd_drc_peak_limiter.h"
45 
46 #include "impd_drc_selection_process.h"
47 #include "impd_drc_api_struct_def.h"
48 #include "impd_drc_error_codes.h"
49 
50 WORD32 impd_init_process_audio_main_qmf(ia_drc_api_struct *p_obj_drc);
51 WORD32 impd_init_process_audio_main_stft(ia_drc_api_struct *p_obj_drc);
52 WORD32 impd_init_process_audio_main_td_qmf(ia_drc_api_struct *p_obj_drc);
53 
54 IA_ERRORCODE impd_drc_mem_api(ia_drc_api_struct *p_obj_drc, WORD32 i_cmd,
55                               WORD32 i_idx, pVOID pv_value);
56 
57 IA_ERRORCODE impd_drc_fill_mem_tables(ia_drc_api_struct *p_obj_drc);
58 
59 IA_ERRORCODE impd_drc_process_frame(ia_drc_api_struct *p_obj_drc);
60 IA_ERRORCODE impd_drc_init(ia_drc_api_struct *p_obj_drc);
61 IA_ERRORCODE impd_drc_set_default_config(ia_drc_api_struct *p_obj_drc);
62 IA_ERRORCODE impd_drc_set_struct_pointer(ia_drc_api_struct *p_obj_drc);
63 IA_ERRORCODE impd_process_time_domain(ia_drc_api_struct *p_obj_drc);
64 
65 #define NUM_DRC_TABLES 4
66 
ia_drc_dec_api(pVOID p_ia_drc_dec_obj,WORD32 i_cmd,WORD32 i_idx,pVOID pv_value)67 IA_ERRORCODE ia_drc_dec_api(pVOID p_ia_drc_dec_obj, WORD32 i_cmd, WORD32 i_idx,
68                             pVOID pv_value) {
69   ia_drc_api_struct *p_obj_drc = p_ia_drc_dec_obj;
70   IA_ERRORCODE error_code = IA_NO_ERROR;
71   LOOPIDX i;
72 
73   pUWORD32 pui_value = pv_value;
74   pUWORD32 pus_value = pv_value;
75   pWORD8 pb_value = pv_value;
76   SIZE_T *ps_value = pv_value;
77   pWORD32 pi_value = pv_value;
78   float *pf_value = pv_value;
79 
80   switch (i_cmd) {
81     case IA_API_CMD_GET_MEM_INFO_SIZE:
82     case IA_API_CMD_GET_MEM_INFO_ALIGNMENT:
83     case IA_API_CMD_GET_MEM_INFO_TYPE:
84     case IA_API_CMD_GET_MEM_INFO_PLACEMENT:
85     case IA_API_CMD_GET_MEM_INFO_PRIORITY:
86     case IA_API_CMD_SET_MEM_PTR:
87     case IA_API_CMD_SET_MEM_PLACEMENT: {
88       return impd_drc_mem_api(p_ia_drc_dec_obj, i_cmd, i_idx, pv_value);
89     }
90   };
91 
92   switch (i_cmd) {
93     case IA_API_CMD_GET_LIB_ID_STRINGS: {
94       switch (i_idx) {
95         case IA_CMD_TYPE_LIB_NAME: {
96           WORD8 lib_name[] = LIBNAME;
97           for (i = 0; i < IA_API_STR_LEN && lib_name[i - 1] != 0; i++) {
98             pb_value[i] = lib_name[i];
99           }
100           break;
101         }
102         case IA_CMD_TYPE_LIB_VERSION: {
103           break;
104         }
105 
106         case IA_CMD_TYPE_API_VERSION: {
107         }
108         default: { return -1; }
109       };
110       break;
111     }
112     case IA_API_CMD_GET_API_SIZE: {
113       *pui_value = sizeof(ia_drc_api_struct);
114 
115       break;
116     }
117     case IA_API_CMD_INIT: {
118       switch (i_idx) {
119         case IA_CMD_TYPE_INIT_SET_BUFF_PTR: {
120           p_obj_drc->p_state->persistent_ptr =
121               (UWORD8 *)p_obj_drc->pp_mem[IA_DRC_PERSIST_IDX] +
122               IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_state_struct), BYTE_ALIGN_8);
123           error_code = impd_drc_set_struct_pointer(p_obj_drc);
124           if (error_code) return error_code;
125 
126           break;
127         }
128         case IA_CMD_TYPE_INIT_API_PRE_CONFIG_PARAMS: {
129           error_code = impd_drc_set_default_config(p_obj_drc);
130           if (error_code) return error_code;
131           break;
132         }
133         case IA_CMD_TYPE_INIT_API_POST_CONFIG_PARAMS: {
134           error_code = impd_drc_fill_mem_tables(p_obj_drc);
135           if (error_code) return error_code;
136           break;
137         }
138         case IA_CMD_TYPE_INIT_PROCESS: {
139           IA_ERRORCODE Error = 0;
140 
141           if (p_obj_drc->pp_mem[IA_DRC_PERSIST_IDX] == 0) {
142             return (-1);
143           }
144 
145           Error = impd_drc_init(p_obj_drc);
146           if (Error) return Error;
147           p_obj_drc->p_state->ui_init_done = 1;
148           return Error;
149           break;
150         }
151         case IA_CMD_TYPE_INIT_DONE_QUERY: {
152           if (p_obj_drc->p_state->ui_init_done == 1) {
153             *pui_value = 1;
154           } else {
155             *pui_value = 0;
156           }
157           break;
158         }
159 
160         case IA_CMD_TYPE_INIT_CPY_BSF_BUFF_OVER_QUERY: {
161           *pui_value = p_obj_drc->str_bit_handler.cpy_over;
162           break;
163         }
164         case IA_CMD_TYPE_INIT_CPY_IC_BSF_BUFF_OVER_QUERY: {
165           *pui_value = p_obj_drc->str_bit_handler.cpy_over_ic;
166           break;
167         }
168 
169         case IA_CMD_TYPE_INIT_CPY_IL_BSF_BUFF_OVER_QUERY: {
170           *pui_value = p_obj_drc->str_bit_handler.cpy_over_il;
171           break;
172         }
173         case IA_CMD_TYPE_INIT_CPY_IN_BSF_BUFF_OVER_QUERY: {
174           *pui_value = p_obj_drc->str_bit_handler.cpy_over_in;
175           break;
176         }
177         case IA_CMD_TYPE_INIT_CPY_BSF_BUFF: {
178           memcpy(p_obj_drc->str_bit_handler.it_bit_buf +
179                      p_obj_drc->str_bit_handler.num_bytes_offset_bs,
180                  p_obj_drc->pp_mem[2], p_obj_drc->str_bit_handler.num_byts_cur);
181           p_obj_drc->str_bit_handler.num_bytes_bs =
182               p_obj_drc->str_bit_handler.num_bytes_bs +
183               p_obj_drc->str_bit_handler.num_byts_cur;
184           p_obj_drc->str_bit_handler.num_bytes_offset_bs =
185               p_obj_drc->str_bit_handler.num_bytes_bs;
186           p_obj_drc->str_bit_handler.num_total_bytes =
187               p_obj_drc->str_bit_handler.num_bytes_bs;
188 
189           break;
190         }
191         case IA_CMD_TYPE_INIT_CPY_IC_BSF_BUFF: {
192           memcpy(p_obj_drc->str_bit_handler.bitstream_drc_config,
193                  p_obj_drc->pp_mem[2],
194                  p_obj_drc->str_bit_handler.num_byts_cur_ic);
195           p_obj_drc->str_bit_handler.num_bytes_bs_drc_config =
196               p_obj_drc->str_bit_handler.num_byts_cur_ic;
197           break;
198         }
199         case IA_CMD_TYPE_INIT_CPY_IL_BSF_BUFF: {
200           memcpy(p_obj_drc->str_bit_handler.bitstream_loudness_info,
201                  p_obj_drc->pp_mem[2],
202                  p_obj_drc->str_bit_handler.num_byts_cur_il);
203           p_obj_drc->str_bit_handler.num_bytes_bs_loudness_info =
204               p_obj_drc->str_bit_handler.num_byts_cur_il;
205           break;
206         }
207         case IA_CMD_TYPE_INIT_CPY_IN_BSF_BUFF: {
208           memcpy(p_obj_drc->str_bit_handler.bitstream_unidrc_interface,
209                  p_obj_drc->pp_mem[2],
210                  p_obj_drc->str_bit_handler.num_byts_cur_in);
211           p_obj_drc->str_bit_handler.num_bytes_bs_unidrc_interface =
212               p_obj_drc->str_bit_handler.num_byts_cur_in;
213           break;
214         }
215         default: { return -1; }
216       };
217       break;
218     }
219     case IA_API_CMD_GET_CONFIG_PARAM: {
220       switch (i_idx) {
221         case IA_DRC_DEC_CONFIG_PARAM_SAMP_FREQ: {
222           *pus_value = p_obj_drc->str_config.sampling_rate;
223           break;
224         }
225 
226         case IA_DRC_DEC_CONFIG_PARAM_NUM_CHANNELS: {
227           *pus_value = p_obj_drc->str_config.num_ch_out;
228           break;
229         }
230         case IA_DRC_DEC_CONFIG_PROC_OUT_PTR: {
231           *ps_value = (SIZE_T)p_obj_drc->str_payload.pstr_drc_sel_proc_output;
232           break;
233         }
234         case IA_DRC_DEC_CONFIG_DRC_TARGET_LOUDNESS: {
235           *pi_value = (WORD32)p_obj_drc->str_payload.pstr_loudness_info->loudness_info
236                           ->loudness_measure->method_val;
237           if (*pi_value < -1)
238             *pi_value = *pi_value * -4;
239           else
240             *pi_value = -1;
241           break;
242         }
243       }
244       break;
245     }
246     case IA_API_CMD_SET_CONFIG_PARAM: {
247       switch (i_idx) {
248         case IA_DRC_DEC_CONFIG_PARAM_SAMP_FREQ: {
249           if (*pus_value < 8000 || *pus_value > 96000) {
250             return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_SAMP_FREQ;
251           }
252           p_obj_drc->str_config.sampling_rate = *pus_value;
253           break;
254         }
255         case IA_DRC_DEC_CONFIG_PARAM_APPLY_CROSSFADE: {
256           p_obj_drc->str_config.apply_crossfade = *pus_value;
257           break;
258         }
259         case IA_DRC_DEC_CONFIG_PARAM_CONFIG_CHANGED: {
260           p_obj_drc->str_config.is_config_changed = *pus_value;
261           break;
262         }
263         case IA_DRC_DEC_CONFIG_PARAM_NUM_CHANNELS: {
264           p_obj_drc->str_config.num_ch_in = *pus_value;
265           if (*pus_value < 1 || *pus_value > MAX_CHANNEL_COUNT) {
266             return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_NUM_OF_CHANNELS;
267           }
268           break;
269         }
270 
271         case IA_DRC_DEC_CONFIG_PARAM_PCM_WDSZ: {
272           switch (*pus_value) {
273             case 16:
274             case 24:
275             case 32:
276               break;
277             default:
278               return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_PCM_SIZE;
279           }
280 
281           p_obj_drc->str_config.pcm_size = *pus_value;
282 
283           break;
284         }
285 
286         case IA_DRC_DEC_CONFIG_PARAM_BITS_FORMAT: {
287           break;
288         }
289         case IA_DRC_DEC_CONFIG_PARAM_INT_PRESENT: {
290           break;
291         }
292         case IA_DRC_DEC_CONFIG_PARAM_FRAME_SIZE: {
293           if (*pus_value < 1 || *pus_value > 4096) {
294             return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_FRAME_SIZE;
295           }
296 
297           p_obj_drc->str_config.frame_size = *pus_value;
298 
299           break;
300         }
301         case IA_DRC_DEC_CONFIG_GAIN_STREAM_FLAG: {
302           break;
303         }
304 
305         case IA_DRC_DEC_CONFIG_DRC_EFFECT_TYPE: {
306           p_obj_drc->str_config.effect_type = *pus_value;
307           break;
308         }
309         case IA_DRC_DEC_CONFIG_DRC_TARGET_LOUDNESS: {
310           p_obj_drc->str_config.target_loudness = *pus_value;
311           break;
312         }
313         case IA_DRC_DEC_CONFIG_DRC_LOUD_NORM: {
314           p_obj_drc->str_config.loud_norm_flag = *pus_value;
315           break;
316         }
317         case IA_DRC_DEC_CONFIG_DRC_ALBUM_MODE: {
318           p_obj_drc->str_config.album_mode = *pus_value;
319           break;
320         }
321         case IA_DRC_DEC_CONFIG_DRC_BOOST: {
322           p_obj_drc->str_config.boost = (*pf_value);
323           p_obj_drc->str_config.boost_set = 1;
324           break;
325         }
326         case IA_DRC_DEC_CONFIG_DRC_COMPRESS: {
327           p_obj_drc->str_config.compress = (*pf_value);
328           p_obj_drc->str_config.compress_set = 1;
329           break;
330         }
331         default: { return -1; }
332       }
333       break;
334     }
335     case IA_API_CMD_GET_MEMTABS_SIZE: {
336       *pui_value =
337           (sizeof(ia_mem_info_struct) + sizeof(pVOID *)) * (NUM_DRC_TABLES);
338       break;
339     }
340     case IA_API_CMD_SET_MEMTABS_PTR: {
341       if (ps_value == NULL) return IA_DRC_DEC_API_FATAL_MEM_ALLOC;
342       memset(ps_value, 0,
343              (sizeof(ia_mem_info_struct) + sizeof(pVOID *)) * (NUM_DRC_TABLES));
344       p_obj_drc->p_mem_info = (ia_mem_info_struct *)(ps_value);
345       p_obj_drc->pp_mem =
346           (pVOID)((SIZE_T)p_obj_drc->p_mem_info +
347                   (NUM_DRC_TABLES * sizeof(*(p_obj_drc->p_mem_info))));
348       break;
349     }
350     case IA_API_CMD_GET_N_MEMTABS: {
351       *pui_value = NUM_DRC_TABLES;
352       break;
353     }
354     case IA_API_CMD_GET_N_TABLES: {
355       break;
356     }
357 
358     case IA_API_CMD_EXECUTE: {
359       switch (i_idx) {
360         case IA_CMD_TYPE_DO_EXECUTE: {
361           if (!p_obj_drc->p_state->ui_init_done) {
362             error_code = IA_FATAL_ERROR;
363           } else if (p_obj_drc->str_config.dec_type == DEC_TYPE_TD) {
364             error_code = impd_process_time_domain(p_obj_drc);
365           } else if (p_obj_drc->str_config.dec_type == DEC_TYPE_QMF64) {
366             error_code = IA_FATAL_ERROR;
367           } else if (p_obj_drc->str_config.dec_type == DEC_TYPE_STFT256) {
368             error_code = IA_FATAL_ERROR;
369           } else if (p_obj_drc->str_config.dec_type == DEC_TYPE_TD_QMF64) {
370             error_code = IA_FATAL_ERROR;
371           }
372           p_obj_drc->str_bit_handler.byte_index_bs =
373               p_obj_drc->str_bit_handler.num_total_bytes -
374               p_obj_drc->str_bit_handler.num_bytes_bs;
375           p_obj_drc->str_bit_handler.num_bytes_offset_bs = 0;
376 
377           break;
378         }
379         case IA_CMD_TYPE_DONE_QUERY: {
380           *pui_value = p_obj_drc->p_state->ui_exe_done;
381           break;
382         }
383         default: { return -1; }
384       };
385       break;
386     }
387     case IA_API_CMD_PUT_INPUT_QUERY: {
388       *pui_value = 1;
389       break;
390     }
391     case IA_API_CMD_GET_CURIDX_INPUT_BUF: {
392       UWORD32 ui_in_buf_size = p_obj_drc->p_mem_info[IA_DRC_INPUT_IDX].ui_size;
393       UWORD32 ui_in_bytes = p_obj_drc->p_state->ui_in_bytes;
394       *pui_value = ui_in_buf_size > ui_in_bytes ? ui_in_bytes : ui_in_buf_size;
395       break;
396     }
397     case IA_API_CMD_SET_INPUT_BYTES: {
398       p_obj_drc->p_state->ui_in_bytes = *pui_value;
399       break;
400     }
401 
402     case IA_API_CMD_GET_OUTPUT_BYTES: {
403       *pui_value = p_obj_drc->p_state->ui_out_bytes;
404       break;
405     }
406     case IA_API_CMD_INPUT_OVER: {
407       p_obj_drc->p_state->ui_exe_done = 1;
408       break;
409     }
410     case IA_API_CMD_SET_INPUT_BYTES_BS: {
411       p_obj_drc->str_bit_handler.num_byts_cur = *pus_value;
412       break;
413     }
414     case IA_API_CMD_SET_INPUT_BYTES_IC_BS: {
415       p_obj_drc->str_bit_handler.num_byts_cur_ic = *pus_value;
416       break;
417     }
418     case IA_API_CMD_SET_INPUT_BYTES_IL_BS: {
419       p_obj_drc->str_bit_handler.num_byts_cur_il = *pus_value;
420       break;
421     }
422     case IA_API_CMD_SET_INPUT_BYTES_IN_BS: {
423       p_obj_drc->str_bit_handler.num_byts_cur_in = *pus_value;
424       break;
425     }
426     default: { return -1; }
427   };
428   return error_code;
429 }
430 
impd_drc_mem_api(ia_drc_api_struct * p_obj_drc,WORD32 i_cmd,WORD32 i_idx,pVOID pv_value)431 IA_ERRORCODE impd_drc_mem_api(ia_drc_api_struct *p_obj_drc, WORD32 i_cmd,
432                               WORD32 i_idx, pVOID pv_value) {
433   pUWORD32 pui_value = pv_value;
434 
435   switch (i_cmd) {
436     case IA_API_CMD_GET_MEM_INFO_SIZE: {
437       *pui_value = p_obj_drc->p_mem_info[i_idx].ui_size;
438       break;
439     }
440     case IA_API_CMD_GET_MEM_INFO_ALIGNMENT: {
441       *pui_value = p_obj_drc->p_mem_info[i_idx].ui_alignment;
442       break;
443     }
444     case IA_API_CMD_GET_MEM_INFO_TYPE: {
445       *pui_value = p_obj_drc->p_mem_info[i_idx].ui_type;
446       break;
447     }
448     case IA_API_CMD_GET_MEM_INFO_PLACEMENT: {
449       *pui_value = p_obj_drc->p_mem_info[i_idx].ui_placement[0];
450       *(pui_value + 1) = p_obj_drc->p_mem_info[i_idx].ui_placement[1];
451       break;
452     }
453     case IA_API_CMD_GET_MEM_INFO_PRIORITY: {
454       *pui_value = p_obj_drc->p_mem_info[i_idx].ui_priority;
455       break;
456     }
457     case IA_API_CMD_SET_MEM_PTR: {
458       if (pv_value == 0) {
459         return (-1);
460       }
461       if (((SIZE_T)pv_value % p_obj_drc->p_mem_info[i_idx].ui_alignment) != 0) {
462         return (-1);
463       }
464       p_obj_drc->pp_mem[i_idx] = pv_value;
465       memset(p_obj_drc->pp_mem[i_idx], 0, p_obj_drc->p_mem_info[i_idx].ui_size);
466       if (IA_MEMTYPE_PERSIST == i_idx) {
467         p_obj_drc->p_state = pv_value;
468       }
469       break;
470     }
471     case IA_API_CMD_SET_MEM_PLACEMENT: {
472     }
473   };
474   return IA_NO_ERROR;
475 }
476 
impd_calc_scratch_size()477 static WORD32 impd_calc_scratch_size() {
478   return IXHEAAC_GET_SIZE_ALIGNED(
479       AUDIO_CODEC_FRAME_SIZE_MAX * MAX_CHANNEL_COUNT * NUM_ELE_IN_CPLX_NUM * sizeof(FLOAT32),
480       BYTE_ALIGN_8);
481 }
482 
impd_calc_pers_size()483 static WORD32 impd_calc_pers_size() {
484   WORD32 size = 0;
485 
486   WORD32 analysis_buf_size = IXHEAAC_GET_SIZE_ALIGNED(
487       AUDIO_CODEC_FRAME_SIZE_MAX * MAX_CHANNEL_COUNT * sizeof(FLOAT32) * NUM_ELE_IN_CPLX_NUM,
488       BYTE_ALIGN_8);
489   WORD32 synth_buf_size = IXHEAAC_GET_SIZE_ALIGNED(
490       AUDIO_CODEC_FRAME_SIZE_MAX * MAX_CHANNEL_COUNT * sizeof(FLOAT32) * NUM_ELE_IN_CPLX_NUM,
491       BYTE_ALIGN_8);
492   WORD32 peak_lim_buf_size = IXHEAAC_GET_SIZE_ALIGNED(
493       AUDIO_CODEC_FRAME_SIZE_MAX * MAX_CHANNEL_COUNT * sizeof(FLOAT32) * NUM_ELE_IN_CPLX_NUM,
494       BYTE_ALIGN_8);
495   WORD32 subband_buf_size =
496       NUM_ELE_IN_CPLX_NUM *
497           IXHEAAC_GET_SIZE_ALIGNED(MAX_CHANNEL_COUNT * sizeof(FLOAT32 *), BYTE_ALIGN_8) +
498       NUM_ELE_IN_CPLX_NUM * MAX_CHANNEL_COUNT *
499           IXHEAAC_GET_SIZE_ALIGNED((MAX_SUBBAND_DELAY + MAX_DRC_FRAME_SIZE) * sizeof(FLOAT32),
500                                    BYTE_ALIGN_8);
501 
502   size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_state_struct), BYTE_ALIGN_8);
503   size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_bits_dec_struct), BYTE_ALIGN_8);
504   size += 2 * IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_gain_dec_struct), BYTE_ALIGN_8);
505   size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_loudness_info_set_struct), BYTE_ALIGN_8);
506   size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_gain_struct), BYTE_ALIGN_8);
507   size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_interface_struct), BYTE_ALIGN_8);
508   size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_config), BYTE_ALIGN_8);
509   size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_sel_pro_struct), BYTE_ALIGN_8);
510   size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_sel_proc_params_struct), BYTE_ALIGN_8);
511   size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_sel_proc_output_struct), BYTE_ALIGN_8);
512   size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_peak_limiter_struct), BYTE_ALIGN_8);
513   size += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_drc_qmf_filt_struct), BYTE_ALIGN_8);
514   size += analysis_buf_size;
515   size += synth_buf_size;
516   size += peak_lim_buf_size;
517 
518   size += IXHEAAC_GET_SIZE_ALIGNED(MAX_DRC_BS_BUF_SIZE, BYTE_ALIGN_8);
519   size += IXHEAAC_GET_SIZE_ALIGNED(MAX_DRC_CONFG_BUF_SIZE, BYTE_ALIGN_8); /*DRC Config Bitstream*/
520   size += IXHEAAC_GET_SIZE_ALIGNED(MAX_LOUD_INFO_BUF_SIZE,
521                                    BYTE_ALIGN_8); /*DRC loudness info Bitstream*/
522   size +=
523       IXHEAAC_GET_SIZE_ALIGNED(MAX_INTERFACE_BUF_SIZE, BYTE_ALIGN_8); /*DRC interface Bitstream*/
524 
525   size += NUM_GAIN_DEC_INSTANCES * SEL_DRC_COUNT *
526           IXHEAAC_GET_SIZE_ALIGNED((sizeof(ia_interp_buf_struct) * MAX_GAIN_ELE_COUNT),
527                                    BYTE_ALIGN_8); /*ia_interp_buf_struct*/
528   size += NUM_GAIN_DEC_INSTANCES *
529           IXHEAAC_GET_SIZE_ALIGNED((sizeof(ia_eq_set_struct)), BYTE_ALIGN_8); /*ia_eq_set_struct*/
530 
531   /*non_interleaved_audio*/
532   size += NUM_GAIN_DEC_INSTANCES *
533           IXHEAAC_GET_SIZE_ALIGNED((MAX_CHANNEL_COUNT * sizeof(FLOAT32 *)), BYTE_ALIGN_8);
534   size += NUM_GAIN_DEC_INSTANCES * MAX_CHANNEL_COUNT *
535           IXHEAAC_GET_SIZE_ALIGNED((MAX_DRC_FRAME_SIZE * sizeof(FLOAT32)), BYTE_ALIGN_8);
536 
537   /*audio_in_out_buf ptr*/
538   size += NUM_GAIN_DEC_INSTANCES *
539           IXHEAAC_GET_SIZE_ALIGNED((MAX_CHANNEL_COUNT * sizeof(FLOAT32 *)), BYTE_ALIGN_8);
540   /*audio_io_buffer_delayed*/
541   size += NUM_GAIN_DEC_INSTANCES *
542           IXHEAAC_GET_SIZE_ALIGNED((MAX_CHANNEL_COUNT * sizeof(FLOAT32 *)), BYTE_ALIGN_8);
543   size += NUM_GAIN_DEC_INSTANCES * MAX_CHANNEL_COUNT *
544           IXHEAAC_GET_SIZE_ALIGNED((MAX_DRC_FRAME_SIZE * sizeof(FLOAT32)), BYTE_ALIGN_8);
545 
546   /*subband band buffer ptr*/
547   size += NUM_GAIN_DEC_INSTANCES * NUM_ELE_IN_CPLX_NUM *
548           IXHEAAC_GET_SIZE_ALIGNED(MAX_CHANNEL_COUNT * sizeof(FLOAT32 *), BYTE_ALIGN_8);
549   size += NUM_GAIN_DEC_INSTANCES * subband_buf_size;
550 
551   size += NUM_GAIN_DEC_INSTANCES * MAX_CHANNEL_COUNT *
552           IXHEAAC_GET_SIZE_ALIGNED((PARAM_DRC_MAX_BUF_SZ * sizeof(FLOAT32)), BYTE_ALIGN_8);
553 
554   return size;
555 }
556 
impd_drc_fill_mem_tables(ia_drc_api_struct * p_obj_drc)557 IA_ERRORCODE impd_drc_fill_mem_tables(ia_drc_api_struct *p_obj_drc) {
558   ia_mem_info_struct *p_mem_info;
559   {
560     p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_PERSIST_IDX];
561     memset(p_mem_info, 0, sizeof(*p_mem_info));
562     p_mem_info->ui_size = impd_calc_pers_size();
563     p_mem_info->ui_alignment = 8;
564     p_mem_info->ui_type = IA_MEMTYPE_PERSIST;
565     p_mem_info->ui_placement[0] = 0;
566     p_mem_info->ui_placement[1] = 0;
567     p_mem_info->ui_priority = IA_MEMPRIORITY_ANYWHERE;
568     p_mem_info->ui_placed[0] = 0;
569     p_mem_info->ui_placed[1] = 0;
570   }
571   {
572     p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_INPUT_IDX];
573     memset(p_mem_info, 0, sizeof(*p_mem_info));
574     p_mem_info->ui_size = p_obj_drc->str_config.frame_size *
575                           (p_obj_drc->str_config.pcm_size >> 3) *
576                           p_obj_drc->str_config.num_ch_in;
577     p_mem_info->ui_alignment = 4;
578     p_mem_info->ui_type = IA_MEMTYPE_INPUT;
579     p_mem_info->ui_placement[0] = 0;
580     p_mem_info->ui_placement[1] = 0;
581     p_mem_info->ui_priority = IA_MEMPRIORITY_ANYWHERE;
582     p_mem_info->ui_placed[0] = 0;
583     p_mem_info->ui_placed[1] = 0;
584   }
585   {
586     p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_OUTPUT_IDX];
587     memset(p_mem_info, 0, sizeof(*p_mem_info));
588     p_mem_info->ui_size = p_obj_drc->str_config.frame_size *
589                           (p_obj_drc->str_config.pcm_size >> 3) *
590                           p_obj_drc->str_config.num_ch_in;
591     p_mem_info->ui_alignment = 4;
592     p_mem_info->ui_type = IA_MEMTYPE_OUTPUT;
593     p_mem_info->ui_placement[0] = 0;
594     p_mem_info->ui_placement[1] = 0;
595     p_mem_info->ui_priority = IA_MEMPRIORITY_ANYWHERE;
596     p_mem_info->ui_placed[0] = 0;
597     p_mem_info->ui_placed[1] = 0;
598   }
599   {
600     p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_SCRATCH_IDX];
601     memset(p_mem_info, 0, sizeof(*p_mem_info));
602     p_mem_info->ui_size = impd_calc_scratch_size();
603     p_mem_info->ui_alignment = 8;
604     p_mem_info->ui_type = IA_MEMTYPE_SCRATCH;
605     p_mem_info->ui_placement[0] = 0;
606     p_mem_info->ui_placement[1] = 0;
607     p_mem_info->ui_priority = IA_MEMPRIORITY_ANYWHERE;
608     p_mem_info->ui_placed[0] = 0;
609     p_mem_info->ui_placed[1] = 0;
610   }
611   return IA_NO_ERROR;
612 }
613