/* * 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. */ /* * entropy_coding.h * * This header file declares all of the functions used to arithmetically * encode the iSAC bistream * */ #ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_ENTROPY_CODING_H_ #define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_ENTROPY_CODING_H_ #include "settings.h" #include "structs.h" /****************************************************************************** * WebRtcIsac_DecodeSpec() * Decode real and imaginary part of the DFT coefficients, given a bit-stream. * The decoded DFT coefficient can be transformed to time domain by * WebRtcIsac_Time2Spec(). * * Input: * - streamdata : pointer to a stucture containg the encoded * data and theparameters needed for entropy * coding. * - AvgPitchGain_Q12 : average pitch-gain of the frame. This is only * relevant for 0-4 kHz band, and the input value is * not used in other bands. * - band : specifies which band's DFT should be decoded. * * Output: * - *fr : pointer to a buffer where the real part of DFT * coefficients are written to. * - *fi : pointer to a buffer where the imaginary part * of DFT coefficients are written to. * * Return value : < 0 if an error occures * 0 if succeeded. */ int WebRtcIsac_DecodeSpec(Bitstr* streamdata, int16_t AvgPitchGain_Q12, enum ISACBand band, double* fr, double* fi); /****************************************************************************** * WebRtcIsac_EncodeSpec() * Encode real and imaginary part of the DFT coefficients into the given * bit-stream. * * Input: * - *fr : pointer to a buffer where the real part of DFT * coefficients are written to. * - *fi : pointer to a buffer where the imaginary part * of DFT coefficients are written to. * - AvgPitchGain_Q12 : average pitch-gain of the frame. This is only * relevant for 0-4 kHz band, and the input value is * not used in other bands. * - band : specifies which band's DFT should be decoded. * * Output: * - streamdata : pointer to a stucture containg the encoded * data and theparameters needed for entropy * coding. * * Return value : < 0 if an error occures * 0 if succeeded. */ int WebRtcIsac_EncodeSpec(const int16_t* fr, const int16_t* fi, int16_t AvgPitchGain_Q12, enum ISACBand band, Bitstr* streamdata); /* decode & dequantize LPC Coef */ int WebRtcIsac_DecodeLpcCoef(Bitstr* streamdata, double* LPCCoef); int WebRtcIsac_DecodeLpcCoefUB(Bitstr* streamdata, double* lpcVecs, double* percepFilterGains, int16_t bandwidth); int WebRtcIsac_DecodeLpc(Bitstr* streamdata, double* LPCCoef_lo, double* LPCCoef_hi); /* quantize & code LPC Coef */ void WebRtcIsac_EncodeLpcLb(double* LPCCoef_lo, double* LPCCoef_hi, Bitstr* streamdata, IsacSaveEncoderData* encData); void WebRtcIsac_EncodeLpcGainLb(double* LPCCoef_lo, double* LPCCoef_hi, Bitstr* streamdata, IsacSaveEncoderData* encData); /****************************************************************************** * WebRtcIsac_EncodeLpcUB() * Encode LPC parameters, given as A-polynomial, of upper-band. The encoding * is performed in LAR domain. * For the upper-band, we compute and encode LPC of some sub-frames, LPC of * other sub-frames are computed by linear interpolation, in LAR domain. This * function performs the interpolation and returns the LPC of all sub-frames. * * Inputs: * - lpcCoef : a buffer containing A-polynomials of sub-frames * (excluding first coefficient that is 1). * - bandwidth : specifies if the codec is operating at 0-12 kHz * or 0-16 kHz mode. * * Input/output: * - streamdata : pointer to a structure containing the encoded * data and the parameters needed for entropy * coding. * * Output: * - interpolLPCCoeff : Decoded and interpolated LPC (A-polynomial) * of all sub-frames. * If LP analysis is of order K, and there are N * sub-frames then this is a buffer of size * (k + 1) * N, each vector starts with the LPC gain * of the corresponding sub-frame. The LPC gains * are encoded and inserted after this function is * called. The first A-coefficient which is 1 is not * included. * * Return value : 0 if encoding is successful, * <0 if failed to encode. */ int16_t WebRtcIsac_EncodeLpcUB(double* lpcCoeff, Bitstr* streamdata, double* interpolLPCCoeff, int16_t bandwidth, ISACUBSaveEncDataStruct* encData); /****************************************************************************** * WebRtcIsac_DecodeInterpolLpcUb() * Decode LPC coefficients and interpolate to get the coefficients fo all * sub-frmaes. * * Inputs: * - bandwidth : spepecifies if the codec is in 0-12 kHz or * 0-16 kHz mode. * * Input/output: * - streamdata : pointer to a stucture containg the encoded * data and theparameters needed for entropy * coding. * * Output: * - percepFilterParam : Decoded and interpolated LPC (A-polynomial) of * all sub-frames. * If LP analysis is of order K, and there are N * sub-frames then this is a buffer of size * (k + 1) * N, each vector starts with the LPC gain * of the corresponding sub-frame. The LPC gains * are encoded and inserted after this function is * called. The first A-coefficient which is 1 is not * included. * * Return value : 0 if encoding is successful, * <0 if failed to encode. */ int16_t WebRtcIsac_DecodeInterpolLpcUb(Bitstr* streamdata, double* percepFilterParam, int16_t bandwidth); /* Decode & dequantize RC */ int WebRtcIsac_DecodeRc(Bitstr* streamdata, int16_t* RCQ15); /* Quantize & code RC */ void WebRtcIsac_EncodeRc(int16_t* RCQ15, Bitstr* streamdata); /* Decode & dequantize squared Gain */ int WebRtcIsac_DecodeGain2(Bitstr* streamdata, int32_t* Gain2); /* Quantize & code squared Gain (input is squared gain) */ int WebRtcIsac_EncodeGain2(int32_t* gain2, Bitstr* streamdata); void WebRtcIsac_EncodePitchGain(int16_t* PitchGains_Q12, Bitstr* streamdata, IsacSaveEncoderData* encData); void WebRtcIsac_EncodePitchLag(double* PitchLags, int16_t* PitchGain_Q12, Bitstr* streamdata, IsacSaveEncoderData* encData); int WebRtcIsac_DecodePitchGain(Bitstr* streamdata, int16_t* PitchGain_Q12); int WebRtcIsac_DecodePitchLag(Bitstr* streamdata, int16_t* PitchGain_Q12, double* PitchLag); int WebRtcIsac_DecodeFrameLen(Bitstr* streamdata, int16_t* framelength); int WebRtcIsac_EncodeFrameLen(int16_t framelength, Bitstr* streamdata); int WebRtcIsac_DecodeSendBW(Bitstr* streamdata, int16_t* BWno); void WebRtcIsac_EncodeReceiveBw(int* BWno, Bitstr* streamdata); /* Step-down */ void WebRtcIsac_Poly2Rc(double* a, int N, double* RC); /* Step-up */ void WebRtcIsac_Rc2Poly(double* RC, int N, double* a); void WebRtcIsac_TranscodeLPCCoef(double* LPCCoef_lo, double* LPCCoef_hi, int* index_g); /****************************************************************************** * WebRtcIsac_EncodeLpcGainUb() * Encode LPC gains of sub-Frames. * * Input/outputs: * - lpGains : a buffer which contains 'SUBFRAME' number of * LP gains to be encoded. The input values are * overwritten by the quantized values. * - streamdata : pointer to a stucture containg the encoded * data and theparameters needed for entropy * coding. * * Output: * - lpcGainIndex : quantization indices for lpc gains, these will * be stored to be used for FEC. */ void WebRtcIsac_EncodeLpcGainUb(double* lpGains, Bitstr* streamdata, int* lpcGainIndex); /****************************************************************************** * WebRtcIsac_EncodeLpcGainUb() * Store LPC gains of sub-Frames in 'streamdata'. * * Input: * - lpGains : a buffer which contains 'SUBFRAME' number of * LP gains to be encoded. * Input/outputs: * - streamdata : pointer to a stucture containg the encoded * data and theparameters needed for entropy * coding. * */ void WebRtcIsac_StoreLpcGainUb(double* lpGains, Bitstr* streamdata); /****************************************************************************** * WebRtcIsac_DecodeLpcGainUb() * Decode the LPC gain of sub-frames. * * Input/output: * - streamdata : pointer to a stucture containg the encoded * data and theparameters needed for entropy * coding. * * Output: * - lpGains : a buffer where decoded LPC gians will be stored. * * Return value : 0 if succeeded. * <0 if failed. */ int16_t WebRtcIsac_DecodeLpcGainUb(double* lpGains, Bitstr* streamdata); /****************************************************************************** * WebRtcIsac_EncodeBandwidth() * Encode if the bandwidth of encoded audio is 0-12 kHz or 0-16 kHz. * * Input: * - bandwidth : an enumerator specifying if the codec in is * 0-12 kHz or 0-16 kHz mode. * * Input/output: * - streamdata : pointer to a stucture containg the encoded * data and theparameters needed for entropy * coding. * * Return value : 0 if succeeded. * <0 if failed. */ int16_t WebRtcIsac_EncodeBandwidth(enum ISACBandwidth bandwidth, Bitstr* streamData); /****************************************************************************** * WebRtcIsac_DecodeBandwidth() * Decode the bandwidth of the encoded audio, i.e. if the bandwidth is 0-12 kHz * or 0-16 kHz. * * Input/output: * - streamdata : pointer to a stucture containg the encoded * data and theparameters needed for entropy * coding. * * Output: * - bandwidth : an enumerator specifying if the codec is in * 0-12 kHz or 0-16 kHz mode. * * Return value : 0 if succeeded. * <0 if failed. */ int16_t WebRtcIsac_DecodeBandwidth(Bitstr* streamData, enum ISACBandwidth* bandwidth); /****************************************************************************** * WebRtcIsac_EncodeJitterInfo() * Decode the jitter information. * * Input/output: * - streamdata : pointer to a stucture containg the encoded * data and theparameters needed for entropy * coding. * * Input: * - jitterInfo : one bit of info specifying if the channel is * in high/low jitter. Zero indicates low jitter * and one indicates high jitter. * * Return value : 0 if succeeded. * <0 if failed. */ int16_t WebRtcIsac_EncodeJitterInfo(int32_t jitterIndex, Bitstr* streamData); /****************************************************************************** * WebRtcIsac_DecodeJitterInfo() * Decode the jitter information. * * Input/output: * - streamdata : pointer to a stucture containg the encoded * data and theparameters needed for entropy * coding. * * Output: * - jitterInfo : one bit of info specifying if the channel is * in high/low jitter. Zero indicates low jitter * and one indicates high jitter. * * Return value : 0 if succeeded. * <0 if failed. */ int16_t WebRtcIsac_DecodeJitterInfo(Bitstr* streamData, int32_t* jitterInfo); #endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_ENTROPY_CODING_H_ */