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 #ifndef IXHEAACD_SBR_DEC_H 21 #define IXHEAACD_SBR_DEC_H 22 23 #include <setjmp.h> 24 25 typedef struct { 26 FLOAT32 real[64][128]; 27 FLOAT32 imag[64][128]; 28 } ia_dft_hbe_anal_coeff; 29 30 typedef struct { 31 WORD32 x_over_qmf[MAX_NUM_PATCHES]; 32 WORD32 max_stretch; 33 WORD32 core_frame_length; 34 WORD32 hbe_qmf_in_len; 35 WORD32 hbe_qmf_out_len; 36 WORD32 no_bins; 37 WORD32 start_band; 38 WORD32 end_band; 39 WORD32 upsamp_4_flag; 40 WORD32 synth_buf_offset; 41 42 FLOAT32 *ptr_input_buf; 43 44 FLOAT32 **qmf_in_buf; 45 FLOAT32 **qmf_out_buf; 46 47 WORD32 k_start; 48 WORD32 synth_size; 49 FLOAT32 synth_buf[1280]; 50 FLOAT32 analy_buf[640]; 51 FLOAT32 *synth_wind_coeff; 52 FLOAT32 *analy_wind_coeff; 53 54 FLOAT32 *synth_cos_tab; 55 FLOAT32 *analy_cos_sin_tab; 56 57 FLOAT32 norm_qmf_in_buf[46][128]; 58 VOID (*ixheaacd_real_synth_fft)(FLOAT32 *inp, FLOAT32 *out, WORD32 n_points); 59 60 VOID (*ixheaacd_cmplx_anal_fft)(FLOAT32 *inp, FLOAT32 *out, WORD32 n_points); 61 62 WORD32 esbr_hq; 63 WORD32 in_hop_size; 64 WORD32 fft_size[2]; 65 66 FLOAT32 *anal_window; 67 FLOAT32 *synth_window; 68 69 FLOAT32 *ptr_spectrum; 70 FLOAT32 *ptr_spectrum_tx; 71 FLOAT32 *mag; 72 FLOAT32 *phase; 73 FLOAT32 *ptr_output_buf; 74 WORD32 ana_fft_size[2]; 75 WORD32 syn_fft_size[2]; 76 WORD32 out_hop_size; 77 WORD32 analy_size; 78 WORD32 x_over_bin[MAX_STRETCH][2]; 79 WORD32 a_start; 80 81 FLOAT32 spectrum_buf[1536]; 82 FLOAT32 spectrum_transposed_buf[1536]; 83 FLOAT32 mag_buf[1536]; 84 FLOAT32 phase_buf[1536]; 85 FLOAT32 output_buf[4096]; 86 FLOAT32 fd_win_buf[3][3][1536]; 87 88 FLOAT32 analysis_window_buf[1024]; 89 FLOAT32 synthesis_window_buf[1024]; 90 91 WORD32 oversampling_flag; 92 ia_dft_hbe_anal_coeff str_dft_hbe_anal_coeff; 93 VOID (*ixheaacd_hbe_anal_fft)(FLOAT32 *inp, FLOAT32 *scratch, WORD32 len, WORD32 sign); 94 VOID (*ixheaacd_hbe_synth_ifft)(FLOAT32 *inp, FLOAT32 *scratch, WORD32 len, WORD32 sign); 95 FLOAT32 *syn_cos_sin_tab; 96 FLOAT32 *ana_cos_sin_tab; 97 98 } ia_esbr_hbe_txposer_struct; 99 100 typedef struct { 101 WORD32 *ptr_sbr_overlap_buf; 102 WORD32 **drc_factors_sbr; 103 ia_sbr_qmf_filter_bank_struct str_codec_qmf_bank; 104 ia_sbr_qmf_filter_bank_struct str_synthesis_qmf_bank; 105 ia_sbr_calc_env_struct str_sbr_calc_env; 106 ia_sbr_hf_generator_struct str_hf_generator; 107 108 ia_sbr_scale_fact_struct str_sbr_scale_fact; 109 110 WORD32 max_samp_val; 111 WORD32 band_count; 112 ia_esbr_hbe_txposer_struct *p_hbe_txposer; 113 114 FLOAT32 core_sample_buf[2624]; 115 WORD16 core_sample_buf_sbr[2624]; 116 FLOAT32 ph_vocod_qmf_real[TIMESLOT_BUFFER_SIZE][NO_QMF_SYNTH_CHANNELS]; 117 FLOAT32 ph_vocod_qmf_imag[TIMESLOT_BUFFER_SIZE][NO_QMF_SYNTH_CHANNELS]; 118 FLOAT32 sbr_qmf_out_real[TIMESLOT_BUFFER_SIZE][NO_QMF_SYNTH_CHANNELS]; 119 FLOAT32 sbr_qmf_out_imag[TIMESLOT_BUFFER_SIZE][NO_QMF_SYNTH_CHANNELS]; 120 FLOAT32 qmf_buf_real[TIMESLOT_BUFFER_SIZE + 2 * 32][NO_QMF_SYNTH_CHANNELS]; 121 FLOAT32 qmf_buf_imag[TIMESLOT_BUFFER_SIZE + 2 * 32][NO_QMF_SYNTH_CHANNELS]; 122 123 FLOAT32 mps_qmf_buf_real[TIMESLOT_BUFFER_SIZE][NO_QMF_SYNTH_CHANNELS]; 124 FLOAT32 mps_qmf_buf_imag[TIMESLOT_BUFFER_SIZE][NO_QMF_SYNTH_CHANNELS]; 125 FLOAT32 mps_sbr_qmf_buf_real[TIMESLOT_BUFFER_SIZE][NO_QMF_SYNTH_CHANNELS]; 126 FLOAT32 mps_sbr_qmf_buf_imag[TIMESLOT_BUFFER_SIZE][NO_QMF_SYNTH_CHANNELS]; 127 128 WORD32 sbr_scratch_local[256]; 129 FLOAT32 scratch_buff[320]; 130 131 FLOAT32 qmf_energy_buf[64][32]; 132 FLOAT32 pvc_qmf_enrg_arr[16 * 32]; 133 134 FLOAT32 **pp_qmf_buf_real; 135 FLOAT32 **pp_qmf_buf_imag; 136 137 WORD32 *p_arr_qmf_buf_real[MAX_ENV_COLS]; 138 WORD32 *p_arr_qmf_buf_imag[MAX_ENV_COLS]; 139 140 FLOAT32 *time_sample_buf; 141 } ia_sbr_dec_struct; 142 143 typedef struct { 144 ia_sbr_prev_frame_data_struct *pstr_prev_frame_data; 145 ia_sbr_dec_struct str_sbr_dec; 146 WORD32 output_frame_size; 147 WORD32 sync_state; 148 } ia_sbr_channel_struct; 149 150 struct ia_sbr_dec_inst_struct { 151 ia_ps_dec_struct *pstr_ps_stereo_dec; 152 ia_ps_dec_config_struct str_ps_config_prev; 153 FLAG ps_present; 154 ia_sbr_channel_struct *pstr_sbr_channel[MAXNRSBRCHANNELS]; 155 ia_sbr_header_data_struct *pstr_sbr_header[MAXNRSBRCHANNELS]; 156 ia_freq_band_data_struct *pstr_freq_band_data[MAXNRSBRCHANNELS]; 157 ia_sbr_tables_struct *pstr_sbr_tables; 158 ixheaacd_misc_tables *pstr_common_tables; 159 ia_pvc_data_struct *ptr_pvc_data_str; 160 VOID *hbe_txposer_buffers; 161 FLOAT32 *time_sample_buf[MAXNRSBRCHANNELS]; 162 VOID *scratch_mem_v; 163 VOID *frame_buffer[2]; 164 ia_sbr_header_data_struct str_sbr_dflt_header; 165 FLAG stereo_config_idx; 166 FLAG usac_independency_flag; 167 FLAG pvc_flag; 168 FLAG hbe_flag; 169 FLAG sbr_mode; 170 FLAG prev_sbr_mode; 171 FLAG inter_tes_flag; 172 FLAG aot_usac_flag; 173 WORD32 band_count[MAXNRSBRCHANNELS]; 174 jmp_buf *xaac_jmp_buf; 175 WORD8 *ptr_mps_data; 176 WORD32 left_mps_bits; 177 WORD32 mps_bits_pos; 178 FLAG esbr_hq; 179 FLAG enh_sbr; 180 FLAG enh_sbr_ps; 181 FLAG eld_sbr; 182 WORD32 num_delay_frames; 183 FLAG sbr_parse_err_flag; 184 FLAG frame_ok; 185 FLAG ec_flag; 186 FLAG first_frame; 187 FLAG prev_usac_independency_flag; 188 FLAG sbr_parse_complete; 189 }; 190 191 typedef struct ia_sbr_pers_struct { 192 WORD16 *sbr_qmf_analy_states; 193 194 WORD32 *sbr_qmf_analy_states_32; 195 196 WORD16 *sbr_qmf_synth_states; 197 198 WORD32 *sbr_qmf_synth_states_32; 199 200 WORD32 **sbr_lpc_filter_states_real[MAXNRSBRCHANNELS]; 201 202 WORD32 **sbr_lpc_filter_states_imag[MAXNRSBRCHANNELS]; 203 204 WORD32 *ptr_sbr_overlap_buf[MAXNRSBRCHANNELS]; 205 206 struct ia_sbr_dec_inst_struct str_sbr_dec_inst; 207 208 ia_transposer_settings_struct str_sbr_tran_settings; 209 210 WORD16 *sbr_smooth_gain_buf[MAXNRSBRCHANNELS]; 211 212 WORD16 *sbr_smooth_noise_buf[MAXNRSBRCHANNELS]; 213 214 ia_sbr_prev_frame_data_struct *pstr_prev_frame_data[MAXNRSBRCHANNELS]; 215 216 } ia_sbr_pers_struct; 217 218 WORD32 ixheaacd_sbr_dec( 219 ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data, 220 ia_sbr_header_data_struct *ptr_header_data, ia_sbr_frame_info_data_struct *ptr_frame_data, 221 ia_sbr_prev_frame_data_struct *ptr_frame_data_prev, ia_ps_dec_struct *ptr_ps_dec, 222 ia_sbr_qmf_filter_bank_struct *ptr_qmf_synth_bank_r, ia_sbr_scale_fact_struct *ptr_sbr_sf_r, 223 FLAG apply_processing, FLAG low_pow_flag, WORD32 *ptr_work_buf_core, 224 ia_sbr_tables_struct *sbr_tables_ptr, ixheaacd_misc_tables *pstr_common_tables, WORD ch_fac, 225 ia_pvc_data_struct *ptr_pvc_data_str, FLAG drc_on, WORD32 drc_sbr_factors[][64], 226 WORD32 audio_object_type, WORD32 ldmps_present, VOID *self, WORD32 heaac_mps_present, 227 WORD32 ec_flag); 228 229 WORD16 ixheaacd_create_sbrdec(ixheaacd_misc_tables *pstr_common_table, 230 ia_sbr_channel_struct *ptr_sbr_channel, 231 ia_sbr_header_data_struct *ptr_header_data, 232 WORD16 chan, FLAG down_sample_flag, 233 VOID *sbr_persistent_mem_v, WORD ps_enable, 234 WORD audio_object_type, WORD32 ldmps_present, 235 WORD32 ldsbr_present); 236 237 #define MAX_NUM_QMF_BANDS_ESBR 128 238 239 WORD32 ixheaacd_sbr_dec_from_mps(FLOAT32 *p_mps_qmf_output, VOID *p_sbr_dec, VOID *p_sbr_frame, 240 VOID *p_sbr_header, WORD32 ec_flag); 241 242 WORD32 ixheaacd_qmf_hbe_apply(ia_esbr_hbe_txposer_struct *h_hbe_txposer, 243 FLOAT32 qmf_buf_real[][64], 244 FLOAT32 qmf_buf_imag[][64], WORD32 num_columns, 245 FLOAT32 pv_qmf_buf_real[][64], 246 FLOAT32 pv_qmf_buf_imag[][64], 247 WORD32 pitch_in_bins, 248 ia_sbr_header_data_struct *ptr_header_data); 249 250 VOID ixheaacd_hbe_apply_cfftn(FLOAT32 re[], FLOAT32 *scratch, WORD32 n_pass, WORD32 i_sign); 251 252 VOID ixheaacd_hbe_apply_cfftn_gen(FLOAT32 re[], FLOAT32 *scratch, WORD32 n_pass, 253 WORD32 i_sign); 254 255 VOID ixheaacd_hbe_apply_fft_288(FLOAT32 *inp, FLOAT32 *scratch, WORD32 len, WORD32 i_sign); 256 257 VOID ixheaacd_hbe_apply_ifft_224(FLOAT32 *inp, FLOAT32 *scratch, WORD32 len, WORD32 i_sign); 258 259 VOID ixheaacd_hbe_apply_fft_3(FLOAT32 *inp, FLOAT32 *op, WORD32 i_sign); 260 261 VOID ixheaacd_hbe_apply_ifft_7(FLOAT32 *inp, FLOAT32 *op); 262 263 VOID ixheaacd_hbe_apply_ifft_336(FLOAT32 *inp, FLOAT32 *ptr_scratch, WORD32 len, 264 WORD32 i_sign); 265 266 WORD32 ixheaacd_dft_hbe_apply(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer, 267 FLOAT32 qmf_buf_real[][64], 268 FLOAT32 qmf_buf_imag[][64], WORD32 num_columns, 269 FLOAT32 pv_qmf_buf_real[][64], 270 FLOAT32 pv_qmf_buf_imag[][64], 271 WORD32 pitch_in_bins, 272 FLOAT32 *dft_hbe_scratch_buf); 273 274 WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, FLOAT32 input_real[][64], 275 FLOAT32 input_imag[][64], FLOAT32 input_real1[][64], 276 FLOAT32 input_imag1[][64], WORD32 x_over_qmf[MAX_NUM_PATCHES], 277 FLOAT32 *scratch_buff, FLOAT32 *env_out, WORD32 ldmps_present, 278 WORD32 ec_flag); 279 280 WORD32 ixheaacd_generate_hf(FLOAT32 ptr_src_buf_real[][64], FLOAT32 ptr_src_buf_imag[][64], 281 FLOAT32 ptr_ph_vocod_buf_real[][64], 282 FLOAT32 ptr_ph_vocod_buf_imag[][64], FLOAT32 ptr_dst_buf_real[][64], 283 FLOAT32 ptr_dst_buf_imag[][64], 284 ia_sbr_frame_info_data_struct *ptr_frame_data, 285 ia_sbr_header_data_struct *ptr_header_data, WORD32 audio_object_type, 286 WORD32 time_slots, WORD32 ec_flag); 287 288 VOID ixheaacd_clr_subsamples(WORD32 *ptr_qmf_buf, WORD32 num, WORD32 size); 289 290 VOID ixheaacd_rescale_x_overlap( 291 ia_sbr_dec_struct *ptr_sbr_dec, ia_sbr_header_data_struct *ptr_header_data, 292 ia_sbr_frame_info_data_struct *ptr_frame_data, 293 ia_sbr_prev_frame_data_struct *ptr_frame_data_prev, 294 WORD32 **pp_overlap_buffer_real, WORD32 **pp_overlap_buffer_imag, 295 FLAG low_pow_flag); 296 297 WORD32 ixheaacd_qmf_hbe_data_reinit( 298 ia_esbr_hbe_txposer_struct *ptr_hbe_transposer_str, 299 WORD16 *ptr_freq_band_tbl[MAX_FREQ_COEFFS + 1], WORD16 *ptr_num_sf_bands, 300 WORD32 upsamp_4_flag); 301 302 WORD32 ixheaacd_dft_hbe_data_reinit(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer, 303 WORD16 *p_freq_band_tab[2], WORD16 *p_num_sfb); 304 305 WORD32 ixheaacd_sbr_read_pvc_sce(ia_sbr_frame_info_data_struct *ptr_frame_data, 306 ia_bit_buf_struct *it_bit_buff, 307 WORD32 hbe_flag, 308 ia_pvc_data_struct *ptr_pvc_data, 309 ia_sbr_tables_struct *sbr_tables_ptr, 310 ia_sbr_header_data_struct *ptr_header_data); 311 312 WORD32 ixheaacd_esbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, 313 ia_sbr_header_data_struct *ptr_header_data, 314 ia_sbr_frame_info_data_struct *ptr_frame_data, 315 FLAG apply_processing, FLAG low_pow_flag, 316 ia_sbr_tables_struct *sbr_tables_ptr, WORD32 ch_fac); 317 318 VOID ixheaacd_hbe_repl_spec(WORD32 x_over_qmf[MAX_NUM_PATCHES], 319 FLOAT32 qmf_buf_real[][64], 320 FLOAT32 qmf_buf_imag[][64], WORD32 no_bins, 321 WORD32 max_stretch); 322 323 #endif 324