383 lines
12 KiB
C
383 lines
12 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.
|
|
*/
|
|
|
|
/*
|
|
* structs.h
|
|
*
|
|
* This header file contains all the structs used in the ISAC codec
|
|
*
|
|
*/
|
|
|
|
#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_STRUCTS_H_
|
|
#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_STRUCTS_H_
|
|
|
|
|
|
#include "typedefs.h"
|
|
#include "signal_processing_library.h"
|
|
#include "settings.h"
|
|
|
|
/* Bitstream struct for decoder */
|
|
typedef struct Bitstreamstruct_dec {
|
|
|
|
WebRtc_UWord16 *stream; /* Pointer to bytestream to decode */
|
|
WebRtc_UWord32 W_upper; /* Upper boundary of interval W */
|
|
WebRtc_UWord32 streamval;
|
|
WebRtc_UWord16 stream_index; /* Index to the current position in bytestream */
|
|
WebRtc_Word16 full; /* 0 - first byte in memory filled, second empty*/
|
|
/* 1 - both bytes are empty (we just filled the previous memory */
|
|
|
|
} Bitstr_dec;
|
|
|
|
/* Bitstream struct for encoder */
|
|
typedef struct Bitstreamstruct_enc {
|
|
|
|
WebRtc_UWord16 stream[STREAM_MAXW16_60MS]; /* Vector for adding encoded bytestream */
|
|
WebRtc_UWord32 W_upper; /* Upper boundary of interval W */
|
|
WebRtc_UWord32 streamval;
|
|
WebRtc_UWord16 stream_index; /* Index to the current position in bytestream */
|
|
WebRtc_Word16 full; /* 0 - first byte in memory filled, second empty*/
|
|
/* 1 - both bytes are empty (we just filled the previous memory */
|
|
|
|
} Bitstr_enc;
|
|
|
|
|
|
typedef struct {
|
|
|
|
WebRtc_Word16 DataBufferLoQ0[WINLEN];
|
|
WebRtc_Word16 DataBufferHiQ0[WINLEN];
|
|
|
|
WebRtc_Word32 CorrBufLoQQ[ORDERLO+1];
|
|
WebRtc_Word32 CorrBufHiQQ[ORDERHI+1];
|
|
|
|
WebRtc_Word16 CorrBufLoQdom[ORDERLO+1];
|
|
WebRtc_Word16 CorrBufHiQdom[ORDERHI+1];
|
|
|
|
WebRtc_Word32 PreStateLoGQ15[ORDERLO+1];
|
|
WebRtc_Word32 PreStateHiGQ15[ORDERHI+1];
|
|
|
|
WebRtc_UWord32 OldEnergy;
|
|
|
|
} MaskFiltstr_enc;
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
WebRtc_Word16 PostStateLoGQ0[ORDERLO+1];
|
|
WebRtc_Word16 PostStateHiGQ0[ORDERHI+1];
|
|
|
|
WebRtc_UWord32 OldEnergy;
|
|
|
|
} MaskFiltstr_dec;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
//state vectors for each of the two analysis filters
|
|
|
|
WebRtc_Word32 INSTAT1_fix[2*(QORDER-1)];
|
|
WebRtc_Word32 INSTAT2_fix[2*(QORDER-1)];
|
|
WebRtc_Word16 INLABUF1_fix[QLOOKAHEAD];
|
|
WebRtc_Word16 INLABUF2_fix[QLOOKAHEAD];
|
|
|
|
/* High pass filter */
|
|
WebRtc_Word32 HPstates_fix[HPORDER];
|
|
|
|
} PreFiltBankstr;
|
|
|
|
|
|
typedef struct {
|
|
|
|
//state vectors for each of the two analysis filters
|
|
WebRtc_Word32 STATE_0_LOWER_fix[2*POSTQORDER];
|
|
WebRtc_Word32 STATE_0_UPPER_fix[2*POSTQORDER];
|
|
|
|
/* High pass filter */
|
|
|
|
WebRtc_Word32 HPstates1_fix[HPORDER];
|
|
WebRtc_Word32 HPstates2_fix[HPORDER];
|
|
|
|
} PostFiltBankstr;
|
|
|
|
typedef struct {
|
|
|
|
|
|
/* data buffer for pitch filter */
|
|
WebRtc_Word16 ubufQQ[PITCH_BUFFSIZE];
|
|
|
|
/* low pass state vector */
|
|
WebRtc_Word16 ystateQQ[PITCH_DAMPORDER];
|
|
|
|
/* old lag and gain */
|
|
WebRtc_Word16 oldlagQ7;
|
|
WebRtc_Word16 oldgainQ12;
|
|
|
|
} PitchFiltstr;
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
//for inital estimator
|
|
WebRtc_Word16 dec_buffer16[PITCH_CORR_LEN2+PITCH_CORR_STEP2+PITCH_MAX_LAG/2-PITCH_FRAME_LEN/2+2];
|
|
WebRtc_Word32 decimator_state32[2*ALLPASSSECTIONS+1];
|
|
WebRtc_Word16 inbuf[QLOOKAHEAD];
|
|
|
|
PitchFiltstr PFstr_wght;
|
|
PitchFiltstr PFstr;
|
|
|
|
|
|
} PitchAnalysisStruct;
|
|
|
|
|
|
typedef struct {
|
|
/* Parameters used in PLC to avoid re-computation */
|
|
|
|
/* --- residual signals --- */
|
|
WebRtc_Word16 prevPitchInvIn[FRAMESAMPLES/2];
|
|
WebRtc_Word16 prevPitchInvOut[PITCH_MAX_LAG + 10]; // [FRAMESAMPLES/2]; save 90
|
|
WebRtc_Word32 prevHP[PITCH_MAX_LAG + 10]; // [FRAMESAMPLES/2]; save 90
|
|
|
|
|
|
WebRtc_Word16 decayCoeffPriodic; /* how much to supress a sample */
|
|
WebRtc_Word16 decayCoeffNoise;
|
|
WebRtc_Word16 used; /* if PLC is used */
|
|
|
|
|
|
WebRtc_Word16 *lastPitchLP; // [FRAMESAMPLES/2]; saved 240;
|
|
|
|
|
|
/* --- LPC side info --- */
|
|
WebRtc_Word16 lofilt_coefQ15[ ORDERLO ];
|
|
WebRtc_Word16 hifilt_coefQ15[ ORDERHI ];
|
|
WebRtc_Word32 gain_lo_hiQ17[2];
|
|
|
|
/* --- LTP side info --- */
|
|
WebRtc_Word16 AvgPitchGain_Q12;
|
|
WebRtc_Word16 lastPitchGain_Q12;
|
|
WebRtc_Word16 lastPitchLag_Q7;
|
|
|
|
/* --- Add-overlap in recovery packet --- */
|
|
WebRtc_Word16 overlapLP[ RECOVERY_OVERLAP ]; // [FRAMESAMPLES/2]; saved 160
|
|
|
|
WebRtc_Word16 pitchCycles;
|
|
WebRtc_Word16 A;
|
|
WebRtc_Word16 B;
|
|
WebRtc_Word16 pitchIndex;
|
|
WebRtc_Word16 stretchLag;
|
|
WebRtc_Word16 *prevPitchLP; // [ FRAMESAMPLES/2 ]; saved 240
|
|
WebRtc_Word16 seed;
|
|
|
|
WebRtc_Word16 std;
|
|
} PLCstr;
|
|
|
|
|
|
|
|
/* Have instance of struct together with other iSAC structs */
|
|
typedef struct {
|
|
|
|
WebRtc_Word16 prevFrameSizeMs; /* Previous frame size (in ms) */
|
|
WebRtc_UWord16 prevRtpNumber; /* Previous RTP timestamp from received packet */
|
|
/* (in samples relative beginning) */
|
|
WebRtc_UWord32 prevSendTime; /* Send time for previous packet, from RTP header */
|
|
WebRtc_UWord32 prevArrivalTime; /* Arrival time for previous packet (in ms using timeGetTime()) */
|
|
WebRtc_UWord16 prevRtpRate; /* rate of previous packet, derived from RTP timestamps (in bits/s) */
|
|
WebRtc_UWord32 lastUpdate; /* Time since the last update of the Bottle Neck estimate (in samples) */
|
|
WebRtc_UWord32 lastReduction; /* Time sinse the last reduction (in samples) */
|
|
WebRtc_Word32 countUpdates; /* How many times the estimate was update in the beginning */
|
|
|
|
/* The estimated bottle neck rate from there to here (in bits/s) */
|
|
WebRtc_UWord32 recBw;
|
|
WebRtc_UWord32 recBwInv;
|
|
WebRtc_UWord32 recBwAvg;
|
|
WebRtc_UWord32 recBwAvgQ;
|
|
|
|
WebRtc_UWord32 minBwInv;
|
|
WebRtc_UWord32 maxBwInv;
|
|
|
|
/* The estimated mean absolute jitter value, as seen on this side (in ms) */
|
|
WebRtc_Word32 recJitter;
|
|
WebRtc_Word32 recJitterShortTerm;
|
|
WebRtc_Word32 recJitterShortTermAbs;
|
|
WebRtc_Word32 recMaxDelay;
|
|
WebRtc_Word32 recMaxDelayAvgQ;
|
|
|
|
|
|
WebRtc_Word16 recHeaderRate; /* (assumed) bitrate for headers (bps) */
|
|
|
|
WebRtc_UWord32 sendBwAvg; /* The estimated bottle neck rate from here to there (in bits/s) */
|
|
WebRtc_Word32 sendMaxDelayAvg; /* The estimated mean absolute jitter value, as seen on the other siee (in ms) */
|
|
|
|
|
|
WebRtc_Word16 countRecPkts; /* number of packets received since last update */
|
|
WebRtc_Word16 highSpeedRec; /* flag for marking that a high speed network has been detected downstream */
|
|
|
|
/* number of consecutive pkts sent during which the bwe estimate has
|
|
remained at a value greater than the downstream threshold for determining highspeed network */
|
|
WebRtc_Word16 countHighSpeedRec;
|
|
|
|
/* flag indicating bwe should not adjust down immediately for very late pckts */
|
|
WebRtc_Word16 inWaitPeriod;
|
|
|
|
/* variable holding the time of the start of a window of time when
|
|
bwe should not adjust down immediately for very late pckts */
|
|
WebRtc_UWord32 startWaitPeriod;
|
|
|
|
/* number of consecutive pkts sent during which the bwe estimate has
|
|
remained at a value greater than the upstream threshold for determining highspeed network */
|
|
WebRtc_Word16 countHighSpeedSent;
|
|
|
|
/* flag indicated the desired number of packets over threshold rate have been sent and
|
|
bwe will assume the connection is over broadband network */
|
|
WebRtc_Word16 highSpeedSend;
|
|
|
|
|
|
|
|
|
|
} BwEstimatorstr;
|
|
|
|
|
|
typedef struct {
|
|
|
|
/* boolean, flags if previous packet exceeded B.N. */
|
|
WebRtc_Word16 PrevExceed;
|
|
/* ms */
|
|
WebRtc_Word16 ExceedAgo;
|
|
/* packets left to send in current burst */
|
|
WebRtc_Word16 BurstCounter;
|
|
/* packets */
|
|
WebRtc_Word16 InitCounter;
|
|
/* ms remaining in buffer when next packet will be sent */
|
|
WebRtc_Word16 StillBuffered;
|
|
|
|
} RateModel;
|
|
|
|
/* The following strutc is used to store data from encoding, to make it
|
|
fast and easy to construct a new bitstream with a different Bandwidth
|
|
estimate. All values (except framelength and minBytes) is double size to
|
|
handle 60 ms of data.
|
|
*/
|
|
typedef struct {
|
|
|
|
/* Used to keep track of if it is first or second part of 60 msec packet */
|
|
int startIdx;
|
|
|
|
/* Frame length in samples */
|
|
WebRtc_Word16 framelength;
|
|
|
|
/* Pitch Gain */
|
|
WebRtc_Word16 pitchGain_index[2];
|
|
|
|
/* Pitch Lag */
|
|
WebRtc_Word32 meanGain[2];
|
|
WebRtc_Word16 pitchIndex[PITCH_SUBFRAMES*2];
|
|
|
|
/* LPC */
|
|
WebRtc_Word32 LPCcoeffs_g[12*2]; /* KLT_ORDER_GAIN = 12 */
|
|
WebRtc_Word16 LPCindex_s[108*2]; /* KLT_ORDER_SHAPE = 108 */
|
|
WebRtc_Word16 LPCindex_g[12*2]; /* KLT_ORDER_GAIN = 12 */
|
|
|
|
/* Encode Spec */
|
|
WebRtc_Word16 fre[FRAMESAMPLES];
|
|
WebRtc_Word16 fim[FRAMESAMPLES];
|
|
WebRtc_Word16 AvgPitchGain[2];
|
|
|
|
/* Used in adaptive mode only */
|
|
int minBytes;
|
|
|
|
} ISAC_SaveEncData_t;
|
|
|
|
typedef struct {
|
|
|
|
Bitstr_enc bitstr_obj;
|
|
MaskFiltstr_enc maskfiltstr_obj;
|
|
PreFiltBankstr prefiltbankstr_obj;
|
|
PitchFiltstr pitchfiltstr_obj;
|
|
PitchAnalysisStruct pitchanalysisstr_obj;
|
|
RateModel rate_data_obj;
|
|
|
|
WebRtc_Word16 buffer_index;
|
|
WebRtc_Word16 current_framesamples;
|
|
|
|
WebRtc_Word16 data_buffer_fix[FRAMESAMPLES]; // the size was MAX_FRAMESAMPLES
|
|
|
|
WebRtc_Word16 frame_nb;
|
|
WebRtc_Word16 BottleNeck;
|
|
WebRtc_Word16 MaxDelay;
|
|
WebRtc_Word16 new_framelength;
|
|
WebRtc_Word16 s2nr;
|
|
WebRtc_UWord16 MaxBits;
|
|
|
|
WebRtc_Word16 bitstr_seed;
|
|
#ifdef NB_CALLS
|
|
PostFiltBankstr interpolatorstr_obj;
|
|
#endif
|
|
|
|
ISAC_SaveEncData_t *SaveEnc_ptr;
|
|
WebRtc_Word16 payloadLimitBytes30; /* Maximum allowed number of bits for a 30 msec packet */
|
|
WebRtc_Word16 payloadLimitBytes60; /* Maximum allowed number of bits for a 30 msec packet */
|
|
WebRtc_Word16 maxPayloadBytes; /* Maximum allowed number of bits for both 30 and 60 msec packet */
|
|
WebRtc_Word16 maxRateInBytes; /* Maximum allowed rate in bytes per 30 msec packet */
|
|
WebRtc_Word16 enforceFrameSize; /* If set iSAC will never change packet size */
|
|
|
|
} ISACFIX_EncInst_t;
|
|
|
|
|
|
typedef struct {
|
|
|
|
Bitstr_dec bitstr_obj;
|
|
MaskFiltstr_dec maskfiltstr_obj;
|
|
PostFiltBankstr postfiltbankstr_obj;
|
|
PitchFiltstr pitchfiltstr_obj;
|
|
PLCstr plcstr_obj; /* TS; for packet loss concealment */
|
|
|
|
#ifdef NB_CALLS
|
|
PreFiltBankstr decimatorstr_obj;
|
|
#endif
|
|
|
|
} ISACFIX_DecInst_t;
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
ISACFIX_EncInst_t ISACenc_obj;
|
|
ISACFIX_DecInst_t ISACdec_obj;
|
|
BwEstimatorstr bwestimator_obj;
|
|
WebRtc_Word16 CodingMode; /* 0 = adaptive; 1 = instantaneous */
|
|
WebRtc_Word16 errorcode;
|
|
WebRtc_Word16 initflag; /* 0 = nothing initiated; 1 = encoder or decoder */
|
|
/* not initiated; 2 = all initiated */
|
|
} ISACFIX_SubStruct;
|
|
|
|
|
|
typedef struct {
|
|
WebRtc_Word32 lpcGains[12]; /* 6 lower-band & 6 upper-band we may need to double it for 60*/
|
|
/* */
|
|
WebRtc_UWord32 W_upper; /* Upper boundary of interval W */
|
|
WebRtc_UWord32 streamval;
|
|
WebRtc_UWord16 stream_index; /* Index to the current position in bytestream */
|
|
WebRtc_Word16 full; /* 0 - first byte in memory filled, second empty*/
|
|
/* 1 - both bytes are empty (we just filled the previous memory */
|
|
WebRtc_UWord16 beforeLastWord;
|
|
WebRtc_UWord16 lastWord;
|
|
} transcode_obj;
|
|
|
|
|
|
//Bitstr_enc myBitStr;
|
|
|
|
#endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_STRUCTS_H_ */
|