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
23 #include "impd_type_def.h"
24 #include "impd_error_standards.h"
25 #include "impd_apicmd_standards.h"
26 #include "impd_memory_standards.h"
27
28 #include "impd_drc_bitbuffer.h"
29 #include "impd_drc_extr_delta_coded_info.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 VOID impd_drc_set_default_config_params(ia_drc_config_struct *ptr_config);
60
61 IA_ERRORCODE impd_drc_process_frame(ia_drc_api_struct *p_obj_drc);
62 IA_ERRORCODE impd_drc_init(ia_drc_api_struct *p_obj_drc);
63 IA_ERRORCODE impd_drc_set_default_config(ia_drc_api_struct *p_obj_drc);
64 IA_ERRORCODE impd_drc_set_struct_pointer(ia_drc_api_struct *p_obj_drc);
65 IA_ERRORCODE impd_process_time_domain(ia_drc_api_struct *p_obj_drc);
66
67 #define NUM_DRC_TABLES 4
68 #define SCRATCH_MEM_SIZE 1024 * 256 * 64
69
ia_drc_dec_api(pVOID p_ia_drc_dec_obj,WORD32 i_cmd,WORD32 i_idx,pVOID pv_value)70 IA_ERRORCODE ia_drc_dec_api(pVOID p_ia_drc_dec_obj, WORD32 i_cmd, WORD32 i_idx,
71 pVOID pv_value) {
72 ia_drc_api_struct *p_obj_drc = p_ia_drc_dec_obj;
73 IA_ERRORCODE error_code = IA_NO_ERROR;
74 LOOPIDX i;
75
76 pUWORD32 pui_value = pv_value;
77 pUWORD32 pus_value = pv_value;
78 pWORD8 pb_value = pv_value;
79 SIZE_T *ps_value = pv_value;
80
81 switch (i_cmd) {
82 case IA_API_CMD_GET_MEM_INFO_SIZE:
83 case IA_API_CMD_GET_MEM_INFO_ALIGNMENT:
84 case IA_API_CMD_GET_MEM_INFO_TYPE:
85 case IA_API_CMD_GET_MEM_INFO_PLACEMENT:
86 case IA_API_CMD_GET_MEM_INFO_PRIORITY:
87 case IA_API_CMD_SET_MEM_PTR:
88 case IA_API_CMD_SET_MEM_PLACEMENT: {
89 return impd_drc_mem_api(p_ia_drc_dec_obj, i_cmd, i_idx, pv_value);
90 }
91 };
92
93 switch (i_cmd) {
94 case IA_API_CMD_GET_LIB_ID_STRINGS: {
95 switch (i_idx) {
96 case IA_CMD_TYPE_LIB_NAME: {
97 WORD8 lib_name[] = LIBNAME;
98 for (i = 0; i < IA_API_STR_LEN && lib_name[i - 1] != 0; i++) {
99 pb_value[i] = lib_name[i];
100 }
101 break;
102 }
103 case IA_CMD_TYPE_LIB_VERSION: {
104 break;
105 }
106
107 case IA_CMD_TYPE_API_VERSION: {
108 }
109 default: { return -1; }
110 };
111 break;
112 }
113 case IA_API_CMD_GET_API_SIZE: {
114 *pui_value = sizeof(ia_drc_api_struct) +
115 (sizeof(ia_drc_state_struct) + 8) + 8080 * 1024;
116
117 break;
118 }
119 case IA_API_CMD_INIT: {
120 switch (i_idx) {
121 case IA_CMD_TYPE_INIT_SET_BUFF_PTR: {
122 p_obj_drc->p_state->persistant_ptr =
123 p_obj_drc->pp_mem[IA_DRC_PERSIST_IDX];
124 impd_drc_set_struct_pointer(p_obj_drc);
125
126 break;
127 }
128 case IA_CMD_TYPE_INIT_API_PRE_CONFIG_PARAMS: {
129 impd_drc_set_default_config(p_obj_drc);
130 break;
131 }
132 case IA_CMD_TYPE_INIT_API_POST_CONFIG_PARAMS: {
133 p_obj_drc->p_state =
134 (ia_drc_state_struct *)((SIZE_T)p_obj_drc + 8000 * 1024);
135 p_obj_drc->p_mem_info =
136 (ia_mem_info_struct *)((SIZE_T)p_obj_drc + 8002 * 1024);
137 p_obj_drc->pp_mem = (pVOID)((SIZE_T)p_obj_drc + 8006 * 1024);
138 impd_drc_fill_mem_tables(p_obj_drc);
139 break;
140 }
141 case IA_CMD_TYPE_INIT_PROCESS: {
142 IA_ERRORCODE Error = 0;
143
144 if (p_obj_drc->pp_mem[IA_DRC_PERSIST_IDX] == 0) {
145 return (-1);
146 }
147
148 Error = impd_drc_init(p_obj_drc);
149 if (Error) return Error;
150 p_obj_drc->p_state->ui_init_done = 1;
151 return Error;
152 break;
153 }
154 case IA_CMD_TYPE_INIT_DONE_QUERY: {
155 if (p_obj_drc->p_state->ui_init_done == 1) {
156 *pui_value = 1;
157 } else {
158 *pui_value = 0;
159 }
160 break;
161 }
162
163 case IA_CMD_TYPE_INIT_CPY_BSF_BUFF_OVER_QUERY: {
164 *pui_value = p_obj_drc->str_bit_handler.cpy_over;
165 break;
166 }
167 case IA_CMD_TYPE_INIT_CPY_IC_BSF_BUFF_OVER_QUERY: {
168 *pui_value = p_obj_drc->str_bit_handler.cpy_over_ic;
169 break;
170 }
171
172 case IA_CMD_TYPE_INIT_CPY_IL_BSF_BUFF_OVER_QUERY: {
173 *pui_value = p_obj_drc->str_bit_handler.cpy_over_il;
174 break;
175 }
176 case IA_CMD_TYPE_INIT_CPY_IN_BSF_BUFF_OVER_QUERY: {
177 *pui_value = p_obj_drc->str_bit_handler.cpy_over_in;
178 break;
179 }
180 case IA_CMD_TYPE_INIT_CPY_BSF_BUFF: {
181 memcpy(p_obj_drc->str_bit_handler.it_bit_buf +
182 p_obj_drc->str_bit_handler.num_bytes_bs,
183 p_obj_drc->pp_mem[2], p_obj_drc->str_bit_handler.num_byts_cur);
184 p_obj_drc->str_bit_handler.num_bytes_bs =
185 p_obj_drc->str_bit_handler.num_bytes_bs +
186 p_obj_drc->str_bit_handler.num_byts_cur;
187 break;
188 }
189 case IA_CMD_TYPE_INIT_CPY_IC_BSF_BUFF: {
190 memcpy(p_obj_drc->str_bit_handler.bitstream_drc_config +
191 p_obj_drc->str_bit_handler.num_bytes_bs_drc_config,
192 p_obj_drc->pp_mem[2],
193 p_obj_drc->str_bit_handler.num_byts_cur_ic);
194 p_obj_drc->str_bit_handler.num_bytes_bs_drc_config =
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->str_bit_handler.num_bytes_bs_loudness_info,
202 p_obj_drc->pp_mem[2],
203 p_obj_drc->str_bit_handler.num_byts_cur_il);
204 p_obj_drc->str_bit_handler.num_bytes_bs_loudness_info =
205 p_obj_drc->str_bit_handler.num_bytes_bs_loudness_info +
206 p_obj_drc->str_bit_handler.num_byts_cur_il;
207 break;
208 }
209 case IA_CMD_TYPE_INIT_CPY_IN_BSF_BUFF: {
210 memcpy(p_obj_drc->str_bit_handler.bitstream_unidrc_interface +
211 p_obj_drc->str_bit_handler.num_bytes_bs_unidrc_interface,
212 p_obj_drc->pp_mem[2],
213 p_obj_drc->str_bit_handler.num_byts_cur_in);
214 p_obj_drc->str_bit_handler.num_bytes_bs_unidrc_interface =
215 p_obj_drc->str_bit_handler.num_bytes_bs_unidrc_interface +
216 p_obj_drc->str_bit_handler.num_byts_cur_in;
217 break;
218 }
219 default: { return -1; }
220 };
221 break;
222 }
223 case IA_API_CMD_GET_CONFIG_PARAM: {
224 switch (i_idx) {
225 case IA_DRC_DEC_CONFIG_PARAM_SAMP_FREQ: {
226 *pus_value = p_obj_drc->str_config.sampling_rate;
227 break;
228 }
229
230 case IA_DRC_DEC_CONFIG_PARAM_NUM_CHANNELS: {
231 *pus_value = p_obj_drc->str_config.num_ch_out;
232 break;
233 }
234 case IA_DRC_DEC_CONFIG_PROC_OUT_PTR: {
235 *ps_value = (SIZE_T)p_obj_drc->str_payload.pstr_drc_sel_proc_output;
236 break;
237 }
238 }
239 break;
240 }
241 case IA_API_CMD_SET_CONFIG_PARAM: {
242 switch (i_idx) {
243 case IA_DRC_DEC_CONFIG_PARAM_DEC_TYPE: {
244 if (*pus_value == 1) {
245 p_obj_drc->str_config.dec_type = DEC_TYPE_TD_QMF64;
246 p_obj_drc->str_config.sub_band_domain_mode =
247 SUBBAND_DOMAIN_MODE_QMF64;
248 p_obj_drc->str_config.sub_band_down_sampling_factor =
249 AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF64;
250 p_obj_drc->str_config.sub_band_count =
251 AUDIO_CODEC_SUBBAND_COUNT_QMF64;
252 } else if (*pus_value == 2) {
253 p_obj_drc->str_config.dec_type = DEC_TYPE_QMF64;
254 p_obj_drc->str_config.sub_band_domain_mode =
255 SUBBAND_DOMAIN_MODE_QMF64;
256 p_obj_drc->str_config.sub_band_down_sampling_factor =
257 AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF64;
258 p_obj_drc->str_config.sub_band_count =
259 AUDIO_CODEC_SUBBAND_COUNT_QMF64;
260 } else if (*pus_value == 3) {
261 p_obj_drc->str_config.dec_type = DEC_TYPE_STFT256;
262 p_obj_drc->str_config.sub_band_domain_mode =
263 SUBBAND_DOMAIN_MODE_STFT256;
264 p_obj_drc->str_config.sub_band_down_sampling_factor =
265 AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_STFT256;
266 p_obj_drc->str_config.sub_band_count =
267 AUDIO_CODEC_SUBBAND_COUNT_STFT256;
268 } else {
269 p_obj_drc->str_config.dec_type = DEC_TYPE_TD;
270 p_obj_drc->str_config.sub_band_domain_mode =
271 SUBBAND_DOMAIN_MODE_OFF;
272 }
273
274 if (*pus_value < 0 || *pus_value > 3) {
275 return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_DECODE_TYPE;
276 }
277 break;
278 }
279 case IA_DRC_DEC_CONFIG_PARAM_CTRL_PARAM: {
280 if (*pus_value < 1 || *pus_value > 39) {
281 return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_CTRL_PARAM_IDX;
282 }
283 p_obj_drc->str_config.control_parameter_index = *pus_value;
284 break;
285 }
286 case IA_DRC_DEC_CONFIG_PARAM_PEAK_LIMITER: {
287 if (*pus_value < 0 || *pus_value > 1) {
288 return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_PEAK_LIM_FLAG;
289 }
290 p_obj_drc->str_config.peak_limiter = *pus_value;
291 break;
292 }
293
294 case IA_DRC_DEC_CONFIG_PARAM_VER_MODE: {
295 break;
296 }
297 case IA_DRC_DEC_CONFIG_PARAM_SAMP_FREQ: {
298 if (*pus_value < 8000 || *pus_value > 96000) {
299 return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_SAMP_FREQ;
300 }
301 p_obj_drc->str_config.sampling_rate = *pus_value;
302 break;
303 }
304 case IA_DRC_DEC_CONFIG_PARAM_NUM_CHANNELS: {
305 p_obj_drc->str_config.num_ch_in = *pus_value;
306 if (*pus_value < 1 || *pus_value > MAX_CHANNEL_COUNT) {
307 return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_NUM_OF_CHANNELS;
308 }
309 break;
310 }
311
312 case IA_DRC_DEC_CONFIG_PARAM_PCM_WDSZ: {
313 if ((*pus_value != 16) && (*pus_value != 32)) {
314 return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_PCM_SIZE;
315 }
316
317 p_obj_drc->str_config.pcm_size = *pus_value;
318
319 break;
320 }
321
322 case IA_DRC_DEC_CONFIG_PARAM_BITS_FORMAT: {
323 if ((*pus_value != 1) && (*pus_value != 0)) {
324 return -1;
325 }
326 p_obj_drc->str_config.bitstream_file_format = *pus_value;
327
328 break;
329 }
330 case IA_DRC_DEC_CONFIG_PARAM_INT_PRESENT: {
331 if ((*pus_value != 1) && (*pus_value != 0)) {
332 return -1;
333 }
334 p_obj_drc->str_config.interface_bitstream_present = *pus_value;
335
336 break;
337 }
338 case IA_DRC_DEC_CONFIG_PARAM_DELAY_MODE: {
339 if ((*pus_value != 1) && (*pus_value != 0)) {
340 return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_DELAY_MODE;
341 }
342 p_obj_drc->str_config.delay_mode = *pus_value;
343
344 break;
345 }
346 case IA_DRC_DEC_CONFIG_PARAM_GAIN_DELAY: {
347 if ((*pus_value > MAX_SIGNAL_DELAY) || (*pus_value < 0)) {
348 return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_GAIN_DELAY;
349 }
350
351 p_obj_drc->str_config.gain_delay_samples = *pus_value;
352
353 break;
354 }
355
356 /*Sujith: introduce error*/
357 case IA_DRC_DEC_CONFIG_PARAM_AUDIO_DELAY: {
358 break;
359 }
360 case IA_DRC_DEC_CONFIG_PARAM_CON_DELAY_MODE: {
361 if (*pus_value < 0 || *pus_value > 1) {
362 return IA_DRC_DEC_CONFIG_PARAM_CON_DELAY_MODE;
363 }
364 p_obj_drc->str_config.constant_delay_on = *pus_value;
365
366 break;
367 }
368 case IA_DRC_DEC_CONFIG_PARAM_ABSO_DELAY_OFF: {
369 p_obj_drc->str_config.absorb_delay_on = *pus_value;
370
371 break;
372 }
373 case IA_DRC_DEC_CONFIG_PARAM_FRAME_SIZE: {
374 if (*pus_value < 1 || *pus_value > 4096) {
375 return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_FRAME_SIZE;
376 }
377
378 p_obj_drc->str_config.frame_size = *pus_value;
379
380 break;
381 }
382 case IA_DRC_DEC_CONFIG_GAIN_STREAM_FLAG: {
383 p_obj_drc->str_bit_handler.gain_stream_flag = *pus_value;
384 break;
385 }
386
387 case IA_DRC_DEC_CONFIG_DRC_EFFECT_TYPE: {
388 p_obj_drc->str_config.effect_type = *pus_value;
389 break;
390 }
391 case IA_DRC_DEC_CONFIG_DRC_TARGET_LOUDNESS: {
392 p_obj_drc->str_config.target_loudness = *pus_value;
393 break;
394 }
395 case IA_DRC_DEC_CONFIG_DRC_LOUD_NORM: {
396 p_obj_drc->str_config.loud_norm_flag = *pus_value;
397 break;
398 }
399
400 default: { return -1; }
401 }
402 break;
403 }
404 case IA_API_CMD_GET_MEMTABS_SIZE: {
405 break;
406 }
407 case IA_API_CMD_SET_MEMTABS_PTR: {
408 break;
409 }
410 case IA_API_CMD_GET_N_MEMTABS: {
411 *pui_value = NUM_DRC_TABLES;
412 break;
413 }
414 case IA_API_CMD_GET_N_TABLES: {
415 break;
416 }
417
418 case IA_API_CMD_EXECUTE: {
419 switch (i_idx) {
420 case IA_CMD_TYPE_DO_EXECUTE: {
421 if (p_obj_drc->str_config.dec_type == DEC_TYPE_TD) {
422 error_code = impd_process_time_domain(p_obj_drc);
423 } else if (p_obj_drc->str_config.dec_type == DEC_TYPE_QMF64) {
424 error_code = impd_init_process_audio_main_qmf(p_obj_drc);
425 } else if (p_obj_drc->str_config.dec_type == DEC_TYPE_STFT256) {
426 error_code = impd_init_process_audio_main_stft(p_obj_drc);
427 } else if (p_obj_drc->str_config.dec_type == DEC_TYPE_TD_QMF64) {
428 error_code = impd_init_process_audio_main_td_qmf(p_obj_drc);
429 }
430 break;
431 }
432 case IA_CMD_TYPE_DONE_QUERY: {
433 *pui_value = p_obj_drc->p_state->ui_exe_done;
434 break;
435 }
436 default: { return -1; }
437 };
438 break;
439 }
440 case IA_API_CMD_PUT_INPUT_QUERY: {
441 *pui_value = 1;
442 break;
443 }
444 case IA_API_CMD_GET_CURIDX_INPUT_BUF: {
445 UWORD32 ui_in_buf_size = p_obj_drc->p_mem_info[IA_DRC_INPUT_IDX].ui_size;
446 UWORD32 ui_in_bytes = p_obj_drc->p_state->ui_in_bytes;
447 *pui_value = ui_in_buf_size > ui_in_bytes ? ui_in_bytes : ui_in_buf_size;
448 break;
449 }
450 case IA_API_CMD_SET_INPUT_BYTES: {
451 p_obj_drc->p_state->ui_in_bytes = *pui_value;
452 break;
453 }
454
455 case IA_API_CMD_GET_OUTPUT_BYTES: {
456 *pui_value = p_obj_drc->p_state->ui_out_bytes;
457 break;
458 }
459 case IA_API_CMD_INPUT_OVER: {
460 p_obj_drc->p_state->ui_exe_done = 1;
461 break;
462 }
463 case IA_API_CMD_INPUT_OVER_BS: {
464 p_obj_drc->str_bit_handler.cpy_over = 1;
465 break;
466 }
467 case IA_API_CMD_INPUT_OVER_IC_BS: {
468 p_obj_drc->str_bit_handler.cpy_over_ic = 1;
469 break;
470 }
471 case IA_API_CMD_INPUT_OVER_IL_BS: {
472 p_obj_drc->str_bit_handler.cpy_over_il = 1;
473 break;
474 }
475 case IA_API_CMD_INPUT_OVER_IN_BS: {
476 p_obj_drc->str_bit_handler.cpy_over_in = 1;
477 break;
478 }
479 case IA_API_CMD_SET_INPUT_BYTES_BS: {
480 p_obj_drc->str_bit_handler.num_byts_cur = *pus_value;
481 break;
482 }
483 case IA_API_CMD_SET_INPUT_BYTES_IC_BS: {
484 p_obj_drc->str_bit_handler.num_byts_cur_ic = *pus_value;
485 break;
486 }
487 case IA_API_CMD_SET_INPUT_BYTES_IL_BS: {
488 p_obj_drc->str_bit_handler.num_byts_cur_il = *pus_value;
489 break;
490 }
491 case IA_API_CMD_SET_INPUT_BYTES_IN_BS: {
492 p_obj_drc->str_bit_handler.num_byts_cur_in = *pus_value;
493 break;
494 }
495 default: { return -1; }
496 };
497 return error_code;
498 }
499
impd_drc_mem_api(ia_drc_api_struct * p_obj_drc,WORD32 i_cmd,WORD32 i_idx,pVOID pv_value)500 IA_ERRORCODE impd_drc_mem_api(ia_drc_api_struct *p_obj_drc, WORD32 i_cmd,
501 WORD32 i_idx, pVOID pv_value) {
502 pUWORD32 pui_value = pv_value;
503
504 switch (i_cmd) {
505 case IA_API_CMD_GET_MEM_INFO_SIZE: {
506 *pui_value = p_obj_drc->p_mem_info[i_idx].ui_size;
507 break;
508 }
509 case IA_API_CMD_GET_MEM_INFO_ALIGNMENT: {
510 *pui_value = p_obj_drc->p_mem_info[i_idx].ui_alignment;
511 break;
512 }
513 case IA_API_CMD_GET_MEM_INFO_TYPE: {
514 *pui_value = p_obj_drc->p_mem_info[i_idx].ui_type;
515 break;
516 }
517 case IA_API_CMD_GET_MEM_INFO_PLACEMENT: {
518 *pui_value = p_obj_drc->p_mem_info[i_idx].ui_placement[0];
519 *(pui_value + 1) = p_obj_drc->p_mem_info[i_idx].ui_placement[1];
520 break;
521 }
522 case IA_API_CMD_GET_MEM_INFO_PRIORITY: {
523 *pui_value = p_obj_drc->p_mem_info[i_idx].ui_priority;
524 break;
525 }
526 case IA_API_CMD_SET_MEM_PTR: {
527 pWORD8 pbtemp;
528 UWORD32 sz;
529 if (pv_value == 0) {
530 return (-1);
531 }
532 if (((SIZE_T)pv_value % p_obj_drc->p_mem_info[i_idx].ui_alignment) != 0) {
533 return (-1);
534 }
535 p_obj_drc->pp_mem[i_idx] = pv_value;
536 pbtemp = p_obj_drc->pp_mem[i_idx];
537 sz = p_obj_drc->p_mem_info[i_idx].ui_size;
538
539 memset(pbtemp, 0, sz);
540 }
541 case IA_API_CMD_SET_MEM_PLACEMENT: {
542 }
543 };
544 return IA_NO_ERROR;
545 }
546
impd_drc_fill_mem_tables(ia_drc_api_struct * p_obj_drc)547 IA_ERRORCODE impd_drc_fill_mem_tables(ia_drc_api_struct *p_obj_drc) {
548 ia_mem_info_struct *p_mem_info;
549 {
550 p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_PERSIST_IDX];
551 p_mem_info->ui_size = 64 * 1024 * 1024;
552 p_mem_info->ui_alignment = 8;
553 p_mem_info->ui_type = IA_MEMTYPE_PERSIST;
554 p_mem_info->ui_placement[0] = 0;
555 p_mem_info->ui_placement[1] = 0;
556 p_mem_info->ui_priority = IA_MEMPRIORITY_ANYWHERE;
557 p_mem_info->ui_placed[0] = 0;
558 p_mem_info->ui_placed[1] = 0;
559 }
560 {
561 p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_INPUT_IDX];
562 p_mem_info->ui_size = p_obj_drc->str_config.frame_size *
563 (p_obj_drc->str_config.pcm_size >> 3) *
564 p_obj_drc->str_config.num_ch_in;
565 p_mem_info->ui_alignment = 4;
566 p_mem_info->ui_type = IA_MEMTYPE_INPUT;
567 p_mem_info->ui_placement[0] = 0;
568 p_mem_info->ui_placement[1] = 0;
569 p_mem_info->ui_priority = IA_MEMPRIORITY_ANYWHERE;
570 p_mem_info->ui_placed[0] = 0;
571 p_mem_info->ui_placed[1] = 0;
572 }
573 {
574 p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_OUTPUT_IDX];
575 p_mem_info->ui_size = p_obj_drc->str_config.frame_size *
576 (p_obj_drc->str_config.pcm_size >> 3) *
577 p_obj_drc->str_config.num_ch_in;
578 p_mem_info->ui_alignment = 4;
579 p_mem_info->ui_type = IA_MEMTYPE_OUTPUT;
580 p_mem_info->ui_placement[0] = 0;
581 p_mem_info->ui_placement[1] = 0;
582 p_mem_info->ui_priority = IA_MEMPRIORITY_ANYWHERE;
583 p_mem_info->ui_placed[0] = 0;
584 p_mem_info->ui_placed[1] = 0;
585 }
586 {
587 p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_SCRATCH_IDX];
588 p_mem_info->ui_size = SCRATCH_MEM_SIZE;
589 p_mem_info->ui_alignment = 8;
590 p_mem_info->ui_type = IA_MEMTYPE_SCRATCH;
591 p_mem_info->ui_placement[0] = 0;
592 p_mem_info->ui_placement[1] = 0;
593 p_mem_info->ui_priority = IA_MEMPRIORITY_ANYWHERE;
594 p_mem_info->ui_placed[0] = 0;
595 p_mem_info->ui_placed[1] = 0;
596 }
597 return IA_NO_ERROR;
598 }
599