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 */ 27 typedef 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 */ 39 typedef 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 51 typedef 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 71 typedef 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 87 typedef 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 102 typedef 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 115 typedef 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 132 typedef 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 146 typedef 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 */ 190 typedef 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 253 typedef 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 */ 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 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 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 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 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 } ISACFIX_DecInst_t; 352 353 354 355 typedef 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 367 typedef 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