Home | History | Annotate | Download | only in decoder
      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_MAIN_H
     21 #define IXHEAACD_MAIN_H
     22 
     23 VOID ixheaacd_imdct_flt(FLOAT32 in_data[], FLOAT32 out_data[], WORD32 len);
     24 
     25 VOID usac_tw_imdct(FLOAT32 in_data[], FLOAT32 out_data[], WORD32 len);
     26 
     27 WORD32 ixheaacd_window_calc(FLOAT32 window[], WORD32 len, WORD32 wfun_select);
     28 
     29 VOID calc_window_ratio(FLOAT32 window[], WORD32 len, WORD32 prev_len,
     30                        WORD32 wfun_select, WORD32 prev_wfun_select);
     31 
     32 WORD32 ixheaacd_tw_window_calc(FLOAT32 window[], WORD32 len,
     33                                WORD32 wfun_select);
     34 
     35 typedef struct ia_usac_lpd_decoder {
     36   WORD32 mode_prev;
     37   float synth_prev[MAX_PITCH + SYNTH_DELAY_LMAX];
     38   float xcitation_prev[MAX_PITCH + INTER_LP_FIL_ORDER + 1];
     39   int pitch_prev[NUM_SUBFR_SUPERFRAME_BY2 - 1];
     40   float gain_prev[NUM_SUBFR_SUPERFRAME_BY2 - 1];
     41 
     42   float lp_flt_coeff_a_prev[2 * (ORDER + 1)];
     43 
     44   FLOAT32 exc_prev[1 + (2 * FAC_LENGTH)];
     45 
     46   FLOAT32 bpf_prev[FILTER_DELAY + LEN_SUBFR];
     47 
     48   WORD32 ilspold[ORDER];
     49 
     50   FLOAT32 fac_gain;
     51   FLOAT32 fac_fd_data[FAC_LENGTH / 4];
     52 
     53   FLOAT32 lsf_prev[ORDER];
     54   FLOAT32 lspold[ORDER];
     55   WORD32 lsfold_first[ORDER];
     56 
     57   FLOAT32 gain_threshold;
     58 
     59   WORD32 fscale;
     60 
     61   FLOAT32 fd_synth_buf[3 * LEN_FRAME + 1 + ORDER];
     62   FLOAT32 *fd_synth;
     63   WORD32 bpf_active_prev;
     64 
     65 } ia_usac_lpd_decoder, *ia_usac_lpd_decoder_handle;
     66 
     67 typedef struct ia_usac_data_main_struct {
     68   FLOAT32 time_sample_vector[MAX_NUM_CHANNELS][4096];
     69   WORD32 input_data_ptr[MAX_NUM_CHANNELS][4096];
     70   WORD32 overlap_data_ptr[MAX_NUM_CHANNELS][4096];
     71   WORD32 output_data_ptr[MAX_NUM_CHANNELS][4096];
     72 
     73   WORD32 window_shape[MAX_NUM_CHANNELS];
     74   WORD32 window_shape_prev[MAX_NUM_CHANNELS];
     75   WORD32 window_sequence[MAX_NUM_CHANNELS];
     76   WORD32 window_sequence_last[MAX_NUM_CHANNELS];
     77 
     78   WORD32 output_samples;
     79   WORD32 sbr_ratio_idx;
     80   WORD32 usac_independency_flg;
     81 
     82   WORD32 sampling_rate_idx;
     83   WORD32 audio_object_type;
     84 
     85   WORD32 down_samp_sbr;
     86   WORD32 sbr_mode;
     87 
     88   WORD32 tw_mdct[MAX_ELEMENTS];
     89   WORD32 mps_pseudo_lr[MAX_ELEMENTS];
     90   WORD32 td_frame_prev[MAX_NUM_CHANNELS];
     91 
     92   FLOAT32 warp_sum[MAX_NUM_CHANNELS][2];
     93   FLOAT32 warp_cont_mem[MAX_NUM_CHANNELS][3 * 1024];
     94   FLOAT32 prev_sample_pos[MAX_NUM_CHANNELS][3 * 1024];
     95   FLOAT32 prev_tw_trans_len[MAX_NUM_CHANNELS][2];
     96   WORD32 prev_tw_start_stop[MAX_NUM_CHANNELS][2];
     97   FLOAT32 prev_warped_time_sample_vector[MAX_NUM_CHANNELS][3 * 1024];
     98 
     99   FLOAT32 lpc_prev[MAX_NUM_CHANNELS][ORDER + 1];
    100   FLOAT32 acelp_in[MAX_NUM_CHANNELS][1 + (2 * FAC_LENGTH)];
    101 
    102   WORD32 alpha_q_re[MAX_SHORT_WINDOWS][SFB_NUM_MAX];
    103   WORD32 alpha_q_im[MAX_SHORT_WINDOWS][SFB_NUM_MAX];
    104   UWORD8 cplx_pred_used[MAX_SHORT_WINDOWS][SFB_NUM_MAX];
    105 
    106   WORD32 alpha_q_re_prev[SFB_NUM_MAX];
    107   WORD32 alpha_q_im_prev[SFB_NUM_MAX];
    108   WORD32 dmx_re_prev[BLOCK_LEN_LONG];
    109 
    110   VOID *sbr_scratch_mem_base;
    111 
    112   WORD32 *coef_fix[MAX_NUM_CHANNELS];
    113   FLOAT32 *coef[MAX_NUM_CHANNELS];
    114   UWORD8 *ms_used[MAX_NUM_CHANNELS];
    115   WORD32 *coef_save[chans];
    116 
    117   WORD16 *factors[MAX_NUM_CHANNELS];
    118   UWORD8 *group_dis[MAX_NUM_CHANNELS];
    119 
    120   WORD32 tw_data_present[MAX_NUM_CHANNELS];
    121   WORD32 *tw_ratio[MAX_NUM_CHANNELS];
    122   ia_tns_frame_info_struct *pstr_tns[MAX_NUM_CHANNELS];
    123 
    124   ia_usac_lpd_decoder_handle str_tddec[MAX_NUM_CHANNELS];
    125 
    126   WORD32 arith_prev_n[MAX_NUM_CHANNELS];
    127   WORD8 c_prev[MAX_NUM_CHANNELS][1024 / 2 + 4];
    128   WORD8 c[MAX_NUM_CHANNELS][1024 / 2 + 4];
    129 
    130   WORD32 noise_filling_config[MAX_NUM_ELEMENTS];
    131   UWORD32 seed_value[MAX_NUM_CHANNELS];
    132   WORD32 present_chan;
    133 
    134   WORD32 fac_data_present[MAX_NUM_CHANNELS];
    135   WORD32 fac_data[MAX_NUM_CHANNELS][FAC_LENGTH + 1];
    136 
    137   ia_sfb_info_struct *pstr_sfb_info[MAX_NUM_CHANNELS];
    138   ia_sfb_info_struct str_only_long_info;
    139   ia_sfb_info_struct str_eight_short_info;
    140   ia_sfb_info_struct *pstr_usac_winmap[NUM_WIN_SEQ];
    141   WORD16 sfb_width_short[(1 << LEN_MAX_SFBS)];
    142 
    143   WORD32 ccfl;
    144   WORD32 len_subfrm;
    145   WORD32 num_subfrm;
    146 
    147   ia_handle_sbr_dec_inst_struct pstr_esbr_dec;
    148   ia_aac_dec_sbr_bitstream_struct esbr_bit_str[2];
    149 
    150   WORD32 x_ac_dec[1024];
    151   WORD32 scratch_buffer[1024];
    152 
    153   FLOAT32 synth_buf[1883];
    154   FLOAT32 exc_buf[1453];
    155   FLOAT32 lp_flt_coff[290];
    156   WORD32 pitch[25];
    157   FLOAT32 pitch_gain[25];
    158 
    159   UWORD16 *huffman_code_book_scl;
    160   UWORD32 *huffman_code_book_scl_index;
    161 
    162   WORD32 *tns_coeff3_32;
    163 
    164   WORD32 *tns_coeff4_32;
    165 
    166   WORD32 (*tns_max_bands_tbl_usac)[16][2];
    167 
    168   WORD16 sfb_width_long[(1 << LEN_MAX_SFBL)];
    169   WORD32 usac_flag;
    170 
    171   WORD32 arr_coef_fix[MAX_NUM_CHANNELS][(LN2 + LN2 / 8)];
    172   FLOAT32 arr_coef[MAX_NUM_CHANNELS][(LN2 + LN2 / 8)];
    173   WORD32 arr_coef_save[chans][(LN2 + LN2 / 8)];
    174   WORD16 arr_factors[MAX_NUM_CHANNELS][MAXBANDS];
    175   UWORD8 arr_group_dis[MAX_NUM_CHANNELS][NSHORT];
    176   WORD32 arr_tw_ratio[MAX_NUM_CHANNELS][NUM_TW_NODES];
    177   UWORD8 arr_ms_used[MAX_NUM_CHANNELS][MAXBANDS];
    178   ia_usac_lpd_decoder arr_str_tddec[MAX_NUM_CHANNELS];
    179   ia_tns_frame_info_struct arr_str_tns[MAX_NUM_CHANNELS];
    180 
    181 } ia_usac_data_struct;
    182 
    183 VOID ixheaacd_tns_apply(ia_usac_data_struct *usac_data, WORD32 *spec,
    184                         WORD32 nbands, ia_sfb_info_struct *pstr_sfb_info,
    185                         ia_tns_frame_info_struct *pstr_tns);
    186 
    187 WORD32 ixheaacd_calc_max_spectral_line_dec(WORD32 *ptr_tmp, WORD32 size);
    188 
    189 WORD32 ixheaacd_calc_max_spectral_line_armv7(WORD32 *ptr_tmp, WORD32 size);
    190 
    191 WORD32 ixheaacd_calc_max_spectral_line_armv8(WORD32 *ptr_tmp, WORD32 size);
    192 
    193 WORD32 ixheaacd_tw_buff_update(ia_usac_data_struct *usac_data, WORD32 i,
    194                                ia_usac_lpd_decoder_handle st);
    195 
    196 VOID ixheaacd_fix2flt_data(ia_usac_data_struct *usac_data,
    197                            ia_usac_lpd_decoder_handle st, WORD32 k);
    198 
    199 VOID ixheaacd_td_frm_dec(ia_usac_data_struct *usac_data, WORD32 k, WORD32 mod0);
    200 
    201 WORD32 ixheaacd_tw_frame_dec(ia_usac_data_struct *usac_data, WORD32 i_ch,
    202                              FLOAT32 sample_pos[], FLOAT32 tw_trans_len[],
    203                              WORD32 tw_start_stop[]);
    204 
    205 WORD32 ixheaacd_fd_frm_dec(ia_usac_data_struct *usac_data, WORD32 i_ch);
    206 
    207 WORD32 ixheaacd_acelp_mdct(WORD32 *ptr_in, WORD32 *ptr_out, WORD32 *preshift,
    208                            WORD32 length, WORD32 *ptr_scratch);
    209 
    210 WORD32 ixheaacd_acelp_mdct_main(ia_usac_data_struct *usac_data, WORD32 *x,
    211                                 WORD32 *y, WORD32 l, WORD32 m,
    212                                 WORD32 *preshift);
    213 
    214 WORD32 ixheaacd_fr_alias_cnx_fix(WORD32 *x_in, WORD32 len_subfr, WORD32 lfac,
    215                                  WORD32 *iaq, WORD32 *izir, WORD32 *ifacdec,
    216                                  WORD8 *qshift1, WORD8 qshift2, WORD8 qshift3,
    217                                  WORD32 *preshift, WORD32 *ptr_scratch);
    218 
    219 WORD32 ixheaacd_fwd_alias_cancel_tool(
    220     ia_usac_data_struct *usac_data, ia_td_frame_data_struct *pstr_td_frame_data,
    221     WORD32 fac_length, FLOAT32 *iaq, WORD32 gain);
    222 
    223 WORD32 ixheaacd_lpd_bpf_fix(ia_usac_data_struct *usac_data, WORD32 is_short,
    224                             FLOAT32 out_buffer[],
    225                             ia_usac_lpd_decoder_handle st);
    226 
    227 VOID ixheaacd_reset_acelp_data_fix(ia_usac_data_struct *usac_data,
    228                                    ia_usac_lpd_decoder_handle st,
    229                                    WORD32 *ptr_ola_buff, WORD32 last_was_short,
    230                                    WORD32 tw_mdct);
    231 #endif
    232