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