mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-17 07:37:51 +01:00

WebRTC internal code should always used include paths that starts from the root of the project and that clearly identify the header file. This allows 'gn check' to actually keep dependencies under control because 'gn check' cannot enforce anything if the include path is not fully qualified (starting from the root of the project). Bug: webrtc:8815 Change-Id: I23fb4fed0c27a4d98bea360315b959af843587bc Reviewed-on: https://webrtc-review.googlesource.com/46101 Commit-Queue: Mirko Bonadei <mbonadei@webrtc.org> Reviewed-by: Karl Wiberg <kwiberg@webrtc.org> Cr-Commit-Position: refs/heads/master@{#21847}
343 lines
14 KiB
C
343 lines
14 KiB
C
/*
|
|
* 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 MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_ENTROPY_CODING_H_
|
|
#define MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_ENTROPY_CODING_H_
|
|
|
|
#include "modules/audio_coding/codecs/isac/main/source/settings.h"
|
|
#include "modules/audio_coding/codecs/isac/main/source/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 /* MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_ENTROPY_CODING_H_ */
|