351 lines
20 KiB
C
351 lines
20 KiB
C
/***********************************************************************
|
|
Copyright (c) 2006-2011, Skype Limited. All rights reserved.
|
|
Redistribution and use in source and binary forms, with or without
|
|
modification, (subject to the limitations in the disclaimer below)
|
|
are permitted provided that the following conditions are met:
|
|
- Redistributions of source code must retain the above copyright notice,
|
|
this list of conditions and the following disclaimer.
|
|
- Redistributions in binary form must reproduce the above copyright
|
|
notice, this list of conditions and the following disclaimer in the
|
|
documentation and/or other materials provided with the distribution.
|
|
- Neither the name of Skype Limited, nor the names of specific
|
|
contributors, may be used to endorse or promote products derived from
|
|
this software without specific prior written permission.
|
|
NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
|
|
BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
|
CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
|
|
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
|
USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
|
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
***********************************************************************/
|
|
|
|
#ifndef SKP_SILK_STRUCTS_H
|
|
#define SKP_SILK_STRUCTS_H
|
|
|
|
#include "SKP_Silk_typedef.h"
|
|
#include "SKP_Silk_SigProc_FIX.h"
|
|
#include "SKP_Silk_define.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C"
|
|
{
|
|
#endif
|
|
|
|
|
|
/************************************/
|
|
/* Noise shaping quantization state */
|
|
/************************************/
|
|
typedef struct {
|
|
SKP_int16 xq[ 2 * MAX_FRAME_LENGTH ]; /* Buffer for quantized output signal */
|
|
SKP_int32 sLTP_shp_Q10[ 2 * MAX_FRAME_LENGTH ];
|
|
SKP_int32 sLPC_Q14[ MAX_FRAME_LENGTH / NB_SUBFR + NSQ_LPC_BUF_LENGTH ];
|
|
SKP_int32 sAR2_Q14[ MAX_SHAPE_LPC_ORDER ];
|
|
SKP_int32 sLF_AR_shp_Q12;
|
|
SKP_int lagPrev;
|
|
SKP_int sLTP_buf_idx;
|
|
SKP_int sLTP_shp_buf_idx;
|
|
SKP_int32 rand_seed;
|
|
SKP_int32 prev_inv_gain_Q16;
|
|
SKP_int rewhite_flag;
|
|
} SKP_Silk_nsq_state; /* FIX*/
|
|
|
|
/* Struct for Low BitRate Redundant (LBRR) information */
|
|
typedef struct {
|
|
SKP_uint8 payload[ MAX_ARITHM_BYTES ];
|
|
SKP_int nBytes; /* Number of bytes in payload */
|
|
SKP_int usage; /* Tells how the payload should be used as FEC */
|
|
} SKP_SILK_LBRR_struct;
|
|
|
|
/********************************/
|
|
/* VAD state */
|
|
/********************************/
|
|
typedef struct {
|
|
SKP_int32 AnaState[ 2 ]; /* Analysis filterbank state: 0-8 kHz */
|
|
SKP_int32 AnaState1[ 2 ]; /* Analysis filterbank state: 0-4 kHz */
|
|
SKP_int32 AnaState2[ 2 ]; /* Analysis filterbank state: 0-2 kHz */
|
|
SKP_int32 XnrgSubfr[ VAD_N_BANDS ]; /* Subframe energies */
|
|
SKP_int32 NrgRatioSmth_Q8[ VAD_N_BANDS ]; /* Smoothed energy level in each band */
|
|
SKP_int16 HPstate; /* State of differentiator in the lowest band */
|
|
SKP_int32 NL[ VAD_N_BANDS ]; /* Noise energy level in each band */
|
|
SKP_int32 inv_NL[ VAD_N_BANDS ]; /* Inverse noise energy level in each band */
|
|
SKP_int32 NoiseLevelBias[ VAD_N_BANDS ]; /* Noise level estimator bias/offset */
|
|
SKP_int32 counter; /* Frame counter used in the initial phase */
|
|
} SKP_Silk_VAD_state;
|
|
|
|
/*******************************/
|
|
/* Range encoder/decoder state */
|
|
/*******************************/
|
|
typedef struct {
|
|
SKP_int32 bufferLength;
|
|
SKP_int32 bufferIx;
|
|
SKP_uint32 base_Q32;
|
|
SKP_uint32 range_Q16;
|
|
SKP_int32 error;
|
|
SKP_uint8 buffer[ MAX_ARITHM_BYTES ]; /* Buffer containing payload */
|
|
} SKP_Silk_range_coder_state;
|
|
|
|
/* Input frequency range detection struct */
|
|
typedef struct {
|
|
SKP_int32 S_HP_8_kHz[ NB_SOS ][ 2 ]; /* HP filter State */
|
|
SKP_int32 ConsecSmplsAboveThres;
|
|
SKP_int32 ActiveSpeech_ms; /* Accumulated time with active speech */
|
|
SKP_int SWB_detected; /* Flag to indicate SWB input */
|
|
SKP_int WB_detected; /* Flag to indicate WB input */
|
|
} SKP_Silk_detect_SWB_state;
|
|
|
|
#if SWITCH_TRANSITION_FILTERING
|
|
/* Variable cut-off low-pass filter state */
|
|
typedef struct {
|
|
SKP_int32 In_LP_State[ 2 ]; /* Low pass filter state */
|
|
SKP_int32 transition_frame_no; /* Counter which is mapped to a cut-off frequency */
|
|
SKP_int mode; /* Operating mode, 0: switch down, 1: switch up */
|
|
} SKP_Silk_LP_state;
|
|
#endif
|
|
|
|
/* Structure for one stage of MSVQ */
|
|
typedef struct {
|
|
const SKP_int32 nVectors;
|
|
const SKP_int16 *CB_NLSF_Q15;
|
|
const SKP_int16 *Rates_Q5;
|
|
} SKP_Silk_NLSF_CBS;
|
|
|
|
/* Structure containing NLSF MSVQ codebook */
|
|
typedef struct {
|
|
const SKP_int32 nStages;
|
|
|
|
/* Fields for (de)quantizing */
|
|
const SKP_Silk_NLSF_CBS *CBStages;
|
|
const SKP_int *NDeltaMin_Q15;
|
|
|
|
/* Fields for arithmetic (de)coding */
|
|
const SKP_uint16 *CDF;
|
|
const SKP_uint16 * const *StartPtr;
|
|
const SKP_int *MiddleIx;
|
|
} SKP_Silk_NLSF_CB_struct;
|
|
|
|
/********************************/
|
|
/* Encoder state */
|
|
/********************************/
|
|
typedef struct {
|
|
SKP_Silk_range_coder_state sRC; /* Range coder state */
|
|
SKP_Silk_range_coder_state sRC_LBRR; /* Range coder state (for low bitrate redundancy) */
|
|
#if HIGH_PASS_INPUT
|
|
SKP_int32 In_HP_State[ 2 ]; /* High pass filter state */
|
|
#endif
|
|
#if SWITCH_TRANSITION_FILTERING
|
|
SKP_Silk_LP_state sLP; /* Low pass filter state */
|
|
#endif
|
|
SKP_Silk_VAD_state sVAD; /* Voice activity detector state */
|
|
|
|
SKP_int LBRRprevLastGainIndex;
|
|
SKP_int prev_sigtype;
|
|
SKP_int typeOffsetPrev; /* Previous signal type and quantization offset */
|
|
SKP_int prevLag;
|
|
SKP_int prev_lagIndex;
|
|
SKP_int32 API_fs_Hz; /* API sampling frequency (Hz) */
|
|
SKP_int32 prev_API_fs_Hz; /* Previous API sampling frequency (Hz) */
|
|
SKP_int maxInternal_fs_kHz; /* Maximum internal sampling frequency (kHz) */
|
|
SKP_int fs_kHz; /* Internal sampling frequency (kHz) */
|
|
SKP_int fs_kHz_changed; /* Did we switch yet? */
|
|
SKP_int frame_length; /* Frame length (samples) */
|
|
SKP_int subfr_length; /* Subframe length (samples) */
|
|
SKP_int la_pitch; /* Look-ahead for pitch analysis (samples) */
|
|
SKP_int la_shape; /* Look-ahead for noise shape analysis (samples) */
|
|
SKP_int shapeWinLength; /* Window length for noise shape analysis (samples) */
|
|
SKP_int32 TargetRate_bps; /* Target bitrate (bps) */
|
|
SKP_int PacketSize_ms; /* Number of milliseconds to put in each packet */
|
|
SKP_int PacketLoss_perc; /* Packet loss rate measured by farend */
|
|
SKP_int32 frameCounter;
|
|
SKP_int Complexity; /* Complexity setting: 0-> low; 1-> medium; 2->high */
|
|
SKP_int nStatesDelayedDecision; /* Number of states in delayed decision quantization */
|
|
SKP_int useInterpolatedNLSFs; /* Flag for using NLSF interpolation */
|
|
SKP_int shapingLPCOrder; /* Filter order for noise shaping filters */
|
|
SKP_int predictLPCOrder; /* Filter order for prediction filters */
|
|
SKP_int pitchEstimationComplexity; /* Complexity level for pitch estimator */
|
|
SKP_int pitchEstimationLPCOrder; /* Whitening filter order for pitch estimator */
|
|
SKP_int32 pitchEstimationThreshold_Q16; /* Threshold for pitch estimator */
|
|
SKP_int LTPQuantLowComplexity; /* Flag for low complexity LTP quantization */
|
|
SKP_int NLSF_MSVQ_Survivors; /* Number of survivors in NLSF MSVQ */
|
|
SKP_int first_frame_after_reset; /* Flag for deactivating NLSF interp. and fluc. reduction after resets */
|
|
SKP_int controlled_since_last_payload; /* Flag for ensuring codec_control only runs once per packet */
|
|
SKP_int warping_Q16; /* Warping parameter for warped noise shaping */
|
|
|
|
/* Input/output buffering */
|
|
SKP_int16 inputBuf[ MAX_FRAME_LENGTH ]; /* buffer containin input signal */
|
|
SKP_int inputBufIx;
|
|
SKP_int nFramesInPayloadBuf; /* number of frames sitting in outputBuf */
|
|
SKP_int nBytesInPayloadBuf; /* number of bytes sitting in outputBuf */
|
|
|
|
/* Parameters For LTP scaling Control */
|
|
SKP_int frames_since_onset;
|
|
|
|
const SKP_Silk_NLSF_CB_struct *psNLSF_CB[ 2 ]; /* Pointers to voiced/unvoiced NLSF codebooks */
|
|
|
|
/* Struct for Inband LBRR */
|
|
SKP_SILK_LBRR_struct LBRR_buffer[ MAX_LBRR_DELAY ];
|
|
SKP_int oldest_LBRR_idx;
|
|
SKP_int useInBandFEC; /* Saves the API setting for query */
|
|
SKP_int LBRR_enabled;
|
|
SKP_int LBRR_GainIncreases; /* Number of shifts to Gains to get LBRR rate Voiced frames */
|
|
|
|
/* Bitrate control */
|
|
SKP_int32 bitrateDiff; /* Accumulated diff. between the target bitrate and the switch bitrates */
|
|
SKP_int32 bitrate_threshold_up; /* Threshold for switching to a higher internal sample frequency */
|
|
SKP_int32 bitrate_threshold_down; /* Threshold for switching to a lower internal sample frequency */
|
|
|
|
SKP_Silk_resampler_state_struct resampler_state;
|
|
|
|
/* DTX */
|
|
SKP_int noSpeechCounter; /* Counts concecutive nonactive frames, used by DTX */
|
|
SKP_int useDTX; /* Flag to enable DTX */
|
|
SKP_int inDTX; /* Flag to signal DTX period */
|
|
SKP_int vadFlag; /* Flag to indicate Voice Activity */
|
|
|
|
/* Struct for detecting SWB input */
|
|
SKP_Silk_detect_SWB_state sSWBdetect;
|
|
|
|
|
|
/* Buffers */
|
|
SKP_int8 q[ MAX_FRAME_LENGTH ]; /* pulse signal buffer */
|
|
SKP_int8 q_LBRR[ MAX_FRAME_LENGTH ]; /* pulse signal buffer */
|
|
|
|
} SKP_Silk_encoder_state;
|
|
|
|
|
|
/************************/
|
|
/* Encoder control */
|
|
/************************/
|
|
typedef struct {
|
|
/* Quantization indices */
|
|
SKP_int lagIndex;
|
|
SKP_int contourIndex;
|
|
SKP_int PERIndex;
|
|
SKP_int LTPIndex[ NB_SUBFR ];
|
|
SKP_int NLSFIndices[ NLSF_MSVQ_MAX_CB_STAGES ]; /* NLSF path of quantized LSF vector */
|
|
SKP_int NLSFInterpCoef_Q2;
|
|
SKP_int GainsIndices[ NB_SUBFR ];
|
|
SKP_int32 Seed;
|
|
SKP_int LTP_scaleIndex;
|
|
SKP_int RateLevelIndex;
|
|
SKP_int QuantOffsetType;
|
|
SKP_int sigtype;
|
|
|
|
/* Prediction and coding parameters */
|
|
SKP_int pitchL[ NB_SUBFR ];
|
|
|
|
SKP_int LBRR_usage; /* Low bitrate redundancy usage */
|
|
} SKP_Silk_encoder_control;
|
|
|
|
/* Struct for Packet Loss Concealment */
|
|
typedef struct {
|
|
SKP_int32 pitchL_Q8; /* Pitch lag to use for voiced concealment */
|
|
SKP_int16 LTPCoef_Q14[ LTP_ORDER ]; /* LTP coeficients to use for voiced concealment */
|
|
SKP_int16 prevLPC_Q12[ MAX_LPC_ORDER ];
|
|
SKP_int last_frame_lost; /* Was previous frame lost */
|
|
SKP_int32 rand_seed; /* Seed for unvoiced signal generation */
|
|
SKP_int16 randScale_Q14; /* Scaling of unvoiced random signal */
|
|
SKP_int32 conc_energy;
|
|
SKP_int conc_energy_shift;
|
|
SKP_int16 prevLTP_scale_Q14;
|
|
SKP_int32 prevGain_Q16[ NB_SUBFR ];
|
|
SKP_int fs_kHz;
|
|
} SKP_Silk_PLC_struct;
|
|
|
|
/* Struct for CNG */
|
|
typedef struct {
|
|
SKP_int32 CNG_exc_buf_Q10[ MAX_FRAME_LENGTH ];
|
|
SKP_int CNG_smth_NLSF_Q15[ MAX_LPC_ORDER ];
|
|
SKP_int32 CNG_synth_state[ MAX_LPC_ORDER ];
|
|
SKP_int32 CNG_smth_Gain_Q16;
|
|
SKP_int32 rand_seed;
|
|
SKP_int fs_kHz;
|
|
} SKP_Silk_CNG_struct;
|
|
|
|
/********************************/
|
|
/* Decoder state */
|
|
/********************************/
|
|
typedef struct {
|
|
SKP_Silk_range_coder_state sRC; /* Range coder state */
|
|
SKP_int32 prev_inv_gain_Q16;
|
|
SKP_int32 sLTP_Q16[ 2 * MAX_FRAME_LENGTH ];
|
|
SKP_int32 sLPC_Q14[ MAX_FRAME_LENGTH / NB_SUBFR + MAX_LPC_ORDER ];
|
|
SKP_int32 exc_Q10[ MAX_FRAME_LENGTH ];
|
|
SKP_int32 res_Q10[ MAX_FRAME_LENGTH ];
|
|
SKP_int16 outBuf[ 2 * MAX_FRAME_LENGTH ]; /* Buffer for output signal */
|
|
SKP_int lagPrev; /* Previous Lag */
|
|
SKP_int LastGainIndex; /* Previous gain index */
|
|
SKP_int LastGainIndex_EnhLayer; /* Previous gain index */
|
|
SKP_int typeOffsetPrev; /* Previous signal type and quantization offset */
|
|
SKP_int32 HPState[ DEC_HP_ORDER ]; /* HP filter state */
|
|
const SKP_int16 *HP_A; /* HP filter AR coefficients */
|
|
const SKP_int16 *HP_B; /* HP filter MA coefficients */
|
|
SKP_int fs_kHz; /* Sampling frequency in kHz */
|
|
SKP_int32 prev_API_sampleRate; /* Previous API sample frequency (Hz) */
|
|
SKP_int frame_length; /* Frame length (samples) */
|
|
SKP_int subfr_length; /* Subframe length (samples) */
|
|
SKP_int LPC_order; /* LPC order */
|
|
SKP_int prevNLSF_Q15[ MAX_LPC_ORDER ]; /* Used to interpolate LSFs */
|
|
SKP_int first_frame_after_reset; /* Flag for deactivating NLSF interp. and fluc. reduction after resets */
|
|
|
|
/* For buffering payload in case of more frames per packet */
|
|
SKP_int nBytesLeft;
|
|
SKP_int nFramesDecoded;
|
|
SKP_int nFramesInPacket;
|
|
SKP_int moreInternalDecoderFrames;
|
|
SKP_int FrameTermination;
|
|
|
|
SKP_Silk_resampler_state_struct resampler_state;
|
|
|
|
const SKP_Silk_NLSF_CB_struct *psNLSF_CB[ 2 ]; /* Pointers to voiced/unvoiced NLSF codebooks */
|
|
|
|
/* Parameters used to investigate if inband FEC is used */
|
|
SKP_int vadFlag;
|
|
SKP_int no_FEC_counter; /* Counts number of frames wo inband FEC */
|
|
SKP_int inband_FEC_offset; /* 0: no FEC, 1: FEC with 1 packet offset, 2: FEC w 2 packets offset */
|
|
|
|
/* CNG state */
|
|
SKP_Silk_CNG_struct sCNG;
|
|
|
|
/* Stuff used for PLC */
|
|
SKP_int lossCnt;
|
|
SKP_int prev_sigtype; /* Previous sigtype */
|
|
|
|
SKP_Silk_PLC_struct sPLC;
|
|
|
|
|
|
|
|
} SKP_Silk_decoder_state;
|
|
|
|
/************************/
|
|
/* Decoder control */
|
|
/************************/
|
|
typedef struct {
|
|
/* prediction and coding parameters */
|
|
SKP_int pitchL[ NB_SUBFR ];
|
|
SKP_int32 Gains_Q16[ NB_SUBFR ];
|
|
SKP_int32 Seed;
|
|
/* holds interpolated and final coefficients, 4-byte aligned */
|
|
SKP_DWORD_ALIGN SKP_int16 PredCoef_Q12[ 2 ][ MAX_LPC_ORDER ];
|
|
SKP_int16 LTPCoef_Q14[ LTP_ORDER * NB_SUBFR ];
|
|
SKP_int LTP_scale_Q14;
|
|
|
|
/* quantization indices */
|
|
SKP_int PERIndex;
|
|
SKP_int RateLevelIndex;
|
|
SKP_int QuantOffsetType;
|
|
SKP_int sigtype;
|
|
SKP_int NLSFInterpCoef_Q2;
|
|
} SKP_Silk_decoder_control;
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|