1 /****************************************************************************** 2 * * 3 * Copyright (C) 2023 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 21 #pragma once 22 23 #define IXHEAACE_SBR_HF_ADJ_OFFSET (2) 24 #define IXHEAACE_ESBR_HBE_DELAY_OFFSET (32) 25 #define IXHEAACE_TIMESLOT_BUFFER_SIZE (78) 26 #define IXHEAACE_MAX_NUM_PATCHES (6) 27 #define IXHEAACE_MAX_STRETCH (4) 28 #define IXHEAACE_MAX_NUM_LIMITERS (12) 29 #define IXHEAACE_MAX_FREQ_COEFFS (56) 30 #define IXHEAACE_MAX_NOISE_COEFFS (5) 31 32 #define IXHEAACE_HBE_OPER_WIN_LEN (13) 33 #define IXHEAACE_NUM_QMF_SYNTH_CHANNELS (64) 34 #define IXHEAACE_TWICE_QMF_SYNTH_CH_NUM (128) 35 #define IXHEAACE_HBE_ZERO_BAND_IDX (6) 36 #define IXHEAACE_HBE_OPER_BLK_LEN_2 (10) 37 #define IXHEAACE_HBE_OPER_BLK_LEN_3 (8) 38 #define IXHEAACE_HBE_OPER_BLK_LEN_4 (6) 39 #define IXHEAACE_FD_OVERSAMPLING_FAC (1.5f) 40 41 #define IXHEAACE_MAX_NO_COLS_VALUE (64) 42 #define IXHEAACE_MAX_FRAME_SIZE (1024) 43 #define IXHEAACE_MAX_NUM_SAMPLES (4096) 44 #define IXHEAACE_MAX_QMF_X_INBUF_SIZE (IXHEAACE_MAX_NO_COLS_VALUE) 45 #define IXHEAACE_MAX_QMF_X_OUTBUF_SIZE (2 * IXHEAACE_MAX_QMF_X_INBUF_SIZE) 46 47 #define IXHEAACE_MAX_QMF_X_IN_REAL_BUF \ 48 (IXHEAACE_NUM_QMF_SYNTH_CHANNELS * IXHEAACE_MAX_QMF_X_INBUF_SIZE) 49 #define IXHEAACE_MAX_QMF_X_IN_IMAG_BUF \ 50 (IXHEAACE_NUM_QMF_SYNTH_CHANNELS * IXHEAACE_MAX_QMF_X_INBUF_SIZE) 51 52 #define IXHEAACE_MAX_QMF_X_OUT_REAL_BUF \ 53 (IXHEAACE_NUM_QMF_SYNTH_CHANNELS * IXHEAACE_MAX_QMF_X_OUTBUF_SIZE) 54 #define IXHEAACE_MAX_QMF_X_OUT_IMAG_BUF \ 55 (IXHEAACE_NUM_QMF_SYNTH_CHANNELS * IXHEAACE_MAX_QMF_X_OUTBUF_SIZE) 56 57 #define IXHEAACE_X_INBUF_SIZE (IXHEAACE_MAX_FRAME_SIZE + IXHEAACE_NUM_QMF_SYNTH_CHANNELS) 58 #define IXHEAACE_X_OUTBUF_SIZE (IXHEAACE_X_INBUF_SIZE * 2) 59 60 #define IXHEAACE_MAX_HBE_PERSISTENT_SIZE \ 61 (IXHEAACE_MAX_QMF_X_INBUF_SIZE * sizeof(FLOAT32 *) + \ 62 IXHEAACE_MAX_QMF_X_OUTBUF_SIZE * sizeof(FLOAT32 *) + \ 63 IXHEAACE_MAX_QMF_X_IN_REAL_BUF * sizeof(FLOAT32) + \ 64 IXHEAACE_MAX_QMF_X_IN_IMAG_BUF * sizeof(FLOAT32) + \ 65 IXHEAACE_MAX_QMF_X_OUT_REAL_BUF * sizeof(FLOAT32) + \ 66 IXHEAACE_MAX_QMF_X_OUT_IMAG_BUF * sizeof(FLOAT32) + IXHEAACE_X_INBUF_SIZE * sizeof(FLOAT32) + \ 67 IXHEAACE_X_OUTBUF_SIZE * sizeof(FLOAT32)) 68 69 #define IXHEAACE_LOW (0) 70 #define IXHEAACE_HIGH (1) 71 72 #define IXHEAACE_SBR_CONST_PMIN 1.0f 73 74 #define ixheaace_cbrt_calc(a) (pow(a, -0.333333f)) 75 76 #define IXHEAACE_QMF_FILTER_STATE_ANA_SIZE 320 77 78 typedef struct { 79 FLOAT32 real[64][128]; 80 FLOAT32 imag[64][128]; 81 } ixheaace_str_dft_hbe_anal_coeff; 82 83 typedef struct { 84 WORD32 x_over_qmf[IXHEAACE_MAX_NUM_PATCHES]; 85 WORD32 max_stretch; 86 WORD32 core_frame_length; 87 WORD32 hbe_qmf_in_len; 88 WORD32 hbe_qmf_out_len; 89 WORD32 no_bins; 90 WORD32 start_band; 91 WORD32 end_band; 92 WORD32 upsamp_4_flag; 93 WORD32 synth_buf_offset; 94 95 WORD16 num_sf_bands[2]; 96 WORD16 *ptr_freq_band_tab[2]; 97 WORD16 freq_band_tbl_lo[IXHEAACE_MAX_FREQ_COEFFS / 2 + 1]; 98 WORD16 freq_band_tbl_hi[IXHEAACE_MAX_FREQ_COEFFS + 1]; 99 100 FLOAT32 *ptr_input_buf; 101 102 FLOAT32 qmf_in_buf[IXHEAACE_TWICE_QMF_SYNTH_CH_NUM][IXHEAACE_TWICE_QMF_SYNTH_CH_NUM]; 103 FLOAT32 qmf_out_buf[IXHEAACE_TWICE_QMF_SYNTH_CH_NUM][IXHEAACE_TWICE_QMF_SYNTH_CH_NUM]; 104 105 WORD32 k_start; 106 WORD32 synth_size; 107 FLOAT32 synth_buf[1280]; 108 FLOAT32 analy_buf[640]; 109 FLOAT32 *ptr_syn_win_coeff; 110 FLOAT32 *ptr_ana_win_coeff; 111 112 FLOAT32 *ptr_syn_cos_tab; 113 FLOAT32 *ptr_analy_cos_sin_tab; 114 115 VOID (*ixheaace_real_synth_fft)(FLOAT32 *ptr_inp, FLOAT32 *ptr_out, WORD32 n_points); 116 FLOAT32 norm_qmf_in_buf[128][128]; 117 118 VOID (*ixheaace_cmplx_anal_fft)(FLOAT32 *ptr_inp, FLOAT32 *ptr_out, WORD32 n_points); 119 120 WORD32 esbr_hq; 121 WORD32 in_hop_size; 122 WORD32 fft_size[2]; 123 124 FLOAT32 *ptr_ana_win; /* Phase Vocoder Analysis Window for FFT */ 125 FLOAT32 *ptr_syn_win; /* Phase Vocoder Synthesis Window for OLA */ 126 127 FLOAT32 *ptr_spectrum; /* FFT values in cartesian space */ 128 FLOAT32 *ptr_spectrum_tx; /* Transposed spectrum */ 129 FLOAT32 *ptr_mag; /* FFT magnitudes */ 130 FLOAT32 *ptr_phase; /* FFT angles */ 131 FLOAT32 *ptr_output_buf; 132 WORD32 ana_fft_size[2]; /* Analysis FFT length */ 133 WORD32 syn_fft_size[2]; /* Synthesis FFT length */ 134 WORD32 out_hop_size; 135 WORD32 analy_size; 136 WORD32 x_over_bin[IXHEAACE_MAX_STRETCH][2]; 137 WORD32 a_start; 138 139 FLOAT32 spectrum_buf[1536]; /* FFT values in cartesian space */ 140 FLOAT32 spectrum_transposed_buf[1536]; /* Transposed spectrum */ 141 FLOAT32 mag_buf[1536]; /* FFT magnitudes */ 142 FLOAT32 phase_buf[1536]; /* FFT angles */ 143 FLOAT32 output_buf[IXHEAACE_MAX_NUM_SAMPLES]; 144 FLOAT32 fd_win_buf[3][3][1536]; 145 146 FLOAT32 analysis_window_buf[1024]; 147 FLOAT32 synthesis_window_buf[1024]; 148 149 WORD32 oversampling_flag; 150 ixheaace_str_dft_hbe_anal_coeff str_dft_hbe_anal_coeff; 151 VOID (*ixheaace_hbe_anal_fft)(FLOAT32 *ptr_inp, FLOAT32 *ptr_scratch, WORD32 len, WORD32 sign); 152 VOID(*ixheaace_hbe_synth_ifft) 153 (FLOAT32 *ptr_inp, FLOAT32 *ptr_scratch, WORD32 len, WORD32 sign); 154 FLOAT32 *ptr_syn_cos_sin_tab; 155 FLOAT32 *ptr_ana_cos_sin_tab; 156 } ixheaace_str_esbr_hbe_txposer; 157 158 typedef struct { 159 WORD16 w_16[2 * 12]; 160 FLOAT32 dig_rev_tab_4_16[2]; 161 162 FLOAT32 esbr_qmf_c[1280]; 163 FLOAT32 esbr_qmf_c_24[480]; 164 FLOAT32 esbr_w_16[2 * 12]; 165 166 FLOAT32 esbr_sin_cos_twiddle_l64[64]; 167 FLOAT32 esbr_alt_sin_twiddle_l64[32]; 168 169 FLOAT32 esbr_sin_cos_twiddle_l32[32]; 170 FLOAT32 esbr_alt_sin_twiddle_l32[16]; 171 FLOAT32 esbr_t_cos_sin_l32[32 + 32]; 172 173 FLOAT32 esbr_sin_cos_twiddle_l24[24]; 174 FLOAT32 esbr_alt_sin_twiddle_l24[12]; 175 FLOAT32 esbr_t_cos_sin_l24[24 + 24]; 176 177 FLOAT32 esbr_sin_cos_twiddle_l16[16]; 178 FLOAT32 esbr_alt_sin_twiddle_l16[8]; 179 FLOAT32 esbr_t_cos_sin_l16[16 + 16]; 180 } ixheaace_str_qmf_dec_tabs_struct; 181 182 typedef struct { 183 WORD32 no_channels; 184 WORD16 num_time_slots; 185 186 WORD16 lsb; 187 WORD16 usb; 188 189 const FLOAT32 *ptr_ana_win_coeff_32; 190 const FLOAT32 *ptr_esbr_cos_twiddle; 191 const FLOAT32 *ptr_esbr_alt_sin_twiddle; 192 const FLOAT32 *ptr_esbr_t_cos; 193 FLOAT32 anal_filter_states_32[IXHEAACE_QMF_FILTER_STATE_ANA_SIZE]; 194 FLOAT32 *ptr_state_new_samples_pos_low_32; 195 const FLOAT32 *ptr_filter_pos_32; 196 ixheaace_str_qmf_dec_tabs_struct *pstr_qmf_dec_tabs; 197 } ia_sbr_qmf_filter_bank_struct; 198 199 typedef struct { 200 ixheaace_str_esbr_hbe_txposer *pstr_hbe_txposer; 201 VOID *ptr_hbe_txposer_buffers; 202 FLOAT32 ph_vocod_qmf_real[IXHEAACE_TIMESLOT_BUFFER_SIZE][IXHEAACE_NUM_QMF_SYNTH_CHANNELS]; 203 FLOAT32 ph_vocod_qmf_imag[IXHEAACE_TIMESLOT_BUFFER_SIZE][IXHEAACE_NUM_QMF_SYNTH_CHANNELS]; 204 FLOAT32 sbr_qmf_out_real[IXHEAACE_TIMESLOT_BUFFER_SIZE][IXHEAACE_NUM_QMF_SYNTH_CHANNELS]; 205 FLOAT32 sbr_qmf_out_imag[IXHEAACE_TIMESLOT_BUFFER_SIZE][IXHEAACE_NUM_QMF_SYNTH_CHANNELS]; 206 FLOAT32 qmf_buf_real[IXHEAACE_TIMESLOT_BUFFER_SIZE + 2 * 32][IXHEAACE_NUM_QMF_SYNTH_CHANNELS]; 207 FLOAT32 qmf_buf_imag[IXHEAACE_TIMESLOT_BUFFER_SIZE + 2 * 32][IXHEAACE_NUM_QMF_SYNTH_CHANNELS]; 208 209 ia_sbr_qmf_filter_bank_struct str_codec_qmf_bank; 210 } ixheaace_str_hbe_enc; 211 212 extern const ixheaace_str_qmf_dec_tabs_struct ixheaace_str_aac_qmf_tabs; 213 214 VOID iusace_complex_fft_p2(FLOAT32 *ptr_x, WORD32 nlength, FLOAT32 *ptr_scratch_fft_p2_y); 215 VOID iusace_complex_fft_p3_no_scratch(FLOAT32 *ptr_data, WORD32 nlength); 216 217 VOID ixheaace_esbr_hbe_data_init(ixheaace_str_esbr_hbe_txposer *pstr_esbr_hbe_txposer, 218 const WORD32 num_aac_samples, WORD32 samp_fac_4_flag, 219 const WORD32 num_out_samples, VOID *ptr_persistent_hbe_mem, 220 WORD32 *ptr_total_persistant); 221 222 IA_ERRORCODE ixheaace_dft_hbe_data_reinit(ixheaace_str_esbr_hbe_txposer *pstr_hbe_txposer); 223 224 IA_ERRORCODE ixheaace_qmf_hbe_data_reinit(ixheaace_str_esbr_hbe_txposer *pstr_hbe_txposer); 225 226 IA_ERRORCODE ixheaace_dft_hbe_apply(ixheaace_str_esbr_hbe_txposer *pstr_hbe_txposer, 227 FLOAT32 qmf_buf_real[][64], FLOAT32 qmf_buf_imag[][64], 228 WORD32 num_columns, FLOAT32 pv_qmf_buf_real[][64], 229 FLOAT32 pv_qmf_buf_imag[][64], WORD32 pitch_in_bins, 230 FLOAT32 *ptr_dft_hbe_scratch_buf); 231 232 IA_ERRORCODE ixheaace_qmf_hbe_apply(ixheaace_str_esbr_hbe_txposer *pstr_hbe_txposer, 233 FLOAT32 qmf_buf_real[][64], FLOAT32 qmf_buf_imag[][64], 234 WORD32 num_columns, FLOAT32 pv_qmf_buf_real[][64], 235 FLOAT32 pv_qmf_buf_imag[][64], WORD32 pitch_in_bins); 236 237 IA_ERRORCODE ixheaace_hbe_post_anal_process(ixheaace_str_esbr_hbe_txposer *pstr_hbe_txposer, 238 WORD32 pitch_in_bins, WORD32 sbr_upsamp_4_flg); 239 240 VOID ixheaace_hbe_repl_spec(WORD32 x_over_qmf[IXHEAACE_MAX_NUM_PATCHES], 241 FLOAT32 qmf_buf_real[][64], FLOAT32 qmf_buf_imag[][64], 242 WORD32 no_bins, WORD32 max_stretch); 243 244 VOID ixheaace_esbr_qmf_init(ia_sbr_qmf_filter_bank_struct *pstr_codec_qmf_bank, 245 WORD32 sbr_ratio_idx, WORD32 output_frame_size); 246 247 VOID ixheaace_esbr_analysis_filt_block( 248 ia_sbr_qmf_filter_bank_struct *pstr_codec_qmf_bank, 249 ixheaace_str_qmf_dec_tabs_struct *pstr_qmf_dec_tabs, FLOAT32 *ptr_core_coder_samples, 250 FLOAT32 qmf_buf_real[IXHEAACE_TIMESLOT_BUFFER_SIZE + 2 * 32][IXHEAACE_NUM_QMF_SYNTH_CHANNELS], 251 FLOAT32 qmf_buf_imag[IXHEAACE_TIMESLOT_BUFFER_SIZE + 2 * 32][IXHEAACE_NUM_QMF_SYNTH_CHANNELS], 252 WORD32 op_delay); 253