blob: 54522729fd7e41e3ae8e1c2048fec72526889f70 [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
bjornv@webrtc.org152c34c2012-01-23 12:36:46 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
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 * This file contains some DSP initialization functions,
13 * constant table definitions and other parameters.
14 * Also contains definitions of all DSP-side data structures.
15 */
16
17
18#ifndef DSP_H
19#define DSP_H
20
21#include "typedefs.h"
22
23#include "webrtc_cng.h"
24
25#include "codec_db_defines.h"
26#include "neteq_defines.h"
27#include "neteq_statistics.h"
28
29#ifdef NETEQ_ATEVENT_DECODE
30#include "dtmf_tonegen.h"
31#endif
32
33
34
35/*****************************/
36/* Pre-processor definitions */
37/*****************************/
38
39/* FSMULT is the sample rate divided by 8000 */
40#if defined(NETEQ_48KHZ_WIDEBAND)
41 #define FSMULT 6
42#elif defined(NETEQ_32KHZ_WIDEBAND)
43 #define FSMULT 4
44#elif defined(NETEQ_WIDEBAND)
45 #define FSMULT 2
46#else
47 #define FSMULT 1
48#endif
49
50/* Size of the speech buffer (or synchronization buffer). */
51/* 60 ms decoding + 10 ms syncbuff + 0.625ms lookahead */
52#define SPEECH_BUF_SIZE (565 * FSMULT)
53
54/* Misc definitions */
55#define BGN_LPC_ORDER (4 + FSMULT) /* 5, 6, 8, or 10 */
56#define UNVOICED_LPC_ORDER 6
57#define RANDVEC_NO_OF_SAMPLES 256
58
59/* Number of milliseconds to remove/add during accelerate/pre-emptive expand
60 under BGNonly operation */
61#define DEFAULT_TIME_ADJUST 8
62
63/* Number of RecOut calls without CNG/SID before re-enabling post-decode VAD */
64#define POST_DECODE_VAD_AUTO_ENABLE 3000
65
66/* 8kHz windowing in Q15 (over 5 samples) */
67#define NETEQ_OVERLAP_WINMUTE_8KHZ_START 27307
68#define NETEQ_OVERLAP_WINMUTE_8KHZ_INC -5461
69#define NETEQ_OVERLAP_WINUNMUTE_8KHZ_START 5461
70#define NETEQ_OVERLAP_WINUNMUTE_8KHZ_INC 5461
71/* 16kHz windowing in Q15 (over 10 samples) */
72#define NETEQ_OVERLAP_WINMUTE_16KHZ_START 29789
73#define NETEQ_OVERLAP_WINMUTE_16KHZ_INC -2979
74#define NETEQ_OVERLAP_WINUNMUTE_16KHZ_START 2979
75#define NETEQ_OVERLAP_WINUNMUTE_16KHZ_INC 2979
76/* 32kHz windowing in Q15 (over 20 samples) */
77#define NETEQ_OVERLAP_WINMUTE_32KHZ_START 31208
78#define NETEQ_OVERLAP_WINMUTE_32KHZ_INC -1560
79#define NETEQ_OVERLAP_WINUNMUTE_32KHZ_START 1560
80#define NETEQ_OVERLAP_WINUNMUTE_32KHZ_INC 1560
81/* 48kHz windowing in Q15 (over 30 samples) */
82#define NETEQ_OVERLAP_WINMUTE_48KHZ_START 31711
83#define NETEQ_OVERLAP_WINMUTE_48KHZ_INC -1057
84#define NETEQ_OVERLAP_WINUNMUTE_48KHZ_START 1057
85#define NETEQ_OVERLAP_WINUNMUTE_48KHZ_INC 1057
86
87/* Fade BGN towards zero after this many Expand calls */
88#define FADE_BGN_TIME 200
89
90
91/*******************/
92/* Constant tables */
93/*******************/
94
pbos@webrtc.org0946a562013-04-09 00:28:06 +000095extern const int16_t WebRtcNetEQ_kDownsample8kHzTbl[];
96extern const int16_t WebRtcNetEQ_kDownsample16kHzTbl[];
97extern const int16_t WebRtcNetEQ_kDownsample32kHzTbl[];
98extern const int16_t WebRtcNetEQ_kDownsample48kHzTbl[];
99extern const int16_t WebRtcNetEQ_kRandnTbl[];
100extern const int16_t WebRtcNetEQ_kMixFractionFuncTbl[];
101extern const int16_t WebRtcNetEQ_k1049div[];
102extern const int16_t WebRtcNetEQ_k2097div[];
103extern const int16_t WebRtcNetEQ_k5243div[];
niklase@google.com470e71d2011-07-07 08:21:25 +0000104
105
106
107/************/
108/* Typedefs */
109/************/
110
111enum BGNMode
112{
113 BGN_ON, /* default "normal" behavior with eternal noise */
114 BGN_FADE, /* noise fades to zero after some time */
115 BGN_OFF /* background noise is always zero */
116};
117
118#ifdef NETEQ_STEREO
119enum MasterSlaveMode
120{
121 NETEQ_MONO, /* stand-alone instance */
122 NETEQ_MASTER, /* master instance in a spatial/stereo configuration */
123 NETEQ_SLAVE /* slave instance in a spatial/stereo configuration */
124};
125
126enum MasterSlaveExtraInfo
127{
128 NO_INFO, /* no info to convey */
129 ACC_FAIL, /* signal that accelerate failed */
130 PE_EXP_FAIL, /* signal that pre-emptive expand failed */
131 DTMF_OVERDUB, /* signal that DTMF overdub is generated */
132 DTMF_ONLY /* signal that DTMF only is played */
133};
134#endif
135
136/****************************/
137/* DSP-side data structures */
138/****************************/
139
140/* Background noise (BGN) instance for storing BGN parameters
141 (sub-instance of NETEQDSP_inst) */
142typedef struct BGNInst_t_
143{
144
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000145 int32_t w32_energy;
146 int32_t w32_energyMax;
147 int32_t w32_energyUpdate;
148 int32_t w32_energyUpdateLow;
149 int16_t pw16_filterState[BGN_LPC_ORDER];
150 int16_t pw16_filter[BGN_LPC_ORDER + 1];
151 int16_t w16_mutefactor;
152 int16_t w16_scale;
153 int16_t w16_scaleShift;
154 int16_t w16_initialized;
niklase@google.com470e71d2011-07-07 08:21:25 +0000155 enum BGNMode bgnMode;
156
157} BGNInst_t;
158
159/* Expansion instance (sub-instance of NETEQDSP_inst) */
160typedef struct ExpandInst_t_
161{
162
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000163 int16_t w16_overlap; /* Constant, 5 for NB and 10 for WB */
164 int16_t w16_consecExp; /* Number of consecutive expand calls */
165 int16_t *pw16_arFilter; /* length [UNVOICED_LPC_ORDER+1] */
166 int16_t *pw16_arState; /* length [UNVOICED_LPC_ORDER] */
167 int16_t w16_arGain;
168 int16_t w16_arGainScale;
169 int16_t w16_vFraction; /* Q14 */
170 int16_t w16_currentVFraction; /* Q14 */
171 int16_t *pw16_expVecs[2];
172 int16_t w16_lags[3];
173 int16_t w16_maxLag;
174 int16_t *pw16_overlapVec; /* last samples of speech history */
175 int16_t w16_lagsDirection;
176 int16_t w16_lagsPosition;
177 int16_t w16_expandMuteFactor; /* Q14 */
178 int16_t w16_stopMuting;
179 int16_t w16_onset;
180 int16_t w16_muteSlope; /* Q20 */
niklase@google.com470e71d2011-07-07 08:21:25 +0000181
182} ExpandInst_t;
183
184#ifdef NETEQ_VAD
185
186/*
187 * VAD function pointer types, replicating the typedefs in webrtc_neteq_internal.h.
188 * These function pointers match the definitions of WebRtc VAD functions WebRtcVad_Init,
189 * WebRtcVad_set_mode and WebRtcVad_Process, respectively, all found in webrtc_vad.h.
190 */
bjornv@webrtc.orgab2bb822012-01-18 14:51:02 +0000191typedef int (*VADInitFunction)(void *VAD_inst);
bjornv@webrtc.orgf4b77fd2012-01-25 12:40:00 +0000192typedef int (*VADSetmodeFunction)(void *VAD_inst, int mode);
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000193typedef int (*VADFunction)(void *VAD_inst, int fs, int16_t *frame,
bjornv@webrtc.orgb38fca12012-06-19 11:03:32 +0000194 int frameLen);
niklase@google.com470e71d2011-07-07 08:21:25 +0000195
196/* Post-decode VAD instance (sub-instance of NETEQDSP_inst) */
197typedef struct PostDecodeVAD_t_
198{
199
200 void *VADState; /* pointer to a VAD instance */
201
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000202 int16_t VADEnabled; /* 1 if enabled, 0 if disabled */
bjornv@webrtc.orgf4b77fd2012-01-25 12:40:00 +0000203 int VADMode; /* mode parameter to pass to the VAD function */
bjornv@webrtc.orgb38fca12012-06-19 11:03:32 +0000204 int VADDecision; /* 1 for active, 0 for passive */
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000205 int16_t SIDintervalCounter; /* reset when decoding CNG/SID frame,
niklase@google.com470e71d2011-07-07 08:21:25 +0000206 increment for each recout call */
207
208 /* Function pointers */
209 VADInitFunction initFunction; /* VAD init function */
210 VADSetmodeFunction setmodeFunction; /* VAD setmode function */
211 VADFunction VADFunction; /* VAD function */
212
213} PostDecodeVAD_t;
214
215#endif /* NETEQ_VAD */
216
217#ifdef NETEQ_STEREO
218#define MAX_MS_DECODES 10
219
220typedef struct
221{
222 /* Stand-alone, master, or slave */
223 enum MasterSlaveMode msMode;
224
225 enum MasterSlaveExtraInfo extraInfo;
226
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000227 uint16_t instruction;
228 int16_t distLag;
229 int16_t corrLag;
230 int16_t bestIndex;
niklase@google.com470e71d2011-07-07 08:21:25 +0000231
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000232 uint32_t endTimestamp;
233 uint16_t samplesLeftWithOverlap;
niklase@google.com470e71d2011-07-07 08:21:25 +0000234
235} MasterSlaveInfo;
236#endif
237
238
239/* "Main" NetEQ DSP instance */
240typedef struct DSPInst_t_
241{
242
243 /* MCU/DSP Communication layer */
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000244 int16_t *pw16_readAddress;
245 int16_t *pw16_writeAddress;
niklase@google.com470e71d2011-07-07 08:21:25 +0000246 void *main_inst;
247
248 /* Output frame size in ms and samples */
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000249 int16_t millisecondsPerCall;
250 int16_t timestampsPerCall;
niklase@google.com470e71d2011-07-07 08:21:25 +0000251
252 /*
253 * Example of speech buffer
254 *
255 * -----------------------------------------------------------
256 * | History T-60 to T | Future |
257 * -----------------------------------------------------------
258 * ^ ^
259 * | |
260 * curPosition endPosition
261 *
262 * History is gradually shifted out to the left when inserting
263 * new data at the end.
264 */
265
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000266 int16_t speechBuffer[SPEECH_BUF_SIZE]; /* History/future speech buffer */
niklase@google.com470e71d2011-07-07 08:21:25 +0000267 int curPosition; /* Next sample to play */
268 int endPosition; /* Position that ends future data */
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000269 uint32_t endTimestamp; /* Timestamp value at end of future data */
270 uint32_t videoSyncTimestamp; /* (Estimated) timestamp of the last
niklase@google.com470e71d2011-07-07 08:21:25 +0000271 played sample (usually same as
272 endTimestamp-(endPosition-curPosition)
273 except during Expand and CNG) */
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000274 uint16_t fs; /* sample rate in Hz */
275 int16_t w16_frameLen; /* decoder frame length in samples */
276 int16_t w16_mode; /* operation used during last RecOut call */
277 int16_t w16_muteFactor; /* speech mute factor in Q14 */
278 int16_t *pw16_speechHistory; /* beginning of speech history during Expand */
279 int16_t w16_speechHistoryLen; /* 256 for NB and 512 for WB */
niklase@google.com470e71d2011-07-07 08:21:25 +0000280
281 /* random noise seed parameters */
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000282 int16_t w16_seedInc;
283 uint32_t uw16_seed;
niklase@google.com470e71d2011-07-07 08:21:25 +0000284
285 /* VQmon related variable */
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000286 int16_t w16_concealedTS;
niklase@google.com470e71d2011-07-07 08:21:25 +0000287
288 /*****************/
289 /* Sub-instances */
290 /*****************/
291
292 /* Decoder data */
293 CodecFuncInst_t codec_ptr_inst;
294
295#ifdef NETEQ_CNG_CODEC
296 /* CNG "decoder" instance */
297 CNG_dec_inst *CNG_Codec_inst;
298#endif /* NETEQ_CNG_CODEC */
299
300#ifdef NETEQ_ATEVENT_DECODE
301 /* DTMF generator instance */
302 dtmf_tone_inst_t DTMFInst;
303#endif /* NETEQ_CNG_CODEC */
304
305#ifdef NETEQ_VAD
306 /* Post-decode VAD instance */
307 PostDecodeVAD_t VADInst;
308#endif /* NETEQ_VAD */
309
310 /* Expand instance (defined above) */
311 ExpandInst_t ExpandInst;
312
313 /* Background noise instance (defined above) */
314 BGNInst_t BGNInst;
315
316 /* Internal statistics instance */
317 DSPStats_t statInst;
318
319#ifdef NETEQ_STEREO
320 /* Pointer to Master/Slave info */
321 MasterSlaveInfo *msInfo;
322#endif
323
324} DSPInst_t;
325
326
327/*************************/
328/* Function declarations */
329/*************************/
330
331/****************************************************************************
332 * WebRtcNetEQ_DSPInit(...)
333 *
334 * Initializes DSP side of NetEQ.
335 *
336 * Input:
337 * - inst : NetEq DSP instance
338 * - fs : Initial sample rate (may change when decoding data)
339 *
340 * Output:
341 * - inst : Updated instance
342 *
343 * Return value : 0 - ok
344 * : non-zero - error
345 */
346
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000347int WebRtcNetEQ_DSPInit(DSPInst_t *inst, uint16_t fs);
niklase@google.com470e71d2011-07-07 08:21:25 +0000348
349/****************************************************************************
350 * WebRtcNetEQ_AddressInit(...)
351 *
352 * Initializes the shared-memory communication on the DSP side.
353 *
354 * Input:
355 * - inst : NetEQ DSP instance
356 * - data2McuAddress : Pointer to memory where DSP writes / MCU reads
357 * - data2DspAddress : Pointer to memory where MCU writes / DSP reads
358 * - mainInst : NetEQ main instance
359 *
360 * Output:
361 * - inst : Updated instance
362 *
363 * Return value : 0 - ok
364 */
365
366int WebRtcNetEQ_AddressInit(DSPInst_t *inst, const void *data2McuAddress,
367 const void *data2DspAddress, const void *mainInst);
368
369/****************************************************************************
370 * WebRtcNetEQ_ClearInCallStats(...)
371 *
372 * Reset in-call statistics variables on DSP side.
373 *
374 * Input:
375 * - inst : NetEQ DSP instance
376 *
377 * Output:
378 * - inst : Updated instance
379 *
380 * Return value : 0 - ok
381 */
382
383int WebRtcNetEQ_ClearInCallStats(DSPInst_t *inst);
384
385/****************************************************************************
386 * WebRtcNetEQ_ClearPostCallStats(...)
387 *
388 * Reset post-call statistics variables on DSP side.
389 *
390 * Input:
391 * - inst : NetEQ DSP instance
392 *
393 * Output:
394 * - inst : Updated instance
395 *
396 * Return value : 0 - ok
397 */
398
399int WebRtcNetEQ_ClearPostCallStats(DSPInst_t *inst);
400
401/****************************************************************************
402 * WebRtcNetEQ_RecOutInternal(...)
403 *
404 * This function asks NetEQ for more speech/audio data.
405 *
406 * Input:
407 * - inst : NetEQ instance, i.e. the user that requests more
408 * speech/audio data.
409 * - outdata : Pointer to a memory space where the output data
410 * should be stored.
411 * - BGNonly : If non-zero, RecOut will only produce background
412 * noise. It will still draw packets from the packet
413 * buffer, but they will never be decoded.
414 *
415 * Output:
416 * - inst : Updated user information
417 * - len : Number of samples that were outputted from NetEq
418 *
419 * Return value : 0 - Ok
420 * -1 - Error
421 */
422
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000423int WebRtcNetEQ_RecOutInternal(DSPInst_t *inst, int16_t *pw16_outData, int16_t *pw16_len,
424 int16_t BGNonly);
niklase@google.com470e71d2011-07-07 08:21:25 +0000425
426/****************************************************************************
427 * WebRtcNetEQ_Normal(...)
428 *
429 * This function has the possibility to modify data that is played out in Normal
430 * mode, for example adjust the gain of the signal. The length of the signal
431 * can not be changed.
432 *
433 * Input:
434 * - inst : NetEQ DSP instance
435 * - scratchPtr : Pointer to scratch vector
436 * - decoded : Pointer to vector of new data from decoder
437 * - len : Number of input samples
438 *
439 * Output:
440 * - inst : Updated user information
441 * - pw16_len : Pointer to varibale where the number of samples
442 * produced will be written
443 *
444 * Return value : >=0 - Number of samples written to outData
445 * -1 - Error
446 */
447
448int WebRtcNetEQ_Normal(DSPInst_t *inst,
449#ifdef SCRATCH
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000450 int16_t *pw16_scratchPtr,
niklase@google.com470e71d2011-07-07 08:21:25 +0000451#endif
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000452 int16_t *pw16_decoded, int16_t len,
453 int16_t *pw16_outData, int16_t *pw16_len);
niklase@google.com470e71d2011-07-07 08:21:25 +0000454
455/****************************************************************************
456 * WebRtcNetEQ_Expand(...)
457 *
458 * This function produces one "chunk" of expansion data (PLC audio). The
459 * lenght of the produced audio depends on the speech history.
460 *
461 * Input:
462 * - inst : NetEQ DSP instance
463 * - scratchPtr : Pointer to scratch vector
464 * - BGNonly : If non-zero, Expand will only produce background
465 * noise.
466 * - pw16_len : Desired number of samples (only for BGN mode).
467 *
468 * Output:
469 * - inst : Updated user information
470 * - outdata : Pointer to a memory space where the output data
471 * should be stored
472 * - pw16_len : Number of samples that were outputted from NetEq
473 *
474 * Return value : 0 - Ok
475 * <0 - Error
476 */
477
478int WebRtcNetEQ_Expand(DSPInst_t *inst,
479#ifdef SCRATCH
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000480 int16_t *pw16_scratchPtr,
niklase@google.com470e71d2011-07-07 08:21:25 +0000481#endif
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000482 int16_t *pw16_outData, int16_t *pw16_len,
483 int16_t BGNonly);
niklase@google.com470e71d2011-07-07 08:21:25 +0000484
485/****************************************************************************
486 * WebRtcNetEQ_GenerateBGN(...)
487 *
488 * This function generates and writes len samples of background noise to the
489 * output vector. The Expand function will be called repeteadly until the
490 * correct number of samples is produced.
491 *
492 * Input:
493 * - inst : NetEQ DSP instance
494 * - scratchPtr : Pointer to scratch vector
495 * - len : Desired length of produced BGN.
496 *
497 *
498 * Output:
499 * - pw16_outData : Pointer to a memory space where the output data
500 * should be stored
501 *
502 * Return value : >=0 - Number of noise samples produced and written
503 * to output
504 * -1 - Error
505 */
506
507int WebRtcNetEQ_GenerateBGN(DSPInst_t *inst,
508#ifdef SCRATCH
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000509 int16_t *pw16_scratchPtr,
niklase@google.com470e71d2011-07-07 08:21:25 +0000510#endif
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000511 int16_t *pw16_outData, int16_t len);
niklase@google.com470e71d2011-07-07 08:21:25 +0000512
513/****************************************************************************
514 * WebRtcNetEQ_PreEmptiveExpand(...)
515 *
516 * This function tries to extend the audio data by repeating one or several
517 * pitch periods. The operation is only carried out if the correlation is
518 * strong or if the signal energy is very low. The algorithm is the
519 * reciprocal of the Accelerate algorithm.
520 *
521 * Input:
522 * - inst : NetEQ DSP instance
523 * - scratchPtr : Pointer to scratch vector.
524 * - decoded : Pointer to newly decoded speech.
525 * - len : Length of decoded speech.
526 * - oldDataLen : Length of the part of decoded that has already been played out.
527 * - BGNonly : If non-zero, Pre-emptive Expand will only copy
528 * the first DEFAULT_TIME_ADJUST seconds of the
529 * input and append to the end. No signal matching is
530 * done.
531 *
532 * Output:
533 * - inst : Updated instance
534 * - outData : Pointer to a memory space where the output data
535 * should be stored. The vector must be at least
536 * min(len + 120*fs/8000, NETEQ_MAX_OUTPUT_SIZE)
537 * elements long.
538 * - pw16_len : Number of samples written to outData.
539 *
540 * Return value : 0 - Ok
541 * <0 - Error
542 */
543
544int WebRtcNetEQ_PreEmptiveExpand(DSPInst_t *inst,
545#ifdef SCRATCH
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000546 int16_t *pw16_scratchPtr,
niklase@google.com470e71d2011-07-07 08:21:25 +0000547#endif
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000548 const int16_t *pw16_decoded, int len, int oldDataLen,
549 int16_t *pw16_outData, int16_t *pw16_len,
550 int16_t BGNonly);
niklase@google.com470e71d2011-07-07 08:21:25 +0000551
552/****************************************************************************
553 * WebRtcNetEQ_Accelerate(...)
554 *
555 * This function tries to shorten the audio data by removing one or several
556 * pitch periods. The operation is only carried out if the correlation is
557 * strong or if the signal energy is very low.
558 *
559 * Input:
560 * - inst : NetEQ DSP instance
561 * - scratchPtr : Pointer to scratch vector.
562 * - decoded : Pointer to newly decoded speech.
563 * - len : Length of decoded speech.
564 * - BGNonly : If non-zero, Accelerate will only remove the last
565 * DEFAULT_TIME_ADJUST seconds of the intput.
566 * No signal matching is done.
567 *
568 *
569 * Output:
570 * - inst : Updated instance
571 * - outData : Pointer to a memory space where the output data
572 * should be stored
573 * - pw16_len : Number of samples written to outData.
574 *
575 * Return value : 0 - Ok
576 * <0 - Error
577 */
578
579int WebRtcNetEQ_Accelerate(DSPInst_t *inst,
580#ifdef SCRATCH
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000581 int16_t *pw16_scratchPtr,
niklase@google.com470e71d2011-07-07 08:21:25 +0000582#endif
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000583 const int16_t *pw16_decoded, int len,
584 int16_t *pw16_outData, int16_t *pw16_len,
585 int16_t BGNonly);
niklase@google.com470e71d2011-07-07 08:21:25 +0000586
587/****************************************************************************
588 * WebRtcNetEQ_Merge(...)
589 *
590 * This function is used to merge new data from the decoder to the exisiting
591 * stream in the synchronization buffer. The merge operation is typically
592 * done after a packet loss, where the end of the expanded data does not
593 * fit naturally with the new decoded data.
594 *
595 * Input:
596 * - inst : NetEQ DSP instance
597 * - scratchPtr : Pointer to scratch vector.
598 * - decoded : Pointer to new decoded speech.
599 * - len : Number of samples in pw16_decoded.
600 *
601 *
602 * Output:
603 * - inst : Updated user information
604 * - outData : Pointer to a memory space where the output data
605 * should be stored
606 * - pw16_len : Number of samples written to pw16_outData
607 *
608 * Return value : 0 - Ok
609 * <0 - Error
610 */
611
612int WebRtcNetEQ_Merge(DSPInst_t *inst,
613#ifdef SCRATCH
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000614 int16_t *pw16_scratchPtr,
niklase@google.com470e71d2011-07-07 08:21:25 +0000615#endif
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000616 int16_t *pw16_decoded, int len, int16_t *pw16_outData,
617 int16_t *pw16_len);
niklase@google.com470e71d2011-07-07 08:21:25 +0000618
619/****************************************************************************
620 * WebRtcNetEQ_Cng(...)
621 *
622 * This function produces CNG according to RFC 3389
623 *
624 * Input:
625 * - inst : NetEQ DSP instance
626 * - len : Number of samples to produce
627 *
628 * Output:
629 * - pw16_outData : Output CNG
630 *
631 * Return value : 0 - Ok
632 * <0 - Error
633 */
634
635#ifdef NETEQ_CNG_CODEC
636/* Must compile NetEQ with CNG support to enable this function */
637
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000638int WebRtcNetEQ_Cng(DSPInst_t *inst, int16_t *pw16_outData, int len);
niklase@google.com470e71d2011-07-07 08:21:25 +0000639
640#endif /* NETEQ_CNG_CODEC */
641
642/****************************************************************************
643 * WebRtcNetEQ_BGNUpdate(...)
644 *
645 * This function updates the background noise parameter estimates.
646 *
647 * Input:
648 * - inst : NetEQ instance, where the speech history is stored.
649 * - scratchPtr : Pointer to scratch vector.
650 *
651 * Output:
652 * - inst : Updated information about the BGN characteristics.
653 *
654 * Return value : No return value
655 */
656
657void WebRtcNetEQ_BGNUpdate(
658#ifdef SCRATCH
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000659 DSPInst_t *inst, int16_t *pw16_scratchPtr
niklase@google.com470e71d2011-07-07 08:21:25 +0000660#else
661 DSPInst_t *inst
662#endif
663 );
664
665#ifdef NETEQ_VAD
666/* Functions used by post-decode VAD */
667
668/****************************************************************************
669 * WebRtcNetEQ_InitVAD(...)
670 *
671 * Initializes post-decode VAD instance.
672 *
673 * Input:
674 * - VADinst : PostDecodeVAD instance
675 * - fs : Initial sample rate
676 *
677 * Output:
678 * - VADinst : Updated instance
679 *
680 * Return value : 0 - Ok
681 * -1 - Error
682 */
683
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000684int WebRtcNetEQ_InitVAD(PostDecodeVAD_t *VADInst, uint16_t fs);
niklase@google.com470e71d2011-07-07 08:21:25 +0000685
686/****************************************************************************
687 * WebRtcNetEQ_SetVADModeInternal(...)
688 *
689 * Set the VAD mode in the VAD struct, and communicate it to the VAD instance
690 * if it exists.
691 *
692 * Input:
693 * - VADinst : PostDecodeVAD instance
694 * - mode : Mode number passed on to the VAD function
695 *
696 * Output:
697 * - VADinst : Updated instance
698 *
699 * Return value : 0 - Ok
700 * -1 - Error
701 */
702
bjornv@webrtc.orgf4b77fd2012-01-25 12:40:00 +0000703int WebRtcNetEQ_SetVADModeInternal(PostDecodeVAD_t *VADInst, int mode);
niklase@google.com470e71d2011-07-07 08:21:25 +0000704
705#endif /* NETEQ_VAD */
706
707/****************************************************************************
708 * WebRtcNetEQ_FlushSpeechBuffer(...)
709 *
710 * Flush the speech buffer.
711 *
712 * Input:
713 * - inst : NetEq DSP instance
714 *
715 * Output:
716 * - inst : Updated instance
717 *
718 * Return value : 0 - ok
719 * : non-zero - error
720 */
721
722int WebRtcNetEQ_FlushSpeechBuffer(DSPInst_t *inst);
723
724#ifndef WEBRTC_NETEQ_40BITACC_TEST
725
726#include "signal_processing_library.h"
727/* Map to regular SPL functions */
728#define WebRtcNetEQ_CrossCorr WebRtcSpl_CrossCorrelation
729#define WebRtcNetEQ_DotW16W16 WebRtcSpl_DotProductWithScale
730
731#else /* WEBRTC_NETEQ_40BITACC_TEST defined */
732/* Run NetEQ with simulated 40-bit accumulator to run bit-exact to a DSP
733 implementation where the main (splib and NetEQ) functions have been
734 40-bit optimized. */
735
736/* Map to special 40-bit optimized functions, defined below */
737#define WebRtcNetEQ_CrossCorr WebRtcNetEQ_40BitAccCrossCorr
738#define WebRtcNetEQ_DotW16W16 WebRtcNetEQ_40BitAccDotW16W16
739
740/****************************************************************************
741 * WebRtcNetEQ_40BitAccCrossCorr(...)
742 *
743 * Calculates the Cross correlation between two sequences seq1 and seq2. Seq1
744 * is fixed and seq2 slides as the pointer is increased with step
745 *
746 * Input:
747 * - seq1 : First sequence (fixed throughout the correlation)
748 * - seq2 : Second sequence (slided step_seq2 for each
749 * new correlation)
750 * - dimSeq : Number of samples to use in the cross correlation.
751 * Should be no larger than 1024 to avoid overflow.
752 * - dimCrossCorr : Number of CrossCorrelations to calculate (start
753 * position for seq2 is updated for each new one)
754 * - rShift : Number of right shifts to use
755 * - step_seq2 : How many (positive or negative) steps the seq2
756 * pointer should be updated for each new cross
757 * correlation value
758 *
759 * Output:
760 * - crossCorr : The cross correlation in Q-rShift
761 */
762
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000763void WebRtcNetEQ_40BitAccCrossCorr(int32_t *crossCorr, int16_t *seq1,
764 int16_t *seq2, int16_t dimSeq,
765 int16_t dimCrossCorr, int16_t rShift,
766 int16_t step_seq2);
niklase@google.com470e71d2011-07-07 08:21:25 +0000767
768/****************************************************************************
769 * WebRtcNetEQ_40BitAccDotW16W16(...)
770 *
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000771 * Calculates the dot product between two vectors (int16_t)
niklase@google.com470e71d2011-07-07 08:21:25 +0000772 *
773 * Input:
774 * - vector1 : Vector 1
775 * - vector2 : Vector 2
776 * - len : Number of samples in vector
777 * Should be no larger than 1024 to avoid overflow.
778 * - scaling : The number of right shifts (after multiplication)
779 * required to avoid overflow in the dot product.
780 * Return value : The dot product
781 */
782
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000783int32_t WebRtcNetEQ_40BitAccDotW16W16(int16_t *vector1, int16_t *vector2,
784 int len, int scaling);
niklase@google.com470e71d2011-07-07 08:21:25 +0000785
786#endif /* WEBRTC_NETEQ_40BITACC_TEST */
787
788#endif /* DSP_H */