xref: /aosp_15_r20/external/libxaac/decoder/ixheaacd_mps_dec.h (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
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