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