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 <stdio.h> 21 #include <string.h> 22 #include "ixheaacd_sbr_common.h" 23 #include "ixheaac_type_def.h" 24 25 #include "ixheaac_constants.h" 26 #include "ixheaac_basic_ops32.h" 27 #include "ixheaac_basic_ops16.h" 28 #include "ixheaac_basic_ops40.h" 29 #include "ixheaac_basic_ops.h" 30 31 #include "ixheaac_basic_op.h" 32 #include "ixheaacd_intrinsics.h" 33 #include "ixheaacd_common_rom.h" 34 #include "ixheaacd_sbrdecsettings.h" 35 #include "ixheaacd_bitbuffer.h" 36 #include "ixheaacd_defines.h" 37 38 #include "ixheaacd_pns.h" 39 40 #include "ixheaacd_aac_rom.h" 41 #include "ixheaacd_aac_imdct.h" 42 #include "ixheaacd_pulsedata.h" 43 44 #include "ixheaacd_drc_data_struct.h" 45 46 #include "ixheaacd_lt_predict.h" 47 48 #include "ixheaacd_cnst.h" 49 #include "ixheaacd_ec_defines.h" 50 #include "ixheaacd_ec_struct_def.h" 51 52 #include "ixheaacd_channelinfo.h" 53 #include "ixheaacd_drc_dec.h" 54 55 #include "ixheaacd_sbrdecoder.h" 56 #include "ixheaacd_tns.h" 57 #include "ixheaacd_sbr_scale.h" 58 #include "ixheaacd_lpp_tran.h" 59 #include "ixheaacd_env_extr_part.h" 60 #include "ixheaacd_sbr_rom.h" 61 #include "ixheaacd_block.h" 62 #include "ixheaacd_hybrid.h" 63 #include "ixheaacd_ps_dec.h" 64 #include "ixheaacd_env_extr.h" 65 66 #include "ixheaacd_basic_funcs.h" 67 #include "ixheaacd_env_calc.h" 68 #include "ixheaacd_dsp_fft32x32s.h" 69 70 #include "ixheaacd_interface.h" 71 72 WORD32 (*ixheaacd_fix_div)(WORD32, WORD32) = &ixheaacd_fix_div_armv7; 73 74 VOID(*ixheaacd_covariance_matrix_calc) 75 (WORD32 *, ia_lpp_trans_cov_matrix *, 76 WORD32) = &ixheaacd_covariance_matrix_calc_armv7; 77 78 VOID(*ixheaacd_covariance_matrix_calc_2) 79 (ia_lpp_trans_cov_matrix *, WORD32 *, WORD32, 80 WORD16) = &ixheaacd_covariance_matrix_calc_2_armv7; 81 82 VOID(*ixheaacd_over_lap_add1) 83 (WORD32 *, WORD32 *, WORD32 *, const WORD16 *, WORD16, WORD16, 84 WORD16) = &ixheaacd_over_lap_add1_armv7; 85 86 VOID(*ixheaacd_over_lap_add2) 87 (WORD32 *, WORD32 *, WORD32 *, const WORD16 *, WORD16, WORD16, 88 WORD16) = &ixheaacd_over_lap_add2_armv7; 89 90 VOID(*ixheaacd_decorr_filter2) 91 (ia_ps_dec_struct *ptr_ps_dec, WORD32 *p_buf_left_real, WORD32 *p_buf_left_imag, 92 WORD32 *p_buf_right_real, WORD32 *p_buf_right_imag, 93 ia_ps_tables_struct *ps_tables_ptr, 94 WORD16 *transient_ratio) = &ixheaacd_decorr_filter2_armv7; 95 96 VOID(*ixheaacd_decorr_filter1) 97 (ia_ps_dec_struct *ptr_ps_dec, ia_ps_tables_struct *ps_tables_ptr, 98 WORD16 *transient_ratio) = &ixheaacd_decorr_filter1_armv7; 99 100 WORD32(*ixheaacd_divide16_pos) 101 (WORD32 op1, WORD32 op2) = &ixheaacd_divide16_pos_armv7; 102 103 VOID(*ixheaacd_decorrelation) 104 (ia_ps_dec_struct *ptr_ps_dec, WORD32 *p_buf_left_real, WORD32 *p_buf_left_imag, 105 WORD32 *p_buf_right_real, WORD32 *p_buf_right_imag, 106 ia_ps_tables_struct *ps_tables_ptr) = &ixheaacd_decorrelation_armv7; 107 108 VOID(*ixheaacd_apply_rot) 109 (ia_ps_dec_struct *ptr_ps_dec, WORD32 *qmf_left_real, WORD32 *qmf_left_imag, 110 WORD32 *qmf_right_real, WORD32 *qmf_right_imag, 111 ia_sbr_tables_struct *sbr_tables_ptr, 112 const WORD16 *ptr_resol) = &ixheaacd_apply_rot_armv7; 113 114 VOID(*ixheaacd_conv_ergtoamplitudelp) 115 (WORD32 bands, WORD16 noise_e, WORD16 *nrg_sine, WORD16 *nrg_gain, 116 WORD16 *noise_level_mant, 117 WORD16 *sqrt_table) = &ixheaacd_conv_ergtoamplitudelp_armv7; 118 119 VOID(*ixheaacd_conv_ergtoamplitude) 120 (WORD32 bands, WORD16 noise_e, WORD16 *nrg_sine, WORD16 *nrg_gain, 121 WORD16 *noise_level_mant, 122 WORD16 *sqrt_table) = &ixheaacd_conv_ergtoamplitude_armv7; 123 124 VOID(*ixheaacd_adjust_scale) 125 (WORD32 **re, WORD32 **im, WORD32 sub_band_start, WORD32 sub_band_end, 126 WORD32 start_pos, WORD32 next_pos, WORD32 shift, 127 FLAG low_pow_flag) = &ixheaacd_adjust_scale_armv7; 128 129 WORD16(*ixheaacd_ixheaacd_expsubbandsamples) 130 (WORD32 **re, WORD32 **im, WORD32 sub_band_start, WORD32 sub_band_end, 131 WORD32 start_pos, WORD32 next_pos, 132 FLAG low_pow_flag) = &ixheaacd_expsubbandsamples_armv7; 133 134 VOID(*ixheaacd_enery_calc_per_subband) 135 (WORD32 start_pos, WORD32 next_pos, WORD32 sub_band_start, WORD32 sub_band_end, 136 WORD32 frame_exp, WORD16 *nrg_est_mant, FLAG low_pow_flag, 137 ia_sbr_tables_struct *ptr_sbr_tables, 138 WORD32 *ptr_qmf_matrix) = &ixheaacd_enery_calc_per_subband_armv7; 139 140 VOID(*ixheaacd_harm_idx_zerotwolp) 141 (WORD32 *ptr_real_buf, WORD16 *ptr_gain_buf, WORD32 scale_change, 142 WORD16 *ptr_sine_level_buf, const WORD32 *ptr_rand_ph, 143 WORD16 *noise_level_mant, WORD32 num_sub_bands, FLAG noise_absc_flag, 144 WORD32 harm_index) = &ixheaacd_harm_idx_zerotwolp_armv7; 145 146 VOID(*ixheaacd_tns_ar_filter_fixed) 147 (WORD32 *spectrum, WORD32 size, WORD32 inc, WORD32 *lpc, WORD32 order, 148 WORD32 shift_value, WORD scale_spec) = &ixheaacd_tns_ar_filter_fixed_armv7; 149 150 VOID(*ixheaacd_tns_ar_filter) 151 (WORD32 *spectrum, WORD32 size, WORD32 inc, WORD16 *lpc, WORD32 order, 152 WORD32 shift_value, WORD scale_spec, 153 WORD32 *ptr_filter_state) = &ixheaacd_tns_ar_filter_armv7; 154 155 VOID(*ixheaacd_tns_parcor_lpc_convert) 156 (WORD16 *parcor, WORD16 *lpc, WORD16 *scale, 157 WORD order) = &ixheaacd_tns_parcor_lpc_convert_armv7; 158 159 WORD32(*ixheaacd_calc_max_spectral_line) 160 (WORD32 *ptr_tmp, WORD32 size) = &ixheaacd_calc_max_spectral_line_armv7; 161 162 VOID(*ixheaacd_post_twiddle) 163 (WORD32 out_ptr[], WORD32 spec_data[], 164 ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, 165 WORD npoints) = &ixheaacd_post_twiddle_armv7; 166 167 VOID(*ixheaacd_post_twid_overlap_add) 168 (WORD32 pcm_out[], WORD32 spec_data[], 169 ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints, 170 WORD32 *ptr_overlap_buf, WORD16 q_shift, const WORD16 *window, 171 WORD16 ch_fac) = &ixheaacd_post_twid_overlap_add_armv7; 172 173 VOID(*ixheaacd_neg_shift_spec) 174 (WORD32 *coef, WORD32 *out, WORD16 q_shift, 175 WORD16 ch_fac) = &ixheaacd_neg_shift_spec_armv7; 176 177 VOID(*ixheaacd_spec_to_overlapbuf) 178 (WORD32 *ptr_overlap_buf, WORD32 *ptr_spec_coeff, WORD32 q_shift, 179 WORD32 size) = &ixheaacd_spec_to_overlapbuf_armv7; 180 181 VOID(*ixheaacd_overlap_buf_out) 182 (WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 size, 183 const WORD16 ch_fac) = &ixheaacd_overlap_buf_out_armv7; 184 185 VOID(*ixheaacd_overlap_out_copy) 186 (WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 *ptr_overlap_buf1, 187 const WORD16 ch_fac) = &ixheaacd_overlap_out_copy_armv7; 188 189 VOID(*ixheaacd_pretwiddle_compute) 190 (WORD32 *spec_data1, WORD32 *spec_data2, WORD32 *out_ptr, 191 ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints4, 192 WORD32 neg_expo) = &ixheaacd_pretwiddle_compute_armv7; 193 194 VOID(*ixheaacd_imdct_using_fft) 195 (ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD32 npoints, 196 WORD32 *ptr_x, WORD32 *ptr_y) = &ixheaacd_imdct_using_fft_armv7; 197 198 VOID(*ixheaacd_complex_fft_p2) 199 (WORD32 *xr, WORD32 *xi, WORD32 nlength, WORD32 fft_mode, 200 WORD32 *preshift) = &ixheaacd_complex_fft_p2_armv7; 201 202 VOID(*ixheaacd_calc_pre_twid) 203 (WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength, 204 const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_pre_twid_armv7; 205 206 VOID(*ixheaacd_calc_post_twid) 207 (WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength, 208 const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_post_twid_armv7; 209 210 VOID(*ixheaacd_mps_synt_out_calc) 211 (WORD32 resolution, FLOAT32 *out, FLOAT32 *state, 212 const FLOAT32 *filter_coeff) = &ixheaacd_mps_synt_out_calc_dec; 213 214 VOID(*ixheaacd_fft_15_ld) 215 (WORD32 *inp, WORD32 *op, WORD32 *fft3out, 216 UWORD8 *re_arr_tab_sml_240_ptr) = &ixheaacd_fft_15_ld_armv7; 217 218 VOID(*ixheaacd_aac_ld_dec_rearrange) 219 (WORD32 *ip, WORD32 *op, WORD32 mdct_len_2, 220 UWORD8 *re_arr_tab) = &ia_aac_ld_dec_rearrange_armv7; 221 222 VOID(*ixheaacd_fft32x32_ld) 223 (ia_aac_dec_imdct_tables_struct *imdct_tables_ptr, WORD32 npoints, 224 WORD32 *ptr_x, WORD32 *ptr_y) = &ixheaacd_imdct_using_fft_armv7; 225 226 VOID(*ixheaacd_fft32x32_ld2) 227 (ia_aac_dec_imdct_tables_struct *imdct_tables_ptr, WORD32 npoints, 228 WORD32 *ptr_x, WORD32 *ptr_y) = &ixheaacd_fft32x32_ld2_armv7; 229 230 WORD16 (*ixheaacd_neg_expo_inc)(WORD16 neg_expo) = &ixheaacd_neg_expo_inc_arm; 231 232 VOID(*ixheaacd_inv_dit_fft_8pt) 233 (WORD32 *x, WORD32 *real, WORD32 *imag) = &ixheaacd_inv_dit_fft_8pt_armv7; 234 235 VOID(*ixheaacd_scale_factor_process) 236 (WORD32 *x_invquant, WORD16 *scale_fact, WORD no_band, WORD8 *width, 237 WORD32 *scale_tables_ptr, WORD32 total_channels, WORD32 object_type, 238 WORD32 aac_sf_data_resil_flag) = &ixheaacd_scale_factor_process_armv7; 239 240 VOID(*ixheaacd_covariance_matrix_calc_960) 241 (WORD32 *, ia_lpp_trans_cov_matrix *, 242 WORD32, WORD32) = &ixheaacd_covariance_matrix_calc_dec_960; 243 244 VOID(*ixheaacd_aac_ld_dec_rearrange_960) 245 (WORD32 *ip, WORD32 *op, WORD32 mdct_len_2, 246 WORD16 *re_arr_tab) = &ixheaacd_dec_rearrange_short; 247 248 VOID(*ixheaacd_pretwiddle_compute_960) 249 (WORD32 *spec_data1, WORD32 *spec_data2, WORD32 *out_ptr, 250 ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints4, 251 WORD32 neg_expo) = &ixheaacd_pretwiddle_compute_960_dec; 252