183 lines
6.5 KiB
C
183 lines
6.5 KiB
C
/******************************************************************************
|
|
* *
|
|
* Copyright (C) 2018 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at:
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*
|
|
*****************************************************************************
|
|
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
|
|
*/
|
|
#ifndef IXHEAACD_PS_DEC_H
|
|
#define IXHEAACD_PS_DEC_H
|
|
|
|
#define MAX_NUM_COLUMNS 32
|
|
#define NUM_OF_QUAD_MIRROR_FILTER_CHNLS 64
|
|
#define NUM_OF_ALL_PASS_CHNLS 23
|
|
#define NUM_OF_DEL_CHNLS \
|
|
(NUM_OF_QUAD_MIRROR_FILTER_CHNLS - NUM_OF_ALL_PASS_CHNLS)
|
|
#define DEL_ALL_PASS 2
|
|
#define SMALL_DEL_STRT 12
|
|
#define SMALL_DEL 1
|
|
#define HIGH_DEL 14
|
|
#define NUM_OF_QUAD_MIRROR_FILTER_ALL_PASS_CHNLS \
|
|
(NUM_OF_ALL_PASS_CHNLS - NO_QMF_CHANNELS_IN_HYBRID)
|
|
#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)
|
|
|
|
typedef WORD16((*REVERB_BUFFERS_RI)[NUM_SER_AP_LINKS])[32 * 2];
|
|
typedef WORD16((REVERB_BUFFERS_CH_RI[5])[NUM_SER_AP_LINKS])[16 * 2];
|
|
|
|
typedef struct {
|
|
WORD16 (*delay_buf_qmf_ap_re_im)[32 * 2];
|
|
|
|
WORD16 (*delay_buf_qmf_ld_re_im)[SMALL_DEL_STRT * 2];
|
|
|
|
WORD16 (*delay_buf_qmf_sd_re_im)[2 * 32];
|
|
|
|
WORD16 delay_buf_idx_ser[NUM_SER_AP_LINKS];
|
|
WORD16 delay_sample_ser[NUM_SER_AP_LINKS];
|
|
|
|
REVERB_BUFFERS_RI delay_buf_qmf_ser_re_im;
|
|
WORD16 delay_buf_idx;
|
|
WORD16 delay_buf_idx_long;
|
|
|
|
WORD32 *peak_decay_diff;
|
|
WORD32 *energy_prev;
|
|
WORD32 *peak_decay_diff_prev;
|
|
|
|
WORD32 *ptr_hyb_left_re;
|
|
WORD32 *ptr_hyb_left_im;
|
|
WORD32 *ptr_hyb_right_re;
|
|
WORD32 *ptr_hyb_right_im;
|
|
|
|
WORD16 delay_buf_qmf_sub_re_im[DEL_ALL_PASS][16 * 2];
|
|
REVERB_BUFFERS_CH_RI delay_buf_qmf_sub_ser_re_im;
|
|
|
|
WORD16 h11_h12_vec[2 * 24];
|
|
WORD16 h21_h22_vec[2 * 24];
|
|
|
|
WORD16 H11_H12[2 * 24];
|
|
WORD16 H21_H22[2 * 24];
|
|
|
|
WORD16 delta_h11_h12[2 * 24];
|
|
WORD16 delta_h21_h22[2 * 24];
|
|
|
|
FLAG force_mono;
|
|
|
|
WORD16 delay_buffer_scale;
|
|
WORD16 usb;
|
|
|
|
WORD16 iid_par_prev[NUM_BANDS_FINE];
|
|
WORD16 icc_par_prev[NUM_BANDS_FINE];
|
|
|
|
FLAG ps_data_present;
|
|
|
|
FLAG enable_iid;
|
|
FLAG enable_icc;
|
|
|
|
FLAG enable_ext;
|
|
|
|
WORD16 iid_mode;
|
|
WORD16 icc_mode;
|
|
FLAG iid_quant;
|
|
|
|
FLAG frame_class;
|
|
WORD16 num_env;
|
|
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_hybrid_struct str_hybrid;
|
|
} ia_ps_dec_struct;
|
|
|
|
VOID ixheaacd_create_psdec(ia_ps_dec_struct *ptr_ps_dec,
|
|
VOID *sbr_persistent_mem, WORD32 *ptr_overlap_buf);
|
|
|
|
VOID ixheaacd_decorr_filter1_dec(ia_ps_dec_struct *ptr_ps_dec,
|
|
ia_ps_tables_struct *ps_tables_ptr,
|
|
WORD16 *transient_ratio);
|
|
|
|
VOID ixheaacd_decorr_filter1_armv7(ia_ps_dec_struct *ptr_ps_dec,
|
|
ia_ps_tables_struct *ps_tables_ptr,
|
|
WORD16 *transient_ratio);
|
|
|
|
VOID ixheaacd_decorr_filter2_dec(
|
|
ia_ps_dec_struct *ptr_ps_dec, WORD32 *p_buf_left_real,
|
|
WORD32 *p_buf_left_imag, WORD32 *p_buf_right_real, WORD32 *p_buf_right_imag,
|
|
ia_ps_tables_struct *ps_tables_ptr, WORD16 *transient_ratio);
|
|
|
|
VOID ixheaacd_decorr_filter2_armv7(
|
|
ia_ps_dec_struct *ptr_ps_dec, WORD32 *p_buf_left_real,
|
|
WORD32 *p_buf_left_imag, WORD32 *p_buf_right_real, WORD32 *p_buf_right_imag,
|
|
ia_ps_tables_struct *ps_tables_ptr, WORD16 *transient_ratio);
|
|
|
|
WORD32 ixheaacd_divide16_pos_dec(WORD32 op1, WORD32 op2);
|
|
|
|
WORD32 ixheaacd_divide16_pos_armv7(WORD32 op1, WORD32 op2);
|
|
|
|
VOID ixheaacd_decorrelation_dec(ia_ps_dec_struct *ptr_ps_dec,
|
|
WORD32 *p_buf_left_real,
|
|
WORD32 *p_buf_left_imag,
|
|
WORD32 *p_buf_right_real,
|
|
WORD32 *p_buf_right_imag,
|
|
ia_ps_tables_struct *ps_tables_ptr);
|
|
|
|
VOID ixheaacd_decorrelation_armv7(ia_ps_dec_struct *ptr_ps_dec,
|
|
WORD32 *p_buf_left_real,
|
|
WORD32 *p_buf_left_imag,
|
|
WORD32 *p_buf_right_real,
|
|
WORD32 *p_buf_right_imag,
|
|
ia_ps_tables_struct *ps_tables_ptr);
|
|
|
|
VOID ixheaacd_init_ps_scale(ia_ps_dec_struct *ptr_ps_dec,
|
|
ia_sbr_scale_fact_struct *sbr_scale_factor);
|
|
|
|
VOID ixheaacd_init_rot_env(ia_ps_dec_struct *ptr_ps_dec, WORD16 env, WORD16 usb,
|
|
ia_sbr_tables_struct *sbr_tables_ptr,
|
|
const WORD16 *cos_sin_lookup_tab);
|
|
|
|
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);
|
|
|
|
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,
|
|
WORD32 *p_qmf_right_im,
|
|
ia_sbr_tables_struct *sbr_tables_ptr,
|
|
const WORD16 *ptr_res);
|
|
|
|
VOID ixheaacd_apply_rot_armv7(ia_ps_dec_struct *ptr_ps_dec,
|
|
WORD32 *qmf_left_real, WORD32 *qmf_left_imag,
|
|
WORD32 *qmf_right_real, WORD32 *qmf_right_imag,
|
|
ia_sbr_tables_struct *sbr_tables_ptr,
|
|
const WORD16 *ptr_resol);
|
|
|
|
VOID ixheaacd_scale_ps_states(ia_ps_dec_struct *ptr_ps_dec, WORD16 scale);
|
|
|
|
extern WORD16 ixheaacd_divideby2(WORD32 op);
|
|
extern WORD16 ixheaacd_divideby3(WORD32 op);
|
|
|
|
#endif
|