aboutsummaryrefslogtreecommitdiff
path: root/decoder/ixheaacd_ps_dec.h
diff options
context:
space:
mode:
Diffstat (limited to 'decoder/ixheaacd_ps_dec.h')
-rw-r--r--decoder/ixheaacd_ps_dec.h192
1 files changed, 189 insertions, 3 deletions
diff --git a/decoder/ixheaacd_ps_dec.h b/decoder/ixheaacd_ps_dec.h
index f441d35..059e5e0 100644
--- a/decoder/ixheaacd_ps_dec.h
+++ b/decoder/ixheaacd_ps_dec.h
@@ -21,6 +21,8 @@
#define IXHEAACD_PS_DEC_H
#define MAX_NUM_COLUMNS 32
+
+#define MAX_NUM_COLUMNS_960 30
#define NUM_OF_QUAD_MIRROR_FILTER_CHNLS 64
#define NUM_OF_ALL_PASS_CHNLS 23
#define NUM_OF_DEL_CHNLS \
@@ -34,12 +36,61 @@
#define NUM_OF_QUAD_MIRROR_FILTER_ICC_CHNLS \
(NUM_OF_QUAD_MIRROR_FILTER_ALL_PASS_CHNLS + NUM_OF_DEL_CHNLS)
#define PEAK_DECAYING_FACT 0x620a
-#define NUM_SER_AP_LINKS 3
+
#define MAXIM_NUM_OF_PS_ENVLOPS 5
#define PSC_SQRT05F (0x5a82)
#define NUM_OF_BINS (20)
#define NUM_BANDS_FINE (34)
+#define NUM_SUB_SAMPLES_960 30
+#define CORE_CODEC_FRAME_SIZE 1024
+#define NUM_SUB_SAMPLES (CORE_CODEC_FRAME_SIZE / 32)
+
+#define NRG_INT_COEFF 0.75f
+#define INIT_FILT_COEFF (1.0f - NRG_INT_COEFF)
+
+#define NEGATE_IPD_MASK (0x00001000)
+
+#define NUM_IPD_STEPS (8)
+#define NUM_OPD_STEPS (8)
+
+#define NUM_HI_RES_BINS (34)
+#define NUM_MID_RES_BINS (20)
+
+#define NUM_HI_RES_IPD_BINS (17)
+
+#define NUM_MID_RES_IPD_BINS (11)
+
+#define NUM_LOW_RES_IPD_BINS (5)
+
+#ifndef _M_PI_
+#define _M_PI_ (3.141592653589793238462643383279)
+#endif
+#define PSC_SQRT2 (1.41421356237309504880)
+#define PSC_PIF ((FLOAT32)_M_PI_)
+#define PSC_SQRT2F ((FLOAT32)PSC_SQRT2)
+
+#define IPD_HALF_RANGE (PSC_PIF)
+#define IPD_SCALE_FACTOR (IPD_HALF_RANGE / NUM_IPD_STEPS)
+#define OPD_HALF_RANGE (PSC_PIF)
+#define OPD_SCALE_FACTOR (OPD_HALF_RANGE / NUM_OPD_STEPS)
+#define NEGATE_IPD_MASK (0x00001000)
+
+#define DECAY_CUTOFF 3
+#define DECAY_CUTOFF_HI_RES 5
+#define DECAY_SLOPE 0.05f
+
+#define PHASE_SMOOTH_HIST1 (0.5f)
+#define PHASE_SMOOTH_HIST2 (0.25f)
+
+#define NUM_QMF_BANDS_IN_HYBRID20 3
+#define NUM_QMF_BANDS_IN_HYBRID34 5
+
+#define MAX_NUM_QMF_CHANNELS_IN_HYBRID (NUM_QMF_BANDS_IN_HYBRID34)
+
+#define PEAK_DECAY_FACTOR_FAST (0.765928338364649f)
+
+
typedef WORD16((*REVERB_BUFFERS_RI)[NUM_SER_AP_LINKS])[32 * 2];
typedef WORD16((REVERB_BUFFERS_CH_RI[5])[NUM_SER_AP_LINKS])[16 * 2];
@@ -108,10 +159,106 @@ typedef struct {
WORD16 icc_par_table[MAXIM_NUM_OF_PS_ENVLOPS + 2][NUM_BANDS_FINE];
ia_hybrid_struct str_hybrid;
+ FLOAT32 hyb_left_re[CORE_CODEC_FRAME_SIZE / MAX_NUM_COLUMNS][MAX_NUM_COLUMNS];
+ FLOAT32 hyb_left_im[CORE_CODEC_FRAME_SIZE / MAX_NUM_COLUMNS][MAX_NUM_COLUMNS];
+ FLOAT32 hyb_right_re[CORE_CODEC_FRAME_SIZE / MAX_NUM_COLUMNS][MAX_NUM_COLUMNS];
+ FLOAT32 hyb_right_im[CORE_CODEC_FRAME_SIZE / MAX_NUM_COLUMNS][MAX_NUM_COLUMNS];
+
+ FLOAT32 h11_re_vec[NUM_HI_RES_BINS];
+ FLOAT32 h11_im_vec[NUM_HI_RES_BINS];
+ FLOAT32 h12_re_vec[NUM_HI_RES_BINS];
+ FLOAT32 h12_im_vec[NUM_HI_RES_BINS];
+ FLOAT32 h21_re_vec[NUM_HI_RES_BINS];
+ FLOAT32 h21_im_vec[NUM_HI_RES_BINS];
+ FLOAT32 h22_re_vec[NUM_HI_RES_BINS];
+ FLOAT32 h22_im_vec[NUM_HI_RES_BINS];
+
+ FLOAT32 h11_re_prev[NUM_HI_RES_BINS];
+ FLOAT32 h11_im_prev[NUM_HI_RES_BINS];
+ FLOAT32 h12_re_prev[NUM_HI_RES_BINS];
+ FLOAT32 h12_im_prev[NUM_HI_RES_BINS];
+ FLOAT32 h21_re_prev[NUM_HI_RES_BINS];
+ FLOAT32 h21_im_prev[NUM_HI_RES_BINS];
+ FLOAT32 h22_re_prev[NUM_HI_RES_BINS];
+ FLOAT32 h22_im_prev[NUM_HI_RES_BINS];
+
+ FLOAT32 qmf_delay_buf_re[HIGH_DEL][NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
+ FLOAT32 qmf_delay_buf_im[HIGH_DEL][NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
+ FLOAT32 sub_qmf_delay_buf_re[HIGH_DEL][NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
+ FLOAT32 sub_qmf_delay_buf_im[HIGH_DEL][NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
+ FLOAT32 ser_qmf_delay_buf_re[NUM_SER_AP_LINKS][5][NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
+ FLOAT32 ser_qmf_delay_buf_im[NUM_SER_AP_LINKS][5][NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
+
+ ia_hybrid_flt_struct *ptr_hybrid;
+ ia_hybrid_flt_struct str_flt_hybrid20;
+ ia_hybrid_flt_struct str_flt_hybrid34;
+ WORD32 use_34_st_bands;
+ WORD32 use_34_st_bands_prev;
+ WORD32 ps_mode;
+
+ WORD32 *ptr_group_borders;
+ WORD32 num_groups;
+ WORD32 num_sub_qmf_groups;
+ WORD32 num_bins;
+ WORD32 first_delay_gr;
+ WORD32 *ptr_bins_group_map;
+ WORD32 num_sub_samples;
+ WORD32 num_chans;
+ WORD32 use_pca_rot_flg;
+ WORD32 freq_res_ipd;
+ WORD32 delay_qmf_delay_buf_idx[NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
+ WORD32 delay_qmf_delay_num_samp[NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
+ FLOAT32 peak_decay_fast_bin[NUM_HI_RES_BINS];
+ FLOAT32 prev_nrg_bin[NUM_HI_RES_BINS];
+ FLOAT32 prev_peak_diff_bin[NUM_HI_RES_BINS];
+ WORD32 ipd_idx_map_1[NUM_HI_RES_IPD_BINS];
+ WORD32 opd_idx_map_1[NUM_HI_RES_IPD_BINS];
+ WORD32 ipd_idx_map_2[NUM_HI_RES_IPD_BINS];
+ WORD32 opd_idx_map_2[NUM_HI_RES_IPD_BINS];
+
+ WORD32 ipd_idx_map[MAXIM_NUM_OF_PS_ENVLOPS][NUM_HI_RES_IPD_BINS];
+ WORD32 opd_idx_map[MAXIM_NUM_OF_PS_ENVLOPS][NUM_HI_RES_IPD_BINS];
+
+ FLOAT32 ser_sub_qmf_dealy_buf_re[NUM_SER_AP_LINKS][5][NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
+ FLOAT32 ser_sub_qmf_dealy_buf_im[NUM_SER_AP_LINKS][5][NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
+
+ FLOAT32 hyb_work_re_20[NUM_SUB_SAMPLES + HYBRID_FILTER_LENGTH - 1];
+ FLOAT32 hyb_work_im_20[NUM_SUB_SAMPLES + HYBRID_FILTER_LENGTH - 1];
+ FLOAT32 hyb_qmf_buf_re_20[MAX_NUM_QMF_CHANNELS_IN_HYBRID][HYBRID_FILTER_LENGTH - 1];
+ FLOAT32 hyb_qmf_buf_im_20[MAX_NUM_QMF_CHANNELS_IN_HYBRID][HYBRID_FILTER_LENGTH - 1];
+ FLOAT32 hyb_temp_re_20[NUM_SUB_SAMPLES][NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
+ FLOAT32 hyb_temp_im_20[NUM_SUB_SAMPLES][NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
+
+ FLOAT32 hyb_work_re_34[NUM_SUB_SAMPLES + HYBRID_FILTER_LENGTH - 1];
+ FLOAT32 hyb_work_im_34[NUM_SUB_SAMPLES + HYBRID_FILTER_LENGTH - 1];
+ FLOAT32 hyb_qmf_buf_re_34[MAX_NUM_QMF_CHANNELS_IN_HYBRID][HYBRID_FILTER_LENGTH - 1];
+ FLOAT32 hyb_qmf_buf_im_34[MAX_NUM_QMF_CHANNELS_IN_HYBRID][HYBRID_FILTER_LENGTH - 1];
+ FLOAT32 hyb_temp_re_34[NUM_SUB_SAMPLES][NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
+ FLOAT32 hyb_temp_im_34[NUM_SUB_SAMPLES][NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
+
+ FLOAT32 **pp_qmf_buf_real[2];
+ FLOAT32 **pp_qmf_buf_imag[2];
+ FLOAT32 *time_sample_buf[2];
+
} ia_ps_dec_struct;
+typedef struct {
+ FLAG enable_iid;
+ FLAG enable_icc;
+ WORD16 iid_mode;
+ WORD16 icc_mode;
+ FLAG frame_class;
+ WORD32 freq_res_ipd;
+ WORD16 border_position[MAXIM_NUM_OF_PS_ENVLOPS + 2];
+ FLAG iid_dt[MAXIM_NUM_OF_PS_ENVLOPS];
+ FLAG icc_dt[MAXIM_NUM_OF_PS_ENVLOPS];
+ WORD16 iid_par_table[MAXIM_NUM_OF_PS_ENVLOPS + 2][NUM_BANDS_FINE];
+ WORD16 icc_par_table[MAXIM_NUM_OF_PS_ENVLOPS + 2][NUM_BANDS_FINE];
+} ia_ps_dec_config_struct;
+
VOID ixheaacd_create_psdec(ia_ps_dec_struct *ptr_ps_dec,
- VOID *sbr_persistent_mem, WORD32 *ptr_overlap_buf);
+ VOID *sbr_persistent_mem, WORD32 *ptr_overlap_buf,
+ WORD32 frame_size);
VOID ixheaacd_decorr_filter1_dec(ia_ps_dec_struct *ptr_ps_dec,
ia_ps_tables_struct *ps_tables_ptr,
@@ -160,7 +307,7 @@ VOID ixheaacd_apply_ps(ia_ps_dec_struct *ptr_ps_dec, WORD32 **real_buf_left,
WORD32 **imag_buf_left, WORD32 *real_buf_right,
WORD32 *imag_buf_right,
ia_sbr_scale_fact_struct *sbr_scale_factor, WORD16 slot,
- ia_sbr_tables_struct *sbr_tables_ptr);
+ ia_sbr_tables_struct *sbr_tables_ptr, WORD no_col);
VOID ixheaacd_apply_rot_dec(ia_ps_dec_struct *ptr_ps_dec, WORD32 *p_qmf_left_re,
WORD32 *p_qmf_left_im, WORD32 *p_qmf_right_re,
@@ -176,6 +323,45 @@ VOID ixheaacd_apply_rot_armv7(ia_ps_dec_struct *ptr_ps_dec,
VOID ixheaacd_scale_ps_states(ia_ps_dec_struct *ptr_ps_dec, WORD16 scale);
+VOID
+ixheaacd_esbr_apply_ps(ia_ps_dec_struct * ptr_ps_dec,
+ FLOAT32 **pp_qmf_buf_re_left,
+ FLOAT32 **pp_qmf_buf_im_left,
+ FLOAT32 **pp_qmf_buf_re_right,
+ FLOAT32 **pp_qmf_buf_im_right,
+ WORD32 usb, ia_ps_tables_struct *ptr_ps_tables,
+ WORD32 num_time_slot);
+
+VOID
+ixheaacd_esbr_ps_de_correlate(ia_ps_dec_struct *ptr_ps_dec,
+ FLOAT32 **pp_qmf_buf_re_left,
+ FLOAT32 **pp_qmf_buf_im_left,
+ FLOAT32 **pp_qmf_buf_re_right,
+ FLOAT32 **pp_qmf_buf_im_right,
+ ia_ps_tables_struct *ptr_ps_tables);
+
+VOID
+ixheaacd_esbr_ps_apply_rotation(ia_ps_dec_struct *ptr_ps_dec,
+ FLOAT32 **pp_qmf_buf_re_left,
+ FLOAT32 **pp_qmf_buf_im_left,
+ FLOAT32 **pp_qmf_buf_re_right,
+ FLOAT32 **pp_qmf_buf_im_right,
+ ia_ps_tables_struct *ptr_ps_tables);
+
+WORD32
+ixheaacd_create_hyb_filterbank_esbr_ps(ia_hybrid_flt_struct *pHybrid,
+ WORD32 frameSize,
+ WORD32 noBands);
+
+WORD32 ixheaacd_create_ps_esbr_dec(ia_ps_dec_struct *ptr_ps_dec_struct,
+ ia_ps_tables_struct *ptr_ps_tables,
+ UWORD32 noQmfChans,
+ UWORD32 num_sub_samples,
+ WORD32 ps_mode);
+
+VOID ResetPsDec(ia_ps_dec_struct * ptr_ps_dec);
+VOID ResetPsDeCor(ia_ps_dec_struct * ptr_ps_dec);
+
extern WORD16 ixheaacd_divideby2(WORD32 op);
extern WORD16 ixheaacd_divideby3(WORD32 op);