RTPencode.cc revision 12dc1a38ca54a000e4fecfbc6d41138b895c9ca5
1470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/*
282e1c8d0e71a68a51797292d71b2f7533be47a85henrik.lundin@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
4470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  Use of this source code is governed by a BSD-style license
5470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  that can be found in the LICENSE file in the root of the source
6470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  tree. An additional intellectual property rights grant can be found
7470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  in the file PATENTS.  All contributing project authors may
8470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  be found in the AUTHORS file in the root of the source tree.
9470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
10470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
116c877363f7f229b3b3a9b8ad12fd7e4ace5789e4henrik.lundin@webrtc.org//TODO(hlundin): Reformat file to meet style guide.
126c877363f7f229b3b3a9b8ad12fd7e4ace5789e4henrik.lundin@webrtc.org
13470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/* header includes */
14470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#include "stdio.h"
1512dc1a38ca54a000e4fecfbc6d41138b895c9ca5pbos@webrtc.org#include "typedefs.h"
16470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#include "webrtc_neteq.h" // needed for enum WebRtcNetEQDecoder
1712dc1a38ca54a000e4fecfbc6d41138b895c9ca5pbos@webrtc.org#include <assert.h>
18470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#include <stdlib.h>
1912dc1a38ca54a000e4fecfbc6d41138b895c9ca5pbos@webrtc.org#include <string.h>
20470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
21470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef WIN32
22470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#include <winsock2.h>
23470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
24470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef WEBRTC_LINUX
25470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#include <netinet/in.h>
26470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
27470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
28470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
29470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/************************/
30470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/* Define payload types */
31470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/************************/
32470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
33470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#include "PayloadTypes.h"
34470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
35470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
36470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
37470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/*********************/
38470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/* Misc. definitions */
39470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/*********************/
40470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
41470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#define STOPSENDTIME 3000
42470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#define RESTARTSENDTIME 0 //162500
43470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#define FIRSTLINELEN 40
44470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#define CHECK_NOT_NULL(a) if((a)==0){printf("\n %s \n line: %d \nerror at %s\n",__FILE__,__LINE__,#a );return(-1);}
45470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
46470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com//#define MULTIPLE_SAME_TIMESTAMP
47470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#define REPEAT_PACKET_DISTANCE 17
48470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#define REPEAT_PACKET_COUNT 1  // number of extra packets to send
49470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
50470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com//#define INSERT_OLD_PACKETS
51470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#define OLD_PACKET 5 // how many seconds too old should the packet be?
52470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
53470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com//#define TIMESTAMP_WRAPAROUND
54470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
55470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com//#define RANDOM_DATA
56470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com//#define RANDOM_PAYLOAD_DATA
57470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#define RANDOM_SEED 10
58470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
59470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com//#define INSERT_DTMF_PACKETS
60470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com//#define NO_DTMF_OVERDUB
61470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#define DTMF_PACKET_INTERVAL 2000
62470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#define DTMF_DURATION 500
63470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
64470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#define STEREO_MODE_FRAME 0
65470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#define STEREO_MODE_SAMPLE_1 1 //1 octet per sample
66470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#define STEREO_MODE_SAMPLE_2 2 //2 octets per sample
67470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
68470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/*************************/
69470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/* Function declarations */
70470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/*************************/
71470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
72470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comvoid NetEQTest_GetCodec_and_PT(char * name, enum WebRtcNetEQDecoder *codec, int *PT, int frameLen, int *fs, int *bitrate, int *useRed);
73470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comint NetEQTest_init_coders(enum WebRtcNetEQDecoder coder, int enc_frameSize, int bitrate, int sampfreq , int vad, int numChannels);
74470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comvoid defineCodecs(enum WebRtcNetEQDecoder *usedCodec, int *noOfCodecs );
75470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comint NetEQTest_free_coders(enum WebRtcNetEQDecoder coder, int numChannels);
760946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.orgint NetEQTest_encode(int coder, int16_t *indata, int frameLen, unsigned char * encoded,int sampleRate , int * vad, int useVAD, int bitrate, int numChannels);
770946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.orgvoid makeRTPheader(unsigned char* rtp_data, int payloadType, int seqNo, uint32_t timestamp, uint32_t ssrc);
780946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.orgint makeRedundantHeader(unsigned char* rtp_data, int *payloadType, int numPayloads, uint32_t *timestamp, uint16_t *blockLen,
790946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org                        int seqNo, uint32_t ssrc);
80470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comint makeDTMFpayload(unsigned char* payload_data, int Event, int End, int Volume, int Duration);
810946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.orgvoid stereoDeInterleave(int16_t* audioSamples, int numSamples);
82470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comvoid stereoInterleave(unsigned char* data, int dataLen, int stride);
83470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
84470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/*********************/
85470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/* Codec definitions */
86470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/*********************/
87470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
88470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#include "webrtc_vad.h"
89470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
90470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#if ((defined CODEC_PCM16B)||(defined NETEQ_ARBITRARY_CODEC))
91470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	#include "pcm16b.h"
92470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
93470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G711
94470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	#include "g711_interface.h"
95470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
96470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G729
97470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	#include "G729Interface.h"
98470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
99470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G729_1
100470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	#include "G729_1Interface.h"
101470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
102470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_AMR
103470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	#include "AMRInterface.h"
104470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	#include "AMRCreation.h"
105470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
106470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_AMRWB
107470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	#include "AMRWBInterface.h"
108470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	#include "AMRWBCreation.h"
109470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
110470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_ILBC
111470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	#include "ilbc.h"
112470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
113b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org#if (defined CODEC_ISAC || defined CODEC_ISAC_SWB || defined CODEC_ISAC_FB)
114470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	#include "isac.h"
115470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
116470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef NETEQ_ISACFIX_CODEC
117470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	#include "isacfix.h"
118470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	#ifdef CODEC_ISAC
119470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		#error Cannot have both ISAC and ISACfix defined. Please de-select one in the beginning of RTPencode.cpp
120470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	#endif
121470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
122470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722
123470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	#include "g722_interface.h"
124470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
125470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1_24
126470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	#include "G722_1Interface.h"
127470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
128470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1_32
129470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	#include "G722_1Interface.h"
130470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
131470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1_16
132470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	#include "G722_1Interface.h"
133470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
134470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1C_24
135470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	#include "G722_1Interface.h"
136470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
137470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1C_32
138470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	#include "G722_1Interface.h"
139470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
140470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1C_48
141470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	#include "G722_1Interface.h"
142470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
143470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G726
144470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    #include "G726Creation.h"
145470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    #include "G726Interface.h"
146470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
147470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_GSMFR
148470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	#include "GSMFRInterface.h"
149470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	#include "GSMFRCreation.h"
150470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
151470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
152470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
153470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  #include "webrtc_cng.h"
154470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
155470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#if ((defined CODEC_SPEEX_8)||(defined CODEC_SPEEX_16))
156470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	#include "SpeexInterface.h"
157470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
158df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org#ifdef CODEC_CELT_32
159df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org#include "celt_interface.h"
160df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org#endif
161470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
162470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
163470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/***********************************/
164470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/* Global codec instance variables */
165470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/***********************************/
166470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
167470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comWebRtcVadInst *VAD_inst[2];
168470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
169470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722
170470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    G722EncInst *g722EncState[2];
171470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
172470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
173470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1_24
174470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	G722_1_24_encinst_t *G722_1_24enc_inst[2];
175470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
176470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1_32
177470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	G722_1_32_encinst_t *G722_1_32enc_inst[2];
178470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
179470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1_16
180470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	G722_1_16_encinst_t *G722_1_16enc_inst[2];
181470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
182470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1C_24
183470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	G722_1C_24_encinst_t *G722_1C_24enc_inst[2];
184470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
185470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1C_32
186470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	G722_1C_32_encinst_t *G722_1C_32enc_inst[2];
187470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
188470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1C_48
189470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	G722_1C_48_encinst_t *G722_1C_48enc_inst[2];
190470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
191470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G726
192470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    G726_encinst_t *G726enc_inst[2];
193470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
194470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G729
195470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	G729_encinst_t *G729enc_inst[2];
196470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
197470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G729_1
198470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	G729_1_inst_t *G729_1_inst[2];
199470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
200470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_AMR
201470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	AMR_encinst_t *AMRenc_inst[2];
2020946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org	int16_t		  AMR_bitrate;
203470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
204470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_AMRWB
205470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	AMRWB_encinst_t *AMRWBenc_inst[2];
2060946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org	int16_t		  AMRWB_bitrate;
207470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
208470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_ILBC
209470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	iLBC_encinst_t *iLBCenc_inst[2];
210470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
211470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_ISAC
212470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	ISACStruct *ISAC_inst[2];
213470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
214470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef NETEQ_ISACFIX_CODEC
215470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	ISACFIX_MainStruct *ISAC_inst[2];
216470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
217470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_ISAC_SWB
218470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	ISACStruct *ISACSWB_inst[2];
219470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
220b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org#ifdef CODEC_ISAC_FB
221b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org  ISACStruct *ISACFB_inst[2];
222b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org#endif
223470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_GSMFR
224470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	GSMFR_encinst_t *GSMFRenc_inst[2];
225470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
226470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
227470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
228470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	CNG_enc_inst *CNGenc_inst[2];
229470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
230470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_SPEEX_8
231470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	SPEEX_encinst_t *SPEEX8enc_inst[2];
232470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
233470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_SPEEX_16
234470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	SPEEX_encinst_t *SPEEX16enc_inst[2];
235470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
236df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org#ifdef CODEC_CELT_32
237df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org  CELT_encinst_t *CELT32enc_inst[2];
238df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org#endif
239470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G711
240470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    void *G711state[2]={NULL, NULL};
241470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
242470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
243470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
244470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comint main(int argc, char* argv[])
245470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
246470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	int packet_size, fs;
247470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	enum WebRtcNetEQDecoder usedCodec;
248470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	int payloadType;
249470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	int bitrate = 0;
250470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	int useVAD, vad;
251470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    int useRed=0;
252470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	int len, enc_len;
2530946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org	int16_t org_data[4000];
254470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	unsigned char rtp_data[8000];
2550946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org	int16_t seqNo=0xFFF;
2560946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org	uint32_t ssrc=1235412312;
2570946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org	uint32_t timestamp=0xAC1245;
2580946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org        uint16_t length, plen;
2590946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org	uint32_t offset;
260470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	double sendtime = 0;
26182e1c8d0e71a68a51797292d71b2f7533be47a85henrik.lundin@webrtc.org    int red_PT[2] = {0};
2620946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org    uint32_t red_TS[2] = {0};
2630946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org    uint16_t red_len[2] = {0};
264470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    int RTPheaderLen=12;
265470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	unsigned char red_data[8000];
266470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef INSERT_OLD_PACKETS
2670946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org	uint16_t old_length, old_plen;
268470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	int old_enc_len;
269470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	int first_old_packet=1;
270470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	unsigned char old_rtp_data[8000];
271470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	int packet_age=0;
272470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
273470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef INSERT_DTMF_PACKETS
274470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	int NTone = 1;
275470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	int DTMFfirst = 1;
2760946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org	uint32_t DTMFtimestamp;
277470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    bool dtmfSent = false;
278470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
279470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    bool usingStereo = false;
280543c3eaa46434a7e3974012c4d33ed82fc81fd33kjellander@webrtc.org    int stereoMode = 0;
281470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    int numChannels = 1;
282470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
283470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	/* check number of parameters */
284470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	if ((argc != 6) && (argc != 7)) {
285470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		/* print help text and exit */
286470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("Application to encode speech into an RTP stream.\n");
287470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("The program reads a PCM file and encodes is using the specified codec.\n");
288470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("The coded speech is packetized in RTP packest and written to the output file.\n");
289470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("The format of the RTP stream file is simlilar to that of rtpplay,\n");
290470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("but with the receive time euqal to 0 for all packets.\n");
291470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("Usage:\n\n");
292470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("%s PCMfile RTPfile frameLen codec useVAD bitrate\n", argv[0]);
293470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("where:\n");
294470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
295470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("PCMfile      : PCM speech input file\n\n");
296470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
297470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("RTPfile      : RTP stream output file\n\n");
298470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
299470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("frameLen     : 80...960...  Number of samples per packet (limit depends on codec)\n\n");
300470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
301470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("codecName\n");
302470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_PCM16B
303470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("             : pcm16b       16 bit PCM (8kHz)\n");
304470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
305470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_PCM16B_WB
306470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("             : pcm16b_wb   16 bit PCM (16kHz)\n");
307470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
308470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_PCM16B_32KHZ
309470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("             : pcm16b_swb32 16 bit PCM (32kHz)\n");
310470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
311470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_PCM16B_48KHZ
312470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("             : pcm16b_swb48 16 bit PCM (48kHz)\n");
313470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
314470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G711
315470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("             : pcma         g711 A-law (8kHz)\n");
316470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
317470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G711
318470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("             : pcmu         g711 u-law (8kHz)\n");
319470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
320470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G729
321470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("             : g729         G729 (8kHz and 8kbps) CELP (One-Three frame(s)/packet)\n");
322470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
323470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G729_1
324470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("             : g729.1       G729.1 (16kHz) variable rate (8--32 kbps)\n");
325470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
326470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1_16
327470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("             : g722.1_16    G722.1 coder (16kHz) (g722.1 with 16kbps)\n");
328470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
329470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1_24
330470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("             : g722.1_24    G722.1 coder (16kHz) (the 24kbps version)\n");
331470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
332470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1_32
333470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("             : g722.1_32    G722.1 coder (16kHz) (the 32kbps version)\n");
334470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
335470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1C_24
336470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("             : g722.1C_24    G722.1 C coder (32kHz) (the 24kbps version)\n");
337470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
338470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1C_32
339470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("             : g722.1C_32    G722.1 C coder (32kHz) (the 32kbps version)\n");
340470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
341470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1C_48
342470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("             : g722.1C_48    G722.1 C coder (32kHz) (the 48kbps)\n");
343470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
344470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
345470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G726
346470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        printf("             : g726_16      G726 coder (8kHz) 16kbps\n");
347470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        printf("             : g726_24      G726 coder (8kHz) 24kbps\n");
348470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        printf("             : g726_32      G726 coder (8kHz) 32kbps\n");
349470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        printf("             : g726_40      G726 coder (8kHz) 40kbps\n");
350470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
351470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_AMR
352470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("             : AMRXk        Adaptive Multi Rate CELP codec (8kHz)\n");
353470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("                            X = 4.75, 5.15, 5.9, 6.7, 7.4, 7.95, 10.2 or 12.2\n");
354470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
355470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_AMRWB
356470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("             : AMRwbXk      Adaptive Multi Rate Wideband CELP codec (16kHz)\n");
357470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("                            X = 7, 9, 12, 14, 16, 18, 20, 23 or 24\n");
358470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
359470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_ILBC
360470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("             : ilbc         iLBC codec (8kHz and 13.8kbps)\n");
361470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
362470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_ISAC
363470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("             : isac         iSAC (16kHz and 32.0 kbps). To set rate specify a rate parameter as last parameter\n");
364470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
365470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_ISAC_SWB
366470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("             : isacswb       iSAC SWB (32kHz and 32.0-52.0 kbps). To set rate specify a rate parameter as last parameter\n");
367470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
368b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org#ifdef CODEC_ISAC_FB
369b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org    printf("             : isacfb       iSAC FB (48kHz encoder 32kHz decoder and 32.0-52.0 kbps). To set rate specify a rate parameter as last parameter\n");
370b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org#endif
371470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_GSMFR
372470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("             : gsmfr        GSM FR codec (8kHz and 13kbps)\n");
373470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
374470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722
375470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("             : g722         g722 coder (16kHz) (the 64kbps version)\n");
376470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
377470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_SPEEX_8
378470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("             : speex8       speex coder (8 kHz)\n");
379470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
380470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_SPEEX_16
381470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("             : speex16      speex coder (16 kHz)\n");
382470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
383df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org#ifdef CODEC_CELT_32
384df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org    printf("             : celt32       celt coder (32 kHz)\n");
385df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org#endif
386470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_RED
387470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G711
388470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("             : red_pcm      Redundancy RTP packet with 2*G711A frames\n");
389470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
390470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_ISAC
391470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("             : red_isac     Redundancy RTP packet with 2*iSAC frames\n");
392470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
393470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
394470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        printf("\n");
395470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
396470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
397470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
398470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("useVAD       : 0 Voice Activity Detection is switched off\n");
399470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("             : 1 Voice Activity Detection is switched on\n\n");
400470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#else
401470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("useVAD       : 0 Voice Activity Detection switched off (on not supported)\n\n");
402470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
403470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("bitrate      : Codec bitrate in bps (only applies to vbr codecs)\n\n");
404470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
405470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		return(0);
406470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	}
407470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
4086c877363f7f229b3b3a9b8ad12fd7e4ace5789e4henrik.lundin@webrtc.org	FILE* in_file=fopen(argv[1],"rb");
409470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	CHECK_NOT_NULL(in_file);
410470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	printf("Input file: %s\n",argv[1]);
4116c877363f7f229b3b3a9b8ad12fd7e4ace5789e4henrik.lundin@webrtc.org	FILE* out_file=fopen(argv[2],"wb");
412470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	CHECK_NOT_NULL(out_file);
413470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	printf("Output file: %s\n\n",argv[2]);
414470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	packet_size=atoi(argv[3]);
415470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	CHECK_NOT_NULL(packet_size);
416470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	printf("Packet size: %i\n",packet_size);
417470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
418470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    // check for stereo
419470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    if(argv[4][strlen(argv[4])-1] == '*') {
420470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        // use stereo
421470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        usingStereo = true;
422470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        numChannels = 2;
423470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        argv[4][strlen(argv[4])-1] = '\0';
424470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
425470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
426470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	NetEQTest_GetCodec_and_PT(argv[4], &usedCodec, &payloadType, packet_size, &fs, &bitrate, &useRed);
427470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
428470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    if(useRed) {
429470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        RTPheaderLen = 12 + 4 + 1; /* standard RTP = 12; 4 bytes per redundant payload, except last one which is 1 byte */
430470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
431470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
432470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	useVAD=atoi(argv[5]);
433470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#if !(defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
434470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
435470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	if (useVAD!=0) {
436470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("Error: this simulation does not support VAD/DTX/CNG\n");
437470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	}
438470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
439470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
440470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    // check stereo type
441470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    if(usingStereo)
442470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    {
443470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        switch(usedCodec)
444470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        {
445470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            // sample based codecs
446470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderPCMu:
447470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderPCMa:
448470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderG722:
449470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            {
450470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                // 1 octet per sample
451470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                stereoMode = STEREO_MODE_SAMPLE_1;
452470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                break;
453470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
454470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderPCM16B:
455470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderPCM16Bwb:
456470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderPCM16Bswb32kHz:
457470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderPCM16Bswb48kHz:
458470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            {
459470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                // 2 octets per sample
460470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                stereoMode = STEREO_MODE_SAMPLE_2;
461470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                break;
462470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
463470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
464470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            // fixed-rate frame codecs (with internal VAD)
465470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderG729:
466470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            {
467470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                if(useVAD) {
468470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    printf("Cannot use codec-internal VAD and stereo\n");
469470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    exit(0);
470470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                }
471470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                // break intentionally omitted
472470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
473470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderG722_1_16:
474470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderG722_1_24:
475470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderG722_1_32:
476470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderG722_1C_24:
477470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderG722_1C_32:
478470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderG722_1C_48:
479470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            {
480470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                stereoMode = STEREO_MODE_FRAME;
481470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                break;
482470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
483470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        default:
484470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            {
485470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("Cannot use codec %s as stereo codec\n", argv[4]);
486470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
487470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
488470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
489470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
490470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
491b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org    if ((usedCodec == kDecoderISAC) || (usedCodec == kDecoderISACswb) ||
492b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org        (usedCodec == kDecoderISACfb))
493470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    {
494470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if (argc != 7)
495470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        {
496470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if (usedCodec == kDecoderISAC)
497470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            {
498470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                bitrate = 32000;
499470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf(
500470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    "Running iSAC at default bitrate of 32000 bps (to specify explicitly add the bps as last parameter)\n");
501470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
502b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org            else // usedCodec == kDecoderISACswb || usedCodec == kDecoderISACfb
503470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            {
504470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                bitrate = 56000;
505470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf(
506470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    "Running iSAC at default bitrate of 56000 bps (to specify explicitly add the bps as last parameter)\n");
507470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
508470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
509470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        else
510470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        {
511470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            bitrate = atoi(argv[6]);
512470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if (usedCodec == kDecoderISAC)
513470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            {
514470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                if ((bitrate < 10000) || (bitrate > 32000))
515470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                {
516470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    printf(
517470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                        "Error: iSAC bitrate must be between 10000 and 32000 bps (%i is invalid)\n",
518470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                        bitrate);
519470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    exit(0);
520470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                }
521470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("Running iSAC at bitrate of %i bps\n", bitrate);
522470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
523b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org            else // usedCodec == kDecoderISACswb || usedCodec == kDecoderISACfb
524470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            {
525470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                if ((bitrate < 32000) || (bitrate > 56000))
526470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                {
527470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    printf(
528b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org                        "Error: iSAC SWB/FB bitrate must be between 32000 and 56000 bps (%i is invalid)\n",
529470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                        bitrate);
530470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    exit(0);
531470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                }
532470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
533470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
534470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
535470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    else
536470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    {
537470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if (argc == 7)
538470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        {
539470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            printf(
540470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                "Error: Bitrate parameter can only be specified for iSAC, G.723, and G.729.1\n");
541470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            exit(0);
542470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
543470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
544470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
545470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    if(useRed) {
546470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        printf("Redundancy engaged. ");
547470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
548470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	printf("Used codec: %i\n",usedCodec);
549470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	printf("Payload type: %i\n",payloadType);
550470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
551470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	NetEQTest_init_coders(usedCodec, packet_size, bitrate, fs, useVAD, numChannels);
552470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
553470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	/* write file header */
554470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	//fprintf(out_file, "#!RTPencode%s\n", "1.0");
555470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	fprintf(out_file, "#!rtpplay%s \n", "1.0"); // this is the string that rtpplay needs
5560946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org	uint32_t dummy_variable = 0; // should be converted to network endian format, but does not matter when 0
557354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org        if (fwrite(&dummy_variable, 4, 1, out_file) != 1) {
558354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org          return -1;
559354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org        }
560354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org        if (fwrite(&dummy_variable, 4, 1, out_file) != 1) {
561354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org          return -1;
562354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org        }
563354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org        if (fwrite(&dummy_variable, 4, 1, out_file) != 1) {
564354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org          return -1;
565354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org        }
566354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org        if (fwrite(&dummy_variable, 2, 1, out_file) != 1) {
567354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org          return -1;
568354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org        }
569354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org        if (fwrite(&dummy_variable, 2, 1, out_file) != 1) {
570354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org          return -1;
571354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org        }
572470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
573470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef TIMESTAMP_WRAPAROUND
574470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	timestamp = 0xFFFFFFFF - fs*10; /* should give wrap-around in 10 seconds */
575470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
576470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#if defined(RANDOM_DATA) | defined(RANDOM_PAYLOAD_DATA)
577470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	srand(RANDOM_SEED);
578470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
579470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
580470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /* if redundancy is used, the first redundant payload is zero length */
581470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    red_len[0] = 0;
582470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
583470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	/* read first frame */
584470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	len=fread(org_data,2,packet_size * numChannels,in_file) / numChannels;
585470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
586470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /* de-interleave if stereo */
587470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    if ( usingStereo )
588470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    {
589470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        stereoDeInterleave(org_data, len * numChannels);
590470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
591470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
592470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	while (len==packet_size) {
593470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
594470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef INSERT_DTMF_PACKETS
595470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        dtmfSent = false;
596470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
597470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if ( sendtime >= NTone * DTMF_PACKET_INTERVAL ) {
598470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if ( sendtime < NTone * DTMF_PACKET_INTERVAL + DTMF_DURATION ) {
599470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                // tone has not ended
600470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                if (DTMFfirst==1) {
601470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    DTMFtimestamp = timestamp; // save this timestamp
602470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    DTMFfirst=0;
603470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                }
604470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                makeRTPheader(rtp_data, NETEQ_CODEC_AVT_PT, seqNo,DTMFtimestamp, ssrc);
605470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                enc_len = makeDTMFpayload(&rtp_data[12], NTone % 12, 0, 4, (int) (sendtime - NTone * DTMF_PACKET_INTERVAL)*(fs/1000) + len);
606470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
607470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            else {
608470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                // tone has ended
609470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                makeRTPheader(rtp_data, NETEQ_CODEC_AVT_PT, seqNo,DTMFtimestamp, ssrc);
610470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                enc_len = makeDTMFpayload(&rtp_data[12], NTone % 12, 1, 4, DTMF_DURATION*(fs/1000));
611470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                NTone++;
612470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                DTMFfirst=1;
613470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
614470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
615470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            /* write RTP packet to file */
616470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            length = htons(12 + enc_len + 8);
617470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            plen = htons(12 + enc_len);
6180946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org            offset = (uint32_t) sendtime; //(timestamp/(fs/1000));
619470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            offset = htonl(offset);
620354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org            if (fwrite(&length, 2, 1, out_file) != 1) {
621354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org              return -1;
622354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org            }
623354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org            if (fwrite(&plen, 2, 1, out_file) != 1) {
624354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org              return -1;
625354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org            }
626354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org            if (fwrite(&offset, 4, 1, out_file) != 1) {
627354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org              return -1;
628354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org            }
629354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org            if (fwrite(rtp_data, 12 + enc_len, 1, out_file) != 1) {
630354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org              return -1;
631354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org            }
632470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
633470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            dtmfSent = true;
634470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
635470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
636470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
637470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef NO_DTMF_OVERDUB
638470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        /* If DTMF is sent, we should not send any speech packets during the same time */
639470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if (dtmfSent) {
640470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            enc_len = 0;
641470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
642470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        else {
643470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
644470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		/* encode frame */
645470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		enc_len=NetEQTest_encode(usedCodec, org_data, packet_size, &rtp_data[12] ,fs,&vad, useVAD, bitrate, numChannels);
646470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		if (enc_len==-1) {
647470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			printf("Error encoding frame\n");
648470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			exit(0);
649470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		}
650470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
651470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if ( usingStereo &&
652470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            stereoMode != STEREO_MODE_FRAME &&
653470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            vad == 1 )
654470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        {
655470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            // interleave the encoded payload for sample-based codecs (not for CNG)
656470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            stereoInterleave(&rtp_data[12], enc_len, stereoMode);
657470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
658470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef NO_DTMF_OVERDUB
659470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
660470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
661470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
662470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		if (enc_len > 0 && (sendtime <= STOPSENDTIME || sendtime > RESTARTSENDTIME)) {
663470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if(useRed) {
664470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                if(red_len[0] > 0) {
665470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    memmove(&rtp_data[RTPheaderLen+red_len[0]], &rtp_data[12], enc_len);
666470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    memcpy(&rtp_data[RTPheaderLen], red_data, red_len[0]);
667470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
668470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    red_len[1] = enc_len;
669470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    red_TS[1] = timestamp;
670470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    if(vad)
671470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                        red_PT[1] = payloadType;
672470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    else
673470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                        red_PT[1] = NETEQ_CODEC_CN_PT;
674470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
675470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    makeRedundantHeader(rtp_data, red_PT, 2, red_TS, red_len, seqNo++, ssrc);
676470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
677470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
678470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    enc_len += red_len[0] + RTPheaderLen - 12;
679470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                }
680470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                else { // do not use redundancy payload for this packet, i.e., only last payload
681470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    memmove(&rtp_data[RTPheaderLen-4], &rtp_data[12], enc_len);
682470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    //memcpy(&rtp_data[RTPheaderLen], red_data, red_len[0]);
683470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
684470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    red_len[1] = enc_len;
685470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    red_TS[1] = timestamp;
686470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    if(vad)
687470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                        red_PT[1] = payloadType;
688470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    else
689470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                        red_PT[1] = NETEQ_CODEC_CN_PT;
690470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
691470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    makeRedundantHeader(rtp_data, red_PT, 2, red_TS, red_len, seqNo++, ssrc);
692470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
693470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
694470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    enc_len += red_len[0] + RTPheaderLen - 4 - 12; // 4 is length of redundancy header (not used)
695470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                }
696470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
697470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            else {
698470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
699470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                /* make RTP header */
700470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                if (vad) // regular speech data
701470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    makeRTPheader(rtp_data, payloadType, seqNo++,timestamp, ssrc);
702470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                else // CNG data
703470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    makeRTPheader(rtp_data, NETEQ_CODEC_CN_PT, seqNo++,timestamp, ssrc);
704470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
705470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
706470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef MULTIPLE_SAME_TIMESTAMP
707470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			int mult_pack=0;
708470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			do {
709470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif //MULTIPLE_SAME_TIMESTAMP
710470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			/* write RTP packet to file */
711354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org                          length = htons(12 + enc_len + 8);
712354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org                          plen = htons(12 + enc_len);
7130946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org                          offset = (uint32_t) sendtime;
714354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org                          //(timestamp/(fs/1000));
715354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org                          offset = htonl(offset);
716354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org                          if (fwrite(&length, 2, 1, out_file) != 1) {
717354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org                            return -1;
718354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org                          }
719354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org                          if (fwrite(&plen, 2, 1, out_file) != 1) {
720354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org                            return -1;
721354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org                          }
722354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org                          if (fwrite(&offset, 4, 1, out_file) != 1) {
723354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org                            return -1;
724354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org                          }
725470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef RANDOM_DATA
726470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			for (int k=0; k<12+enc_len; k++) {
727470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com				rtp_data[k] = rand() + rand();
728470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			}
729470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
730470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef RANDOM_PAYLOAD_DATA
731470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			for (int k=12; k<12+enc_len; k++) {
732470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com				rtp_data[k] = rand() + rand();
733470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			}
734470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
735354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org                        if (fwrite(rtp_data, 12 + enc_len, 1, out_file) != 1) {
736354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org                          return -1;
737354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org                        }
738470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef MULTIPLE_SAME_TIMESTAMP
739470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			} while ( (seqNo%REPEAT_PACKET_DISTANCE == 0) && (mult_pack++ < REPEAT_PACKET_COUNT) );
740470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif //MULTIPLE_SAME_TIMESTAMP
741470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
742470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef INSERT_OLD_PACKETS
743470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			if (packet_age >= OLD_PACKET*fs) {
744470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com				if (!first_old_packet) {
745354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org                                  // send the old packet
746354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org                                  if (fwrite(&old_length, 2, 1,
747354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org                                             out_file) != 1) {
748354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org                                    return -1;
749354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org                                  }
750354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org                                  if (fwrite(&old_plen, 2, 1,
751354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org                                             out_file) != 1) {
752354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org                                    return -1;
753354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org                                  }
754354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org                                  if (fwrite(&offset, 4, 1,
755354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org                                             out_file) != 1) {
756354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org                                    return -1;
757354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org                                  }
758354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org                                  if (fwrite(old_rtp_data, 12 + old_enc_len,
759354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org                                             1, out_file) != 1) {
760354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org                                    return -1;
761354b0ed015aca4122020399af4ac1a0f0f43338aleozwang@webrtc.org                                  }
762470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com				}
763470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com				// store current packet as old
764470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com				old_length=length;
765470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com				old_plen=plen;
766470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com				memcpy(old_rtp_data,rtp_data,12+enc_len);
767470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com				old_enc_len=enc_len;
768470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com				first_old_packet=0;
769470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com				packet_age=0;
770470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
771470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			}
772470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			packet_age += packet_size;
773470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
774470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
775470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if(useRed) {
776470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                /* move data to redundancy store */
777470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_ISAC
778470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                if(usedCodec==kDecoderISAC)
779470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                {
780470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    assert(!usingStereo); // Cannot handle stereo yet
7810946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org                    red_len[0] = WebRtcIsac_GetRedPayload(ISAC_inst[0], (int16_t*)red_data);
782470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                }
783470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                else
784470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                {
785470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
786470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    memcpy(red_data, &rtp_data[RTPheaderLen+red_len[0]], enc_len);
787470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    red_len[0]=red_len[1];
788470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_ISAC
789470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                }
790470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
791470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                red_TS[0]=red_TS[1];
792470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                red_PT[0]=red_PT[1];
793470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
794470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
795470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		}
796470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
797470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		/* read next frame */
798470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        len=fread(org_data,2,packet_size * numChannels,in_file) / numChannels;
799470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        /* de-interleave if stereo */
800470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if ( usingStereo )
801470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        {
802470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            stereoDeInterleave(org_data, len * numChannels);
803470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
804470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
80513ac430bef5ae8dd66d26708bcf0962a5f314849tina.legrand@webrtc.org        if (payloadType==NETEQ_CODEC_G722_PT)
80613ac430bef5ae8dd66d26708bcf0962a5f314849tina.legrand@webrtc.org            timestamp+=len>>1;
80713ac430bef5ae8dd66d26708bcf0962a5f314849tina.legrand@webrtc.org        else
80813ac430bef5ae8dd66d26708bcf0962a5f314849tina.legrand@webrtc.org            timestamp+=len;
809470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
810470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		sendtime += (double) len/(fs/1000);
811470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	}
812470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
813470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	NetEQTest_free_coders(usedCodec, numChannels);
814470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	fclose(in_file);
815470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	fclose(out_file);
816470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    printf("Done!\n");
817470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
818470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	return(0);
819470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
820470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
821470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
822470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
823470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
824470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/****************/
825470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/* Subfunctions */
826470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/****************/
827470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
828470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comvoid NetEQTest_GetCodec_and_PT(char * name, enum WebRtcNetEQDecoder *codec, int *PT, int frameLen, int *fs, int *bitrate, int *useRed) {
829470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
830470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	*bitrate = 0; /* Default bitrate setting */
831470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    *useRed = 0; /* Default no redundancy */
832470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
833470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	if(!strcmp(name,"pcmu")){
834470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*codec=kDecoderPCMu;
835470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*PT=NETEQ_CODEC_PCMU_PT;
836470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*fs=8000;
837470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	}
838470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	else if(!strcmp(name,"pcma")){
839470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*codec=kDecoderPCMa;
840470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*PT=NETEQ_CODEC_PCMA_PT;
841470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*fs=8000;
842470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	}
843470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	else if(!strcmp(name,"pcm16b")){
844470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*codec=kDecoderPCM16B;
845470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*PT=NETEQ_CODEC_PCM16B_PT;
846470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*fs=8000;
847470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	}
848470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	else if(!strcmp(name,"pcm16b_wb")){
849470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*codec=kDecoderPCM16Bwb;
850470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*PT=NETEQ_CODEC_PCM16B_WB_PT;
851470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*fs=16000;
852470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	}
853470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	else if(!strcmp(name,"pcm16b_swb32")){
854470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*codec=kDecoderPCM16Bswb32kHz;
855470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*PT=NETEQ_CODEC_PCM16B_SWB32KHZ_PT;
856470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*fs=32000;
857470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	}
858470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	else if(!strcmp(name,"pcm16b_swb48")){
859470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*codec=kDecoderPCM16Bswb48kHz;
860470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*PT=NETEQ_CODEC_PCM16B_SWB48KHZ_PT;
861470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*fs=48000;
862470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	}
863470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	else if(!strcmp(name,"g722")){
864470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*codec=kDecoderG722;
865470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*PT=NETEQ_CODEC_G722_PT;
866470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*fs=16000;
867470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	}
868470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	else if(!strcmp(name,"g722.1_16")){
869470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*codec=kDecoderG722_1_16;
870470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*PT=NETEQ_CODEC_G722_1_16_PT;
871470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*fs=16000;
872470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	}
873470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	else if(!strcmp(name,"g722.1_24")){
874470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*codec=kDecoderG722_1_24;
875470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*PT=NETEQ_CODEC_G722_1_24_PT;
876470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*fs=16000;
877470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	}
878470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	else if(!strcmp(name,"g722.1_32")){
879470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*codec=kDecoderG722_1_32;
880470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*PT=NETEQ_CODEC_G722_1_32_PT;
881470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*fs=16000;
882470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	}
883470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	else if(!strcmp(name,"g722.1C_24")){
884470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*codec=kDecoderG722_1C_24;
885470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*PT=NETEQ_CODEC_G722_1C_24_PT;
886470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*fs=32000;
887470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	}
888470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	else if(!strcmp(name,"g722.1C_32")){
889470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*codec=kDecoderG722_1C_32;
890470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*PT=NETEQ_CODEC_G722_1C_32_PT;
891470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*fs=32000;
892470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	}
893470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    else if(!strcmp(name,"g722.1C_48")){
894470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*codec=kDecoderG722_1C_48;
895470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*PT=NETEQ_CODEC_G722_1C_48_PT;
896470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*fs=32000;
897470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	}
898470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    else if(!strcmp(name,"g726_16")){
899470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        *fs=8000;
900470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        *codec=kDecoderG726_16;
901470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        *PT=NETEQ_CODEC_G726_16_PT;
902470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        *bitrate=16;
903470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
904470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    else if(!strcmp(name,"g726_24")){
905470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        *fs=8000;
906470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        *codec=kDecoderG726_24;
907470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        *PT=NETEQ_CODEC_G726_24_PT;
908470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        *bitrate=24;
909470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
910470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    else if(!strcmp(name,"g726_32")){
911470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        *fs=8000;
912470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        *codec=kDecoderG726_32;
913470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        *PT=NETEQ_CODEC_G726_32_PT;
914470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        *bitrate=32;
915470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
916470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    else if(!strcmp(name,"g726_40")){
917470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        *fs=8000;
918470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        *codec=kDecoderG726_40;
919470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        *PT=NETEQ_CODEC_G726_40_PT;
920470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        *bitrate=40;
921470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
922470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	else if((!strcmp(name,"amr4.75k"))||(!strcmp(name,"amr5.15k"))||(!strcmp(name,"amr5.9k"))||
923470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			(!strcmp(name,"amr6.7k"))||(!strcmp(name,"amr7.4k"))||(!strcmp(name,"amr7.95k"))||
924470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			(!strcmp(name,"amr10.2k"))||(!strcmp(name,"amr12.2k"))) {
925470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*fs=8000;
926470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		if (!strcmp(name,"amr4.75k"))
927470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			*bitrate = 0;
928470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		if (!strcmp(name,"amr5.15k"))
929470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			*bitrate = 1;
930470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		if (!strcmp(name,"amr5.9k"))
931470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			*bitrate = 2;
932470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		if (!strcmp(name,"amr6.7k"))
933470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			*bitrate = 3;
934470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		if (!strcmp(name,"amr7.4k"))
935470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			*bitrate = 4;
936470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		if (!strcmp(name,"amr7.95k"))
937470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			*bitrate = 5;
938470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		if (!strcmp(name,"amr10.2k"))
939470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			*bitrate = 6;
940470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		if (!strcmp(name,"amr12.2k"))
941470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			*bitrate = 7;
942470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*codec=kDecoderAMR;
943470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*PT=NETEQ_CODEC_AMR_PT;
944470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	}
945470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	else if((!strcmp(name,"amrwb7k"))||(!strcmp(name,"amrwb9k"))||(!strcmp(name,"amrwb12k"))||
946470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			(!strcmp(name,"amrwb14k"))||(!strcmp(name,"amrwb16k"))||(!strcmp(name,"amrwb18k"))||
947470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			(!strcmp(name,"amrwb20k"))||(!strcmp(name,"amrwb23k"))||(!strcmp(name,"amrwb24k"))) {
948470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*fs=16000;
949470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		if (!strcmp(name,"amrwb7k"))
950470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			*bitrate = 7000;
951470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		if (!strcmp(name,"amrwb9k"))
952470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			*bitrate = 9000;
953470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		if (!strcmp(name,"amrwb12k"))
954470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			*bitrate = 12000;
955470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		if (!strcmp(name,"amrwb14k"))
956470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			*bitrate = 14000;
957470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		if (!strcmp(name,"amrwb16k"))
958470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			*bitrate = 16000;
959470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		if (!strcmp(name,"amrwb18k"))
960470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			*bitrate = 18000;
961470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		if (!strcmp(name,"amrwb20k"))
962470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			*bitrate = 20000;
963470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		if (!strcmp(name,"amrwb23k"))
964470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			*bitrate = 23000;
965470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		if (!strcmp(name,"amrwb24k"))
966470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			*bitrate = 24000;
967470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*codec=kDecoderAMRWB;
968470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*PT=NETEQ_CODEC_AMRWB_PT;
969470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	}
970470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	else if((!strcmp(name,"ilbc"))&&((frameLen%240==0)||(frameLen%160==0))){
971470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*fs=8000;
972470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*codec=kDecoderILBC;
973470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*PT=NETEQ_CODEC_ILBC_PT;
974470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	}
975470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	else if(!strcmp(name,"isac")){
976470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*fs=16000;
977470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*codec=kDecoderISAC;
978470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*PT=NETEQ_CODEC_ISAC_PT;
979470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	}
980b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org  else if(!strcmp(name,"isacswb")){
981b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org    *fs=32000;
982b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org    *codec=kDecoderISACswb;
983b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org    *PT=NETEQ_CODEC_ISACSWB_PT;
984470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	}
985b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org  else if(!strcmp(name,"isacfb")){
986b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org    *fs=48000;
987b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org    *codec=kDecoderISACfb;
988b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org    *PT=NETEQ_CODEC_ISACFB_PT;
989b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org  }
990470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	else if(!strcmp(name,"g729")){
991470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*fs=8000;
992470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*codec=kDecoderG729;
993470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*PT=NETEQ_CODEC_G729_PT;
994470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	}
995470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	else if(!strcmp(name,"g729.1")){
996470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*fs=16000;
997470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*codec=kDecoderG729_1;
998470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*PT=NETEQ_CODEC_G729_1_PT;
999470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	}
1000470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	else if(!strcmp(name,"gsmfr")){
1001470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*fs=8000;
1002470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*codec=kDecoderGSMFR;
1003470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*PT=NETEQ_CODEC_GSMFR_PT;
1004470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	}
1005470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	else if(!strcmp(name,"speex8")){
1006470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*fs=8000;
1007470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*codec=kDecoderSPEEX_8;
1008470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*PT=NETEQ_CODEC_SPEEX8_PT;
1009470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	}
1010470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	else if(!strcmp(name,"speex16")){
1011470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*fs=16000;
1012470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*codec=kDecoderSPEEX_16;
1013470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*PT=NETEQ_CODEC_SPEEX16_PT;
1014470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	}
1015df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org  else if(!strcmp(name,"celt32")){
1016df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org    *fs=32000;
1017df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org    *codec=kDecoderCELT_32;
1018df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org    *PT=NETEQ_CODEC_CELT32_PT;
1019df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org  }
1020470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    else if(!strcmp(name,"red_pcm")){
1021470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*codec=kDecoderPCMa;
1022470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*PT=NETEQ_CODEC_PCMA_PT; /* this will be the PT for the sub-headers */
1023470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*fs=8000;
1024470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        *useRed = 1;
1025470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	} else if(!strcmp(name,"red_isac")){
1026470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*codec=kDecoderISAC;
1027470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*PT=NETEQ_CODEC_ISAC_PT; /* this will be the PT for the sub-headers */
1028470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		*fs=16000;
1029470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        *useRed = 1;
1030470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    } else {
1031470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		printf("Error: Not a supported codec (%s)\n", name);
1032470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		exit(0);
1033470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	}
1034470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1035470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
1036470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1037470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1038470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1039470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1040470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comint NetEQTest_init_coders(enum WebRtcNetEQDecoder coder, int enc_frameSize, int bitrate, int sampfreq , int vad, int numChannels){
1041470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1042470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	int ok=0;
1043470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1044470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    for (int k = 0; k < numChannels; k++)
1045470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    {
1046470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        ok=WebRtcVad_Create(&VAD_inst[k]);
1047470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if (ok!=0) {
1048470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            printf("Error: Couldn't allocate memory for VAD instance\n");
1049470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            exit(0);
1050470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1051470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        ok=WebRtcVad_Init(VAD_inst[k]);
1052470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if (ok==-1) {
1053470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            printf("Error: Initialization of VAD struct failed\n");
1054470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            exit(0);
1055470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1056470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1057470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1058470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
1059470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
1060470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        ok=WebRtcCng_CreateEnc(&CNGenc_inst[k]);
1061470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if (ok!=0) {
1062470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            printf("Error: Couldn't allocate memory for CNG encoding instance\n");
1063470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            exit(0);
1064470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1065470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if(sampfreq <= 16000) {
1066470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            ok=WebRtcCng_InitEnc(CNGenc_inst[k],sampfreq, 200, 5);
1067470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if (ok==-1) {
1068470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("Error: Initialization of CNG struct failed. Error code %d\n",
1069470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    WebRtcCng_GetErrorCodeEnc(CNGenc_inst[k]));
1070470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1071470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1072470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1073470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1074470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1075470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        switch (coder) {
1076470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    case kDecoderReservedStart : // dummy codec
1077470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_PCM16B
1078470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    case kDecoderPCM16B :
1079470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1080470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_PCM16B_WB
1081470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    case kDecoderPCM16Bwb :
1082470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1083470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_PCM16B_32KHZ
1084470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    case kDecoderPCM16Bswb32kHz :
1085470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1086470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_PCM16B_48KHZ
1087470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    case kDecoderPCM16Bswb48kHz :
1088470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1089470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G711
1090470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    case kDecoderPCMu :
1091470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    case kDecoderPCMa :
1092470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1093470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        // do nothing
1094470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        break;
1095470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G729
1096470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    case kDecoderG729:
1097470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if (sampfreq==8000) {
1098470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if ((enc_frameSize==80)||(enc_frameSize==160)||(enc_frameSize==240)||(enc_frameSize==320)||(enc_frameSize==400)||(enc_frameSize==480)) {
1099470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                ok=WebRtcG729_CreateEnc(&G729enc_inst[k]);
1100470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                if (ok!=0) {
1101470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    printf("Error: Couldn't allocate memory for G729 encoding instance\n");
1102470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    exit(0);
1103470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                }
1104470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            } else {
1105470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("\nError: g729 only supports 10, 20, 30, 40, 50 or 60 ms!!\n\n");
1106470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1107470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1108470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcG729_EncoderInit(G729enc_inst[k], vad);
1109470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if ((vad==1)&&(enc_frameSize!=80)) {
1110470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("\nError - This simulation only supports VAD for G729 at 10ms packets (not %dms)\n", (enc_frameSize>>3));
1111470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1112470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        } else {
1113470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            printf("\nError - g729 is only developed for 8kHz \n");
1114470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            exit(0);
1115470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1116470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        break;
1117470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1118470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G729_1
1119470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    case kDecoderG729_1:
1120470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if (sampfreq==16000) {
1121470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if ((enc_frameSize==320)||(enc_frameSize==640)||(enc_frameSize==960)
1122470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                ) {
1123470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    ok=WebRtcG7291_Create(&G729_1_inst[k]);
1124470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    if (ok!=0) {
1125470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                        printf("Error: Couldn't allocate memory for G.729.1 codec instance\n");
1126470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                        exit(0);
1127470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    }
1128470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                } else {
1129470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    printf("\nError: G.729.1 only supports 20, 40 or 60 ms!!\n\n");
1130470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    exit(0);
1131470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                }
1132470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                if (!(((bitrate >= 12000) && (bitrate <= 32000) && (bitrate%2000 == 0)) || (bitrate == 8000))) {
1133470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    /* must be 8, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, or 32 kbps */
1134470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    printf("\nError: G.729.1 bitrate must be 8000 or 12000--32000 in steps of 2000 bps\n");
1135470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    exit(0);
1136470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                }
1137470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                WebRtcG7291_EncoderInit(G729_1_inst[k], bitrate, 0 /* flag8kHz*/, 0 /*flagG729mode*/);
1138470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        } else {
1139470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            printf("\nError - G.729.1 input is always 16 kHz \n");
1140470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            exit(0);
1141470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1142470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        break;
1143470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1144470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_SPEEX_8
1145470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    case kDecoderSPEEX_8 :
1146470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if (sampfreq==8000) {
1147470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if ((enc_frameSize==160)||(enc_frameSize==320)||(enc_frameSize==480)) {
1148470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                ok=WebRtcSpeex_CreateEnc(&SPEEX8enc_inst[k], sampfreq);
1149470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                if (ok!=0) {
1150470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    printf("Error: Couldn't allocate memory for Speex encoding instance\n");
1151470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    exit(0);
1152470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                }
1153470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            } else {
1154470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("\nError: Speex only supports 20, 40, and 60 ms!!\n\n");
1155470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1156470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1157470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if ((vad==1)&&(enc_frameSize!=160)) {
1158470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("\nError - This simulation only supports VAD for Speex at 20ms packets (not %dms)\n", (enc_frameSize>>3));
1159470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                vad=0;
1160470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1161470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            ok=WebRtcSpeex_EncoderInit(SPEEX8enc_inst[k], 0/*vbr*/, 3 /*complexity*/, vad);
1162470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if (ok!=0) exit(0);
1163470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        } else {
1164470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            printf("\nError - Speex8 called with sample frequency other than 8 kHz.\n\n");
1165470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1166470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        break;
1167470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1168470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_SPEEX_16
1169470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    case kDecoderSPEEX_16 :
1170470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if (sampfreq==16000) {
1171470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if ((enc_frameSize==320)||(enc_frameSize==640)||(enc_frameSize==960)) {
1172470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                ok=WebRtcSpeex_CreateEnc(&SPEEX16enc_inst[k], sampfreq);
1173470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                if (ok!=0) {
1174470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    printf("Error: Couldn't allocate memory for Speex encoding instance\n");
1175470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    exit(0);
1176470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                }
1177470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            } else {
1178470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("\nError: Speex only supports 20, 40, and 60 ms!!\n\n");
1179470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1180470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1181470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if ((vad==1)&&(enc_frameSize!=320)) {
1182470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("\nError - This simulation only supports VAD for Speex at 20ms packets (not %dms)\n", (enc_frameSize>>4));
1183470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                vad=0;
1184470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1185470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            ok=WebRtcSpeex_EncoderInit(SPEEX16enc_inst[k], 0/*vbr*/, 3 /*complexity*/, vad);
1186470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if (ok!=0) exit(0);
1187470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        } else {
1188470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            printf("\nError - Speex16 called with sample frequency other than 16 kHz.\n\n");
1189470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1190470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        break;
1191470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1192df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org#ifdef CODEC_CELT_32
1193df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org    case kDecoderCELT_32 :
1194df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org        if (sampfreq==32000) {
1195df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org            if (enc_frameSize==320) {
1196df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org                ok=WebRtcCelt_CreateEnc(&CELT32enc_inst[k], 1 /*mono*/);
1197df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org                if (ok!=0) {
1198df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org                    printf("Error: Couldn't allocate memory for Celt encoding instance\n");
1199df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org                    exit(0);
1200df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org                }
1201df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org            } else {
1202df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org                printf("\nError: Celt only supports 10 ms!!\n\n");
1203df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org                exit(0);
1204df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org            }
1205df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org            ok=WebRtcCelt_EncoderInit(CELT32enc_inst[k],  1 /*mono*/, 48000 /*bitrate*/);
1206df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org            if (ok!=0) exit(0);
1207df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org        } else {
1208df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org          printf("\nError - Celt32 called with sample frequency other than 32 kHz.\n\n");
1209df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org        }
1210df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org        break;
1211df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org#endif
1212470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1213470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1_16
1214470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    case kDecoderG722_1_16 :
1215470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if (sampfreq==16000) {
1216470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            ok=WebRtcG7221_CreateEnc16(&G722_1_16enc_inst[k]);
1217470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if (ok!=0) {
1218470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("Error: Couldn't allocate memory for G.722.1 instance\n");
1219470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1220470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1221470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if (enc_frameSize==320) {
1222470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            } else {
1223470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("\nError: G722.1 only supports 20 ms!!\n\n");
1224470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1225470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1226470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcG7221_EncoderInit16((G722_1_16_encinst_t*)G722_1_16enc_inst[k]);
1227470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        } else {
1228470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            printf("\nError - G722.1 is only developed for 16kHz \n");
1229470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            exit(0);
1230470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1231470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        break;
1232470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1233470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1_24
1234470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    case kDecoderG722_1_24 :
1235470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if (sampfreq==16000) {
1236470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            ok=WebRtcG7221_CreateEnc24(&G722_1_24enc_inst[k]);
1237470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if (ok!=0) {
1238470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("Error: Couldn't allocate memory for G.722.1 instance\n");
1239470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1240470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1241470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if (enc_frameSize==320) {
1242470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            } else {
1243470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("\nError: G722.1 only supports 20 ms!!\n\n");
1244470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1245470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1246470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcG7221_EncoderInit24((G722_1_24_encinst_t*)G722_1_24enc_inst[k]);
1247470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        } else {
1248470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            printf("\nError - G722.1 is only developed for 16kHz \n");
1249470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            exit(0);
1250470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1251470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        break;
1252470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1253470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1_32
1254470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    case kDecoderG722_1_32 :
1255470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if (sampfreq==16000) {
1256470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            ok=WebRtcG7221_CreateEnc32(&G722_1_32enc_inst[k]);
1257470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if (ok!=0) {
1258470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("Error: Couldn't allocate memory for G.722.1 instance\n");
1259470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1260470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1261470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if (enc_frameSize==320) {
1262470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            } else {
1263470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("\nError: G722.1 only supports 20 ms!!\n\n");
1264470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1265470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1266470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcG7221_EncoderInit32((G722_1_32_encinst_t*)G722_1_32enc_inst[k]);
1267470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        } else {
1268470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            printf("\nError - G722.1 is only developed for 16kHz \n");
1269470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            exit(0);
1270470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1271470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        break;
1272470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1273470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1C_24
1274470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    case kDecoderG722_1C_24 :
1275470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if (sampfreq==32000) {
1276470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            ok=WebRtcG7221C_CreateEnc24(&G722_1C_24enc_inst[k]);
1277470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if (ok!=0) {
1278470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("Error: Couldn't allocate memory for G.722.1C instance\n");
1279470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1280470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1281470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if (enc_frameSize==640) {
1282470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            } else {
1283470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("\nError: G722.1 C only supports 20 ms!!\n\n");
1284470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1285470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1286470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcG7221C_EncoderInit24((G722_1C_24_encinst_t*)G722_1C_24enc_inst[k]);
1287470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        } else {
1288470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            printf("\nError - G722.1 C is only developed for 32kHz \n");
1289470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            exit(0);
1290470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1291470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        break;
1292470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1293470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1C_32
1294470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    case kDecoderG722_1C_32 :
1295470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if (sampfreq==32000) {
1296470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            ok=WebRtcG7221C_CreateEnc32(&G722_1C_32enc_inst[k]);
1297470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if (ok!=0) {
1298470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("Error: Couldn't allocate memory for G.722.1C instance\n");
1299470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1300470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1301470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if (enc_frameSize==640) {
1302470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            } else {
1303470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("\nError: G722.1 C only supports 20 ms!!\n\n");
1304470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1305470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1306470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcG7221C_EncoderInit32((G722_1C_32_encinst_t*)G722_1C_32enc_inst[k]);
1307470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        } else {
1308470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            printf("\nError - G722.1 C is only developed for 32kHz \n");
1309470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            exit(0);
1310470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1311470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        break;
1312470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1313470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1C_48
1314470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    case kDecoderG722_1C_48 :
1315470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if (sampfreq==32000) {
1316470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            ok=WebRtcG7221C_CreateEnc48(&G722_1C_48enc_inst[k]);
1317470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if (ok!=0) {
1318470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("Error: Couldn't allocate memory for G.722.1C instance\n");
1319470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1320470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1321470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if (enc_frameSize==640) {
1322470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            } else {
1323470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("\nError: G722.1 C only supports 20 ms!!\n\n");
1324470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1325470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1326470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcG7221C_EncoderInit48((G722_1C_48_encinst_t*)G722_1C_48enc_inst[k]);
1327470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        } else {
1328470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            printf("\nError - G722.1 C is only developed for 32kHz \n");
1329470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            exit(0);
1330470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1331470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        break;
1332470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1333470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722
1334470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    case kDecoderG722 :
1335470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if (sampfreq==16000) {
1336470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if (enc_frameSize%2==0) {
1337470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            } else {
1338470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("\nError - g722 frames must have an even number of enc_frameSize\n");
1339470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1340470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1341470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcG722_CreateEncoder(&g722EncState[k]);
1342470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcG722_EncoderInit(g722EncState[k]);
1343470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        } else {
1344470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            printf("\nError - g722 is only developed for 16kHz \n");
1345470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            exit(0);
1346470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1347470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        break;
1348470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1349470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_AMR
1350470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    case kDecoderAMR :
1351470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if (sampfreq==8000) {
1352470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            ok=WebRtcAmr_CreateEnc(&AMRenc_inst[k]);
1353470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if (ok!=0) {
1354470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("Error: Couldn't allocate memory for AMR encoding instance\n");
1355470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1356470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }if ((enc_frameSize==160)||(enc_frameSize==320)||(enc_frameSize==480)) {
1357470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            } else {
1358470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("\nError - AMR must have a multiple of 160 enc_frameSize\n");
1359470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1360470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1361470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcAmr_EncoderInit(AMRenc_inst[k], vad);
1362470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcAmr_EncodeBitmode(AMRenc_inst[k], AMRBandwidthEfficient);
1363470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            AMR_bitrate = bitrate;
1364470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        } else {
1365470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            printf("\nError - AMR is only developed for 8kHz \n");
1366470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            exit(0);
1367470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1368470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        break;
1369470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1370470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_AMRWB
1371470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    case kDecoderAMRWB :
1372470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if (sampfreq==16000) {
1373470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            ok=WebRtcAmrWb_CreateEnc(&AMRWBenc_inst[k]);
1374470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if (ok!=0) {
1375470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("Error: Couldn't allocate memory for AMRWB encoding instance\n");
1376470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1377470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1378470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if (((enc_frameSize/320)<0)||((enc_frameSize/320)>3)||((enc_frameSize%320)!=0)) {
1379470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("\nError - AMRwb must have frameSize of 20, 40 or 60ms\n");
1380470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1381470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1382470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcAmrWb_EncoderInit(AMRWBenc_inst[k], vad);
1383470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if (bitrate==7000) {
1384470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                AMRWB_bitrate = AMRWB_MODE_7k;
1385470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            } else if (bitrate==9000) {
1386470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                AMRWB_bitrate = AMRWB_MODE_9k;
1387470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            } else if (bitrate==12000) {
1388470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                AMRWB_bitrate = AMRWB_MODE_12k;
1389470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            } else if (bitrate==14000) {
1390470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                AMRWB_bitrate = AMRWB_MODE_14k;
1391470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            } else if (bitrate==16000) {
1392470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                AMRWB_bitrate = AMRWB_MODE_16k;
1393470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            } else if (bitrate==18000) {
1394470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                AMRWB_bitrate = AMRWB_MODE_18k;
1395470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            } else if (bitrate==20000) {
1396470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                AMRWB_bitrate = AMRWB_MODE_20k;
1397470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            } else if (bitrate==23000) {
1398470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                AMRWB_bitrate = AMRWB_MODE_23k;
1399470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            } else if (bitrate==24000) {
1400470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                AMRWB_bitrate = AMRWB_MODE_24k;
1401470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1402470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcAmrWb_EncodeBitmode(AMRWBenc_inst[k], AMRBandwidthEfficient);
1403470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1404470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        } else {
1405470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            printf("\nError - AMRwb is only developed for 16kHz \n");
1406470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            exit(0);
1407470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1408470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        break;
1409470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1410470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_ILBC
1411470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    case kDecoderILBC :
1412470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if (sampfreq==8000) {
1413470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            ok=WebRtcIlbcfix_EncoderCreate(&iLBCenc_inst[k]);
1414470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if (ok!=0) {
1415470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("Error: Couldn't allocate memory for iLBC encoding instance\n");
1416470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1417470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1418470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if ((enc_frameSize==160)||(enc_frameSize==240)||(enc_frameSize==320)||(enc_frameSize==480)) {
1419470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            } else {
1420470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("\nError - iLBC only supports 160, 240, 320 and 480 enc_frameSize (20, 30, 40 and 60 ms)\n");
1421470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1422470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1423470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if ((enc_frameSize==160)||(enc_frameSize==320)) {
1424470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                /* 20 ms version */
1425470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                WebRtcIlbcfix_EncoderInit(iLBCenc_inst[k], 20);
1426470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            } else {
1427470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                /* 30 ms version */
1428470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                WebRtcIlbcfix_EncoderInit(iLBCenc_inst[k], 30);
1429470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1430470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        } else {
1431470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            printf("\nError - iLBC is only developed for 8kHz \n");
1432470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            exit(0);
1433470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1434470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        break;
1435470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1436470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_ISAC
1437470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    case kDecoderISAC:
1438470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if (sampfreq==16000) {
1439470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            ok=WebRtcIsac_Create(&ISAC_inst[k]);
1440470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if (ok!=0) {
1441470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("Error: Couldn't allocate memory for iSAC instance\n");
1442470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1443470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }if ((enc_frameSize==480)||(enc_frameSize==960)) {
1444470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            } else {
1445470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("\nError - iSAC only supports frameSize (30 and 60 ms)\n");
1446470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1447470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1448470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcIsac_EncoderInit(ISAC_inst[k],1);
1449470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if ((bitrate<10000)||(bitrate>32000)) {
1450470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("\nError - iSAC bitrate has to be between 10000 and 32000 bps (not %i)\n", bitrate);
1451470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1452470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1453470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcIsac_Control(ISAC_inst[k], bitrate, enc_frameSize>>4);
1454470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        } else {
1455470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            printf("\nError - iSAC only supports 480 or 960 enc_frameSize (30 or 60 ms)\n");
1456470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            exit(0);
1457470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1458470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        break;
1459470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1460470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef NETEQ_ISACFIX_CODEC
1461470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    case kDecoderISAC:
1462470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if (sampfreq==16000) {
1463470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            ok=WebRtcIsacfix_Create(&ISAC_inst[k]);
1464470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if (ok!=0) {
1465470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("Error: Couldn't allocate memory for iSAC instance\n");
1466470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1467470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }if ((enc_frameSize==480)||(enc_frameSize==960)) {
1468470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            } else {
1469470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("\nError - iSAC only supports frameSize (30 and 60 ms)\n");
1470470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1471470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1472470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcIsacfix_EncoderInit(ISAC_inst[k],1);
1473470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if ((bitrate<10000)||(bitrate>32000)) {
1474470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("\nError - iSAC bitrate has to be between 10000 and 32000 bps (not %i)\n", bitrate);
1475470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1476470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1477470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcIsacfix_Control(ISAC_inst[k], bitrate, enc_frameSize>>4);
1478470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        } else {
1479470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            printf("\nError - iSAC only supports 480 or 960 enc_frameSize (30 or 60 ms)\n");
1480470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            exit(0);
1481470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1482470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        break;
1483470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1484470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_ISAC_SWB
1485470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    case kDecoderISACswb:
1486470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if (sampfreq==32000) {
1487470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            ok=WebRtcIsac_Create(&ISACSWB_inst[k]);
1488470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if (ok!=0) {
1489470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("Error: Couldn't allocate memory for iSAC SWB instance\n");
1490470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
14916198624815334bdba5860148f515c522937b8ca8henrik.lundin@webrtc.org            }if (enc_frameSize==960) {
1492470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            } else {
1493470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("\nError - iSAC SWB only supports frameSize 30 ms\n");
1494470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1495470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1496b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org            ok = WebRtcIsac_SetEncSampRate(ISACSWB_inst[k], 32000);
1497470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if (ok!=0) {
1498470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("Error: Couldn't set sample rate for iSAC SWB instance\n");
1499470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1500470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1501470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcIsac_EncoderInit(ISACSWB_inst[k],1);
1502470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if ((bitrate<32000)||(bitrate>56000)) {
1503470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("\nError - iSAC SWB bitrate has to be between 32000 and 56000 bps (not %i)\n", bitrate);
1504470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1505470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1506470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcIsac_Control(ISACSWB_inst[k], bitrate, enc_frameSize>>5);
1507470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        } else {
1508470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            printf("\nError - iSAC SWB only supports 960 enc_frameSize (30 ms)\n");
1509470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            exit(0);
1510470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1511470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        break;
1512470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1513b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org#ifdef CODEC_ISAC_FB
1514b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org    case kDecoderISACfb:
1515b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org        if (sampfreq == 48000) {
1516b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org            ok = WebRtcIsac_Create(&ISACFB_inst[k]);
1517b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org            if (ok != 0) {
1518b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org                printf("Error: Couldn't allocate memory for iSAC FB "
1519b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org                    "instance\n");
1520b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org                exit(0);
1521b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org            }
1522b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org            if (enc_frameSize != 1440) {
1523b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org                printf("\nError - iSAC FB only supports frameSize 30 ms\n");
1524b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org                exit(0);
1525b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org            }
1526b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org            ok = WebRtcIsac_SetEncSampRate(ISACFB_inst[k], 48000);
1527b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org            if (ok != 0) {
1528b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org                printf("Error: Couldn't set sample rate for iSAC FB "
1529b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org                    "instance\n");
1530b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org                exit(0);
1531b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org            }
1532b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org            WebRtcIsac_EncoderInit(ISACFB_inst[k], 1);
1533b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org            if ((bitrate < 32000) || (bitrate > 56000)) {
1534b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org                printf("\nError - iSAC FB bitrate has to be between 32000 and"
1535b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org                    "56000 bps (not %i)\n", bitrate);
1536b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org                exit(0);
1537b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org            }
1538b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org            WebRtcIsac_Control(ISACFB_inst[k], bitrate, 30);
1539b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org        } else {
1540b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org            printf("\nError - iSAC FB only support 48 kHz sampling rate.\n");
1541b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org            exit(0);
1542b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org        }
1543b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org        break;
1544b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org#endif
1545470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_GSMFR
1546470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    case kDecoderGSMFR:
1547470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if (sampfreq==8000) {
1548470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            ok=WebRtcGSMFR_CreateEnc(&GSMFRenc_inst[k]);
1549470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if (ok!=0) {
1550470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("Error: Couldn't allocate memory for GSM FR encoding instance\n");
1551470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1552470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1553470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if ((enc_frameSize==160)||(enc_frameSize==320)||(enc_frameSize==480)) {
1554470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            } else {
1555470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("\nError - GSM FR must have a multiple of 160 enc_frameSize\n");
1556470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1557470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1558470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcGSMFR_EncoderInit(GSMFRenc_inst[k], 0);
1559470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        } else {
1560470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            printf("\nError - GSM FR is only developed for 8kHz \n");
1561470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            exit(0);
1562470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1563470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        break;
1564470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1565470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    default :
1566470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        printf("Error: unknown codec in call to NetEQTest_init_coders.\n");
1567470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        exit(0);
1568470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        break;
1569470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1570470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1571470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if (ok != 0) {
1572470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            return(ok);
1573470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1574d900e8bea84c474696bf0219aed1353ce65ffd8epbos@webrtc.org    }  // end for
1575470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1576470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return(0);
1577470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
1578470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1579470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1580470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1581470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1582470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comint NetEQTest_free_coders(enum WebRtcNetEQDecoder coder, int numChannels) {
1583470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1584470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    for (int k = 0; k < numChannels; k++)
1585470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    {
1586470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        WebRtcVad_Free(VAD_inst[k]);
1587470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
1588470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
1589470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        WebRtcCng_FreeEnc(CNGenc_inst[k]);
1590470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1591470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1592470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        switch (coder)
1593470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        {
1594470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderReservedStart : // dummy codec
1595470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_PCM16B
1596470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderPCM16B :
1597470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1598470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_PCM16B_WB
1599470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderPCM16Bwb :
1600470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1601470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_PCM16B_32KHZ
1602470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderPCM16Bswb32kHz :
1603470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1604470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_PCM16B_48KHZ
1605470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderPCM16Bswb48kHz :
1606470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1607470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G711
1608470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderPCMu :
1609470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderPCMa :
1610470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1611470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            // do nothing
1612470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            break;
1613470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G729
1614470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderG729:
1615470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcG729_FreeEnc(G729enc_inst[k]);
1616470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            break;
1617470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1618470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G729_1
1619470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderG729_1:
1620470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcG7291_Free(G729_1_inst[k]);
1621470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            break;
1622470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1623470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_SPEEX_8
1624470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderSPEEX_8 :
1625470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcSpeex_FreeEnc(SPEEX8enc_inst[k]);
1626470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            break;
1627470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1628470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_SPEEX_16
1629470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderSPEEX_16 :
1630470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcSpeex_FreeEnc(SPEEX16enc_inst[k]);
1631470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            break;
1632470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1633df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org#ifdef CODEC_CELT_32
1634df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org        case kDecoderCELT_32 :
1635df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org            WebRtcCelt_FreeEnc(CELT32enc_inst[k]);
1636df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org            break;
1637df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org#endif
1638470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1639470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1_16
1640470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderG722_1_16 :
1641470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcG7221_FreeEnc16(G722_1_16enc_inst[k]);
1642470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            break;
1643470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1644470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1_24
1645470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderG722_1_24 :
1646470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcG7221_FreeEnc24(G722_1_24enc_inst[k]);
1647470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            break;
1648470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1649470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1_32
1650470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderG722_1_32 :
1651470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcG7221_FreeEnc32(G722_1_32enc_inst[k]);
1652470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            break;
1653470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1654470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1C_24
1655470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderG722_1C_24 :
1656470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcG7221C_FreeEnc24(G722_1C_24enc_inst[k]);
1657470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            break;
1658470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1659470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1C_32
1660470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderG722_1C_32 :
1661470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcG7221C_FreeEnc32(G722_1C_32enc_inst[k]);
1662470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            break;
1663470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1664470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1C_48
1665470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderG722_1C_48 :
1666470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcG7221C_FreeEnc48(G722_1C_48enc_inst[k]);
1667470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            break;
1668470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1669470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722
1670470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderG722 :
1671470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcG722_FreeEncoder(g722EncState[k]);
1672470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            break;
1673470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1674470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_AMR
1675470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderAMR :
1676470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcAmr_FreeEnc(AMRenc_inst[k]);
1677470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            break;
1678470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1679470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_AMRWB
1680470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderAMRWB :
1681470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcAmrWb_FreeEnc(AMRWBenc_inst[k]);
1682470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            break;
1683470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1684470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_ILBC
1685470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderILBC :
1686470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcIlbcfix_EncoderFree(iLBCenc_inst[k]);
1687470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            break;
1688470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1689470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_ISAC
1690470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderISAC:
1691470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcIsac_Free(ISAC_inst[k]);
1692470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            break;
1693470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1694470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef NETEQ_ISACFIX_CODEC
1695470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderISAC:
1696470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcIsacfix_Free(ISAC_inst[k]);
1697470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            break;
1698470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1699470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_ISAC_SWB
1700470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderISACswb:
1701470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcIsac_Free(ISACSWB_inst[k]);
1702470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            break;
1703470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1704b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org#ifdef CODEC_ISAC_FB
1705b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org        case kDecoderISACfb:
1706b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org            WebRtcIsac_Free(ISACFB_inst[k]);
1707b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org            break;
1708b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org#endif
1709470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_GSMFR
1710470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        case kDecoderGSMFR:
1711470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            WebRtcGSMFR_FreeEnc(GSMFRenc_inst[k]);
1712470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            break;
1713470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1714470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        default :
1715470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            printf("Error: unknown codec in call to NetEQTest_init_coders.\n");
1716470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            exit(0);
1717470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            break;
1718470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1719470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
1720470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1721470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	return(0);
1722470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
1723470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1724470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1725470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1726470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1727470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1728470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
17290946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.orgint NetEQTest_encode(int coder, int16_t *indata, int frameLen, unsigned char * encoded,int sampleRate ,
1730470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com						  int * vad, int useVAD, int bitrate, int numChannels){
1731470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1732543c3eaa46434a7e3974012c4d33ed82fc81fd33kjellander@webrtc.org	short cdlen = 0;
17330946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org	int16_t *tempdata;
1734470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	static int first_cng=1;
17350946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org	int16_t tempLen;
1736470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1737470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	*vad =1;
1738470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1739470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    // check VAD first
1740470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	if(useVAD&&
1741470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			   (coder!=kDecoderG729)&&(coder!=kDecoderAMR)&&
1742470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			   (coder!=kDecoderSPEEX_8)&&(coder!=kDecoderSPEEX_16))
1743470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    {
1744470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        *vad = 0;
1745470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1746470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        for (int k = 0; k < numChannels; k++)
1747470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        {
1748470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            tempLen = frameLen;
1749470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            tempdata = &indata[k*frameLen];
1750470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            int localVad=0;
1751470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            /* Partition the signal and test each chunk for VAD.
1752470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            All chunks must be VAD=0 to produce a total VAD=0. */
1753470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            while (tempLen >= 10*sampleRate/1000) {
1754470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                if ((tempLen % 30*sampleRate/1000) == 0) { // tempLen is multiple of 30ms
1755470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    localVad |= WebRtcVad_Process(VAD_inst[k] ,sampleRate, tempdata, 30*sampleRate/1000);
1756470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    tempdata += 30*sampleRate/1000;
1757470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    tempLen -= 30*sampleRate/1000;
1758470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                }
1759470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                else if (tempLen >= 20*sampleRate/1000) { // tempLen >= 20ms
1760470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    localVad |= WebRtcVad_Process(VAD_inst[k] ,sampleRate, tempdata, 20*sampleRate/1000);
1761470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    tempdata += 20*sampleRate/1000;
1762470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    tempLen -= 20*sampleRate/1000;
1763470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                }
1764470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                else { // use 10ms
1765470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    localVad |= WebRtcVad_Process(VAD_inst[k] ,sampleRate, tempdata, 10*sampleRate/1000);
1766470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    tempdata += 10*sampleRate/1000;
1767470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    tempLen -= 10*sampleRate/1000;
1768470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                }
1769470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1770470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1771470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            // aggregate all VAD decisions over all channels
1772470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            *vad |= localVad;
1773470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1774470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1775470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if(!*vad){
1776470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            // all channels are silent
1777470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            cdlen = 0;
1778470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            for (int k = 0; k < numChannels; k++)
1779470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            {
1780470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                WebRtcCng_Encode(CNGenc_inst[k],&indata[k*frameLen], (frameLen <= 640 ? frameLen : 640) /* max 640 */,
1781470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                    encoded,&tempLen,first_cng);
1782470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                encoded += tempLen;
1783470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                cdlen += tempLen;
1784470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1785470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            *vad=0;
1786470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            first_cng=0;
1787470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            return(cdlen);
1788470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1789470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	}
1790470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1791470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1792470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    // loop over all channels
1793470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    int totalLen = 0;
1794470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1795470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    for (int k = 0; k < numChannels; k++)
1796470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    {
1797470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        /* Encode with the selected coder type */
17986198624815334bdba5860148f515c522937b8ca8henrik.lundin@webrtc.org        if (coder==kDecoderPCMu) { /*g711 u-law */
1799470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G711
18000946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org            cdlen = WebRtcG711_EncodeU(G711state[k], indata, frameLen, (int16_t*) encoded);
1801470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1802470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
18036198624815334bdba5860148f515c522937b8ca8henrik.lundin@webrtc.org        else if (coder==kDecoderPCMa) { /*g711 A-law */
1804470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G711
18050946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org            cdlen = WebRtcG711_EncodeA(G711state[k], indata, frameLen, (int16_t*) encoded);
1806470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1807470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1808470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_PCM16B
1809470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        else if ((coder==kDecoderPCM16B)||(coder==kDecoderPCM16Bwb)||
1810470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            (coder==kDecoderPCM16Bswb32kHz)||(coder==kDecoderPCM16Bswb48kHz)) { /*pcm16b (8kHz, 16kHz, 32kHz or 48kHz) */
18110946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org                cdlen = WebRtcPcm16b_EncodeW16(indata, frameLen, (int16_t*) encoded);
1812470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1813470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1814470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722
18156198624815334bdba5860148f515c522937b8ca8henrik.lundin@webrtc.org        else if (coder==kDecoderG722) { /*g722 */
18160946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org            cdlen=WebRtcG722_Encode(g722EncState[k], indata, frameLen, (int16_t*)encoded);
1817470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            cdlen=frameLen>>1;
1818470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1819470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1820470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1_16
1821470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        else if (coder==kDecoderG722_1_16) { /* g722.1 16kbit/s mode */
18220946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org            cdlen=WebRtcG7221_Encode16((G722_1_16_encinst_t*)G722_1_16enc_inst[k], indata, frameLen, (int16_t*)encoded);
1823470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1824470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1825470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1_24
1826470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        else if (coder==kDecoderG722_1_24) { /* g722.1 24kbit/s mode*/
18270946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org            cdlen=WebRtcG7221_Encode24((G722_1_24_encinst_t*)G722_1_24enc_inst[k], indata, frameLen, (int16_t*)encoded);
1828470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1829470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1830470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1_32
1831470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        else if (coder==kDecoderG722_1_32) { /* g722.1 32kbit/s mode */
18320946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org            cdlen=WebRtcG7221_Encode32((G722_1_32_encinst_t*)G722_1_32enc_inst[k], indata, frameLen, (int16_t*)encoded);
1833470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1834470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1835470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1C_24
1836470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        else if (coder==kDecoderG722_1C_24) { /* g722.1 32 kHz 24kbit/s mode*/
18370946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org            cdlen=WebRtcG7221C_Encode24((G722_1C_24_encinst_t*)G722_1C_24enc_inst[k], indata, frameLen, (int16_t*)encoded);
1838470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1839470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1840470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1C_32
1841470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        else if (coder==kDecoderG722_1C_32) { /* g722.1 32 kHz 32kbit/s mode */
18420946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org            cdlen=WebRtcG7221C_Encode32((G722_1C_32_encinst_t*)G722_1C_32enc_inst[k], indata, frameLen, (int16_t*)encoded);
1843470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1844470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1845470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G722_1C_48
1846470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        else if (coder==kDecoderG722_1C_48) { /* g722.1 32 kHz 48kbit/s mode */
18470946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org            cdlen=WebRtcG7221C_Encode48((G722_1C_48_encinst_t*)G722_1C_48enc_inst[k], indata, frameLen, (int16_t*)encoded);
1848470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1849470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1850470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G729
18516198624815334bdba5860148f515c522937b8ca8henrik.lundin@webrtc.org        else if (coder==kDecoderG729) { /*g729 */
18520946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org            int16_t dataPos=0;
18530946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org            int16_t len=0;
1854470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            cdlen = 0;
1855470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            for (dataPos=0;dataPos<frameLen;dataPos+=80) {
18560946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org                len=WebRtcG729_Encode(G729enc_inst[k], &indata[dataPos], 80, (int16_t*)(&encoded[cdlen]));
1857470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                cdlen += len;
1858470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1859470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1860470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1861470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_G729_1
18626198624815334bdba5860148f515c522937b8ca8henrik.lundin@webrtc.org        else if (coder==kDecoderG729_1) { /*g729.1 */
18630946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org            int16_t dataPos=0;
18640946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org            int16_t len=0;
1865470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            cdlen = 0;
1866470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            for (dataPos=0;dataPos<frameLen;dataPos+=160) {
18670946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org                len=WebRtcG7291_Encode(G729_1_inst[k], &indata[dataPos], (int16_t*)(&encoded[cdlen]), bitrate, frameLen/320 /* num 20ms frames*/);
1868470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                cdlen += len;
1869470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1870470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1871470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1872470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_AMR
1873470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        else if (coder==kDecoderAMR) { /*AMR */
18740946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org            cdlen=WebRtcAmr_Encode(AMRenc_inst[k], indata, frameLen, (int16_t*)encoded, AMR_bitrate);
1875470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1876470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1877470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_AMRWB
1878470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        else if (coder==kDecoderAMRWB) { /*AMR-wb */
18790946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org            cdlen=WebRtcAmrWb_Encode(AMRWBenc_inst[k], indata, frameLen, (int16_t*)encoded, AMRWB_bitrate);
1880470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1881470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1882470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_ILBC
18836198624815334bdba5860148f515c522937b8ca8henrik.lundin@webrtc.org        else if (coder==kDecoderILBC) { /*iLBC */
18840946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org            cdlen=WebRtcIlbcfix_Encode(iLBCenc_inst[k], indata,frameLen,(int16_t*)encoded);
1885470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1886470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1887470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#if (defined(CODEC_ISAC) || defined(NETEQ_ISACFIX_CODEC)) // TODO(hlundin): remove all NETEQ_ISACFIX_CODEC
1888470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        else if (coder==kDecoderISAC) { /*iSAC */
1889470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            int noOfCalls=0;
1890470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            cdlen=0;
1891470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            while (cdlen<=0) {
1892470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_ISAC /* floating point */
18930946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org                cdlen=WebRtcIsac_Encode(ISAC_inst[k],&indata[noOfCalls*160],(int16_t*)encoded);
1894470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#else /* fixed point */
18950946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org                cdlen=WebRtcIsacfix_Encode(ISAC_inst[k],&indata[noOfCalls*160],(int16_t*)encoded);
1896470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1897470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                noOfCalls++;
1898470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1899470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1900470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1901470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_ISAC_SWB
1902470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        else if (coder==kDecoderISACswb) { /* iSAC SWB */
1903470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            int noOfCalls=0;
1904470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            cdlen=0;
1905470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            while (cdlen<=0) {
19060946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org                cdlen=WebRtcIsac_Encode(ISACSWB_inst[k],&indata[noOfCalls*320],(int16_t*)encoded);
1907470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                noOfCalls++;
1908470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1909470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1910470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1911b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org#ifdef CODEC_ISAC_FB
1912b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org        else if (coder == kDecoderISACfb) { /* iSAC FB */
1913b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org            int noOfCalls = 0;
1914b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org            cdlen = 0;
1915b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org            while (cdlen <= 0) {
1916b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org                cdlen = WebRtcIsac_Encode(ISACFB_inst[k],
1917b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org                                          &indata[noOfCalls * 480],
19180946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org                                          (int16_t*)encoded);
1919b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org                noOfCalls++;
1920b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org            }
1921b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org        }
1922b0dff12d2bfd2be52c07b0bcce5a36938ea4f491turaj@webrtc.org#endif
1923470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_GSMFR
19246198624815334bdba5860148f515c522937b8ca8henrik.lundin@webrtc.org        else if (coder==kDecoderGSMFR) { /* GSM FR */
19250946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org            cdlen=WebRtcGSMFR_Encode(GSMFRenc_inst[k], indata, frameLen, (int16_t*)encoded);
1926470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1927470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1928470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_SPEEX_8
1929470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        else if (coder==kDecoderSPEEX_8) { /* Speex */
1930470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            int encodedLen = 0;
1931470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            int retVal = 1;
1932470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            while (retVal == 1 && encodedLen < frameLen) {
1933470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                retVal = WebRtcSpeex_Encode(SPEEX8enc_inst[k], &indata[encodedLen], 15000);
1934470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                encodedLen += 20*8; /* 20 ms */
1935470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1936470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if( (retVal == 0 && encodedLen != frameLen) || retVal < 0) {
1937470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("Error encoding speex frame!\n");
1938470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1939470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
19400946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org            cdlen=WebRtcSpeex_GetBitstream(SPEEX8enc_inst[k], (int16_t*)encoded);
1941470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1942470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1943470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef CODEC_SPEEX_16
1944470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        else if (coder==kDecoderSPEEX_16) { /* Speex */
1945470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            int encodedLen = 0;
1946470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            int retVal = 1;
1947470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            while (retVal == 1 && encodedLen < frameLen) {
1948470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                retVal = WebRtcSpeex_Encode(SPEEX16enc_inst[k], &indata[encodedLen], 15000);
1949470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                encodedLen += 20*16; /* 20 ms */
1950470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
1951470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            if( (retVal == 0 && encodedLen != frameLen) || retVal < 0) {
1952470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                printf("Error encoding speex frame!\n");
1953470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                exit(0);
1954470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            }
19550946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org            cdlen=WebRtcSpeex_GetBitstream(SPEEX16enc_inst[k], (int16_t*)encoded);
1956470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
1957470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1958df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org#ifdef CODEC_CELT_32
1959df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org        else if (coder==kDecoderCELT_32) { /* Celt */
1960df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org            int encodedLen = 0;
1961df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org            cdlen = 0;
1962df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org            while (cdlen <= 0) {
1963df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org                cdlen = WebRtcCelt_Encode(CELT32enc_inst[k], &indata[encodedLen], encoded);
1964df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org                encodedLen += 10*32; /* 10 ms */
1965df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org            }
1966df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org            if( (encodedLen != frameLen) || cdlen < 0) {
1967df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org                printf("Error encoding Celt frame!\n");
1968df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org                exit(0);
1969df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org            }
1970df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org        }
1971df69775bfacd124d7af5503fbd8fdb680a0a9908tina.legrand@webrtc.org#endif
1972470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1973470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        indata += frameLen;
1974470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        encoded += cdlen;
1975470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        totalLen += cdlen;
1976470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1977d900e8bea84c474696bf0219aed1353ce65ffd8epbos@webrtc.org    }  // end for
1978470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1979470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	first_cng=1;
1980470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	return(totalLen);
1981470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
1982470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1983470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1984470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
19850946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.orgvoid makeRTPheader(unsigned char* rtp_data, int payloadType, int seqNo, uint32_t timestamp, uint32_t ssrc){
1986470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1987470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			rtp_data[0]=(unsigned char)0x80;
1988470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			rtp_data[1]=(unsigned char)(payloadType & 0xFF);
1989470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			rtp_data[2]=(unsigned char)((seqNo>>8)&0xFF);
1990470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			rtp_data[3]=(unsigned char)((seqNo)&0xFF);
1991470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			rtp_data[4]=(unsigned char)((timestamp>>24)&0xFF);
1992470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			rtp_data[5]=(unsigned char)((timestamp>>16)&0xFF);
1993470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1994470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			rtp_data[6]=(unsigned char)((timestamp>>8)&0xFF);
1995470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			rtp_data[7]=(unsigned char)(timestamp & 0xFF);
1996470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1997470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			rtp_data[8]=(unsigned char)((ssrc>>24)&0xFF);
1998470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			rtp_data[9]=(unsigned char)((ssrc>>16)&0xFF);
1999470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
2000470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			rtp_data[10]=(unsigned char)((ssrc>>8)&0xFF);
2001470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com			rtp_data[11]=(unsigned char)(ssrc & 0xFF);
2002470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
2003470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
2004470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
20050946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.orgint makeRedundantHeader(unsigned char* rtp_data, int *payloadType, int numPayloads, uint32_t *timestamp, uint16_t *blockLen,
20060946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org                        int seqNo, uint32_t ssrc)
2007470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
2008470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
2009470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    int i;
2010470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    unsigned char *rtpPointer;
20110946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org    uint16_t offset;
2012470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
2013470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /* first create "standard" RTP header */
2014470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    makeRTPheader(rtp_data, NETEQ_CODEC_RED_PT, seqNo, timestamp[numPayloads-1], ssrc);
2015470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
2016470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    rtpPointer = &rtp_data[12];
2017470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
2018470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /* add one sub-header for each redundant payload (not the primary) */
2019470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    for(i=0; i<numPayloads-1; i++) {                                            /* |0 1 2 3 4 5 6 7| */
2020470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if(blockLen[i] > 0) {
20210946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org            offset = (uint16_t) (timestamp[numPayloads-1] - timestamp[i]);
2022470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
2023470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            rtpPointer[0] = (unsigned char) ( 0x80 | (0x7F & payloadType[i]) ); /* |F|   block PT  | */
2024470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            rtpPointer[1] = (unsigned char) ((offset >> 6) & 0xFF);             /* |  timestamp-   | */
2025470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            rtpPointer[2] = (unsigned char) ( ((offset & 0x3F)<<2) |
2026470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                ( (blockLen[i]>>8) & 0x03 ) );                                  /* | -offset   |bl-| */
2027470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            rtpPointer[3] = (unsigned char) ( blockLen[i] & 0xFF );             /* | -ock length   | */
2028470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
2029470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            rtpPointer += 4;
2030470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
2031470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
2032470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
2033470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /* last sub-header */
2034470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    rtpPointer[0]= (unsigned char) (0x00 | (0x7F&payloadType[numPayloads-1]));/* |F|   block PT  | */
2035470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    rtpPointer += 1;
2036470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
2037470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return(rtpPointer - rtp_data); /* length of header in bytes */
2038470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
2039470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
2040470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
2041470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
2042470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comint makeDTMFpayload(unsigned char* payload_data, int Event, int End, int Volume, int Duration) {
2043470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	unsigned char E,R,V;
2044470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	R=0;
2045470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	V=(unsigned char)Volume;
2046470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	if (End==0) {
2047470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		E = 0x00;
2048470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	} else {
2049470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com		E = 0x80;
2050470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	}
2051470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	payload_data[0]=(unsigned char)Event;
2052470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	payload_data[1]=(unsigned char)(E|R|V);
2053470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	//Duration equals 8 times time_ms, default is 8000 Hz.
2054470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	payload_data[2]=(unsigned char)((Duration>>8)&0xFF);
2055470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	payload_data[3]=(unsigned char)(Duration&0xFF);
2056470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com	return(4);
2057470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
2058470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
20590946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.orgvoid stereoDeInterleave(int16_t* audioSamples, int numSamples)
2060470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
2061470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
20620946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org    int16_t *tempVec;
20630946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org    int16_t *readPtr, *writeL, *writeR;
2064470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
2065470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    if (numSamples <= 0)
2066470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        return;
2067470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
20680946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org    tempVec = (int16_t *) malloc(sizeof(int16_t) * numSamples);
2069470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    if (tempVec == NULL) {
2070470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        printf("Error allocating memory\n");
2071470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        exit(0);
2072470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
2073470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
20740946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org    memcpy(tempVec, audioSamples, numSamples*sizeof(int16_t));
2075470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
2076470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    writeL = audioSamples;
2077470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    writeR = &audioSamples[numSamples/2];
2078470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    readPtr = tempVec;
2079470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
2080470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    for (int k = 0; k < numSamples; k += 2)
2081470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    {
2082470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        *writeL = *readPtr;
2083470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        readPtr++;
2084470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        *writeR = *readPtr;
2085470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        readPtr++;
2086470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        writeL++;
2087470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        writeR++;
2088470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
2089470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
2090470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    free(tempVec);
2091470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
2092470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
2093470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
2094470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
2095470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comvoid stereoInterleave(unsigned char* data, int dataLen, int stride)
2096470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
2097470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
2098470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    unsigned char *ptrL, *ptrR;
2099470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    unsigned char temp[10];
2100470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
2101470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    if (stride > 10)
2102470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    {
2103470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        exit(0);
2104470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
2105470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
2106470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    if (dataLen%1 != 0)
2107470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    {
2108470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        // must be even number of samples
2109470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        printf("Error: cannot interleave odd sample number\n");
2110470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        exit(0);
2111470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
2112470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
2113470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ptrL = data + stride;
2114470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ptrR = &data[dataLen/2];
2115470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
2116470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    while (ptrL < ptrR) {
2117470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        // copy from right pointer to temp
2118470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        memcpy(temp, ptrR, stride);
2119470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
2120470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        // shift data between pointers
2121470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        memmove(ptrL + stride, ptrL, ptrR - ptrL);
2122470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
2123470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        // copy from temp to left pointer
2124470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        memcpy(ptrL, temp, stride);
2125470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
2126470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        // advance pointers
2127470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        ptrL += stride*2;
2128470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        ptrR += stride;
2129470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
2130470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
2131470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
2132