| /* |
| * Copyright (c) 2011 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 "structs.h" |
| |
| /* decode complex spectrum (return number of bytes in stream) */ |
| int WebRtcIsac_DecodeSpecLb(Bitstr *streamdata, |
| double *fr, |
| double *fi, |
| WebRtc_Word16 AvgPitchGain_Q12); |
| |
| /****************************************************************************** |
| * WebRtcIsac_DecodeSpecUB16() |
| * Decode real and imaginary part of the DFT coefficients, given a bit-stream. |
| * This function is called when the codec is in 0-16 kHz bandwidth. |
| * 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. |
| * |
| * 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_DecodeSpecUB16( |
| Bitstr* streamdata, |
| double* fr, |
| double* fi); |
| |
| |
| /****************************************************************************** |
| * WebRtcIsac_DecodeSpecUB12() |
| * Decode real and imaginary part of the DFT coefficients, given a bit-stream. |
| * This function is called when the codec is in 0-12 kHz bandwidth. |
| * 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. |
| * |
| * 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_DecodeSpecUB12( |
| Bitstr* streamdata, |
| double* fr, |
| double* fi); |
| |
| |
| /* encode complex spectrum */ |
| int WebRtcIsac_EncodeSpecLb(const WebRtc_Word16* fr, |
| const WebRtc_Word16* fi, |
| Bitstr* streamdata, |
| WebRtc_Word16 AvgPitchGain_Q12); |
| |
| |
| /****************************************************************************** |
| * WebRtcIsac_EncodeSpecUB16() |
| * Quantize and encode real and imaginary part of the DFT coefficients. |
| * This function is called when the codec is in 0-16 kHz bandwidth. |
| * The real and imaginary part are computed by calling WebRtcIsac_Time2Spec(). |
| * |
| * |
| * Input: |
| * -*fr : pointer to a buffer where the real part of DFT |
| * coefficients are stored. |
| * -*fi : pointer to a buffer where the imaginary part |
| * of DFT coefficients are stored. |
| * |
| * 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_EncodeSpecUB16( |
| const WebRtc_Word16* fr, |
| const WebRtc_Word16* fi, |
| Bitstr* streamdata); |
| |
| |
| /****************************************************************************** |
| * WebRtcIsac_EncodeSpecUB12() |
| * Quantize and encode real and imaginary part of the DFT coefficients. |
| * This function is called when the codec is in 0-12 kHz bandwidth. |
| * The real and imaginary part are computed by calling WebRtcIsac_Time2Spec(). |
| * |
| * |
| * Input: |
| * -*fr : pointer to a buffer where the real part of DFT |
| * coefficients are stored. |
| * -*fi : pointer to a buffer where the imaginary part |
| * of DFT coefficients are stored. |
| * |
| * 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_EncodeSpecUB12( |
| const WebRtc_Word16* fr, |
| const WebRtc_Word16* fi, |
| Bitstr* streamdata); |
| |
| |
| /* decode & dequantize LPC Coef */ |
| int WebRtcIsac_DecodeLpcCoef(Bitstr *streamdata, double *LPCCoef, int *outmodel); |
| int WebRtcIsac_DecodeLpcCoefUB( |
| Bitstr* streamdata, |
| double* lpcVecs, |
| double* percepFilterGains, |
| WebRtc_Word16 bandwidth); |
| |
| int WebRtcIsac_DecodeLpc(Bitstr *streamdata, double *LPCCoef_lo, double *LPCCoef_hi, int *outmodel); |
| |
| /* quantize & code LPC Coef */ |
| void WebRtcIsac_EncodeLpcLb(double *LPCCoef_lo, double *LPCCoef_hi, int *model, double *size, Bitstr *streamdata, ISAC_SaveEncData_t* encData); |
| void WebRtcIsac_EncodeLpcGainLb(double *LPCCoef_lo, double *LPCCoef_hi, int model, Bitstr *streamdata, ISAC_SaveEncData_t* 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 stucture containg the encoded |
| * data and theparameters 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. |
| */ |
| WebRtc_Word16 WebRtcIsac_EncodeLpcUB( |
| double* lpcCoeff, |
| Bitstr* streamdata, |
| double* interpolLPCCoeff, |
| WebRtc_Word16 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. |
| */ |
| WebRtc_Word16 WebRtcIsac_DecodeInterpolLpcUb( |
| Bitstr* streamdata, |
| double* percepFilterParam, |
| WebRtc_Word16 bandwidth); |
| |
| /* decode & dequantize RC */ |
| int WebRtcIsac_DecodeRc(Bitstr *streamdata, WebRtc_Word16 *RCQ15); |
| |
| /* quantize & code RC */ |
| void WebRtcIsac_EncodeRc(WebRtc_Word16 *RCQ15, Bitstr *streamdata); |
| |
| /* decode & dequantize squared Gain */ |
| int WebRtcIsac_DecodeGain2(Bitstr *streamdata, WebRtc_Word32 *Gain2); |
| |
| /* quantize & code squared Gain (input is squared gain) */ |
| int WebRtcIsac_EncodeGain2(WebRtc_Word32 *gain2, Bitstr *streamdata); |
| |
| void WebRtcIsac_EncodePitchGain(WebRtc_Word16* PitchGains_Q12, Bitstr* streamdata, ISAC_SaveEncData_t* encData); |
| |
| void WebRtcIsac_EncodePitchLag(double* PitchLags, WebRtc_Word16* PitchGain_Q12, Bitstr* streamdata, ISAC_SaveEncData_t* encData); |
| |
| int WebRtcIsac_DecodePitchGain(Bitstr *streamdata, WebRtc_Word16 *PitchGain_Q12); |
| int WebRtcIsac_DecodePitchLag(Bitstr *streamdata, WebRtc_Word16 *PitchGain_Q12, double *PitchLag); |
| |
| int WebRtcIsac_DecodeFrameLen(Bitstr *streamdata, WebRtc_Word16 *framelength); |
| int WebRtcIsac_EncodeFrameLen(WebRtc_Word16 framelength, Bitstr *streamdata); |
| int WebRtcIsac_DecodeSendBW(Bitstr *streamdata, WebRtc_Word16 *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 model, |
| 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. |
| */ |
| WebRtc_Word16 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. |
| */ |
| WebRtc_Word16 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. |
| */ |
| WebRtc_Word16 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. |
| */ |
| WebRtc_Word16 WebRtcIsac_EncodeJitterInfo( |
| WebRtc_Word32 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. |
| */ |
| WebRtc_Word16 WebRtcIsac_DecodeJitterInfo( |
| Bitstr* streamData, |
| WebRtc_Word32* jitterInfo); |
| |
| #endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_ENTROPY_CODING_H_ */ |