• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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