/******************************************************************************
 *                                                                            *
 * 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_FUNC_DEF_H
#define IXHEAACD_FUNC_DEF_H

#define restrict

WORD32 ixheaacd_calc_idx_offset(WORD32 qn1, WORD32 qn2);

VOID ixheaacd_qn_data(WORD32 nk_mode, WORD32 *qn,
                      ia_bit_buf_struct *it_bit_buff);

VOID ixheaacd_memset(FLOAT32 *x, WORD32 n);

VOID ixheaacd_mem_cpy(const FLOAT32 x[], FLOAT32 y[], WORD32 n);

VOID ixheaacd_vec_add(FLOAT32 x[], FLOAT32 y[], FLOAT32 z[], WORD32 n);

VOID ixheaacd_vec_cnst_mul(FLOAT32 a, FLOAT32 x[], FLOAT32 z[], WORD32 n);

WORD32 ixheaacd_lpd_dec(ia_usac_data_struct *usac_data,
                        ia_usac_lpd_decoder_handle st,
                        ia_td_frame_data_struct *pstr_td_frame_data,
                        FLOAT32 fsynth[], WORD32 first_lpd_flag,
                        WORD32 short_fac_flag, WORD32 bpf_control_info);

VOID ixheaacd_lpd_dec_update(ia_usac_lpd_decoder_handle tddec,
                             ia_usac_data_struct *usac_data, WORD32 i_ch);

VOID ixheaacd_acelp_update(ia_usac_data_struct *usac_data, FLOAT32 signal_out[],
                           ia_usac_lpd_decoder_handle st);

VOID ixheaacd_init_acelp_data(ia_usac_data_struct *usac_data,
                              ia_usac_lpd_decoder_handle st);

VOID ixheaacd_reset_acelp_data(ia_usac_data_struct *usac_data,
                               ia_usac_lpd_decoder_handle st,
                               FLOAT32 *ptr_ola_buffer, WORD32 last_was_short,
                               WORD32 tw_mdct);

WORD32 ixheaacd_acelp_alias_cnx(ia_usac_data_struct *usac_data,
                                ia_td_frame_data_struct *pstr_td_frame_data,
                                WORD32 k, FLOAT32 A[], FLOAT32 stab_fac,
                                ia_usac_lpd_decoder_handle st);

WORD32 ixheaacd_tcx_mdct(ia_usac_data_struct *usac_data,
                         ia_td_frame_data_struct *pstr_td_frame_data,
                         WORD32 frame_index, FLOAT32 A[], WORD32 long_frame,
                         ia_usac_lpd_decoder_handle st);

VOID ixheaacd_alg_vec_dequant(ia_td_frame_data_struct *pstr_td_frame_data,
                              WORD32 first_lpd_flag, FLOAT32 *lsf,
                              WORD32 mod[]);

VOID ixheaacd_fac_decoding(WORD32 fac_len, WORD32 k, WORD32 *fac_prm,
                           ia_bit_buf_struct *it_bit_buff);

WORD32 ixheaacd_lpc_to_td(FLOAT32 *lpc_coeffs, WORD32 lpc_order,
                          FLOAT32 *mdct_gains, WORD32 lg);

VOID ixheaacd_noise_shaping(FLOAT32 x[], WORD32 lg, WORD32 fdns_npts,
                            FLOAT32 old_gains[], FLOAT32 new_gains[]);
VOID ixheaacd_interpolation_lsp_params(FLOAT32 lsp_old[], FLOAT32 lsp_new[],
                                       FLOAT32 lp_flt_coff_a[],
                                       WORD32 nb_subfr);

VOID ixheaacd_lpc_coef_gen(FLOAT32 lsf_old[], FLOAT32 lsf_new[], FLOAT32 a[],
                           WORD32 nb_subfr, WORD32 m);

VOID ixheaacd_tw_create(VOID);

WORD32 ixheaacd_reset_acelp_tw_data(ia_usac_data_struct *usac_data, WORD32 i,
                                    ia_usac_lpd_decoder_handle st);

WORD32 ixheaacd_tw_frame_process(ia_usac_data_struct *usac_data, WORD32 ch);

VOID ixheaacd_huffman_decode(WORD32 it_bit_buff, WORD16 *h_index, WORD16 *len,
                             const UWORD16 *input_table,
                             const UWORD32 *idx_table);

#endif
