cannam@154: /*********************************************************************** cannam@154: Copyright (c) 2006-2011, Skype Limited. All rights reserved. cannam@154: Redistribution and use in source and binary forms, with or without cannam@154: modification, are permitted provided that the following conditions cannam@154: are met: cannam@154: - Redistributions of source code must retain the above copyright notice, cannam@154: this list of conditions and the following disclaimer. cannam@154: - Redistributions in binary form must reproduce the above copyright cannam@154: notice, this list of conditions and the following disclaimer in the cannam@154: documentation and/or other materials provided with the distribution. cannam@154: - Neither the name of Internet Society, IETF or IETF Trust, nor the cannam@154: names of specific contributors, may be used to endorse or promote cannam@154: products derived from this software without specific prior written cannam@154: permission. cannam@154: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" cannam@154: AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE cannam@154: IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE cannam@154: ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE cannam@154: LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR cannam@154: CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF cannam@154: SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS cannam@154: INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN cannam@154: CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) cannam@154: ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE cannam@154: POSSIBILITY OF SUCH DAMAGE. cannam@154: ***********************************************************************/ cannam@154: cannam@154: #ifndef SILK_STRUCTS_H cannam@154: #define SILK_STRUCTS_H cannam@154: cannam@154: #include "typedef.h" cannam@154: #include "SigProc_FIX.h" cannam@154: #include "define.h" cannam@154: #include "entenc.h" cannam@154: #include "entdec.h" cannam@154: cannam@154: #ifdef __cplusplus cannam@154: extern "C" cannam@154: { cannam@154: #endif cannam@154: cannam@154: /************************************/ cannam@154: /* Noise shaping quantization state */ cannam@154: /************************************/ cannam@154: typedef struct { cannam@154: opus_int16 xq[ 2 * MAX_FRAME_LENGTH ]; /* Buffer for quantized output signal */ cannam@154: opus_int32 sLTP_shp_Q14[ 2 * MAX_FRAME_LENGTH ]; cannam@154: opus_int32 sLPC_Q14[ MAX_SUB_FRAME_LENGTH + NSQ_LPC_BUF_LENGTH ]; cannam@154: opus_int32 sAR2_Q14[ MAX_SHAPE_LPC_ORDER ]; cannam@154: opus_int32 sLF_AR_shp_Q14; cannam@154: opus_int32 sDiff_shp_Q14; cannam@154: opus_int lagPrev; cannam@154: opus_int sLTP_buf_idx; cannam@154: opus_int sLTP_shp_buf_idx; cannam@154: opus_int32 rand_seed; cannam@154: opus_int32 prev_gain_Q16; cannam@154: opus_int rewhite_flag; cannam@154: } silk_nsq_state; cannam@154: cannam@154: /********************************/ cannam@154: /* VAD state */ cannam@154: /********************************/ cannam@154: typedef struct { cannam@154: opus_int32 AnaState[ 2 ]; /* Analysis filterbank state: 0-8 kHz */ cannam@154: opus_int32 AnaState1[ 2 ]; /* Analysis filterbank state: 0-4 kHz */ cannam@154: opus_int32 AnaState2[ 2 ]; /* Analysis filterbank state: 0-2 kHz */ cannam@154: opus_int32 XnrgSubfr[ VAD_N_BANDS ]; /* Subframe energies */ cannam@154: opus_int32 NrgRatioSmth_Q8[ VAD_N_BANDS ]; /* Smoothed energy level in each band */ cannam@154: opus_int16 HPstate; /* State of differentiator in the lowest band */ cannam@154: opus_int32 NL[ VAD_N_BANDS ]; /* Noise energy level in each band */ cannam@154: opus_int32 inv_NL[ VAD_N_BANDS ]; /* Inverse noise energy level in each band */ cannam@154: opus_int32 NoiseLevelBias[ VAD_N_BANDS ]; /* Noise level estimator bias/offset */ cannam@154: opus_int32 counter; /* Frame counter used in the initial phase */ cannam@154: } silk_VAD_state; cannam@154: cannam@154: /* Variable cut-off low-pass filter state */ cannam@154: typedef struct { cannam@154: opus_int32 In_LP_State[ 2 ]; /* Low pass filter state */ cannam@154: opus_int32 transition_frame_no; /* Counter which is mapped to a cut-off frequency */ cannam@154: opus_int mode; /* Operating mode, <0: switch down, >0: switch up; 0: do nothing */ cannam@154: opus_int32 saved_fs_kHz; /* If non-zero, holds the last sampling rate before a bandwidth switching reset. */ cannam@154: } silk_LP_state; cannam@154: cannam@154: /* Structure containing NLSF codebook */ cannam@154: typedef struct { cannam@154: const opus_int16 nVectors; cannam@154: const opus_int16 order; cannam@154: const opus_int16 quantStepSize_Q16; cannam@154: const opus_int16 invQuantStepSize_Q6; cannam@154: const opus_uint8 *CB1_NLSF_Q8; cannam@154: const opus_int16 *CB1_Wght_Q9; cannam@154: const opus_uint8 *CB1_iCDF; cannam@154: const opus_uint8 *pred_Q8; cannam@154: const opus_uint8 *ec_sel; cannam@154: const opus_uint8 *ec_iCDF; cannam@154: const opus_uint8 *ec_Rates_Q5; cannam@154: const opus_int16 *deltaMin_Q15; cannam@154: } silk_NLSF_CB_struct; cannam@154: cannam@154: typedef struct { cannam@154: opus_int16 pred_prev_Q13[ 2 ]; cannam@154: opus_int16 sMid[ 2 ]; cannam@154: opus_int16 sSide[ 2 ]; cannam@154: opus_int32 mid_side_amp_Q0[ 4 ]; cannam@154: opus_int16 smth_width_Q14; cannam@154: opus_int16 width_prev_Q14; cannam@154: opus_int16 silent_side_len; cannam@154: opus_int8 predIx[ MAX_FRAMES_PER_PACKET ][ 2 ][ 3 ]; cannam@154: opus_int8 mid_only_flags[ MAX_FRAMES_PER_PACKET ]; cannam@154: } stereo_enc_state; cannam@154: cannam@154: typedef struct { cannam@154: opus_int16 pred_prev_Q13[ 2 ]; cannam@154: opus_int16 sMid[ 2 ]; cannam@154: opus_int16 sSide[ 2 ]; cannam@154: } stereo_dec_state; cannam@154: cannam@154: typedef struct { cannam@154: opus_int8 GainsIndices[ MAX_NB_SUBFR ]; cannam@154: opus_int8 LTPIndex[ MAX_NB_SUBFR ]; cannam@154: opus_int8 NLSFIndices[ MAX_LPC_ORDER + 1 ]; cannam@154: opus_int16 lagIndex; cannam@154: opus_int8 contourIndex; cannam@154: opus_int8 signalType; cannam@154: opus_int8 quantOffsetType; cannam@154: opus_int8 NLSFInterpCoef_Q2; cannam@154: opus_int8 PERIndex; cannam@154: opus_int8 LTP_scaleIndex; cannam@154: opus_int8 Seed; cannam@154: } SideInfoIndices; cannam@154: cannam@154: /********************************/ cannam@154: /* Encoder state */ cannam@154: /********************************/ cannam@154: typedef struct { cannam@154: opus_int32 In_HP_State[ 2 ]; /* High pass filter state */ cannam@154: opus_int32 variable_HP_smth1_Q15; /* State of first smoother */ cannam@154: opus_int32 variable_HP_smth2_Q15; /* State of second smoother */ cannam@154: silk_LP_state sLP; /* Low pass filter state */ cannam@154: silk_VAD_state sVAD; /* Voice activity detector state */ cannam@154: silk_nsq_state sNSQ; /* Noise Shape Quantizer State */ cannam@154: opus_int16 prev_NLSFq_Q15[ MAX_LPC_ORDER ]; /* Previously quantized NLSF vector */ cannam@154: opus_int speech_activity_Q8; /* Speech activity */ cannam@154: opus_int allow_bandwidth_switch; /* Flag indicating that switching of internal bandwidth is allowed */ cannam@154: opus_int8 LBRRprevLastGainIndex; cannam@154: opus_int8 prevSignalType; cannam@154: opus_int prevLag; cannam@154: opus_int pitch_LPC_win_length; cannam@154: opus_int max_pitch_lag; /* Highest possible pitch lag (samples) */ cannam@154: opus_int32 API_fs_Hz; /* API sampling frequency (Hz) */ cannam@154: opus_int32 prev_API_fs_Hz; /* Previous API sampling frequency (Hz) */ cannam@154: opus_int maxInternal_fs_Hz; /* Maximum internal sampling frequency (Hz) */ cannam@154: opus_int minInternal_fs_Hz; /* Minimum internal sampling frequency (Hz) */ cannam@154: opus_int desiredInternal_fs_Hz; /* Soft request for internal sampling frequency (Hz) */ cannam@154: opus_int fs_kHz; /* Internal sampling frequency (kHz) */ cannam@154: opus_int nb_subfr; /* Number of 5 ms subframes in a frame */ cannam@154: opus_int frame_length; /* Frame length (samples) */ cannam@154: opus_int subfr_length; /* Subframe length (samples) */ cannam@154: opus_int ltp_mem_length; /* Length of LTP memory */ cannam@154: opus_int la_pitch; /* Look-ahead for pitch analysis (samples) */ cannam@154: opus_int la_shape; /* Look-ahead for noise shape analysis (samples) */ cannam@154: opus_int shapeWinLength; /* Window length for noise shape analysis (samples) */ cannam@154: opus_int32 TargetRate_bps; /* Target bitrate (bps) */ cannam@154: opus_int PacketSize_ms; /* Number of milliseconds to put in each packet */ cannam@154: opus_int PacketLoss_perc; /* Packet loss rate measured by farend */ cannam@154: opus_int32 frameCounter; cannam@154: opus_int Complexity; /* Complexity setting */ cannam@154: opus_int nStatesDelayedDecision; /* Number of states in delayed decision quantization */ cannam@154: opus_int useInterpolatedNLSFs; /* Flag for using NLSF interpolation */ cannam@154: opus_int shapingLPCOrder; /* Filter order for noise shaping filters */ cannam@154: opus_int predictLPCOrder; /* Filter order for prediction filters */ cannam@154: opus_int pitchEstimationComplexity; /* Complexity level for pitch estimator */ cannam@154: opus_int pitchEstimationLPCOrder; /* Whitening filter order for pitch estimator */ cannam@154: opus_int32 pitchEstimationThreshold_Q16; /* Threshold for pitch estimator */ cannam@154: opus_int32 sum_log_gain_Q7; /* Cumulative max prediction gain */ cannam@154: opus_int NLSF_MSVQ_Survivors; /* Number of survivors in NLSF MSVQ */ cannam@154: opus_int first_frame_after_reset; /* Flag for deactivating NLSF interpolation, pitch prediction */ cannam@154: opus_int controlled_since_last_payload; /* Flag for ensuring codec_control only runs once per packet */ cannam@154: opus_int warping_Q16; /* Warping parameter for warped noise shaping */ cannam@154: opus_int useCBR; /* Flag to enable constant bitrate */ cannam@154: opus_int prefillFlag; /* Flag to indicate that only buffers are prefilled, no coding */ cannam@154: const opus_uint8 *pitch_lag_low_bits_iCDF; /* Pointer to iCDF table for low bits of pitch lag index */ cannam@154: const opus_uint8 *pitch_contour_iCDF; /* Pointer to iCDF table for pitch contour index */ cannam@154: const silk_NLSF_CB_struct *psNLSF_CB; /* Pointer to NLSF codebook */ cannam@154: opus_int input_quality_bands_Q15[ VAD_N_BANDS ]; cannam@154: opus_int input_tilt_Q15; cannam@154: opus_int SNR_dB_Q7; /* Quality setting */ cannam@154: cannam@154: opus_int8 VAD_flags[ MAX_FRAMES_PER_PACKET ]; cannam@154: opus_int8 LBRR_flag; cannam@154: opus_int LBRR_flags[ MAX_FRAMES_PER_PACKET ]; cannam@154: cannam@154: SideInfoIndices indices; cannam@154: opus_int8 pulses[ MAX_FRAME_LENGTH ]; cannam@154: cannam@154: int arch; cannam@154: cannam@154: /* Input/output buffering */ cannam@154: opus_int16 inputBuf[ MAX_FRAME_LENGTH + 2 ]; /* Buffer containing input signal */ cannam@154: opus_int inputBufIx; cannam@154: opus_int nFramesPerPacket; cannam@154: opus_int nFramesEncoded; /* Number of frames analyzed in current packet */ cannam@154: cannam@154: opus_int nChannelsAPI; cannam@154: opus_int nChannelsInternal; cannam@154: opus_int channelNb; cannam@154: cannam@154: /* Parameters For LTP scaling Control */ cannam@154: opus_int frames_since_onset; cannam@154: cannam@154: /* Specifically for entropy coding */ cannam@154: opus_int ec_prevSignalType; cannam@154: opus_int16 ec_prevLagIndex; cannam@154: cannam@154: silk_resampler_state_struct resampler_state; cannam@154: cannam@154: /* DTX */ cannam@154: opus_int useDTX; /* Flag to enable DTX */ cannam@154: opus_int inDTX; /* Flag to signal DTX period */ cannam@154: opus_int noSpeechCounter; /* Counts concecutive nonactive frames, used by DTX */ cannam@154: cannam@154: /* Inband Low Bitrate Redundancy (LBRR) data */ cannam@154: opus_int useInBandFEC; /* Saves the API setting for query */ cannam@154: opus_int LBRR_enabled; /* Depends on useInBandFRC, bitrate and packet loss rate */ cannam@154: opus_int LBRR_GainIncreases; /* Gains increment for coding LBRR frames */ cannam@154: SideInfoIndices indices_LBRR[ MAX_FRAMES_PER_PACKET ]; cannam@154: opus_int8 pulses_LBRR[ MAX_FRAMES_PER_PACKET ][ MAX_FRAME_LENGTH ]; cannam@154: } silk_encoder_state; cannam@154: cannam@154: cannam@154: /* Struct for Packet Loss Concealment */ cannam@154: typedef struct { cannam@154: opus_int32 pitchL_Q8; /* Pitch lag to use for voiced concealment */ cannam@154: opus_int16 LTPCoef_Q14[ LTP_ORDER ]; /* LTP coeficients to use for voiced concealment */ cannam@154: opus_int16 prevLPC_Q12[ MAX_LPC_ORDER ]; cannam@154: opus_int last_frame_lost; /* Was previous frame lost */ cannam@154: opus_int32 rand_seed; /* Seed for unvoiced signal generation */ cannam@154: opus_int16 randScale_Q14; /* Scaling of unvoiced random signal */ cannam@154: opus_int32 conc_energy; cannam@154: opus_int conc_energy_shift; cannam@154: opus_int16 prevLTP_scale_Q14; cannam@154: opus_int32 prevGain_Q16[ 2 ]; cannam@154: opus_int fs_kHz; cannam@154: opus_int nb_subfr; cannam@154: opus_int subfr_length; cannam@154: } silk_PLC_struct; cannam@154: cannam@154: /* Struct for CNG */ cannam@154: typedef struct { cannam@154: opus_int32 CNG_exc_buf_Q14[ MAX_FRAME_LENGTH ]; cannam@154: opus_int16 CNG_smth_NLSF_Q15[ MAX_LPC_ORDER ]; cannam@154: opus_int32 CNG_synth_state[ MAX_LPC_ORDER ]; cannam@154: opus_int32 CNG_smth_Gain_Q16; cannam@154: opus_int32 rand_seed; cannam@154: opus_int fs_kHz; cannam@154: } silk_CNG_struct; cannam@154: cannam@154: /********************************/ cannam@154: /* Decoder state */ cannam@154: /********************************/ cannam@154: typedef struct { cannam@154: opus_int32 prev_gain_Q16; cannam@154: opus_int32 exc_Q14[ MAX_FRAME_LENGTH ]; cannam@154: opus_int32 sLPC_Q14_buf[ MAX_LPC_ORDER ]; cannam@154: opus_int16 outBuf[ MAX_FRAME_LENGTH + 2 * MAX_SUB_FRAME_LENGTH ]; /* Buffer for output signal */ cannam@154: opus_int lagPrev; /* Previous Lag */ cannam@154: opus_int8 LastGainIndex; /* Previous gain index */ cannam@154: opus_int fs_kHz; /* Sampling frequency in kHz */ cannam@154: opus_int32 fs_API_hz; /* API sample frequency (Hz) */ cannam@154: opus_int nb_subfr; /* Number of 5 ms subframes in a frame */ cannam@154: opus_int frame_length; /* Frame length (samples) */ cannam@154: opus_int subfr_length; /* Subframe length (samples) */ cannam@154: opus_int ltp_mem_length; /* Length of LTP memory */ cannam@154: opus_int LPC_order; /* LPC order */ cannam@154: opus_int16 prevNLSF_Q15[ MAX_LPC_ORDER ]; /* Used to interpolate LSFs */ cannam@154: opus_int first_frame_after_reset; /* Flag for deactivating NLSF interpolation */ cannam@154: const opus_uint8 *pitch_lag_low_bits_iCDF; /* Pointer to iCDF table for low bits of pitch lag index */ cannam@154: const opus_uint8 *pitch_contour_iCDF; /* Pointer to iCDF table for pitch contour index */ cannam@154: cannam@154: /* For buffering payload in case of more frames per packet */ cannam@154: opus_int nFramesDecoded; cannam@154: opus_int nFramesPerPacket; cannam@154: cannam@154: /* Specifically for entropy coding */ cannam@154: opus_int ec_prevSignalType; cannam@154: opus_int16 ec_prevLagIndex; cannam@154: cannam@154: opus_int VAD_flags[ MAX_FRAMES_PER_PACKET ]; cannam@154: opus_int LBRR_flag; cannam@154: opus_int LBRR_flags[ MAX_FRAMES_PER_PACKET ]; cannam@154: cannam@154: silk_resampler_state_struct resampler_state; cannam@154: cannam@154: const silk_NLSF_CB_struct *psNLSF_CB; /* Pointer to NLSF codebook */ cannam@154: cannam@154: /* Quantization indices */ cannam@154: SideInfoIndices indices; cannam@154: cannam@154: /* CNG state */ cannam@154: silk_CNG_struct sCNG; cannam@154: cannam@154: /* Stuff used for PLC */ cannam@154: opus_int lossCnt; cannam@154: opus_int prevSignalType; cannam@154: int arch; cannam@154: cannam@154: silk_PLC_struct sPLC; cannam@154: cannam@154: } silk_decoder_state; cannam@154: cannam@154: /************************/ cannam@154: /* Decoder control */ cannam@154: /************************/ cannam@154: typedef struct { cannam@154: /* Prediction and coding parameters */ cannam@154: opus_int pitchL[ MAX_NB_SUBFR ]; cannam@154: opus_int32 Gains_Q16[ MAX_NB_SUBFR ]; cannam@154: /* Holds interpolated and final coefficients, 4-byte aligned */ cannam@154: silk_DWORD_ALIGN opus_int16 PredCoef_Q12[ 2 ][ MAX_LPC_ORDER ]; cannam@154: opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ]; cannam@154: opus_int LTP_scale_Q14; cannam@154: } silk_decoder_control; cannam@154: cannam@154: cannam@154: #ifdef __cplusplus cannam@154: } cannam@154: #endif cannam@154: cannam@154: #endif