mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-14 06:10:40 +01:00

Running clang-format with chromium's style guide. The goal is n-fold: * providing consistency and readability (that's what code guidelines are for) * preventing noise with presubmit checks and git cl format * building on the previous point: making it easier to automatically fix format issues * you name it Please consider using git-hyper-blame to ignore this commit. Bug: webrtc:9340 Change-Id: I694567c4cdf8cee2860958cfe82bfaf25848bb87 Reviewed-on: https://webrtc-review.googlesource.com/81185 Reviewed-by: Patrik Höglund <phoglund@webrtc.org> Cr-Commit-Position: refs/heads/master@{#23660}
347 lines
14 KiB
C
347 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_ */
|