/*
 *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

/*
 * codec.h
 *
 * This header file contains the calls to the internal encoder
 * and decoder functions.
 *
 */

#ifndef MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_CODEC_H_
#define MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_CODEC_H_

#include "structs.h"


void WebRtcIsac_ResetBitstream(Bitstr* bit_stream);

int WebRtcIsac_EstimateBandwidth(BwEstimatorstr* bwest_str, Bitstr* streamdata,
                                 size_t packet_size,
                                 uint16_t rtp_seq_number,
                                 uint32_t send_ts, uint32_t arr_ts,
                                 enum IsacSamplingRate encoderSampRate,
                                 enum IsacSamplingRate decoderSampRate);

int WebRtcIsac_DecodeLb(const TransformTables* transform_tables,
                        float* signal_out,
                        ISACLBDecStruct* ISACdec_obj,
                        int16_t* current_framesamples,
                        int16_t isRCUPayload);

int WebRtcIsac_DecodeRcuLb(float* signal_out, ISACLBDecStruct* ISACdec_obj,
                           int16_t* current_framesamples);

int WebRtcIsac_EncodeLb(const TransformTables* transform_tables,
                        float* in,
                        ISACLBEncStruct* ISACencLB_obj,
                        int16_t codingMode,
                        int16_t bottleneckIndex);

int WebRtcIsac_EncodeStoredDataLb(const IsacSaveEncoderData* ISACSavedEnc_obj,
                                  Bitstr* ISACBitStr_obj, int BWnumber,
                                  float scale);

int WebRtcIsac_EncodeStoredDataUb(
    const ISACUBSaveEncDataStruct* ISACSavedEnc_obj, Bitstr* bitStream,
    int32_t jitterInfo, float scale, enum ISACBandwidth bandwidth);

int16_t WebRtcIsac_GetRedPayloadUb(
    const ISACUBSaveEncDataStruct* ISACSavedEncObj, Bitstr* bitStreamObj,
    enum ISACBandwidth bandwidth);

/******************************************************************************
 * WebRtcIsac_RateAllocation()
 * Internal function to perform a rate-allocation for upper and lower-band,
 * given a total rate.
 *
 * Input:
 *   - inRateBitPerSec           : a total bit-rate in bits/sec.
 *
 * Output:
 *   - rateLBBitPerSec           : a bit-rate allocated to the lower-band
 *                                 in bits/sec.
 *   - rateUBBitPerSec           : a bit-rate allocated to the upper-band
 *                                 in bits/sec.
 *
 * Return value                  : 0 if rate allocation has been successful.
 *                                -1 if failed to allocate rates.
 */

int16_t WebRtcIsac_RateAllocation(int32_t inRateBitPerSec,
                                  double* rateLBBitPerSec,
                                  double* rateUBBitPerSec,
                                  enum ISACBandwidth* bandwidthKHz);


/******************************************************************************
 * WebRtcIsac_DecodeUb16()
 *
 * Decode the upper-band if the codec is in 0-16 kHz mode.
 *
 * Input/Output:
 *       -ISACdec_obj        : pointer to the upper-band decoder object. The
 *                             bit-stream is stored inside the decoder object.
 *
 * Output:
 *       -signal_out         : decoded audio, 480 samples 30 ms.
 *
 * Return value              : >0 number of decoded bytes.
 *                             <0 if an error occurred.
 */
int WebRtcIsac_DecodeUb16(const TransformTables* transform_tables,
                          float* signal_out,
                          ISACUBDecStruct* ISACdec_obj,
                          int16_t isRCUPayload);

/******************************************************************************
 * WebRtcIsac_DecodeUb12()
 *
 * Decode the upper-band if the codec is in 0-12 kHz mode.
 *
 * Input/Output:
 *       -ISACdec_obj        : pointer to the upper-band decoder object. The
 *                             bit-stream is stored inside the decoder object.
 *
 * Output:
 *       -signal_out         : decoded audio, 480 samples 30 ms.
 *
 * Return value              : >0 number of decoded bytes.
 *                             <0 if an error occurred.
 */
int WebRtcIsac_DecodeUb12(const TransformTables* transform_tables,
                          float* signal_out,
                          ISACUBDecStruct* ISACdec_obj,
                          int16_t isRCUPayload);

/******************************************************************************
 * WebRtcIsac_EncodeUb16()
 *
 * Encode the upper-band if the codec is in 0-16 kHz mode.
 *
 * Input:
 *       -in                 : upper-band audio, 160 samples (10 ms).
 *
 * Input/Output:
 *       -ISACdec_obj        : pointer to the upper-band encoder object. The
 *                             bit-stream is stored inside the encoder object.
 *
 * Return value              : >0 number of encoded bytes.
 *                             <0 if an error occurred.
 */
int WebRtcIsac_EncodeUb16(const TransformTables* transform_tables,
                          float* in,
                          ISACUBEncStruct* ISACenc_obj,
                          int32_t jitterInfo);

/******************************************************************************
 * WebRtcIsac_EncodeUb12()
 *
 * Encode the upper-band if the codec is in 0-12 kHz mode.
 *
 * Input:
 *       -in                 : upper-band audio, 160 samples (10 ms).
 *
 * Input/Output:
 *       -ISACdec_obj        : pointer to the upper-band encoder object. The
 *                             bit-stream is stored inside the encoder object.
 *
 * Return value              : >0 number of encoded bytes.
 *                             <0 if an error occurred.
 */
int WebRtcIsac_EncodeUb12(const TransformTables* transform_tables,
                          float* in,
                          ISACUBEncStruct* ISACenc_obj,
                          int32_t jitterInfo);

/************************** initialization functions *************************/

void WebRtcIsac_InitMasking(MaskFiltstr* maskdata);

void WebRtcIsac_InitPreFilterbank(PreFiltBankstr* prefiltdata);

void WebRtcIsac_InitPostFilterbank(PostFiltBankstr* postfiltdata);

void WebRtcIsac_InitPitchFilter(PitchFiltstr* pitchfiltdata);

void WebRtcIsac_InitPitchAnalysis(PitchAnalysisStruct* State);


/**************************** transform functions ****************************/

void WebRtcIsac_InitTransform(TransformTables* tables);

void WebRtcIsac_Time2Spec(const TransformTables* tables,
                          double* inre1,
                          double* inre2,
                          int16_t* outre,
                          int16_t* outim,
                          FFTstr* fftstr_obj);

void WebRtcIsac_Spec2time(const TransformTables* tables,
                          double* inre,
                          double* inim,
                          double* outre1,
                          double* outre2,
                          FFTstr* fftstr_obj);

/******************************* filter functions ****************************/

void WebRtcIsac_AllPoleFilter(double* InOut, double* Coef, size_t lengthInOut,
                              int orderCoef);

void WebRtcIsac_AllZeroFilter(double* In, double* Coef, size_t lengthInOut,
                              int orderCoef, double* Out);

void WebRtcIsac_ZeroPoleFilter(double* In, double* ZeroCoef, double* PoleCoef,
                               size_t lengthInOut, int orderCoef, double* Out);


/***************************** filterbank functions **************************/

void WebRtcIsac_SplitAndFilterFloat(float* in, float* LP, float* HP,
                                    double* LP_la, double* HP_la,
                                    PreFiltBankstr* prefiltdata);


void WebRtcIsac_FilterAndCombineFloat(float* InLP, float* InHP, float* Out,
                                      PostFiltBankstr* postfiltdata);


/************************* normalized lattice filters ************************/

void WebRtcIsac_NormLatticeFilterMa(int orderCoef, float* stateF, float* stateG,
                                    float* lat_in, double* filtcoeflo,
                                    double* lat_out);

void WebRtcIsac_NormLatticeFilterAr(int orderCoef, float* stateF, float* stateG,
                                    double* lat_in, double* lo_filt_coef,
                                    float* lat_out);

void WebRtcIsac_Dir2Lat(double* a, int orderCoef, float* sth, float* cth);

void WebRtcIsac_AutoCorr(double* r, const double* x, size_t N, size_t order);

#endif /* MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_CODEC_H_ */
