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