mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-02-24 18:41:57 +00:00
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_ */
|