Home | History | Annotate | Download | only in drc_src
      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