Home | History | Annotate | Download | only in source
      1 /*
      2  *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 /*
     12  * structs.h
     13  *
     14  * This header file contains all the structs used in the ISAC codec
     15  *
     16  */
     17 
     18 #ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_STRUCTS_H_
     19 #define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_STRUCTS_H_
     20 
     21 
     22 #include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
     23 #include "webrtc/modules/audio_coding/codecs/isac/bandwidth_info.h"
     24 #include "webrtc/modules/audio_coding/codecs/isac/fix/source/settings.h"
     25 #include "webrtc/typedefs.h"
     26 
     27 /* Bitstream struct for decoder */
     28 typedef struct Bitstreamstruct_dec {
     29 
     30   uint16_t  stream[INTERNAL_STREAM_SIZE_W16];  /* Array bytestream to decode */
     31   uint32_t  W_upper;          /* Upper boundary of interval W */
     32   uint32_t  streamval;
     33   uint16_t  stream_index;     /* Index to the current position in bytestream */
     34   int16_t   full;             /* 0 - first byte in memory filled, second empty*/
     35   /* 1 - both bytes are empty (we just filled the previous memory */
     36 
     37   size_t stream_size;  /* The size of stream in bytes. */
     38 } Bitstr_dec;
     39 
     40 /* Bitstream struct for encoder */
     41 typedef struct Bitstreamstruct_enc {
     42 
     43   uint16_t  stream[STREAM_MAXW16_60MS];   /* Vector for adding encoded bytestream */
     44   uint32_t  W_upper;          /* Upper boundary of interval W */
     45   uint32_t  streamval;
     46   uint16_t  stream_index;     /* Index to the current position in bytestream */
     47   int16_t   full;             /* 0 - first byte in memory filled, second empty*/
     48   /* 1 - both bytes are empty (we just filled the previous memory */
     49 
     50 } Bitstr_enc;
     51 
     52 
     53 typedef struct {
     54 
     55   int16_t DataBufferLoQ0[WINLEN];
     56   int16_t DataBufferHiQ0[WINLEN];
     57 
     58   int32_t CorrBufLoQQ[ORDERLO+1];
     59   int32_t CorrBufHiQQ[ORDERHI+1];
     60 
     61   int16_t CorrBufLoQdom[ORDERLO+1];
     62   int16_t CorrBufHiQdom[ORDERHI+1];
     63 
     64   int32_t PreStateLoGQ15[ORDERLO+1];
     65   int32_t PreStateHiGQ15[ORDERHI+1];
     66 
     67   uint32_t OldEnergy;
     68 
     69 } MaskFiltstr_enc;
     70 
     71 
     72 
     73 typedef struct {
     74 
     75   int16_t PostStateLoGQ0[ORDERLO+1];
     76   int16_t PostStateHiGQ0[ORDERHI+1];
     77 
     78   uint32_t OldEnergy;
     79 
     80 } MaskFiltstr_dec;
     81 
     82 
     83 
     84 
     85 
     86 
     87 
     88 
     89 typedef struct {
     90 
     91   //state vectors for each of the two analysis filters
     92 
     93   int32_t INSTAT1_fix[2*(QORDER-1)];
     94   int32_t INSTAT2_fix[2*(QORDER-1)];
     95   int16_t INLABUF1_fix[QLOOKAHEAD];
     96   int16_t INLABUF2_fix[QLOOKAHEAD];
     97 
     98   /* High pass filter */
     99   int32_t HPstates_fix[HPORDER];
    100 
    101 } PreFiltBankstr;
    102 
    103 
    104 typedef struct {
    105 
    106   //state vectors for each of the two analysis filters
    107   int32_t STATE_0_LOWER_fix[2*POSTQORDER];
    108   int32_t STATE_0_UPPER_fix[2*POSTQORDER];
    109 
    110   /* High pass filter */
    111 
    112   int32_t HPstates1_fix[HPORDER];
    113   int32_t HPstates2_fix[HPORDER];
    114 
    115 } PostFiltBankstr;
    116 
    117 typedef struct {
    118 
    119 
    120   /* data buffer for pitch filter */
    121   int16_t ubufQQ[PITCH_BUFFSIZE];
    122 
    123   /* low pass state vector */
    124   int16_t ystateQQ[PITCH_DAMPORDER];
    125 
    126   /* old lag and gain */
    127   int16_t oldlagQ7;
    128   int16_t oldgainQ12;
    129 
    130 } PitchFiltstr;
    131 
    132 
    133 
    134 typedef struct {
    135 
    136   //for inital estimator
    137   int16_t   dec_buffer16[PITCH_CORR_LEN2+PITCH_CORR_STEP2+PITCH_MAX_LAG/2-PITCH_FRAME_LEN/2+2];
    138   int32_t   decimator_state32[2*ALLPASSSECTIONS+1];
    139   int16_t   inbuf[QLOOKAHEAD];
    140 
    141   PitchFiltstr  PFstr_wght;
    142   PitchFiltstr  PFstr;
    143 
    144 
    145 } PitchAnalysisStruct;
    146 
    147 
    148 typedef struct {
    149   /* Parameters used in PLC to avoid re-computation       */
    150 
    151   /* --- residual signals --- */
    152   int16_t prevPitchInvIn[FRAMESAMPLES/2];
    153   int16_t prevPitchInvOut[PITCH_MAX_LAG + 10];            // [FRAMESAMPLES/2]; save 90
    154   int32_t prevHP[PITCH_MAX_LAG + 10];                     // [FRAMESAMPLES/2]; save 90
    155 
    156 
    157   int16_t decayCoeffPriodic; /* how much to supress a sample */
    158   int16_t decayCoeffNoise;
    159   int16_t used;       /* if PLC is used */
    160 
    161 
    162   int16_t *lastPitchLP;                                  // [FRAMESAMPLES/2]; saved 240;
    163 
    164 
    165   /* --- LPC side info --- */
    166   int16_t lofilt_coefQ15[ ORDERLO ];
    167   int16_t hifilt_coefQ15[ ORDERHI ];
    168   int32_t gain_lo_hiQ17[2];
    169 
    170   /* --- LTP side info --- */
    171   int16_t AvgPitchGain_Q12;
    172   int16_t lastPitchGain_Q12;
    173   int16_t lastPitchLag_Q7;
    174 
    175   /* --- Add-overlap in recovery packet --- */
    176   int16_t overlapLP[ RECOVERY_OVERLAP ];                 // [FRAMESAMPLES/2]; saved 160
    177 
    178   int16_t pitchCycles;
    179   int16_t A;
    180   int16_t B;
    181   size_t pitchIndex;
    182   size_t stretchLag;
    183   int16_t *prevPitchLP;                                  // [ FRAMESAMPLES/2 ]; saved 240
    184   int16_t seed;
    185 
    186   int16_t std;
    187 } PLCstr;
    188 
    189 
    190 
    191 /* Have instance of struct together with other iSAC structs */
    192 typedef struct {
    193 
    194   int16_t   prevFrameSizeMs;      /* Previous frame size (in ms) */
    195   uint16_t  prevRtpNumber;      /* Previous RTP timestamp from received packet */
    196   /* (in samples relative beginning)  */
    197   uint32_t  prevSendTime;   /* Send time for previous packet, from RTP header */
    198   uint32_t  prevArrivalTime;      /* Arrival time for previous packet (in ms using timeGetTime()) */
    199   uint16_t  prevRtpRate;          /* rate of previous packet, derived from RTP timestamps (in bits/s) */
    200   uint32_t  lastUpdate;           /* Time since the last update of the Bottle Neck estimate (in samples) */
    201   uint32_t  lastReduction;        /* Time sinse the last reduction (in samples) */
    202   int32_t   countUpdates;         /* How many times the estimate was update in the beginning */
    203 
    204   /* The estimated bottle neck rate from there to here (in bits/s)                */
    205   uint32_t  recBw;
    206   uint32_t  recBwInv;
    207   uint32_t  recBwAvg;
    208   uint32_t  recBwAvgQ;
    209 
    210   uint32_t  minBwInv;
    211   uint32_t  maxBwInv;
    212 
    213   /* The estimated mean absolute jitter value, as seen on this side (in ms)       */
    214   int32_t   recJitter;
    215   int32_t   recJitterShortTerm;
    216   int32_t   recJitterShortTermAbs;
    217   int32_t   recMaxDelay;
    218   int32_t   recMaxDelayAvgQ;
    219 
    220 
    221   int16_t   recHeaderRate;         /* (assumed) bitrate for headers (bps) */
    222 
    223   uint32_t  sendBwAvg;           /* The estimated bottle neck rate from here to there (in bits/s) */
    224   int32_t   sendMaxDelayAvg;    /* The estimated mean absolute jitter value, as seen on the other siee (in ms)  */
    225 
    226 
    227   int16_t   countRecPkts;          /* number of packets received since last update */
    228   int16_t   highSpeedRec;        /* flag for marking that a high speed network has been detected downstream */
    229 
    230   /* number of consecutive pkts sent during which the bwe estimate has
    231      remained at a value greater than the downstream threshold for determining highspeed network */
    232   int16_t   countHighSpeedRec;
    233 
    234   /* flag indicating bwe should not adjust down immediately for very late pckts */
    235   int16_t   inWaitPeriod;
    236 
    237   /* variable holding the time of the start of a window of time when
    238      bwe should not adjust down immediately for very late pckts */
    239   uint32_t  startWaitPeriod;
    240 
    241   /* number of consecutive pkts sent during which the bwe estimate has
    242      remained at a value greater than the upstream threshold for determining highspeed network */
    243   int16_t   countHighSpeedSent;
    244 
    245   /* flag indicated the desired number of packets over threshold rate have been sent and
    246      bwe will assume the connection is over broadband network */
    247   int16_t   highSpeedSend;
    248 
    249   IsacBandwidthInfo external_bw_info;
    250 } BwEstimatorstr;
    251 
    252 
    253 typedef struct {
    254 
    255   /* boolean, flags if previous packet exceeded B.N. */
    256   int16_t    PrevExceed;
    257   /* ms */
    258   int16_t    ExceedAgo;
    259   /* packets left to send in current burst */
    260   int16_t    BurstCounter;
    261   /* packets */
    262   int16_t    InitCounter;
    263   /* ms remaining in buffer when next packet will be sent */
    264   int16_t    StillBuffered;
    265 
    266 } RateModel;
    267 
    268 /* The following strutc is used to store data from encoding, to make it
    269    fast and easy to construct a new bitstream with a different Bandwidth
    270    estimate. All values (except framelength and minBytes) is double size to
    271    handle 60 ms of data.
    272 */
    273 typedef struct {
    274 
    275   /* Used to keep track of if it is first or second part of 60 msec packet */
    276   int     startIdx;
    277 
    278   /* Frame length in samples */
    279   int16_t         framelength;
    280 
    281   /* Pitch Gain */
    282   int16_t   pitchGain_index[2];
    283 
    284   /* Pitch Lag */
    285   int32_t   meanGain[2];
    286   int16_t   pitchIndex[PITCH_SUBFRAMES*2];
    287 
    288   /* LPC */
    289   int32_t         LPCcoeffs_g[12*2]; /* KLT_ORDER_GAIN = 12 */
    290   int16_t   LPCindex_s[108*2]; /* KLT_ORDER_SHAPE = 108 */
    291   int16_t   LPCindex_g[12*2];  /* KLT_ORDER_GAIN = 12 */
    292 
    293   /* Encode Spec */
    294   int16_t   fre[FRAMESAMPLES];
    295   int16_t   fim[FRAMESAMPLES];
    296   int16_t   AvgPitchGain[2];
    297 
    298   /* Used in adaptive mode only */
    299   int     minBytes;
    300 
    301 } IsacSaveEncoderData;
    302 
    303 typedef struct {
    304 
    305   Bitstr_enc          bitstr_obj;
    306   MaskFiltstr_enc     maskfiltstr_obj;
    307   PreFiltBankstr      prefiltbankstr_obj;
    308   PitchFiltstr        pitchfiltstr_obj;
    309   PitchAnalysisStruct pitchanalysisstr_obj;
    310   RateModel           rate_data_obj;
    311 
    312   int16_t         buffer_index;
    313   int16_t         current_framesamples;
    314 
    315   int16_t      data_buffer_fix[FRAMESAMPLES]; // the size was MAX_FRAMESAMPLES
    316 
    317   int16_t         frame_nb;
    318   int16_t         BottleNeck;
    319   int16_t         MaxDelay;
    320   int16_t         new_framelength;
    321   int16_t         s2nr;
    322   uint16_t        MaxBits;
    323 
    324   int16_t         bitstr_seed;
    325 #ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
    326   PostFiltBankstr     interpolatorstr_obj;
    327 #endif
    328 
    329   IsacSaveEncoderData *SaveEnc_ptr;
    330   int16_t         payloadLimitBytes30; /* Maximum allowed number of bits for a 30 msec packet */
    331   int16_t         payloadLimitBytes60; /* Maximum allowed number of bits for a 30 msec packet */
    332   int16_t         maxPayloadBytes;     /* Maximum allowed number of bits for both 30 and 60 msec packet */
    333   int16_t         maxRateInBytes;      /* Maximum allowed rate in bytes per 30 msec packet */
    334   int16_t         enforceFrameSize;    /* If set iSAC will never change packet size */
    335 
    336 } IsacFixEncoderInstance;
    337 
    338 
    339 typedef struct {
    340 
    341   Bitstr_dec          bitstr_obj;
    342   MaskFiltstr_dec     maskfiltstr_obj;
    343   PostFiltBankstr     postfiltbankstr_obj;
    344   PitchFiltstr        pitchfiltstr_obj;
    345   PLCstr              plcstr_obj;               /* TS; for packet loss concealment */
    346 
    347 #ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
    348   PreFiltBankstr      decimatorstr_obj;
    349 #endif
    350 
    351 } IsacFixDecoderInstance;
    352 
    353 
    354 
    355 typedef struct {
    356 
    357   IsacFixEncoderInstance ISACenc_obj;
    358   IsacFixDecoderInstance ISACdec_obj;
    359   BwEstimatorstr     bwestimator_obj;
    360   int16_t         CodingMode;       /* 0 = adaptive; 1 = instantaneous */
    361   int16_t   errorcode;
    362   int16_t   initflag;  /* 0 = nothing initiated; 1 = encoder or decoder */
    363   /* not initiated; 2 = all initiated */
    364 } ISACFIX_SubStruct;
    365 
    366 
    367 typedef struct {
    368   int32_t   lpcGains[12];     /* 6 lower-band & 6 upper-band we may need to double it for 60*/
    369   /* */
    370   uint32_t  W_upper;          /* Upper boundary of interval W */
    371   uint32_t  streamval;
    372   uint16_t  stream_index;     /* Index to the current position in bytestream */
    373   int16_t   full;             /* 0 - first byte in memory filled, second empty*/
    374   /* 1 - both bytes are empty (we just filled the previous memory */
    375   uint16_t  beforeLastWord;
    376   uint16_t  lastWord;
    377 } transcode_obj;
    378 
    379 
    380 //Bitstr_enc myBitStr;
    381 
    382 #endif  /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_STRUCTS_H_ */
    383