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