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