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 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 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 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