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