413 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			413 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  *  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_ */
 | 
