| /* |
| * 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_ */ |