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_MPS_DEC_H 21 #define IXHEAACD_MPS_DEC_H 22 23 #include "stddef.h" 24 25 #define ABS_THR (1e-9f * 32768 * 32768) 26 27 #define MAX_NUM_QMF_BANDS_MPS (128) 28 #define MAX_NUM_QMF_BANDS_MPS_NEW (64) 29 30 #define MAX_PARAMETER_SETS_MPS (9) 31 #define BUFFER_LEN_HF_MPS ((QMF_HYBRID_FILT_ORDER - 1) / 2 + MAX_TIME_SLOTS) 32 33 #define DECORR_FILTER_ORDER_BAND_0 (20) 34 #define DECORR_FILTER_ORDER_BAND_1 (15) 35 #define DECORR_FILTER_ORDER_BAND_2 (6) 36 #define DECORR_FILTER_ORDER_BAND_3 (3) 37 38 #define MAX_DECORR_FILTER_ORDER (DECORR_FILTER_ORDER_BAND_0) 39 40 #define DECORR_FILT_0_ORD (10) 41 #define DECORR_FILT_1_ORD (8) 42 #define DECORR_FILT_2_ORD (3) 43 #define DECORR_FILT_3_ORD (2) 44 45 #define NO_RES_BANDS -1 46 47 #define MAX_HYBRID_BANDS_MPS (MAX_NUM_QMF_BANDS_MPS_NEW - 3 + 10) 48 #define MAX_TIME_SLOTS (72) 49 50 #define QMF_HYBRID_FILT_ORDER (13) 51 #define BUFFER_LEN_LF_MPS (QMF_HYBRID_FILT_ORDER - 1 + MAX_TIME_SLOTS) 52 #define MAX_NO_TIME_SLOTS_DELAY (14) 53 54 #define MAXNRSBRCHANNELS 2 55 #define abs(x) (x < 0) ? -x : x 56 57 #define PC_FILTERLENGTH (11) 58 #define PC_FILTERDELAY ((PC_FILTERLENGTH - 1) / 2) 59 #define ABS_THR_FIX (35184) 60 61 #ifndef MAX_NUM_QMF_BANDS 62 #define MAX_NUM_QMF_BANDS (64) 63 #endif 64 65 #define MAX_HYBRID_BANDS (MAX_NUM_QMF_BANDS - 3 + 10) 66 #define MAX_INPUT_CHANNELS_MPS (6) 67 68 #define MAX_RESIDUAL_CHANNELS_MPS (10) 69 #define MAX_RESIDUAL_FRAMES (4) 70 71 #define MAX_OUTPUT_CHANNELS_MPS (8) 72 #define MAX_NUM_PARAMS (MAX_NUM_OTT + 4 * MAX_NUM_TTT + MAX_INPUT_CHANNELS_MPS) 73 74 #define MAX_PARAMETER_SETS (8) 75 76 #define MAX_M1_OUTPUT (8) 77 #define MAX_M2_INPUT (8) 78 #define MAX_M2_OUTPUT (8) 79 80 #define PROTO_LEN (13) 81 #define BUFFER_LEN_LF (PROTO_LEN - 1 + MAX_TIME_SLOTS) 82 #define BUFFER_LEN_HF ((PROTO_LEN - 1) / 2 + MAX_TIME_SLOTS) 83 84 #define MAX_NO_DECORR_CHANNELS (5) 85 86 #define MAX_OUTPUT_CHANNELS_AT_MPS (8) 87 88 #define QMF_FILTER_STATE_SYN_SIZE_MPS (576) 89 90 #define QMF_FILTER_STATE_ANA_SIZE_MPS (640) 91 92 #define MAX_NUM_POAT max(MAX_NUM_PARAMS, MAX_NUM_OTT + MAX_OUTPUT_CHANNELS_AT) 93 94 #define BP_SIZE 25 95 96 #define MPS_SCRATCH_MEM_SIZE (194048) 97 98 typedef struct { 99 FLOAT32 re; 100 FLOAT32 im; 101 102 } ia_cmplx_flt_struct; 103 104 typedef struct { 105 WORD32 re; 106 WORD32 im; 107 } ia_cmplx_w32_struct; 108 109 typedef struct { 110 FLOAT32 *re; 111 FLOAT32 *im; 112 } ia_cmplx_fltp_struct; 113 114 typedef struct ia_mps_decor_filt_struct { 115 WORD32 state_len; 116 WORD32 num_len; 117 WORD32 den_len; 118 119 ia_cmplx_flt_struct state[MAX_DECORR_FILTER_ORDER + 1]; 120 const FLOAT32 *num; 121 const FLOAT32 *den; 122 123 } ia_mps_decor_filt_struct; 124 125 typedef struct ixheaacd_mps_decor_energy_adjust_filt_struct { 126 WORD32 num_bins; 127 FLOAT32 smooth_in_energy[MAX_PARAMETER_BANDS]; 128 FLOAT32 smooth_out_energy[MAX_PARAMETER_BANDS]; 129 130 } ixheaacd_mps_decor_energy_adjust_filt_struct; 131 132 typedef struct ia_mps_decor_struct { 133 WORD32 num_bins; 134 ia_mps_decor_filt_struct filter[MAX_HYBRID_BANDS_MPS]; 135 ixheaacd_mps_decor_energy_adjust_filt_struct decor_nrg_smooth; 136 137 WORD32 delay_sample_count[MAX_HYBRID_BANDS_MPS]; 138 139 ia_cmplx_flt_struct 140 decor_delay_buffer[71][MAX_TIME_SLOTS + MAX_NO_TIME_SLOTS_DELAY]; 141 142 } ia_mps_decor_struct; 143 144 typedef struct ia_mps_hybrid_filt_struct { 145 ia_cmplx_flt_struct hf_buffer[MAX_NUM_QMF_BANDS_MPS][BUFFER_LEN_HF_MPS]; 146 ia_cmplx_flt_struct lf_buffer[QMF_BANDS_TO_HYBRID][BUFFER_LEN_LF_MPS]; 147 } ia_mps_hybrid_filt_struct; 148 149 typedef struct ia_mps_data_struct { 150 WORD32 bs_xxx_data_mode[MAX_PARAMETER_SETS_MPS]; 151 WORD32 quant_coarse_xxx_flag[MAX_PARAMETER_SETS_MPS]; 152 WORD32 bs_freq_res_stride_xxx[MAX_PARAMETER_SETS_MPS]; 153 WORD8 bs_quant_coarse_xxx[MAX_PARAMETER_SETS_MPS]; 154 WORD8 bs_quant_coarse_xxx_prev; 155 } ia_mps_data_struct; 156 157 typedef struct ia_mps_bs_frame { 158 WORD8 independency_flag; 159 160 WORD32 cld_idx[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS]; 161 WORD32 icc_idx[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS]; 162 163 WORD32 cld_idx_pre[MAX_PARAMETER_BANDS]; 164 WORD32 icc_idx_pre[MAX_PARAMETER_BANDS]; 165 166 WORD32 cmp_cld_idx[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS]; 167 WORD32 cmp_icc_idx[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS]; 168 169 WORD32 cmp_cld_idx_prev[MAX_PARAMETER_BANDS]; 170 WORD32 cmp_icc_idx_prev[MAX_PARAMETER_BANDS]; 171 172 ia_mps_data_struct cld_data; 173 ia_mps_data_struct icc_data; 174 ia_mps_data_struct ipd_data; 175 176 WORD32 ipd_idx_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS]; 177 WORD32 ipd_idx_data_prev[MAX_PARAMETER_BANDS]; 178 WORD32 ipd_idx[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS]; 179 WORD32 ipd_idx_prev[MAX_PARAMETER_BANDS]; 180 181 WORD32 bs_smooth_mode[MAX_PARAMETER_SETS_MPS]; 182 WORD32 bs_smooth_time[MAX_PARAMETER_SETS_MPS]; 183 WORD32 bs_freq_res_stride_smg[MAX_PARAMETER_SETS_MPS]; 184 WORD32 bs_smg_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS]; 185 186 } ia_mps_bs_frame; 187 188 typedef struct ia_mps_smoothing_struct { 189 WORD32 prev_smg_time; 190 FLOAT32 inv_prev_smg_time; 191 WORD32 prev_smg_data[MAX_PARAMETER_BANDS]; 192 } ia_mps_smoothing_struct; 193 194 typedef struct ia_mps_env_reshape_struct { 195 FLOAT32 pb_energy_prev[3][MAX_PARAMETER_BANDS]; 196 FLOAT32 avg_energy_prev[3]; 197 FLOAT32 frame_energy_prev[3]; 198 } ia_mps_env_reshape_struct; 199 200 typedef struct ia_mps_stp_struct { 201 FLOAT32 nrg_dir; 202 FLOAT32 nrg_diff[2]; 203 FLOAT32 nrg_dir_prev; 204 FLOAT32 nrg_diff_prev[2]; 205 FLOAT32 tp_scale_last[2]; 206 WORD32 init_flag; 207 WORD32 update_old_ener; 208 } ia_mps_stp_struct; 209 210 typedef struct ia_mps_opd_smooth_struct { 211 WORD32 smooth_l_phase[MAX_PARAMETER_BANDS]; 212 WORD32 smooth_r_phase[MAX_PARAMETER_BANDS]; 213 } ia_mps_opd_smooth_struct; 214 215 typedef struct ia_mps_dec_state_struct { 216 WORD32 in_ch_count; 217 WORD32 out_ch_count; 218 219 FLOAT32 input_gain; 220 WORD32 dir_sig_count; 221 222 WORD32 decor_sig_count; 223 224 WORD32 time_slots; 225 WORD32 pre_mix_req; 226 WORD32 temp_shape_enable_ch_stp[2]; 227 WORD32 temp_shape_enable_ch_ges[2]; 228 229 FLOAT32 env_shape_data[2][MAX_TIME_SLOTS]; 230 231 WORD8 parse_nxt_frame; 232 WORD32 band_count[MAX_M_INPUT]; 233 WORD32 synth_count; 234 WORD32 qmf_band_count; 235 WORD32 hyb_band_count[MAX_M_INPUT]; 236 WORD32 hyb_band_count_max; 237 const WORD32 *hyb_band_to_processing_band_table; 238 239 WORD32 res_ch_count; 240 241 WORD32 res_bands; 242 WORD32 max_res_bands; 243 WORD32 bs_param_bands; 244 245 WORD32 ext_frame_flag; 246 WORD32 num_parameter_sets; 247 WORD32 num_parameter_sets_prev; 248 WORD32 param_slots[MAX_PARAMETER_SETS_MPS]; 249 WORD32 param_slot_diff[MAX_PARAMETER_SETS_MPS]; 250 FLOAT32 inv_param_slot_diff[MAX_PARAMETER_SETS_MPS]; 251 WORD32 inv_param_slot_diff_Q30[MAX_PARAMETER_SETS_MPS]; 252 253 WORD32 frame_length; 254 WORD32 residual_coding; 255 WORD32 bs_residual_present; 256 257 WORD32 bs_residual_bands; 258 259 ia_usac_dec_mps_config_struct *config; 260 ia_usac_dec_mps_config_struct ldmps_config; 261 ia_mps_bs_frame bs_frame; 262 263 WORD32 smoothing_time[MAX_PARAMETER_SETS_MPS]; 264 FLOAT32 inv_smoothing_time[MAX_PARAMETER_SETS_MPS]; 265 WORD32 smoothing_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS]; 266 267 WORD32 bs_tsd_enable; 268 WORD32 bs_tsd_sep_data[MAX_TIME_SLOTS]; 269 WORD32 bs_tsd_tr_phase_data[MAX_TIME_SLOTS]; 270 WORD32 tsd_num_tr_slots; 271 WORD32 tsd_codeword_len; 272 273 FLOAT32 cld_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS]; 274 FLOAT32 icc_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS]; 275 FLOAT32 ipd_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS]; 276 277 WORD32 bs_phase_mode; 278 WORD32 opd_smoothing_mode; 279 WORD32 num_bands_ipd; 280 281 FLOAT32 phase_l[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS]; 282 FLOAT32 phase_r[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS]; 283 FLOAT32 phase_l_prev[MAX_PARAMETER_BANDS]; 284 FLOAT32 phase_r_prev[MAX_PARAMETER_BANDS]; 285 286 FLOAT32 m1_param_re[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] 287 [MAX_M_INPUT]; 288 FLOAT32 m1_param_im[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] 289 [MAX_M_INPUT]; 290 FLOAT32 m2_decor_re[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] 291 [MAX_M_INPUT]; 292 FLOAT32 m2_decor_im[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] 293 [MAX_M_INPUT]; 294 FLOAT32 m2_resid_re[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] 295 [MAX_M_INPUT]; 296 FLOAT32 m2_resid_im[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] 297 [MAX_M_INPUT]; 298 299 FLOAT32 m1_param_re_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT]; 300 FLOAT32 m1_param_im_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT]; 301 FLOAT32 m2_decor_re_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT]; 302 FLOAT32 m2_decor_im_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT]; 303 FLOAT32 m2_resid_re_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT]; 304 FLOAT32 m2_resid_im_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT]; 305 306 ia_cmplx_flt_struct qmf_in[2][MAX_NUM_QMF_BANDS_MPS_NEW][MAX_TIME_SLOTS]; 307 ia_cmplx_flt_struct hyb_in[2][MAX_HYBRID_BANDS_MPS][MAX_TIME_SLOTS]; 308 ia_cmplx_flt_struct hyb_res[MAX_HYBRID_BANDS_MPS][MAX_TIME_SLOTS]; 309 ia_cmplx_flt_struct v[MAX_M_OUTPUT][MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS]; 310 ia_cmplx_flt_struct w_diff[MAX_M_INPUT][MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS]; 311 ia_cmplx_flt_struct w_dir[MAX_M_INPUT][MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS]; 312 ia_cmplx_flt_struct hyb_dir_out[2][MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS]; 313 ia_cmplx_flt_struct hyb_diff_out[2][MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS]; 314 315 ia_cmplx_flt_struct qmf_out_dir[2][MAX_TIME_SLOTS][MAX_NUM_QMF_BANDS_MPS]; 316 ia_cmplx_flt_struct scratch[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS]; 317 318 FLOAT32 (*output_buffer)[4096]; 319 320 ia_mps_hybrid_filt_struct hyb_filt_state[2]; 321 FLOAT32 qmf_filt_state[2][POLY_PHASE_SYNTH_SIZE]; 322 323 ia_mps_decor_struct mps_decor; 324 325 ia_mps_smoothing_struct smoothing_filt_state; 326 327 ia_mps_env_reshape_struct guided_env_shaping; 328 329 WORD32 bs_high_rate_mode; 330 331 FLOAT32 tmp_buf[84 * MAX_NUM_QMF_BANDS_SAC]; 332 333 FLOAT32 r_out_re_in_m1[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] 334 [MAX_M_INPUT]; 335 FLOAT32 r_out_im_in_m1[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] 336 [MAX_M_INPUT]; 337 WORD32 r_out_re_scratch_m1[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] 338 [MAX_M_INPUT]; 339 WORD32 r_out_im_scratch_m1[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] 340 [MAX_M_INPUT]; 341 342 FLOAT32 r_out_re_in_m2[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] 343 [MAX_M_INPUT]; 344 FLOAT32 r_out_im_in_m2[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] 345 [MAX_M_INPUT]; 346 FLOAT32 r_out_diff_re_in_m2[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] 347 [MAX_M_INPUT]; 348 FLOAT32 r_out_diff_im_in_m2[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] 349 [MAX_M_INPUT]; 350 351 WORD32 r_out_re_fix_in_m2[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] 352 [MAX_M_INPUT]; 353 WORD32 r_out_im_fix_in_m2[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] 354 [MAX_M_INPUT]; 355 WORD32 r_diff_out_re_fix_in_m2[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS] 356 [MAX_M_OUTPUT][MAX_M_INPUT]; 357 WORD32 r_diff_out_im_fix_in_m2[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS] 358 [MAX_M_OUTPUT][MAX_M_INPUT]; 359 360 FLOAT32 r_out_ph_re_in_m2[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][2]; 361 FLOAT32 r_out_ph_im_in_m2[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][2]; 362 363 ia_mps_stp_struct subband_var; 364 ia_mps_opd_smooth_struct opd_smooth; 365 WORD32 resolution; 366 VOID *p_sbr_dec[MAXNRSBRCHANNELS]; 367 VOID *p_sbr_frame[MAXNRSBRCHANNELS]; 368 VOID *p_sbr_header[MAXNRSBRCHANNELS]; 369 370 WORD32 object_type; 371 WORD32 mps_init_done; 372 ia_sbr_qmf_filter_bank_struct str_mps_qmf_bank; 373 ia_qmf_dec_tables_struct *qmf_dec_tables_ptr; 374 ia_sbr_tables_struct *sbr_tables_ptr; 375 ia_sbr_scale_fact_struct *str_sbr_scale_fact; 376 WORD8 ec_flag; 377 WORD8 frame_ok; 378 } ia_mps_dec_state_struct; 379 380 VOID ixheaacd_mps_init_pre_and_post_matrix(ia_mps_dec_state_struct *self); 381 VOID ixheaacd_pre_and_mix_matrix_calculation(ia_mps_dec_state_struct *self); 382 VOID ixheaacd_mps_apply_pre_matrix(ia_mps_dec_state_struct *self); 383 VOID ixheaacd_mps_apply_mix_matrix(ia_mps_dec_state_struct *self); 384 VOID ixheaacd_mps_apply_mix_matrix_type1(ia_mps_dec_state_struct *self); 385 VOID ixheaacd_mps_apply_mix_matrix_type2(ia_mps_dec_state_struct *self); 386 VOID ixheaacd_mps_apply_mix_matrix_type3(ia_mps_dec_state_struct *self); 387 388 VOID ixheaacd_samples_sat(WORD8 *outbuffer, WORD32 num_samples_out, 389 WORD32 pcmsize, FLOAT32 (*out_samples)[4096], 390 WORD32 *out_bytes, WORD32 num_channel_out); 391 392 VOID ixheaacd_samples_sat_mc(WORD8* outbuffer, WORD32 num_samples_out, 393 FLOAT32(*out_samples)[4096], WORD32* out_bytes, 394 WORD32 num_channel_out, WORD32 ch_fac); 395 396 IA_ERRORCODE ixheaacd_mps_frame_decode(ia_mps_dec_state_struct *self); 397 398 WORD32 ixheaacd_mps_header_decode(ia_mps_dec_state_struct *self); 399 400 VOID ixheaacd_mps_env_init(ia_mps_dec_state_struct *self); 401 VOID ixheaacd_mps_time_env_shaping(ia_mps_dec_state_struct *self); 402 403 VOID ixheaacd_mps_pre_matrix_mix_matrix_smoothing( 404 ia_mps_dec_state_struct *self); 405 VOID ixheaacd_mps_smoothing_opd(ia_mps_dec_state_struct *self); 406 WORD32 ixheaacd_mps_temp_process(ia_mps_dec_state_struct *self); 407 408 VOID ixheaacd_mps_par2umx_ps(ia_mps_dec_state_struct *self, 409 ia_mps_bs_frame *curr_bit_stream, FLOAT32 *h_real, 410 WORD32 param_set_idx); 411 VOID ixheaacd_mps_par2umx_ps_ipd_opd(ia_mps_dec_state_struct *self, 412 ia_mps_bs_frame *curr_bit_stream, 413 FLOAT32 *h_real, WORD32 param_set_idx); 414 415 VOID ixheaacd_mps_par2umx_pred(ia_mps_dec_state_struct *self, 416 ia_mps_bs_frame *curr_bit_stream, FLOAT32 *h_imag, 417 FLOAT32 *h_real, WORD32 param_set_idx, 418 WORD32 res_bands); 419 420 VOID ixheaacd_mps_upmix_interp( 421 FLOAT32 m_matrix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] 422 [MAX_M_INPUT], 423 FLOAT32 r_matrix[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] 424 [MAX_M_INPUT], 425 FLOAT32 m_matrix_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT], 426 WORD32 num_rows, WORD32 num_cols, ia_mps_dec_state_struct *self, WORD32 bs_high_rate_mode); 427 428 VOID ixheaacd_mps_upmix_interp_type1( 429 FLOAT32 m_matrix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] 430 [MAX_M_INPUT], 431 FLOAT32 r_matrix[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] 432 [MAX_M_INPUT], 433 FLOAT32 m_matrix_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT], 434 WORD32 num_rows, WORD32 num_cols, ia_mps_dec_state_struct *self, 435 WORD32 bs_high_rate_mode); 436 437 VOID ixheaacd_mps_upmix_interp_type2( 438 FLOAT32 m_matrix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] 439 [MAX_M_INPUT], 440 FLOAT32 r_matrix[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] 441 [MAX_M_INPUT], 442 FLOAT32 m_matrix_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT], 443 WORD32 num_rows, ia_mps_dec_state_struct *self, WORD32 col); 444 445 VOID ixheaacd_mps_phase_interpolation( 446 FLOAT32 pl[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS], 447 FLOAT32 pr[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS], 448 FLOAT32 pl_prev[MAX_PARAMETER_BANDS], FLOAT32 pr_prev[MAX_PARAMETER_BANDS], 449 FLOAT32 r_re[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][2], 450 FLOAT32 r_im[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][2], 451 ia_mps_dec_state_struct *self); 452 453 VOID ixheaacd_mps_complex_fft(FLOAT32 *xr, FLOAT32 *xi, WORD32 nlength); 454 455 typedef struct { 456 WORD32 state_length; 457 WORD32 num_length; 458 WORD32 den_length; 459 WORD32 complex; 460 461 WORD32 *state_real; 462 WORD32 *state_imag; 463 464 WORD32 *numerator_real; 465 WORD32 *numerator_imag; 466 467 WORD32 *denominator_real; 468 WORD32 *denominator_imag; 469 } ia_mps_dec_decorr_filter_instance_struct; 470 471 typedef struct ia_mps_dec_ducker_interface ia_mps_dec_ducker_interface; 472 473 typedef struct { 474 WORD32 decorr_seed; 475 WORD32 numbins; 476 477 ia_mps_dec_decorr_filter_instance_struct *filter[MAX_HYBRID_BANDS]; 478 479 ia_mps_dec_ducker_interface *ducker; 480 481 WORD32 no_sample_delay[MAX_HYBRID_BANDS]; 482 WORD32 **delay_buffer_real; 483 WORD32 **delay_buffer_imag; 484 } ia_mps_dec_decorr_dec_struct, *ia_mps_dec_decorr_dec_handle; 485 486 typedef struct { 487 WORD32 buffer_lf_real[QMF_BANDS_TO_HYBRID][BUFFER_LEN_LF]; 488 WORD32 buffer_lf_imag[QMF_BANDS_TO_HYBRID][BUFFER_LEN_LF]; 489 WORD32 qmf_lf_real[QMF_BANDS_TO_HYBRID][BUFFER_LEN_LF]; 490 WORD32 qmf_lf_imag[QMF_BANDS_TO_HYBRID][BUFFER_LEN_LF]; 491 WORD32 buffer_hf_real[MAX_NUM_QMF_BANDS][BUFFER_LEN_HF]; 492 WORD32 buffer_hf_imag[MAX_NUM_QMF_BANDS][BUFFER_LEN_HF]; 493 } ia_mps_dec_thyb_filter_state_struct; 494 495 typedef struct { 496 WORD32 re; 497 WORD32 im; 498 } complex; 499 500 typedef struct { 501 UWORD32 ui_pcm_wdsz; 502 UWORD32 ui_samp_freq; 503 UWORD32 ui_in_channels; 504 UWORD32 ui_out_channels; 505 WORD32 ui_channel_mask; 506 507 WORD32 frame_ok; 508 UWORD32 ui_bs_is_buried; 509 WORD32 ui_dec_type; 510 WORD32 ui_upmix_type; 511 WORD32 ui_binaural_quality; 512 WORD32 ui_hrtf_model; 513 UWORD32 ui_qmf_bands; 514 515 WORD32 bs_frame_length; 516 WORD32 bs_sampling_freq_index; 517 WORD32 bs_sampling_frequency; 518 WORD32 bs_freq_res; 519 WORD32 bs_tree_config; 520 WORD32 bs_quant_mode; 521 WORD32 bs_one_icc; 522 WORD32 bs_arbitrary_downmix; 523 WORD32 bs_residual_coding; 524 WORD32 bs_smooth_config; 525 WORD32 bs_fixed_gain_sur; 526 WORD32 bs_fixed_gain_lfe; 527 WORD32 bs_fixed_gain_dmx; 528 WORD32 bs_matrix_mode; 529 WORD32 bs_temp_shape_config; 530 531 WORD32 bs_decorr_config; 532 533 WORD32 bs_3d_audio_mode; 534 WORD32 bs_3d_audio_hrtf_set; 535 WORD32 bs_hrtf_freq_res; 536 WORD32 hrtf_num_band; 537 WORD32 bs_hrtf_num_chan; 538 WORD32 bs_hrtf_asymmetric; 539 WORD32 bs_hrtf_level_left[MAX_OUTPUT_CHANNELS_MPS][MAX_PARAMETER_BANDS]; 540 WORD32 bs_hrtf_level_right[MAX_OUTPUT_CHANNELS_MPS][MAX_PARAMETER_BANDS]; 541 WORD32 bs_hrtf_phase[MAX_OUTPUT_CHANNELS_MPS]; 542 WORD32 bs_hrtf_phase_lr[MAX_OUTPUT_CHANNELS_MPS][MAX_PARAMETER_BANDS]; 543 544 WORD32 bs_ott_bands[MAX_NUM_OTT]; 545 WORD32 bs_ttt_dual_mode[MAX_NUM_TTT]; 546 WORD32 bs_ttt_mode_low[MAX_NUM_TTT]; 547 WORD32 bs_ttt_mode_high[MAX_NUM_TTT]; 548 WORD32 bs_ttt_bands_low[MAX_NUM_TTT]; 549 550 WORD32 bs_sac_ext_type[MAX_NUM_EXT_TYPES]; 551 WORD32 sac_ext_cnt; 552 553 WORD32 bs_residual_present[MAX_RESIDUAL_CHANNELS_MPS]; 554 WORD32 bs_residual_sampling_freq_index; 555 WORD32 bs_residual_frames_per_spatial_frame; 556 557 WORD32 bs_residual_bands[MAX_RESIDUAL_CHANNELS_MPS]; 558 559 WORD32 bs_arbitrary_downmix_residual_sampling_freq_index; 560 WORD32 bs_arbitrary_downmix_residual_frames_per_spatial_frame; 561 WORD32 bs_arbitrary_downmix_residual_bands; 562 563 WORD32 bs_env_quant_mode; 564 565 WORD32 arbitrary_tree; 566 WORD32 num_out_chan_at; 567 WORD32 num_ott_boxes_at; 568 WORD32 bs_output_channel_pos_at[MAX_OUTPUT_CHANNELS_AT_MPS]; 569 WORD32 bs_ott_box_present_at[MAX_OUTPUT_CHANNELS_AT_MPS] 570 [MAX_ARBITRARY_TREE_INDEX]; 571 WORD32 bs_ott_default_cld_at[MAX_OUTPUT_CHANNELS_AT_MPS * 572 MAX_ARBITRARY_TREE_INDEX]; 573 WORD32 574 bs_ott_mode_lfe_at[MAX_OUTPUT_CHANNELS_AT_MPS * MAX_ARBITRARY_TREE_INDEX]; 575 WORD32 bs_ott_bands_at[MAX_OUTPUT_CHANNELS_AT_MPS * MAX_ARBITRARY_TREE_INDEX]; 576 } ia_mps_spatial_bs_config_struct; 577 578 typedef struct { 579 WORD32 580 bs_xxx_data_mode[MAX_NUM_POAT][MAX_PARAMETER_SETS]; 581 WORD32 582 bs_quant_coarse_xxx[MAX_NUM_POAT][MAX_PARAMETER_SETS]; 583 WORD32 584 bs_freq_res_stride_xxx[MAX_NUM_POAT][MAX_PARAMETER_SETS]; 585 586 WORD32 bs_quant_coarse_xxx_prev[MAX_NUM_POAT]; 587 WORD32 588 no_cmp_quant_coarse_xxx[MAX_NUM_POAT][MAX_PARAMETER_SETS]; 589 590 } ia_mps_dec_lossless_data_struct; 591 592 typedef struct { 593 WORD32 bs_icc_diff_present[MAX_RESIDUAL_CHANNELS_MPS][MAX_PARAMETER_SETS]; 594 WORD32 595 bs_icc_diff[MAX_RESIDUAL_CHANNELS_MPS][MAX_PARAMETER_SETS] 596 [MAX_PARAMETER_BANDS]; 597 598 } RESIDUAL_FRAME_DATA; 599 600 typedef struct { 601 WORD32 bs_independency_flag; 602 WORD32 603 ott_cld_idx[MAX_NUM_OTT + MAX_OUTPUT_CHANNELS_AT][MAX_PARAMETER_SETS] 604 [MAX_PARAMETER_BANDS]; 605 WORD32 ott_icc_idx[MAX_NUM_OTT][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS]; 606 WORD32 ttt_cpc_1_idx[MAX_NUM_TTT][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS]; 607 WORD32 ttt_cpc_2_idx[MAX_NUM_TTT][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS]; 608 WORD32 ttt_cld_1_idx[MAX_NUM_TTT][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS]; 609 WORD32 ttt_cld_2_idx[MAX_NUM_TTT][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS]; 610 WORD32 ttt_icc_idx[MAX_NUM_TTT][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS]; 611 612 WORD32 ott_cld_idx_prev[MAX_NUM_OTT + MAX_OUTPUT_CHANNELS_AT][MAX_PARAMETER_BANDS]; 613 WORD32 ott_icc_idx_prev[MAX_NUM_OTT][MAX_PARAMETER_BANDS]; 614 WORD32 ttt_cpc_1_idx_prev[MAX_NUM_TTT][MAX_PARAMETER_BANDS]; 615 WORD32 ttt_cpc_2_idx_prev[MAX_NUM_TTT][MAX_PARAMETER_BANDS]; 616 WORD32 ttt_cld_1_idx_prev[MAX_NUM_TTT][MAX_PARAMETER_BANDS]; 617 WORD32 ttt_cld_2_idx_prev[MAX_NUM_TTT][MAX_PARAMETER_BANDS]; 618 WORD32 ttt_icc_idx_prev[MAX_NUM_TTT][MAX_PARAMETER_BANDS]; 619 620 WORD32 621 cmp_ott_cld_idx[MAX_NUM_OTT + MAX_OUTPUT_CHANNELS_AT][MAX_PARAMETER_SETS] 622 [MAX_PARAMETER_BANDS]; 623 WORD32 cmp_ott_icc_idx[MAX_NUM_OTT][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS]; 624 WORD32 ott_icc_diff_idx[MAX_NUM_OTT][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS]; 625 WORD32 cmp_ttt_cpc_1_idx[MAX_NUM_TTT][MAX_PARAMETER_SETS] 626 [MAX_PARAMETER_BANDS]; 627 WORD32 cmp_ttt_cpc_2_idx[MAX_NUM_TTT][MAX_PARAMETER_SETS] 628 [MAX_PARAMETER_BANDS]; 629 WORD32 cmp_ttt_cld_1_idx[MAX_NUM_TTT][MAX_PARAMETER_SETS] 630 [MAX_PARAMETER_BANDS]; 631 WORD32 cmp_ttt_cld_2_idx[MAX_NUM_TTT][MAX_PARAMETER_SETS] 632 [MAX_PARAMETER_BANDS]; 633 WORD32 cmp_ttt_icc_idx[MAX_NUM_TTT][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS]; 634 WORD32 cmp_ott_cld_idx_prev[MAX_NUM_OTT + MAX_OUTPUT_CHANNELS_AT] 635 [MAX_PARAMETER_BANDS]; 636 WORD32 cmp_ott_icc_idx_prev[MAX_NUM_OTT][MAX_PARAMETER_BANDS]; 637 WORD32 cmp_ttt_cpc_1_idx_prev[MAX_NUM_TTT][MAX_PARAMETER_BANDS]; 638 WORD32 cmp_ttt_cpc_2_idx_prev[MAX_NUM_TTT][MAX_PARAMETER_BANDS]; 639 WORD32 cmp_ttt_cld_1_idx_prev[MAX_NUM_TTT][MAX_PARAMETER_BANDS]; 640 WORD32 cmp_ttt_cld_2_idx_prev[MAX_NUM_TTT][MAX_PARAMETER_BANDS]; 641 WORD32 cmp_ttt_icc_idx_prev[MAX_NUM_TTT][MAX_PARAMETER_BANDS]; 642 643 ia_mps_dec_lossless_data_struct cld_lossless_data; 644 ia_mps_dec_lossless_data_struct icc_lossless_data; 645 ia_mps_dec_lossless_data_struct cpc_lossless_data; 646 647 WORD32 bs_smooth_control; 648 WORD32 bs_smooth_mode[MAX_PARAMETER_SETS]; 649 WORD32 bs_smooth_time[MAX_PARAMETER_SETS]; 650 WORD32 bs_freq_res_stride_smg[MAX_PARAMETER_SETS]; 651 WORD32 bs_smg_data[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS]; 652 653 RESIDUAL_FRAME_DATA res_data; 654 655 WORD32 656 arbdmx_gain_idx[MAX_INPUT_CHANNELS_MPS][MAX_PARAMETER_SETS] 657 [MAX_PARAMETER_BANDS]; 658 WORD32 arbdmx_gain_idx_prev[MAX_INPUT_CHANNELS_MPS][MAX_PARAMETER_BANDS]; 659 WORD32 660 cmp_arbdmx_gain_idx[MAX_INPUT_CHANNELS_MPS][MAX_PARAMETER_SETS] 661 [MAX_PARAMETER_BANDS]; 662 WORD32 cmp_arbdmx_gain_idx_prev[MAX_INPUT_CHANNELS_MPS][MAX_PARAMETER_BANDS]; 663 WORD32 bs_arbitrary_downmix_residual_abs[MAX_INPUT_CHANNELS_MPS]; 664 WORD32 bs_arbitrary_downmix_residual_alpha_update_set[MAX_INPUT_CHANNELS_MPS]; 665 666 } ia_mps_dec_spatial_bs_frame_struct; 667 668 typedef struct { 669 WORD32 spec_prev_real[MAX_NUM_QMF_BANDS * 8]; 670 WORD32 spec_prev_imag[MAX_NUM_QMF_BANDS * 8]; 671 WORD32 p_cross_real[MAX_NUM_QMF_BANDS * 8]; 672 WORD32 p_cross_imag[MAX_NUM_QMF_BANDS * 8]; 673 674 WORD32 p_sum[MAX_NUM_QMF_BANDS * 8]; 675 WORD32 p_sum_prev[MAX_NUM_QMF_BANDS * 8]; 676 677 WORD32 buf_real[MAX_NUM_QMF_BANDS][6]; 678 WORD32 buf_imag[MAX_NUM_QMF_BANDS][6]; 679 680 WORD32 win_buf_real[MAX_NUM_QMF_BANDS][16]; 681 WORD32 win_buf_imag[MAX_NUM_QMF_BANDS][16]; 682 } ia_mps_dec_tonality_state_struct; 683 684 typedef struct { 685 WORD32 prev_smg_time; 686 WORD32 prev_smg_data[MAX_PARAMETER_BANDS]; 687 } ia_mps_dec_smoothing_state_struct; 688 689 typedef struct { 690 WORD32 691 part_nrg_prev[2 * MAX_OUTPUT_CHANNELS_MPS + MAX_INPUT_CHANNELS_MPS] 692 [MAX_PARAMETER_BANDS]; 693 WORD32 norm_nrg_prev[2 * MAX_OUTPUT_CHANNELS_MPS + MAX_INPUT_CHANNELS_MPS]; 694 WORD32 frame_nrg_prev[2 * MAX_OUTPUT_CHANNELS_MPS + MAX_INPUT_CHANNELS_MPS]; 695 696 WORD16 697 q_part_nrg_prev[2 * MAX_OUTPUT_CHANNELS_MPS + MAX_INPUT_CHANNELS_MPS] 698 [MAX_PARAMETER_BANDS]; 699 WORD16 q_norm_nrg_prev[2 * MAX_OUTPUT_CHANNELS_MPS + MAX_INPUT_CHANNELS_MPS]; 700 WORD16 q_frame_nrg_prev[2 * MAX_OUTPUT_CHANNELS_MPS + MAX_INPUT_CHANNELS_MPS]; 701 702 } ia_mps_dec_reshape_bb_env_state_struct; 703 704 typedef struct { 705 WORD32 use_ttt_decorr; 706 WORD32 mode; 707 WORD32 start_band; 708 WORD32 stop_band; 709 WORD32 bitstream_start_band; 710 WORD32 bitstream_stop_band; 711 } ia_mps_dec_ttt_config_struct; 712 713 typedef struct { 714 WORD32 excitation[3][MAX_PARAMETER_BANDS]; 715 WORD32 filter_coeff; 716 WORD16 q_excitation[3][MAX_PARAMETER_BANDS]; 717 } ia_mps_dec_blind_decoder_struct; 718 719 typedef struct { 720 WORD32 run_dry_ener[MAX_INPUT_CHANNELS_MPS]; 721 WORD32 run_wet_ener[MAX_OUTPUT_CHANNELS_MPS]; 722 WORD32 old_dry_ener[MAX_INPUT_CHANNELS_MPS]; 723 WORD32 old_wet_ener[MAX_OUTPUT_CHANNELS_MPS]; 724 725 WORD16 q_run_dry_ener[MAX_INPUT_CHANNELS_MPS]; 726 WORD16 q_run_wet_ener[MAX_OUTPUT_CHANNELS_MPS]; 727 WORD16 q_old_dry_ener[MAX_INPUT_CHANNELS_MPS]; 728 WORD16 q_old_wet_ener[MAX_OUTPUT_CHANNELS_MPS]; 729 WORD32 update_old_ener; 730 731 WORD32 prev_tp_scale[MAX_OUTPUT_CHANNELS_MPS]; 732 WORD16 q_prev_tp_scale[MAX_OUTPUT_CHANNELS_MPS]; 733 } ia_mps_dec_subband_tp_params_struct; 734 735 typedef struct ia_mps_persistent_mem { 736 WORD32 *prev_gain_at; 737 WORD32 *arbdmx_alpha_prev; 738 WORD32 *m1_param_real_prev; 739 WORD32 *m1_param_imag_prev; 740 WORD32 *m2_decor_real_prev; 741 WORD32 *m2_decor_imag_prev; 742 WORD32 *m2_resid_real_prev; 743 WORD32 *m2_resid_imag_prev; 744 WORD32 *qmf_input_delay_real; 745 WORD32 *qmf_input_delay_imag; 746 WORD32 *ana_qmf_states_buffer; 747 WORD32 *syn_qmf_states_buffer; 748 VOID *decorr_ptr; 749 750 ia_mps_dec_thyb_filter_state_struct *hyb_filter_state; 751 ia_mps_dec_tonality_state_struct *ton_state; 752 ia_mps_dec_smoothing_state_struct *smooth_state; 753 ia_mps_dec_reshape_bb_env_state_struct *reshape_bb_env_state; 754 ia_mps_dec_subband_tp_params_struct *sub_band_params; 755 ia_mps_dec_blind_decoder_struct *blind_decoder; 756 ia_mps_dec_spatial_bs_frame_struct *p_bs_frame; 757 } ia_mps_persistent_mem; 758 759 typedef struct { 760 ia_mps_dec_qmf_tables_struct *qmf_table_ptr; 761 ia_mps_dec_common_tables_struct *common_table_ptr; 762 ia_mps_dec_hybrid_tables_struct *hybrid_table_ptr; 763 ia_mps_dec_m1_m2_tables_struct *m1_m2_table_ptr; 764 ia_mps_dec_decorr_tables_struct *decor_table_ptr; 765 ia_mps_dec_tp_process_tables_struct *tp_process_table_ptr; 766 ia_mps_dec_mdct2qmf_table_struct *mdct2qmf_table_ptr; 767 ia_mps_dec_tonality_tables_struct *tonality_table_ptr; 768 ia_mps_dec_bitdec_tables_struct *bitdec_table_ptr; 769 ia_mps_dec_blind_tables_struct *blind_table_ptr; 770 ia_mps_dec_mdct2qmf_tables_struct *mdct2qmfcos_table_ptr; 771 ia_mps_dec_mdct2qmf_cos_table_struct *mdct2qmfcos_tab_ptr; 772 VOID *aac_tab; 773 ia_mps_dec_wf_ptr_table_struct *wf_tab_ptr; 774 775 } ia_mps_dec_mps_tables_struct; 776 777 typedef struct { 778 VOID(*syn_filter_bank) 779 (ia_mps_dec_qmf_syn_filter_bank *syn, WORD32 *sr, WORD32 *si, 780 WORD32 *time_sig, WORD32 channel, WORD32 resolution, WORD32 nr_samples, 781 ia_mps_dec_qmf_tables_struct *qmf_table_ptr); 782 } ia_mps_dec_synthesis_interface, *ia_mps_dec_synthesis_interface_handle; 783 784 typedef struct { 785 WORD32 786 m1_param_real[MAX_M1_OUTPUT][MAX_INPUT_CHANNELS_MPS][MAX_PARAMETER_SETS] 787 [MAX_PARAMETER_BANDS]; 788 WORD32 789 m1_param_imag[MAX_M1_OUTPUT][MAX_INPUT_CHANNELS_MPS][MAX_PARAMETER_SETS] 790 [MAX_PARAMETER_BANDS]; 791 } ia_mps_dec_m1_param_struct; 792 793 typedef struct { 794 WORD32 *qmf_residual_real; 795 WORD32 *qmf_residual_imag; 796 WORD32 *qmf_residual_real_pre, *qmf_residual_real_post; 797 WORD32 *qmf_residual_imag_pre, *qmf_residual_imag_post; 798 WORD32 *res_mdct; 799 WORD32 *time_out; 800 WORD32 *x_real; 801 WORD32 *x_imag; 802 WORD32 *hyb_output_real_dry; 803 WORD32 *hyb_output_imag_dry; 804 WORD32 *env_dmx_0; 805 WORD32 *env_dmx_1; 806 WORD32 *m_qmf_real; 807 WORD32 *m_qmf_imag; 808 WORD32 *w_dry_real; 809 WORD32 *w_dry_imag; 810 WORD32 *buf_real; 811 WORD32 *buf_imag; 812 WORD32 *buffer_real; 813 WORD32 *buffer_imag; 814 ia_mps_dec_m1_param_struct *m1_param; 815 } ia_mps_dec_reuse_array_struct; 816 817 typedef struct { 818 WORD32 m2_decor_real[15][MAX_PARAMETER_SETS] 819 [MAX_PARAMETER_BANDS]; 820 WORD32 m2_decor_imag[15][MAX_PARAMETER_SETS] 821 [MAX_PARAMETER_BANDS]; 822 823 WORD32 m2_resid_real[19][MAX_PARAMETER_SETS] 824 [MAX_PARAMETER_BANDS]; 825 WORD32 m2_resid_imag[19][MAX_PARAMETER_SETS] 826 [MAX_PARAMETER_BANDS]; 827 } ia_mps_dec_m2_param_struct; 828 829 typedef struct { 830 ia_mps_dec_m2_param_struct *m2_param; 831 832 WORD32 temp_shape_enable_channel_stp[MAX_OUTPUT_CHANNELS_MPS]; 833 WORD32 temp_shape_enable_channel_ges[MAX_OUTPUT_CHANNELS_MPS]; 834 835 WORD32 env_shape_data[MAX_OUTPUT_CHANNELS_MPS][MAX_TIME_SLOTS]; 836 837 WORD32 num_ott_bands[MAX_NUM_OTT]; 838 839 ia_mps_dec_ttt_config_struct ttt_config[2][MAX_NUM_TTT]; 840 WORD32 param_slot[MAX_PARAMETER_SETS]; 841 842 WORD32 smg_time[MAX_PARAMETER_SETS]; 843 WORD32 smg_data[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS]; 844 845 WORD32 846 ott_cld[MAX_NUM_OTT + MAX_OUTPUT_CHANNELS_AT][MAX_PARAMETER_SETS] 847 [MAX_PARAMETER_BANDS]; 848 WORD32 ott_icc[MAX_NUM_OTT][MAX_PARAMETER_SETS] 849 [MAX_PARAMETER_BANDS]; 850 851 WORD32 ttt_cpc_1[MAX_NUM_TTT][MAX_PARAMETER_SETS] 852 [MAX_PARAMETER_BANDS]; 853 WORD32 ttt_cpc_2[MAX_NUM_TTT][MAX_PARAMETER_SETS] 854 [MAX_PARAMETER_BANDS]; 855 WORD32 ttt_cld_1[MAX_NUM_TTT][MAX_PARAMETER_SETS] 856 [MAX_PARAMETER_BANDS]; 857 WORD32 ttt_cld_2[MAX_NUM_TTT][MAX_PARAMETER_SETS] 858 [MAX_PARAMETER_BANDS]; 859 WORD32 ttt_icc[MAX_NUM_TTT][MAX_PARAMETER_SETS] 860 [MAX_PARAMETER_BANDS]; 861 862 WORD32 863 arbdmx_gain[MAX_INPUT_CHANNELS_MPS][MAX_PARAMETER_SETS] 864 [MAX_PARAMETER_BANDS]; 865 866 WORD32 arbdmx_residual_abs[MAX_INPUT_CHANNELS_MPS]; 867 WORD32 arbdmx_alpha_upd_set[MAX_INPUT_CHANNELS_MPS]; 868 WORD32 arbdmx_alpha[MAX_INPUT_CHANNELS_MPS]; 869 } ia_mps_dec_auxilary_struct; 870 871 typedef struct ia_heaac_mps_state_struct { 872 WORD32 sac_time_align_flag; 873 WORD32 sac_time_align; 874 WORD32 sampling_freq; 875 876 WORD32 tree_config; 877 WORD32 num_input_channels; 878 WORD32 num_output_channels; 879 WORD32 num_ott_boxes; 880 WORD32 num_ttt_boxes; 881 882 WORD32 num_output_channels_at; 883 884 WORD32 quant_mode; 885 WORD32 one_icc; 886 WORD32 arbitrary_downmix; 887 WORD32 residual_coding; 888 WORD32 smooth_config; 889 WORD32 temp_shape_config; 890 WORD32 decorr_config; 891 WORD32 mtx_inversion; 892 WORD32 _3d_stereo_inversion; 893 WORD32 env_quant_mode; 894 895 WORD32 clip_protect_gain; 896 WORD32 surround_gain; 897 WORD32 lfe_gain; 898 WORD32 cpc_default; 899 WORD32 icc_default; 900 WORD32 arbdmx_gain_default; 901 902 WORD32 num_direct_signals; 903 WORD32 num_residual_signals; 904 WORD32 num_decor_signals; 905 WORD32 num_v_channels; 906 WORD32 num_w_channels; 907 WORD32 w_start_residual_idx; 908 WORD32 num_x_channels; 909 910 WORD32 time_slots; 911 WORD32 cur_time_slot; 912 WORD32 frame_length; 913 WORD32 dec_type; 914 WORD32 up_mix_type; 915 WORD32 binaural_quality; 916 WORD32 hrtf_model; 917 918 WORD32 tp_hyb_band_border; 919 920 WORD32 parse_next_bitstream_frame; 921 922 WORD32 qmf_bands; 923 WORD32 hybrid_bands; 924 925 WORD32 residual_frames_per_spatial_frame; 926 WORD32 upd_qmf; 927 928 WORD32 arbdmx_residual_bands; 929 WORD32 arbdmx_frames_per_spatial_frame; 930 WORD32 arbdmx_upd_qmf; 931 932 WORD32 bitstream_parameter_bands; 933 WORD32 num_parameter_bands; 934 935 WORD32 extend_frame; 936 WORD32 num_parameter_sets; 937 WORD32 num_parameter_sets_prev; 938 939 WORD32 smooth_control; 940 941 WORD32 i_bytes_consumed_mps; 942 WORD32 bytes_remaining; 943 WORD32 ui_mps_in_bytes; 944 WORD32 is_sbr_present; 945 946 WORD32 bits_per_sample; 947 WORD32 qmf_input_delay_index; 948 949 WORD32 m1_param_imag_present; 950 WORD32 m2_param_imag_present; 951 952 WORD32 m1_param_present[MAX_M1_OUTPUT][MAX_INPUT_CHANNELS_MPS]; 953 WORD32 m2_param_present[MAX_M2_OUTPUT][MAX_M2_INPUT]; 954 955 WORD32 index[MAX_RESIDUAL_CHANNELS_MPS]; 956 957 WORD32 ott_cld_default[MAX_NUM_OTT]; 958 WORD32 ttt_cld_1_default[MAX_NUM_TTT]; 959 WORD32 ttt_cld_2_default[MAX_NUM_TTT]; 960 961 SIZE_T kernels[MAX_HYBRID_BANDS]; 962 963 WORD32 res_bands[MAX_RESIDUAL_CHANNELS_MPS]; 964 WORD32 ott_mode_lfe[MAX_NUM_OTT]; 965 WORD32 bitstream_ott_bands[MAX_NUM_OTT]; 966 967 WORD32 scaling_enable; 968 969 WORD32 is_buried_flag; 970 971 ia_mps_dec_residual_sfband_info_struct sfband_info_tab; 972 WORD16 *pcm_out_buf; 973 974 WORD32 res_block_type[MAX_RESIDUAL_CHANNELS_MPS][MAX_RESIDUAL_FRAMES]; 975 976 ia_mps_spatial_bs_config_struct bs_config; 977 ia_mps_dec_decorr_dec_handle ap_decor[MAX_NO_DECORR_CHANNELS]; 978 ia_mps_dec_qmf_ana_filter_bank qmf_bank[6]; 979 ia_mps_dec_qmf_syn_filter_bank syn_qmf_bank; 980 struct ia_bit_buf_struct mps_bit_buf, *ptr_mps_bit_buff; 981 982 ia_mps_dec_spatial_bs_frame_struct *bs_frame; 983 ia_mps_dec_reuse_array_struct *array_struct; 984 ia_mps_dec_auxilary_struct *aux_struct; 985 VOID *mps_scratch_mem_v; 986 ia_mps_persistent_mem mps_persistent_mem; 987 VOID *mps_persistent_mem_v; 988 989 ia_mps_dec_synthesis_interface *syn; 990 ia_mps_dec_residual_channel_info_struct *p_aac_decoder_channel_info[2]; 991 ia_mps_dec_residual_dynamic_data_struct *p_aac_decoder_dynamic_data_init[2]; 992 WORD8 tot_sf_bands_ls[2]; 993 994 ia_mps_dec_mps_tables_struct ia_mps_dec_mps_table; 995 ia_mps_dec_residual_aac_tables_struct aac_table; 996 ia_mps_dec_mdct2qmf_cos_table_struct ia_mps_dec_mdct2qmfcos_table; 997 ia_mps_dec_wf_ptr_table_struct wf_tab; 998 WORD32 is_first; 999 WORD32 mps_decode; 1000 UWORD8 temp_buf[1024]; 1001 WORD32 heaac_mps_present; 1002 WORD32 mps_with_sbr; 1003 WORD32 mps_init_done; 1004 WORD32 ec_flag; 1005 WORD32 frame_ok; 1006 WORD32 first_frame; 1007 1008 } ia_heaac_mps_state_struct; 1009 1010 WORD32 ixheaacd_mps_persistent_buffer_sizes(); 1011 1012 WORD32 ixheaacd_getsize_mps_persistent(); 1013 1014 VOID ixheaacd_set_mps_persistent_buffers(ia_heaac_mps_state_struct *pstr_mps_state, 1015 WORD32 *persistent_used, 1016 WORD32 num_channel, 1017 VOID *persistent_mem); 1018 1019 WORD32 ixheaacd_scratch_buffer_sizes(); 1020 1021 VOID ixheaacd_set_scratch_buffers(ia_heaac_mps_state_struct *pstr_mps_state, 1022 VOID *scratch_mem); 1023 1024 VOID ixheaacd_calc_ana_filt_bank(ia_heaac_mps_state_struct *pstr_mps_state, 1025 WORD16 *time_in, WORD32 *p_qmf_real, 1026 WORD32 *p_qmf_imag, WORD32 channel); 1027 1028 IA_ERRORCODE 1029 ixheaacd_syn_filt_bank_init(ia_mps_dec_synthesis_interface_handle self, 1030 WORD32 resolution); 1031 #endif /* IXHEAACD_MPS_DEC_H */ 1032