diff options
author | Sowmya Sree Reddy G <100844@ittiam.com> | 2022-09-29 17:34:48 +0530 |
---|---|---|
committer | Nikhil Bhavikatti <nikhilbhavikatti19@gmail.com> | 2022-10-10 10:15:43 +0530 |
commit | 270720de5eb4d5a9093e94a691142d565dd671e1 (patch) | |
tree | bd53416a87d63577860d8fd4834e2313e5c31e62 /decoder/ixheaacd_sbr_dec.c | |
parent | 397bdac956698d2410039a4689cf7c9319725ff9 (diff) | |
download | libxaac-270720de5eb4d5a9093e94a691142d565dd671e1.tar.gz |
ELDv2 support for EXHEAAC decoder
Diffstat (limited to 'decoder/ixheaacd_sbr_dec.c')
-rw-r--r-- | decoder/ixheaacd_sbr_dec.c | 158 |
1 files changed, 112 insertions, 46 deletions
diff --git a/decoder/ixheaacd_sbr_dec.c b/decoder/ixheaacd_sbr_dec.c index 2287c6c..f8af386 100644 --- a/decoder/ixheaacd_sbr_dec.c +++ b/decoder/ixheaacd_sbr_dec.c @@ -563,12 +563,13 @@ WORD32 ixheaacd_sbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data, ia_sbr_tables_struct *sbr_tables_ptr, ixheaacd_misc_tables *pstr_common_tables, WORD ch_fac, ia_pvc_data_struct *ptr_pvc_data, FLAG drc_on, - WORD32 drc_sbr_factors[][64], - WORD32 audio_object_type) { - WORD i; + WORD32 drc_sbr_factors[][64], WORD32 audio_object_type, + WORD32 ldmps_present) { + WORD i, j, k; WORD slot, reserve; WORD save_lb_scale; WORD op_delay; + IA_ERRORCODE err_code = IA_NO_ERROR; WORD32 *p_arr_qmf_buf_real[MAX_ENV_COLS] = {0}; WORD32 *p_arr_qmf_buf_imag[MAX_ENV_COLS] = {0}; @@ -585,6 +586,7 @@ WORD32 ixheaacd_sbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data, WORD stereo_config_idx = ptr_frame_data->stereo_config_idx; WORD sbr_mode = ptr_frame_data->sbr_mode; WORD usac_flag = ptr_header_data->usac_flag; + WORD add_slot = 0; FLOAT32 *pvc_qmf_enrg_arr = (FLOAT32 *)ptr_sbr_dec->pvc_qmf_enrg_arr; @@ -595,6 +597,9 @@ WORD32 ixheaacd_sbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data, } else { op_delay = 6; } + + if (ldmps_present == 1) add_slot = SBR_HF_ADJ_OFFSET; + if (usac_flag) { pp_qmf_buf_real = ptr_sbr_dec->pp_qmf_buf_real; pp_qmf_buf_imag = ptr_sbr_dec->pp_qmf_buf_imag; @@ -610,7 +615,8 @@ WORD32 ixheaacd_sbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data, WORD32 *ptr_pers_qmf_real = ptr_sbr_dec->ptr_sbr_overlap_buf; WORD32 *p_scr_qmf_real = ptr_work_buf_core + (2 << (6 + !low_pow_flag)); - if ((no_bins < LPC_ORDER) || ((no_bins + op_delay) > MAX_ENV_COLS)) + if ((no_bins < LPC_ORDER) || + ((no_bins + op_delay + add_slot) > MAX_ENV_COLS)) return -1; if (!low_pow_flag) { @@ -622,7 +628,7 @@ WORD32 ixheaacd_sbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data, } ptr = p_scr_qmf_real; - for (slot = 0; slot < op_delay + no_bins; slot++) { + for (slot = 0; slot < op_delay + no_bins + add_slot; slot++) { p_arr_qmf_buf_real[slot] = ptr; ptr += NO_SYNTHESIS_CHANNELS; @@ -644,7 +650,6 @@ WORD32 ixheaacd_sbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data, if (usac_flag) { WORD32 num_anal_bands = ptr_sbr_dec->str_codec_qmf_bank.no_channels; WORD32 codec_x_delay = 0; - WORD32 core_syn_ch_index = 0; WORD32 frame_move = 288; WORD32 core_frame_size = ptr_header_data->core_frame_size; @@ -658,12 +663,6 @@ WORD32 ixheaacd_sbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data, */ if (mps_sbr_flag) op_delay = MPS_SBR_DELAY; - if (hbe_flag || mps_sbr_flag) { - core_syn_ch_index = num_anal_bands; - } else { - core_syn_ch_index = ptr_header_data->pstr_freq_band_data->sub_band_start; - } - frame_move = 9 * num_anal_bands; memmove(ptr_sbr_dec->core_sample_buf, @@ -710,7 +709,7 @@ WORD32 ixheaacd_sbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data, op_delay + codec_x_delay + SBR_HF_ADJ_OFFSET); if (hbe_flag) { - WORD32 err_code = ixheaacd_qmf_hbe_apply( + err_code = ixheaacd_qmf_hbe_apply( ptr_sbr_dec->p_hbe_txposer, ptr_sbr_dec->qmf_buf_real + (op_delay + SBR_HF_ADJ_OFFSET) + ESBR_HBE_DELAY_OFFSET, @@ -733,7 +732,6 @@ WORD32 ixheaacd_sbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data, } if (!mps_sbr_flag && apply_processing) { - WORD32 err_code = 0; err_code = ixheaacd_generate_hf( ptr_sbr_dec->qmf_buf_real + (SBR_HF_ADJ_OFFSET), ptr_sbr_dec->qmf_buf_imag + (SBR_HF_ADJ_OFFSET), @@ -741,7 +739,8 @@ WORD32 ixheaacd_sbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data, ptr_sbr_dec->ph_vocod_qmf_imag + (SBR_HF_ADJ_OFFSET), ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET), ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET), ptr_frame_data, - ptr_header_data); + ptr_header_data, ldmps_present, + ptr_sbr_dec->str_codec_qmf_bank.num_time_slots); if (err_code) return err_code; ptr_pvc_data->pvc_rate = ptr_header_data->upsamp_fac; @@ -774,7 +773,8 @@ WORD32 ixheaacd_sbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data, (ptr_header_data->hbe_flag == 0) ? NULL : ptr_sbr_dec->p_hbe_txposer->x_over_qmf, - ptr_sbr_dec->scratch_buff, pvc_dec_out_buf); + ptr_sbr_dec->scratch_buff, pvc_dec_out_buf, ldmps_present); + if (err_code) return err_code; } else { @@ -800,12 +800,39 @@ WORD32 ixheaacd_sbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data, return 0; } - ixheaacd_cplx_anal_qmffilt( - ptr_time_data, &ptr_sbr_dec->str_sbr_scale_fact, - &p_arr_qmf_buf_real[op_delay], &p_arr_qmf_buf_imag[op_delay], - &ptr_sbr_dec->str_codec_qmf_bank, sbr_tables_ptr->qmf_dec_tables_ptr, - ch_fac, low_pow_flag, audio_object_type); + if (ldmps_present) { + ixheaacd_cplx_anal_qmffilt_32( + (WORD32 *)ptr_time_data, &ptr_sbr_dec->str_sbr_scale_fact, + &p_arr_qmf_buf_real[op_delay], &p_arr_qmf_buf_imag[op_delay], + &ptr_sbr_dec->str_codec_qmf_bank, sbr_tables_ptr->qmf_dec_tables_ptr, + ch_fac, 1); + } else { + ixheaacd_cplx_anal_qmffilt( + ptr_time_data, &ptr_sbr_dec->str_sbr_scale_fact, + &p_arr_qmf_buf_real[op_delay], &p_arr_qmf_buf_imag[op_delay], + &ptr_sbr_dec->str_codec_qmf_bank, sbr_tables_ptr->qmf_dec_tables_ptr, + ch_fac, low_pow_flag, audio_object_type, ldmps_present); + } + if (ldmps_present == 1) { + for (j = SBR_HF_ADJ_OFFSET; + j < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots + SBR_HF_ADJ_OFFSET; + j++) { + for (k = 0; k < 64; k++) { + WORD32 scale = 7; + ptr_sbr_dec->mps_qmf_buf_real[j][k] = 0.0f; + ptr_sbr_dec->mps_qmf_buf_imag[j][k] = 0.0f; + if (k < ptr_sbr_dec->str_codec_qmf_bank.usb) { + ptr_sbr_dec->mps_qmf_buf_real[j][k] += + (FLOAT32)(p_arr_qmf_buf_real[j][k] / (FLOAT32)(1 << scale)); + ptr_sbr_dec->mps_qmf_buf_imag[j][k] += + (FLOAT32)(p_arr_qmf_buf_imag[j][k] / (FLOAT32)(1 << scale)); + } + } + } + } + /*ITTIAM : the size of real and img coeff are not same as that of the mps + * analysis.*/ { WORD shift1, shift2; WORD min_shift; @@ -888,7 +915,6 @@ WORD32 ixheaacd_sbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data, if (apply_processing) { WORD16 degree_alias[NO_SYNTHESIS_CHANNELS]; WORD16 *border_vec = ptr_frame_data->str_frame_info_details.border_vec; - IA_ERRORCODE error_code = IA_NO_ERROR; if (low_pow_flag) { memset(degree_alias, 0, NO_SYNTHESIS_CHANNELS * sizeof(WORD16)); @@ -915,28 +941,59 @@ WORD32 ixheaacd_sbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data, ptr_sbr_dec->str_sbr_scale_fact.hb_scale = (WORD16)(com_low_band_scale - 2); } else { - ixheaacd_hf_generator( - &ptr_sbr_dec->str_hf_generator, &ptr_sbr_dec->str_sbr_scale_fact, - p_arr_qmf_buf_real, p_arr_qmf_buf_imag, ptr_header_data->time_step, - border_vec[0], - ixheaacd_sub16_sat( - border_vec[ptr_frame_data->str_frame_info_details.num_env], - ptr_header_data->num_time_slots), - ptr_header_data->pstr_freq_band_data->num_if_bands, - ptr_frame_data->max_qmf_subband_aac, ptr_frame_data->sbr_invf_mode, - ptr_frame_data_prev->sbr_invf_mode, ptr_work_buf_core, + if (ldmps_present == 1) { + err_code = ixheaacd_generate_hf( + ptr_sbr_dec->mps_qmf_buf_real + (SBR_HF_ADJ_OFFSET), + ptr_sbr_dec->mps_qmf_buf_imag + (SBR_HF_ADJ_OFFSET), + ptr_sbr_dec->ph_vocod_qmf_real + (SBR_HF_ADJ_OFFSET), + ptr_sbr_dec->ph_vocod_qmf_imag + (SBR_HF_ADJ_OFFSET), + ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET), + ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET), ptr_frame_data, + ptr_header_data, ldmps_present, + ptr_sbr_dec->str_codec_qmf_bank.num_time_slots); + if (err_code) return err_code; + } else { + ixheaacd_hf_generator( + &ptr_sbr_dec->str_hf_generator, &ptr_sbr_dec->str_sbr_scale_fact, + p_arr_qmf_buf_real, p_arr_qmf_buf_imag, ptr_header_data->time_step, + border_vec[0], + ixheaacd_sub16_sat( + border_vec[ptr_frame_data->str_frame_info_details.num_env], + ptr_header_data->num_time_slots), + ptr_header_data->pstr_freq_band_data->num_if_bands, + ptr_frame_data->max_qmf_subband_aac, ptr_frame_data->sbr_invf_mode, + ptr_frame_data_prev->sbr_invf_mode, ptr_work_buf_core, + audio_object_type); + } + } + if (ldmps_present == 1) { + ptr_frame_data->pstr_sbr_header = ptr_header_data; + err_code = ixheaacd_sbr_env_calc( + ptr_frame_data, ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET), + ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET), + ptr_sbr_dec->qmf_buf_real + (SBR_HF_ADJ_OFFSET), + ptr_sbr_dec->qmf_buf_imag + (SBR_HF_ADJ_OFFSET), NULL, + ptr_sbr_dec->scratch_buff, pvc_dec_out_buf, ldmps_present); + + for (j = 0; j < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots + 2; j++) { + for (k = ptr_sbr_dec->str_codec_qmf_bank.usb; k < 64; k++) { + ptr_sbr_dec->mps_qmf_buf_real[j][k] += + ptr_sbr_dec->sbr_qmf_out_real[j][k]; + ptr_sbr_dec->mps_qmf_buf_imag[j][k] += + ptr_sbr_dec->sbr_qmf_out_imag[j][k]; + } + } + } else { + err_code = ixheaacd_calc_sbrenvelope( + &ptr_sbr_dec->str_sbr_scale_fact, &ptr_sbr_dec->str_sbr_calc_env, + ptr_header_data, ptr_frame_data, ptr_frame_data_prev, + p_arr_qmf_buf_real, p_arr_qmf_buf_imag, degree_alias, low_pow_flag, + sbr_tables_ptr, pstr_common_tables, + ptr_work_buf_core + (LPC_ORDER << (6 + !low_pow_flag)), audio_object_type); + if (err_code) return err_code; } - error_code = ixheaacd_calc_sbrenvelope( - &ptr_sbr_dec->str_sbr_scale_fact, &ptr_sbr_dec->str_sbr_calc_env, - ptr_header_data, ptr_frame_data, ptr_frame_data_prev, - p_arr_qmf_buf_real, p_arr_qmf_buf_imag, degree_alias, low_pow_flag, - sbr_tables_ptr, pstr_common_tables, - ptr_work_buf_core + (LPC_ORDER << (6 + !low_pow_flag)), - audio_object_type); - if (error_code) return error_code; - memcpy(ptr_frame_data_prev->sbr_invf_mode, ptr_frame_data->sbr_invf_mode, ptr_header_data->pstr_freq_band_data->num_if_bands * sizeof(WORD32)); @@ -1017,6 +1074,18 @@ WORD32 ixheaacd_sbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data, memcpy(p_loc_qmf_real, p_loc_qmf_real_1, sizeof(WORD32) * NO_SYNTHESIS_CHANNELS * num); + + if (ldmps_present == 1) { + memmove(&ptr_sbr_dec->mps_qmf_buf_real[0][0], + &ptr_sbr_dec->mps_qmf_buf_real[ptr_sbr_dec->str_codec_qmf_bank + .num_time_slots][0], + SBR_HF_ADJ_OFFSET * sizeof(FLOAT32) * 64); + + memmove(&ptr_sbr_dec->mps_qmf_buf_imag[0][0], + &ptr_sbr_dec->mps_qmf_buf_imag[ptr_sbr_dec->str_codec_qmf_bank + .num_time_slots][0], + SBR_HF_ADJ_OFFSET * sizeof(FLOAT32) * 64); + } } ptr_sbr_dec->str_sbr_scale_fact.ov_lb_scale = save_lb_scale; @@ -1039,7 +1108,6 @@ WORD32 ixheaacd_esbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD32 upsample_ratio_idx = ptr_header_data->sbr_ratio_idx; WORD32 core_frame_size = ptr_header_data->core_frame_size; - WORD32 no_bins; WORD32 mps_sbr_flag = ptr_frame_data->mps_sbr_flag; WORD32 stereo_config_idx = ptr_frame_data->stereo_config_idx; WORD32 hbe_flag = ptr_header_data->hbe_flag; @@ -1050,8 +1118,6 @@ WORD32 ixheaacd_esbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, op_delay = 2 * 6; } - no_bins = ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; - ptr_sbr_dec->str_sbr_scale_fact.lb_scale = 0; { WORD32 num_anal_bands = ptr_sbr_dec->str_codec_qmf_bank.no_channels; @@ -1221,7 +1287,7 @@ WORD32 ixheaacd_sbr_dec_from_mps(FLOAT32 *p_mps_qmf_output, VOID *p_sbr_dec, ptr_sbr_dec->mps_qmf_buf_imag + SBR_HF_ADJ_OFFSET, NULL, NULL, ptr_sbr_dec->mps_sbr_qmf_buf_real + SBR_HF_ADJ_OFFSET, ptr_sbr_dec->mps_sbr_qmf_buf_imag + SBR_HF_ADJ_OFFSET, ptr_frame_data, - ptr_header_data); + ptr_header_data, 0, ptr_sbr_dec->str_codec_qmf_bank.num_time_slots); if (err) return err; ptr_frame_data->pstr_sbr_header = ptr_header_data; @@ -1234,7 +1300,7 @@ WORD32 ixheaacd_sbr_dec_from_mps(FLOAT32 *p_mps_qmf_output, VOID *p_sbr_dec, ptr_sbr_dec->mps_qmf_buf_imag + SBR_HF_ADJ_OFFSET, (ptr_header_data->hbe_flag == 0) ? NULL : ptr_sbr_dec->p_hbe_txposer->x_over_qmf, - ptr_sbr_dec->scratch_buff, NULL); + ptr_sbr_dec->scratch_buff, NULL, 0); if (err) return err; for (i = 0; i < no_bins; i++) { |