diff options
-rw-r--r-- | decoder/drc_src/impd_drc_api.c | 63 | ||||
-rw-r--r-- | decoder/drc_src/impd_drc_common.h | 44 | ||||
-rw-r--r-- | decoder/drc_src/impd_drc_eq.h | 5 | ||||
-rw-r--r-- | decoder/drc_src/impd_drc_gain_decoder.c | 48 | ||||
-rw-r--r-- | decoder/drc_src/impd_drc_init.c | 51 | ||||
-rw-r--r-- | decoder/ixheaacd_api.c | 19 | ||||
-rw-r--r-- | decoder/ixheaacd_channel.c | 3 | ||||
-rw-r--r-- | decoder/ixheaacd_headerdecode.c | 3 | ||||
-rw-r--r-- | decoder/ixheaacd_huff_code_reorder.c | 40 | ||||
-rw-r--r-- | decoder/ixheaacd_qmf_dec.c | 54 | ||||
-rw-r--r-- | test/ixheaacd_main.c | 23 |
11 files changed, 234 insertions, 119 deletions
diff --git a/decoder/drc_src/impd_drc_api.c b/decoder/drc_src/impd_drc_api.c index 0b40d94..c0edced 100644 --- a/decoder/drc_src/impd_drc_api.c +++ b/decoder/drc_src/impd_drc_api.c @@ -64,8 +64,41 @@ IA_ERRORCODE impd_drc_set_default_config(ia_drc_api_struct *p_obj_drc); IA_ERRORCODE impd_drc_set_struct_pointer(ia_drc_api_struct *p_obj_drc); IA_ERRORCODE impd_process_time_domain(ia_drc_api_struct *p_obj_drc); +#define SUBBAND_BUF_SIZE \ + NUM_ELE_IN_CPLX_NUM *MAX_CHANNEL_COUNT * sizeof(FLOAT32 *) + \ + (MAX_SUBBAND_DELAY + MAX_DRC_FRAME_SIZE) * MAX_CHANNEL_COUNT * \ + sizeof(FLOAT32) * NUM_ELE_IN_CPLX_NUM + #define NUM_DRC_TABLES 4 -#define SCRATCH_MEM_SIZE 1024 * 256 * 64 +#define SCRATCH_MEM_SIZE \ + (AUDIO_CODEC_FRAME_SIZE_MAX * MAX_CHANNEL_COUNT * sizeof(FLOAT32) * \ + NUM_ELE_IN_CPLX_NUM) + +#define PERSIST_MEM_SIZE \ + (sizeof(ia_drc_state_struct) + sizeof(ia_drc_bits_dec_struct) + \ + sizeof(ia_drc_gain_dec_struct) * 2 + \ + sizeof(ia_drc_loudness_info_set_struct) + sizeof(ia_drc_gain_struct) + \ + sizeof(ia_drc_interface_struct) + sizeof(ia_drc_config) + \ + sizeof(ia_drc_sel_pro_struct) + sizeof(ia_drc_sel_proc_params_struct) + \ + sizeof(ia_drc_sel_proc_output_struct) + \ + sizeof(ia_drc_peak_limiter_struct) + sizeof(ia_drc_peak_limiter_struct) + \ + sizeof(ia_drc_qmf_filt_struct) + ANALY_BUF_SIZE + SYNTH_BUF_SIZE + \ + PEAK_LIM_BUF_SIZE + MAX_BS_BUF_SIZE + /*DRC Config Bitstream*/ \ + MAX_DRC_CONFG_BUF_SIZE + /*DRC loudness info Bitstream*/ \ + MAX_LOUD_INFO_BUF_SIZE + /*DRC interface Bitstream*/ \ + MAX_INTERFACE_BUF_SIZE + \ + NUM_GAIN_DEC_INSTANCES * \ + (SEL_DRC_COUNT * sizeof(ia_interp_buf_struct) * MAX_GAIN_ELE_COUNT + \ + sizeof(ia_eq_set_struct) + /*non_interleaved_audio*/ \ + MAX_CHANNEL_COUNT * sizeof(FLOAT32 *) + \ + MAX_DRC_FRAME_SIZE * sizeof(FLOAT32) * \ + MAX_CHANNEL_COUNT + /*audio_in_out_buf ptr*/ \ + MAX_CHANNEL_COUNT * sizeof(FLOAT32 *) + /*audio_io_buffer_delayed*/ \ + MAX_CHANNEL_COUNT * sizeof(FLOAT32 *) + \ + MAX_DRC_FRAME_SIZE * sizeof(FLOAT32) * \ + MAX_CHANNEL_COUNT + /*subband band buffer ptr*/ \ + NUM_ELE_IN_CPLX_NUM * MAX_CHANNEL_COUNT * sizeof(FLOAT32 *) + \ + SUBBAND_BUF_SIZE + (PARAM_DRC_MAX_BUF_SZ * MAX_CHANNEL_COUNT))) IA_ERRORCODE ia_drc_dec_api(pVOID p_ia_drc_dec_obj, WORD32 i_cmd, WORD32 i_idx, pVOID pv_value) { @@ -111,8 +144,7 @@ IA_ERRORCODE ia_drc_dec_api(pVOID p_ia_drc_dec_obj, WORD32 i_cmd, WORD32 i_idx, break; } case IA_API_CMD_GET_API_SIZE: { - *pui_value = sizeof(ia_drc_api_struct) + - (sizeof(ia_drc_state_struct) + 8) + 8080 * 1024; + *pui_value = sizeof(ia_drc_api_struct); break; } @@ -120,7 +152,8 @@ IA_ERRORCODE ia_drc_dec_api(pVOID p_ia_drc_dec_obj, WORD32 i_cmd, WORD32 i_idx, switch (i_idx) { case IA_CMD_TYPE_INIT_SET_BUFF_PTR: { p_obj_drc->p_state->persistant_ptr = - p_obj_drc->pp_mem[IA_DRC_PERSIST_IDX]; + (UWORD8 *)p_obj_drc->pp_mem[IA_DRC_PERSIST_IDX] + + sizeof(ia_drc_state_struct); impd_drc_set_struct_pointer(p_obj_drc); break; @@ -130,11 +163,6 @@ IA_ERRORCODE ia_drc_dec_api(pVOID p_ia_drc_dec_obj, WORD32 i_cmd, WORD32 i_idx, break; } case IA_CMD_TYPE_INIT_API_POST_CONFIG_PARAMS: { - p_obj_drc->p_state = - (ia_drc_state_struct *)((SIZE_T)p_obj_drc + 8000 * 1024); - p_obj_drc->p_mem_info = - (ia_mem_info_struct *)((SIZE_T)p_obj_drc + 8002 * 1024); - p_obj_drc->pp_mem = (pVOID)((SIZE_T)p_obj_drc + 8006 * 1024); impd_drc_fill_mem_tables(p_obj_drc); break; } @@ -402,9 +430,15 @@ IA_ERRORCODE ia_drc_dec_api(pVOID p_ia_drc_dec_obj, WORD32 i_cmd, WORD32 i_idx, break; } case IA_API_CMD_GET_MEMTABS_SIZE: { + *pui_value = + (sizeof(ia_mem_info_struct) + sizeof(pVOID *)) * (NUM_DRC_TABLES); break; } case IA_API_CMD_SET_MEMTABS_PTR: { + p_obj_drc->p_mem_info = (ia_mem_info_struct *)(ps_value); + p_obj_drc->pp_mem = + (pVOID)((SIZE_T)p_obj_drc->p_mem_info + + (NUM_DRC_TABLES * sizeof(*(p_obj_drc->p_mem_info)))); break; } case IA_API_CMD_GET_N_MEMTABS: { @@ -535,8 +569,11 @@ IA_ERRORCODE impd_drc_mem_api(ia_drc_api_struct *p_obj_drc, WORD32 i_cmd, p_obj_drc->pp_mem[i_idx] = pv_value; pbtemp = p_obj_drc->pp_mem[i_idx]; sz = p_obj_drc->p_mem_info[i_idx].ui_size; - + if (IA_MEMTYPE_PERSIST == i_idx) { + p_obj_drc->p_state = pv_value; + } memset(pbtemp, 0, sz); + break; } case IA_API_CMD_SET_MEM_PLACEMENT: { } @@ -548,7 +585,8 @@ IA_ERRORCODE impd_drc_fill_mem_tables(ia_drc_api_struct *p_obj_drc) { ia_mem_info_struct *p_mem_info; { p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_PERSIST_IDX]; - p_mem_info->ui_size = 64 * 1024 * 1024; + memset(p_mem_info, 0, sizeof(*p_mem_info)); + p_mem_info->ui_size = PERSIST_MEM_SIZE; p_mem_info->ui_alignment = 8; p_mem_info->ui_type = IA_MEMTYPE_PERSIST; p_mem_info->ui_placement[0] = 0; @@ -559,6 +597,7 @@ IA_ERRORCODE impd_drc_fill_mem_tables(ia_drc_api_struct *p_obj_drc) { } { p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_INPUT_IDX]; + memset(p_mem_info, 0, sizeof(*p_mem_info)); p_mem_info->ui_size = p_obj_drc->str_config.frame_size * (p_obj_drc->str_config.pcm_size >> 3) * p_obj_drc->str_config.num_ch_in; @@ -572,6 +611,7 @@ IA_ERRORCODE impd_drc_fill_mem_tables(ia_drc_api_struct *p_obj_drc) { } { p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_OUTPUT_IDX]; + memset(p_mem_info, 0, sizeof(*p_mem_info)); p_mem_info->ui_size = p_obj_drc->str_config.frame_size * (p_obj_drc->str_config.pcm_size >> 3) * p_obj_drc->str_config.num_ch_in; @@ -585,6 +625,7 @@ IA_ERRORCODE impd_drc_fill_mem_tables(ia_drc_api_struct *p_obj_drc) { } { p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_SCRATCH_IDX]; + memset(p_mem_info, 0, sizeof(*p_mem_info)); p_mem_info->ui_size = SCRATCH_MEM_SIZE; p_mem_info->ui_alignment = 8; p_mem_info->ui_type = IA_MEMTYPE_SCRATCH; diff --git a/decoder/drc_src/impd_drc_common.h b/decoder/drc_src/impd_drc_common.h index 2da2542..2afe708 100644 --- a/decoder/drc_src/impd_drc_common.h +++ b/decoder/drc_src/impd_drc_common.h @@ -30,9 +30,10 @@ extern "C" { #define ENABLE_ADDITIONAL_TESTS 1 -#define SPEAKER_POS_COUNT_MAX 128 +#define SPEAKER_POS_COUNT_MAX (8) // 128 #define DOWNMIX_COEFF_COUNT_MAX 32 * 32 -#define MAX_CHANNEL_COUNT 128 +#define MAX_CHANNEL_COUNT (8) // 128 +#define MAX_SUBBAND_CHANNEL_COUNT (128) #define BAND_COUNT_MAX 8 #define SEQUENCE_COUNT_MAX 24 #define GAIN_SET_COUNT_MAX SEQUENCE_COUNT_MAX @@ -50,6 +51,42 @@ extern "C" { #define DOWNMIX_ID_COUNT_MAX 8 #define MAX_SIGNAL_DELAY 4500 +#define NUM_ELE_IN_CPLX_NUM 2 +#define MAX_BS_BUF_SIZE 768 +#define MAX_DRC_CONFG_BUF_SIZE MAX_BS_BUF_SIZE +#define MAX_LOUD_INFO_BUF_SIZE MAX_BS_BUF_SIZE +#define MAX_INTERFACE_BUF_SIZE MAX_BS_BUF_SIZE +#define MAX_GAIN_ELE_COUNT 15 /*MAX 4-bit Value*/ + +#define NUM_GAIN_DEC_INSTANCES 2 + +#define MAX_DRC_FRAME_SIZE AUDIO_CODEC_FRAME_SIZE_MAX +#define ANALY_BUF_SIZE \ + (AUDIO_CODEC_FRAME_SIZE_MAX * MAX_CHANNEL_COUNT * sizeof(FLOAT32) * \ + NUM_ELE_IN_CPLX_NUM) +#define SYNTH_BUF_SIZE \ + (AUDIO_CODEC_FRAME_SIZE_MAX * MAX_CHANNEL_COUNT * sizeof(FLOAT32) * \ + NUM_ELE_IN_CPLX_NUM) +#define PEAK_LIM_BUF_SIZE \ + (AUDIO_CODEC_FRAME_SIZE_MAX * MAX_CHANNEL_COUNT * sizeof(FLOAT32) * \ + NUM_ELE_IN_CPLX_NUM) + +/*7 bits read from the bitstream*/ +#define MAX_PARAM_DRC_LOOK_AHEAD_VAL 127 + +#define MAX_PARAM_DRC_LIM_ATTACK_VAL MAX_PARAM_DRC_LOOK_AHEAD_VAL +#define MAX_SAMP_FREQ_IN_KHZ 96 +#define MAX_ATTACK_VAL (MAX_PARAM_DRC_LOOK_AHEAD_VAL * MAX_SAMP_FREQ_IN_KHZ) + +/*int(sqrt(MAX_ATTACK_VAL + 1))*/ +#define MAX_SEC_LEN 110 +#define MAX_NUMBUF_SEC_VAL (MAX_ATTACK_VAL / MAX_SEC_LEN) + +/*(MAX_NUMBUF_SEC_VAL * MAX_SEC_LEN)*/ +#define PARAM_DRC_MAX_BUF_SZ 110 + +#define MAX_SUBBAND_DELAY (MAX_SIGNAL_DELAY / AUDIO_CODEC_SUBBAND_COUNT_QMF64) + #define DRC_BAND_COUNT_MAX BAND_COUNT_MAX #define SPLIT_CHARACTERISTIC_COUNT_MAX 8 #define GAIN_SET_COUNT_MAX SEQUENCE_COUNT_MAX @@ -150,6 +187,7 @@ extern "C" { #define PARAM_DRC_TYPE_LIM_THRESHOLD_DEFAULT (-1.f) #define PARAM_DRC_TYPE_LIM_ATTACK_DEFAULT 5 #define PARAM_DRC_TYPE_LIM_RELEASE_DEFAULT 50 +#define MAX_LOUDNESS_INFO_COUNT (16) #define MAX_LOUDNESS_INFO_COUNT (16) @@ -200,7 +238,7 @@ typedef struct ia_drc_sel_proc_output_struct { WORD32 target_channel_count; WORD32 target_layout; WORD32 downmix_matrix_present; - FLOAT32 downmix_matrix[MAX_CHANNEL_COUNT][MAX_CHANNEL_COUNT]; + FLOAT32 downmix_matrix[MAX_SUBBAND_CHANNEL_COUNT][MAX_SUBBAND_CHANNEL_COUNT]; FLOAT32 boost; FLOAT32 compress; diff --git a/decoder/drc_src/impd_drc_eq.h b/decoder/drc_src/impd_drc_eq.h index dfcf0aa..d45e7ed 100644 --- a/decoder/drc_src/impd_drc_eq.h +++ b/decoder/drc_src/impd_drc_eq.h @@ -24,7 +24,6 @@ #endif #define EQ_CHANNEL_COUNT_MAX 8 -#define EQ_AUDIO_DELAY_MAX 1024 #define EQ_FIR_FILTER_SIZE_MAX 128 #define EQ_SUBBAND_COUNT_MAX 256 #define EQ_INTERMEDIATE_2ND_ORDER_PARAMS_COUNT_MAX 32 @@ -38,6 +37,10 @@ #define EQ_FILTER_DOMAIN_TIME (1 << 0) #define EQ_FILTER_DOMAIN_SUBBAND (1 << 1) +#define EQ_REAL_ZERO_CNT 63 /*Max Value of a 6 bit number*/ +#define EQ_GENERIC_ZERO_CNT 63 /*Max Value of a 6 bit number*/ +#define EQ_AUDIO_DELAY_MAX (EQ_REAL_ZERO_CNT + (EQ_GENERIC_ZERO_CNT * 2)) + #ifdef __cplusplus extern "C" { #endif diff --git a/decoder/drc_src/impd_drc_gain_decoder.c b/decoder/drc_src/impd_drc_gain_decoder.c index 4b48f54..829f576 100644 --- a/decoder/drc_src/impd_drc_gain_decoder.c +++ b/decoder/drc_src/impd_drc_gain_decoder.c @@ -187,7 +187,7 @@ IA_ERRORCODE impd_init_drc_decode_post_config( } p_drc_gain_dec_structs->eq_set = (ia_eq_set_struct*)*mem_ptr; - *mem_ptr = (pVOID)((SIZE_T)*mem_ptr + sizeof(ia_eq_set_struct) + 32); + *mem_ptr = (pVOID)((SIZE_T)*mem_ptr + sizeof(ia_eq_set_struct)); if (err_code) return (err_code); @@ -217,14 +217,13 @@ IA_ERRORCODE impd_init_drc_decode_post_config( p_drc_gain_dec_structs->audio_band_buffer.non_interleaved_audio = *mem_ptr; *mem_ptr = (pVOID)((SIZE_T)*mem_ptr + - (maxMultibandAudioSignalCount * sizeof(FLOAT32*)) + 32); + (maxMultibandAudioSignalCount * sizeof(FLOAT32*))); for (i = 0; i < maxMultibandAudioSignalCount; i++) { p_drc_gain_dec_structs->audio_band_buffer.non_interleaved_audio[i] = *mem_ptr; - *mem_ptr = - (pVOID)((SIZE_T)*mem_ptr + - (p_drc_params_struct->drc_frame_size * sizeof(FLOAT32)) + 32); + *mem_ptr = (pVOID)((SIZE_T)*mem_ptr + + (p_drc_params_struct->drc_frame_size * sizeof(FLOAT32))); } p_drc_gain_dec_structs->audio_band_buffer.multiband_audio_sig_count = maxMultibandAudioSignalCount; @@ -235,21 +234,18 @@ IA_ERRORCODE impd_init_drc_decode_post_config( if (p_drc_params_struct->sub_band_domain_mode == SUBBAND_DOMAIN_MODE_OFF && p_audio_in_out_buf->audio_delay_samples) { p_audio_in_out_buf->audio_io_buffer_delayed = *mem_ptr; - *mem_ptr = - (pVOID)((SIZE_T)*mem_ptr + - (p_audio_in_out_buf->audio_num_chan * sizeof(FLOAT32*)) + 32); + *mem_ptr = (pVOID)((SIZE_T)*mem_ptr + + (p_audio_in_out_buf->audio_num_chan * sizeof(FLOAT32*))); p_audio_in_out_buf->audio_in_out_buf = *mem_ptr; - *mem_ptr = - (pVOID)((SIZE_T)*mem_ptr + - (p_audio_in_out_buf->audio_num_chan * sizeof(FLOAT32*)) + 32); + *mem_ptr = (pVOID)((SIZE_T)*mem_ptr + + (p_audio_in_out_buf->audio_num_chan * sizeof(FLOAT32*))); for (i = 0; i < p_audio_in_out_buf->audio_num_chan; i++) { p_audio_in_out_buf->audio_io_buffer_delayed[i] = *mem_ptr; *mem_ptr = (pVOID)((SIZE_T)*mem_ptr + ((p_audio_in_out_buf->frame_size + p_audio_in_out_buf->audio_delay_samples) * - sizeof(FLOAT32*)) + - 32); + sizeof(FLOAT32*))); p_audio_in_out_buf->audio_in_out_buf[i] = &p_audio_in_out_buf->audio_io_buffer_delayed [i][p_audio_in_out_buf->audio_delay_samples]; @@ -258,35 +254,29 @@ IA_ERRORCODE impd_init_drc_decode_post_config( if (p_drc_params_struct->sub_band_domain_mode != SUBBAND_DOMAIN_MODE_OFF && p_audio_in_out_buf->audio_delay_sub_band_samples) { p_audio_in_out_buf->audio_buffer_delayed_real = *mem_ptr; - *mem_ptr = - (pVOID)((SIZE_T)*mem_ptr + - (p_audio_in_out_buf->audio_num_chan * sizeof(FLOAT32*)) + 32); + *mem_ptr = (pVOID)((SIZE_T)*mem_ptr + + (p_audio_in_out_buf->audio_num_chan * sizeof(FLOAT32*))); p_audio_in_out_buf->audio_buffer_delayed_imag = *mem_ptr; - *mem_ptr = - (pVOID)((SIZE_T)*mem_ptr + - (p_audio_in_out_buf->audio_num_chan * sizeof(FLOAT32*)) + 32); + *mem_ptr = (pVOID)((SIZE_T)*mem_ptr + + (p_audio_in_out_buf->audio_num_chan * sizeof(FLOAT32*))); p_audio_in_out_buf->audio_real_buff = *mem_ptr; - *mem_ptr = - (pVOID)((SIZE_T)*mem_ptr + - (p_audio_in_out_buf->audio_num_chan * sizeof(FLOAT32*)) + 32); + *mem_ptr = (pVOID)((SIZE_T)*mem_ptr + + (p_audio_in_out_buf->audio_num_chan * sizeof(FLOAT32*))); p_audio_in_out_buf->audio_imag_buff = *mem_ptr; - *mem_ptr = - (pVOID)((SIZE_T)*mem_ptr + - (p_audio_in_out_buf->audio_num_chan * sizeof(FLOAT32*)) + 32); + *mem_ptr = (pVOID)((SIZE_T)*mem_ptr + + (p_audio_in_out_buf->audio_num_chan * sizeof(FLOAT32*))); for (i = 0; i < p_audio_in_out_buf->audio_num_chan; i++) { p_audio_in_out_buf->audio_buffer_delayed_real[i] = *mem_ptr; *mem_ptr = (pVOID)((SIZE_T)*mem_ptr + ((p_audio_in_out_buf->audio_sub_band_frame_size + p_audio_in_out_buf->audio_delay_sub_band_samples) * - sizeof(FLOAT32*)) + - 32); + sizeof(FLOAT32*))); p_audio_in_out_buf->audio_buffer_delayed_imag[i] = *mem_ptr; *mem_ptr = (pVOID)((SIZE_T)*mem_ptr + ((p_audio_in_out_buf->audio_sub_band_frame_size + p_audio_in_out_buf->audio_delay_sub_band_samples) * - sizeof(FLOAT32*)) + - 32); + sizeof(FLOAT32*))); p_audio_in_out_buf->audio_real_buff[i] = &p_audio_in_out_buf->audio_buffer_delayed_real diff --git a/decoder/drc_src/impd_drc_init.c b/decoder/drc_src/impd_drc_init.c index cd6d467..14830ed 100644 --- a/decoder/drc_src/impd_drc_init.c +++ b/decoder/drc_src/impd_drc_init.c @@ -22,7 +22,7 @@ #include <string.h> #include "impd_type_def.h" #include "impd_error_standards.h" - +#include <string.h> #include "impd_drc_extr_delta_coded_info.h" #include "impd_drc_common.h" #include "impd_drc_struct.h" @@ -62,8 +62,6 @@ impd_drc_dec_interface_add_effect_type( ia_drc_interface_struct *pstr_drc_interface, WORD32 drc_effect_type, WORD32 target_loudness, WORD32 loud_norm); -#define NUM_GAIN_DEC_INSTANCES 2 - #define BITSTREAM_FILE_FORMAT_SPLIT 1 #define LIM_DEFAULT_THRESHOLD (0.89125094f) @@ -279,79 +277,73 @@ IA_ERRORCODE impd_drc_set_struct_pointer(ia_drc_api_struct *p_obj_drc) { p_obj_drc->str_payload.pstr_bitstream_dec = (ia_drc_bits_dec_struct *)persistant_ptr; - persistant_ptr = (SIZE_T)persistant_ptr + sizeof(ia_drc_bits_dec_struct) + 32; + persistant_ptr = persistant_ptr + sizeof(ia_drc_bits_dec_struct); p_obj_drc->str_payload.pstr_gain_dec[0] = (ia_drc_gain_dec_struct *)persistant_ptr; - persistant_ptr = (SIZE_T)persistant_ptr + sizeof(ia_drc_gain_dec_struct) + 32; + persistant_ptr = persistant_ptr + sizeof(ia_drc_gain_dec_struct); p_obj_drc->str_payload.pstr_gain_dec[1] = (ia_drc_gain_dec_struct *)persistant_ptr; - persistant_ptr = (SIZE_T)persistant_ptr + sizeof(ia_drc_gain_dec_struct) + 32; + persistant_ptr = persistant_ptr + sizeof(ia_drc_gain_dec_struct); p_obj_drc->str_payload.pstr_loudness_info = (ia_drc_loudness_info_set_struct *)persistant_ptr; - persistant_ptr = - (SIZE_T)persistant_ptr + sizeof(ia_drc_loudness_info_set_struct) + 32; + persistant_ptr = persistant_ptr + sizeof(ia_drc_loudness_info_set_struct); p_obj_drc->str_payload.pstr_drc_gain = (ia_drc_gain_struct *)persistant_ptr; - ; - persistant_ptr = (SIZE_T)persistant_ptr + sizeof(ia_drc_gain_struct) + 32; + persistant_ptr = persistant_ptr + sizeof(ia_drc_gain_struct); p_obj_drc->str_payload.pstr_drc_interface = (ia_drc_interface_struct *)persistant_ptr; - persistant_ptr = - (SIZE_T)persistant_ptr + sizeof(ia_drc_interface_struct) + 32; + persistant_ptr = persistant_ptr + sizeof(ia_drc_interface_struct); p_obj_drc->str_payload.pstr_drc_config = (ia_drc_config *)persistant_ptr; - persistant_ptr = (SIZE_T)persistant_ptr + sizeof(ia_drc_config) + 32; + persistant_ptr = persistant_ptr + sizeof(ia_drc_config); p_obj_drc->str_payload.pstr_selection_proc = (ia_drc_sel_pro_struct *)persistant_ptr; - persistant_ptr = (SIZE_T)persistant_ptr + sizeof(ia_drc_sel_pro_struct) + 32; + persistant_ptr = persistant_ptr + sizeof(ia_drc_sel_pro_struct); p_obj_drc->str_bit_handler.it_bit_buf = (UWORD8 *)persistant_ptr; - persistant_ptr = (SIZE_T)persistant_ptr + 32 * 1024; /*varify the sizelater*/ + persistant_ptr = persistant_ptr + MAX_BS_BUF_SIZE; p_obj_drc->str_payload.pstr_drc_sel_proc_params = (ia_drc_sel_proc_params_struct *)persistant_ptr; - persistant_ptr = - (SIZE_T)persistant_ptr + sizeof(ia_drc_sel_proc_params_struct); + persistant_ptr = persistant_ptr + sizeof(ia_drc_sel_proc_params_struct); p_obj_drc->str_payload.pstr_drc_sel_proc_output = (ia_drc_sel_proc_output_struct *)persistant_ptr; - persistant_ptr = (SIZE_T)persistant_ptr + - sizeof(ia_drc_sel_proc_output_struct) + 16 * 1024; + persistant_ptr = persistant_ptr + sizeof(ia_drc_sel_proc_output_struct); p_obj_drc->str_bit_handler.bitstream_drc_config = (UWORD8 *)persistant_ptr; - persistant_ptr = (SIZE_T)persistant_ptr + 8 * 1024; + persistant_ptr = persistant_ptr + MAX_BS_BUF_SIZE; p_obj_drc->str_bit_handler.bitstream_loudness_info = (UWORD8 *)persistant_ptr; - persistant_ptr = (SIZE_T)persistant_ptr + 8 * 1024; + persistant_ptr = persistant_ptr + MAX_BS_BUF_SIZE; p_obj_drc->str_bit_handler.bitstream_unidrc_interface = (UWORD8 *)persistant_ptr; - persistant_ptr = (SIZE_T)persistant_ptr + 8 * 1024; + persistant_ptr = persistant_ptr + MAX_BS_BUF_SIZE; p_obj_drc->str_payload.pstr_peak_limiter = (ia_drc_peak_limiter_struct *)persistant_ptr; - persistant_ptr = - (SIZE_T)persistant_ptr + sizeof(ia_drc_peak_limiter_struct) + 32; + persistant_ptr = persistant_ptr + sizeof(ia_drc_peak_limiter_struct); p_obj_drc->str_payload.pstr_peak_limiter->buffer = (FLOAT32 *)((SIZE_T)p_obj_drc->str_payload.pstr_peak_limiter + - sizeof(ia_drc_peak_limiter_struct) + 32); - persistant_ptr = (SIZE_T)persistant_ptr + 16 * 1024; + sizeof(ia_drc_peak_limiter_struct)); + persistant_ptr = persistant_ptr + PEAK_LIM_BUF_SIZE; p_obj_drc->str_payload.pstr_qmf_filter = (ia_drc_qmf_filt_struct *)persistant_ptr; - persistant_ptr = (SIZE_T)persistant_ptr + sizeof(ia_drc_qmf_filt_struct) + 32; + persistant_ptr = persistant_ptr + sizeof(ia_drc_qmf_filt_struct); p_obj_drc->str_payload.pstr_qmf_filter->ana_buff = (FLOAT64 *)persistant_ptr; - persistant_ptr = (SIZE_T)persistant_ptr + 16 * 1024; + persistant_ptr = persistant_ptr + ANALY_BUF_SIZE; p_obj_drc->str_payload.pstr_qmf_filter->syn_buff = (FLOAT64 *)persistant_ptr; - persistant_ptr = (SIZE_T)persistant_ptr + 16 * 1024; + persistant_ptr = persistant_ptr + SYNTH_BUF_SIZE; p_obj_drc->p_state->persistant_ptr = (pVOID)persistant_ptr; return IA_NO_ERROR; @@ -464,6 +456,7 @@ IA_ERRORCODE impd_drc_init(ia_drc_api_struct *p_obj_drc) { p_obj_drc->str_bit_handler.num_bytes_bs_drc_config); if (err_code == 1) { + memset(p_obj_drc->str_payload.pstr_drc_config, 0, sizeof(ia_drc_config)); err_code = impd_drc_set_default_bitstream_config( p_obj_drc->str_payload.pstr_drc_config); p_obj_drc->str_payload.pstr_drc_config->channel_layout diff --git a/decoder/ixheaacd_api.c b/decoder/ixheaacd_api.c index 2efad04..2652d27 100644 --- a/decoder/ixheaacd_api.c +++ b/decoder/ixheaacd_api.c @@ -1413,17 +1413,22 @@ IA_ERRORCODE ixheaacd_dec_init( return IA_NO_ERROR; } + memset(&(p_state_enhaacplus_dec->eld_specific_config), 0, + sizeof(ia_eld_specific_config_struct)); return_val = ixheaacd_aac_headerdecode( p_obj_exhaacplus_dec, (UWORD8 *)in_buffer, &header_bytes_consumed, aac_persistent_mem->str_aac_decoder.pstr_aac_tables ->pstr_huffmann_tables); - - memcpy(sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_header[0], - &p_obj_exhaacplus_dec->p_state_aac->str_sbr_config, - sizeof(ia_sbr_header_data_struct)); - memcpy(sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_header[1], - &p_obj_exhaacplus_dec->p_state_aac->str_sbr_config, - sizeof(ia_sbr_header_data_struct)); + if (p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_LD || + p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_ELD) { + *sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_header[0] = + p_obj_exhaacplus_dec->p_state_aac->str_sbr_config; + *sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_header[1] = + p_obj_exhaacplus_dec->p_state_aac->str_sbr_config; + } else { + memset(&(p_state_enhaacplus_dec->eld_specific_config), 0, + sizeof(ia_eld_specific_config_struct)); + } if (return_val < 0) { if (return_val == diff --git a/decoder/ixheaacd_channel.c b/decoder/ixheaacd_channel.c index 3a2fea6..e452f37 100644 --- a/decoder/ixheaacd_channel.c +++ b/decoder/ixheaacd_channel.c @@ -578,7 +578,8 @@ VOID ixheaacd_channel_pair_process( void *self_ptr) { WORD32 channel; ia_aac_decoder_struct *self = self_ptr; - if (aac_spect_data_resil_flag) { + if (aac_spect_data_resil_flag && + ((object_type == AOT_ER_AAC_LD) || (object_type == AOT_ER_AAC_ELD))) { for (channel = 0; channel < num_ch; channel++) { ixheaacd_cblock_inv_quant_spect_data(ptr_aac_dec_channel_info[channel], ptr_aac_tables); diff --git a/decoder/ixheaacd_headerdecode.c b/decoder/ixheaacd_headerdecode.c index c632864..5e809ec 100644 --- a/decoder/ixheaacd_headerdecode.c +++ b/decoder/ixheaacd_headerdecode.c @@ -496,6 +496,9 @@ WORD32 ixheaacd_ga_hdr_dec(ia_aac_dec_state_struct *aac_state_struct, memset(aac_state_struct->ia_audio_specific_config, 0, sizeof(ia_audio_specific_config_struct)); + memset(&(aac_state_struct->eld_specific_config), 0, + sizeof(ia_eld_specific_config_struct)); + pstr_audio_specific_config = aac_state_struct->ia_audio_specific_config; aac_state_struct->p_config->str_prog_config.alignment_bits = diff --git a/decoder/ixheaacd_huff_code_reorder.c b/decoder/ixheaacd_huff_code_reorder.c index f9f178c..8a67f2e 100644 --- a/decoder/ixheaacd_huff_code_reorder.c +++ b/decoder/ixheaacd_huff_code_reorder.c @@ -574,7 +574,7 @@ static VOID ixheaacd_huff_ext_sect_info(ia_hcr_info_struct *ptr_hcr_info) { ptr_num_ext_sort_cw_sect[x_srt_sc_cnt] = 0; } -static VOID ixheaacd_hcr_prepare_segmentation_grid( +static UWORD32 ixheaacd_hcr_prepare_segmentation_grid( ia_hcr_info_struct *ptr_hcr_info) { UWORD16 i, j; UWORD16 num_segment = 0; @@ -630,7 +630,12 @@ static VOID ixheaacd_hcr_prepare_segmentation_grid( break; } } + + if (num_segment == 0) ptr_hcr_info->str_dec_io.err_log |= (ERROR_POS << 9); + ptr_hcr_info->str_segment_info.num_segment = num_segment; + + return (ptr_hcr_info->str_dec_io.err_log); } static PLATFORM_INLINE UWORD16 *ixheaacd_huff_dec_pair_hcr_pcw( @@ -1442,8 +1447,6 @@ static VOID ixheaacd_decode_hcr_non_pcw( ia_bit_buf_struct *itt_bit_buff, ia_hcr_info_struct *ptr_hcr_info, ia_aac_dec_tables_struct *ptr_aac_tables, WORD32 *cw_offset, WORD32 trial, WORD32 start) { - UWORD16 *cb_table; - UWORD32 *idx_table; WORD16 codeword_len = 0; WORD8 seg_bits_left; UWORD8 tot_bits_to_save, code_bits_to_save, extra_code_bits; @@ -1456,14 +1459,6 @@ static VOID ixheaacd_decode_hcr_non_pcw( segment_offset++, *cw_offset += 1) { if (p_remaining_bits_in_seg[segment_offset] && !ptr_hcr_info->str_segment_info.is_decoded[*cw_offset]) { - cb_table = - (UWORD16 *)(ptr_aac_tables - ->code_book[ptr_hcr_info->str_non_pcw_side_info - .ptr_cb[*cw_offset % num_segment]]); - idx_table = - (UWORD32 *)(ptr_aac_tables - ->index_table[ptr_hcr_info->str_non_pcw_side_info - .ptr_cb[*cw_offset % num_segment]]); { UWORD32 i_qsc; WORD8 current_seg_bits = p_remaining_bits_in_seg[segment_offset]; @@ -1550,6 +1545,15 @@ static VOID ixheaacd_decode_hcr_non_pcw( if (ptr_hcr_info->str_non_pcw_side_info .ptr_cb[*cw_offset % num_segment] <= 4) { WORD32 tbl_sign = 0; + const UWORD16 *cb_table = + (UWORD16 + *)(ptr_aac_tables + ->code_book[ptr_hcr_info->str_non_pcw_side_info + .ptr_cb[*cw_offset % num_segment]]); + const UWORD32 *idx_table = + (UWORD32 *)(ptr_aac_tables->index_table + [ptr_hcr_info->str_non_pcw_side_info + .ptr_cb[*cw_offset % num_segment]]); if (ptr_hcr_info->str_non_pcw_side_info .ptr_cb[*cw_offset % num_segment] > 2) { @@ -1571,6 +1575,17 @@ static VOID ixheaacd_decode_hcr_non_pcw( .ptr_cb[*cw_offset % num_segment] < 11) { WORD32 tbl_sign = 0; WORD32 huff_mode = 9; + + const UWORD16 *cb_table = + (UWORD16 + *)(ptr_aac_tables + ->code_book[ptr_hcr_info->str_non_pcw_side_info + .ptr_cb[*cw_offset % num_segment]]); + const UWORD32 *idx_table = + (UWORD32 *)(ptr_aac_tables->index_table + [ptr_hcr_info->str_non_pcw_side_info + .ptr_cb[*cw_offset % num_segment]]); + if (ptr_hcr_info->str_non_pcw_side_info .ptr_cb[*cw_offset % num_segment] > 6) { if (ptr_hcr_info->str_non_pcw_side_info @@ -1812,7 +1827,8 @@ UWORD32 ixheaacd_hcr_decoder( ixheaacd_huff_sort_sect_cb_cwd(ptr_hcr_info); - ixheaacd_hcr_prepare_segmentation_grid(ptr_hcr_info); + if (ixheaacd_hcr_prepare_segmentation_grid(ptr_hcr_info) != 0) + return (ptr_hcr_info->str_dec_io.err_log); ixheaacd_huff_ext_sect_info(ptr_hcr_info); diff --git a/decoder/ixheaacd_qmf_dec.c b/decoder/ixheaacd_qmf_dec.c index ffc0c84..8833289 100644 --- a/decoder/ixheaacd_qmf_dec.c +++ b/decoder/ixheaacd_qmf_dec.c @@ -133,11 +133,11 @@ VOID ixheaacd_fftposttw(WORD32 *out, temp[3] = *ptr_out_rev--; temp[2] = *ptr_out_rev++; - in2 = temp[3] - temp[1]; - in1 = temp[3] + temp[1]; + in2 = ixheaacd_sub32_sat(temp[3], temp[1]); + in1 = ixheaacd_add32_sat(temp[3], temp[1]); - temp[1] = temp[0] - temp[2]; - temp[3] = temp[0] + temp[2]; + temp[1] = ixheaacd_sub32_sat(temp[0], temp[2]); + temp[3] = ixheaacd_add32_sat(temp[0], temp[2]); twid_re = *twidle_fwd++; twid_im = *twidle_rev--; @@ -148,11 +148,11 @@ VOID ixheaacd_fftposttw(WORD32 *out, val1 = val1 << 1; val2 = val2 << 1; - *p_out_fwd++ = temp[3] + val1; - *p_out_fwd++ = in2 + val2; + *p_out_fwd++ = ixheaacd_add32_sat(temp[3], val1); + *p_out_fwd++ = ixheaacd_add32_sat(in2, val2); - *ptr_out_rev-- = -in2 + val2; - *ptr_out_rev-- = temp[3] - val1; + *ptr_out_rev-- = ixheaacd_sub32_sat(val2, in2); + *ptr_out_rev-- = ixheaacd_sub32_sat(temp[3], val1); } return; @@ -172,12 +172,13 @@ VOID ixheaacd_posttwdct2(WORD32 *inp, WORD16 *out_fwd, out_fwd2 = out_fwd + 65; out_re = *inp++; out_im = *inp++; - out_re1 = (out_re + out_im) >> 1; + out_re1 = + ixheaacd_sat64_32(ixheaacd_add64((WORD64)out_re, (WORD64)out_im) >> 1); re1 = ixheaacd_round16(ixheaacd_shl32(out_re1, (5 - 1))); *out_fwd++ = re1; - last_val = (out_re - out_im); + last_val = ixheaacd_sub32_sat(out_re, out_im); twidle_fwd = qmf_dec_tables_ptr->dct23_tw + 2; for (k = DCT2_LEN / 2 - 2; k >= 0; k--) { @@ -186,10 +187,10 @@ VOID ixheaacd_posttwdct2(WORD32 *inp, WORD16 *out_fwd, twid_re = *twidle_fwd++; twid_im = *twidle_fwd++; - out_re = ixheaacd_sub32(ixheaacd_mult32x16in32(inp_re, twid_re), - ixheaacd_mult32x16in32(inp_im, twid_im)); - out_im = ixheaacd_add32(ixheaacd_mult32x16in32(inp_im, twid_re), - ixheaacd_mult32x16in32(inp_re, twid_im)); + out_re = ixheaacd_sub32_sat(ixheaacd_mult32x16in32(inp_re, twid_re), + ixheaacd_mult32x16in32(inp_im, twid_im)); + out_im = ixheaacd_add32_sat(ixheaacd_mult32x16in32(inp_im, twid_re), + ixheaacd_mult32x16in32(inp_re, twid_im)); re1 = ixheaacd_round16(ixheaacd_shl32(out_re, (5 - 1))); im1 = ixheaacd_round16(ixheaacd_shl32(out_im, (5 - 1))); im2 = ixheaacd_negate16(im1); @@ -238,11 +239,11 @@ static PLATFORM_INLINE VOID ixheaacd_fftposttw_32( temp3 = *ptr_out_rev--; temp2 = *ptr_out_rev++; - in1 = temp1 + temp3; - in2 = -temp1 + temp3; + in1 = ixheaacd_add32_sat(temp1, temp3); + in2 = ixheaacd_sub32_sat(temp3, temp1); - temp1 = temp0 - temp2; - temp3 = temp0 + temp2; + temp1 = ixheaacd_sub32_sat(temp0, temp2); + temp3 = ixheaacd_add32_sat(temp0, temp2); twid_re = *twidle_fwd; twidle_fwd += 2; @@ -258,11 +259,11 @@ static PLATFORM_INLINE VOID ixheaacd_fftposttw_32( val1 = val1 << 1; val2 = val2 << 1; - *ptr_out_fwd++ = temp3 + val1; - *ptr_out_fwd++ = in2 + val2; + *ptr_out_fwd++ = ixheaacd_add32_sat(temp3, val1); + *ptr_out_fwd++ = ixheaacd_add32_sat(in2, val2); - *ptr_out_rev-- = -in2 + val2; - *ptr_out_rev-- = temp3 - val1; + *ptr_out_rev-- = ixheaacd_sub32_sat(val2, in2); + *ptr_out_rev-- = ixheaacd_sub32_sat(temp3, val1); } return; @@ -287,10 +288,11 @@ ixheaacd_posttwdct2_32(WORD32 *inp, WORD16 *out_fwd, out_re = *inp++; out_im = *inp++; - out_re1 = (out_re + out_im) >> 1; + out_re1 = + ixheaacd_sat64_32(ixheaacd_add64((WORD64)out_re, (WORD64)out_im) >> 1); re1 = ixheaacd_round16(ixheaacd_shl32_sat(out_re1, (5 - 1))); *out_fwd++ = re1; - last_val = (out_re - out_im); + last_val = ixheaacd_sub32_sat(out_re, out_im); twidle_fwd = qmf_dec_tables_ptr->dct23_tw + 4; for (k = 14; k >= 0; k--) { @@ -305,8 +307,8 @@ ixheaacd_posttwdct2_32(WORD32 *inp, WORD16 *out_fwd, inp_re = *inp++; - out_re = ixheaacd_sub32(temp1, ixheaacd_mult32x16in32(inp_re, twid_im)); - out_im = ixheaacd_add32(ixheaacd_mult32x16in32(inp_re, twid_re), temp2); + out_re = ixheaacd_sub32_sat(temp1, ixheaacd_mult32x16in32(inp_re, twid_im)); + out_im = ixheaacd_add32_sat(ixheaacd_mult32x16in32(inp_re, twid_re), temp2); out_re = ixheaacd_add32_sat(out_re, out_re); out_im = ixheaacd_add32_sat(out_im, out_im); diff --git a/test/ixheaacd_main.c b/test/ixheaacd_main.c index fca49c3..55f62d9 100644 --- a/test/ixheaacd_main.c +++ b/test/ixheaacd_main.c @@ -1332,6 +1332,29 @@ int ixheaacd_main_process(WORD32 argc, pWORD8 argv[]) { _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code); } + /* Get memory info tables size */ + err_code = + ia_drc_dec_api(pv_ia_drc_process_api_obj, IA_API_CMD_GET_MEMTABS_SIZE, + 0, &ui_proc_mem_tabs_size); + _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code); + + g_pv_arr_alloc_memory[g_w_malloc_count] = malloc(ui_proc_mem_tabs_size); + + if (g_pv_arr_alloc_memory[g_w_malloc_count] == NULL) { + err_code = IA_TESTBENCH_MFMAN_FATAL_MEM_ALLOC_FAILED; + _IA_HANDLE_ERROR(&ixheaacd_ia_testbench_error_info, + (pWORD8) "Mem tables alloc", err_code); + } + + /* Set pointer for process memory tables */ + err_code = ia_drc_dec_api( + pv_ia_drc_process_api_obj, IA_API_CMD_SET_MEMTABS_PTR, 0, + (pVOID)((WORD8 *)g_pv_arr_alloc_memory[g_w_malloc_count])); + + _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code); + + g_w_malloc_count++; + err_code = ia_drc_dec_api(pv_ia_drc_process_api_obj, IA_API_CMD_INIT, IA_CMD_TYPE_INIT_API_POST_CONFIG_PARAMS, NULL); |