RTPencode.cc revision f045e4da43e671ae511aa1d9b6ef2968256a745d
1d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/* 2d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org * 4d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org * Use of this source code is governed by a BSD-style license 5d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org * that can be found in the LICENSE file in the root of the source 6d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org * tree. An additional intellectual property rights grant can be found 7d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org * in the file PATENTS. All contributing project authors may 8d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org */ 10d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 11248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting// TODO(hlundin): Reformat file to meet style guide. 12d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 13d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/* header includes */ 14d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#include <stdio.h> 15d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#include <stdlib.h> 16d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#include <string.h> 17d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef WIN32 18d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#include <winsock2.h> 19d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 20d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef WEBRTC_LINUX 21d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#include <netinet/in.h> 22d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 23d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 2412dc1a38ca54a000e4fecfbc6d41138b895c9ca5pbos@webrtc.org#include <assert.h> 25d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 26d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#include "webrtc/typedefs.h" 27d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org// needed for NetEqDecoder 28e04a93bcf5e1b608c798a6a3148224b8035f0119kwiberg@webrtc.org#include "webrtc/modules/audio_coding/neteq/audio_decoder_impl.h" 299c55f0f957534144d2b8a64154f0a479249b34behenrik.lundin@webrtc.org#include "webrtc/modules/audio_coding/neteq/interface/neteq.h" 30d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 31d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/************************/ 32d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/* Define payload types */ 33d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/************************/ 34d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 35d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#include "PayloadTypes.h" 36d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 37d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/*********************/ 38d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/* Misc. definitions */ 39d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/*********************/ 40d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 41d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#define STOPSENDTIME 3000 42248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#define RESTARTSENDTIME 0 // 162500 43d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#define FIRSTLINELEN 40 44248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#define CHECK_NOT_NULL(a) \ 45248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((a) == 0) { \ 46248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\n %s \n line: %d \nerror at %s\n", __FILE__, __LINE__, #a); \ 47248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return (-1); \ 48248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 49d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 50d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org//#define MULTIPLE_SAME_TIMESTAMP 51d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#define REPEAT_PACKET_DISTANCE 17 52d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#define REPEAT_PACKET_COUNT 1 // number of extra packets to send 53d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 54d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org//#define INSERT_OLD_PACKETS 55248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#define OLD_PACKET 5 // how many seconds too old should the packet be? 56d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 57d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org//#define TIMESTAMP_WRAPAROUND 58d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 59d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org//#define RANDOM_DATA 60d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org//#define RANDOM_PAYLOAD_DATA 61d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#define RANDOM_SEED 10 62d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 63d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org//#define INSERT_DTMF_PACKETS 64d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org//#define NO_DTMF_OVERDUB 65d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#define DTMF_PACKET_INTERVAL 2000 66d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#define DTMF_DURATION 500 67d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 68d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#define STEREO_MODE_FRAME 0 69248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#define STEREO_MODE_SAMPLE_1 1 // 1 octet per sample 70248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#define STEREO_MODE_SAMPLE_2 2 // 2 octets per sample 71d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 72d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/*************************/ 73d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/* Function declarations */ 74d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/*************************/ 75d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 76d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.orgvoid NetEQTest_GetCodec_and_PT(char* name, 77d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org webrtc::NetEqDecoder* codec, 78d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int* PT, 79d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int frameLen, 80d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int* fs, 81d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int* bitrate, 82d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int* useRed); 83d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.orgint NetEQTest_init_coders(webrtc::NetEqDecoder coder, 84d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int enc_frameSize, 85d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int bitrate, 86d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int sampfreq, 87d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int vad, 88d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int numChannels); 89d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.orgvoid defineCodecs(webrtc::NetEqDecoder* usedCodec, int* noOfCodecs); 90d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.orgint NetEQTest_free_coders(webrtc::NetEqDecoder coder, int numChannels); 91d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.orgint NetEQTest_encode(int coder, 92d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int16_t* indata, 93d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int frameLen, 94d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org unsigned char* encoded, 95d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int sampleRate, 96d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int* vad, 97d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int useVAD, 98d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int bitrate, 99d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int numChannels); 100d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.orgvoid makeRTPheader(unsigned char* rtp_data, 101d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int payloadType, 102d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int seqNo, 103d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org uint32_t timestamp, 104d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org uint32_t ssrc); 105d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.orgint makeRedundantHeader(unsigned char* rtp_data, 106d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int* payloadType, 107d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int numPayloads, 108d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org uint32_t* timestamp, 109d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org uint16_t* blockLen, 110d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int seqNo, 111d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org uint32_t ssrc); 112d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.orgint makeDTMFpayload(unsigned char* payload_data, 113d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int Event, 114d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int End, 115d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int Volume, 116d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int Duration); 1170946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.orgvoid stereoDeInterleave(int16_t* audioSamples, int numSamples); 118d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.orgvoid stereoInterleave(unsigned char* data, int dataLen, int stride); 119d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 120d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/*********************/ 121d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/* Codec definitions */ 122d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/*********************/ 123d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 124d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#include "webrtc_vad.h" 125d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 126248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#if ((defined CODEC_PCM16B) || (defined NETEQ_ARBITRARY_CODEC)) 127248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "pcm16b.h" 128d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 129d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G711 130248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "g711_interface.h" 131d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 132d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G729 133248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "G729Interface.h" 134d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 135d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G729_1 136248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "G729_1Interface.h" 137d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 138d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_AMR 139248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "AMRInterface.h" 140248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "AMRCreation.h" 141d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 142d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_AMRWB 143248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "AMRWBInterface.h" 144248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "AMRWBCreation.h" 145d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 146d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ILBC 147248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "ilbc.h" 148d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 149248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#if (defined CODEC_ISAC || defined CODEC_ISAC_SWB) 150248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "isac.h" 151d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 152d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef NETEQ_ISACFIX_CODEC 153248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "isacfix.h" 154248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#ifdef CODEC_ISAC 155248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#error Cannot have both ISAC and ISACfix defined. Please de-select one in the beginning of RTPencode.cpp 156248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#endif 157d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 158d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722 159248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "g722_interface.h" 160d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 161d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1_24 162248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "G722_1Interface.h" 163d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 164d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1_32 165248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "G722_1Interface.h" 166d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 167d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1_16 168248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "G722_1Interface.h" 169d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 170d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1C_24 171248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "G722_1Interface.h" 172d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 173d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1C_32 174248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "G722_1Interface.h" 175d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 176d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1C_48 177248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "G722_1Interface.h" 178d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 179d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G726 180248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "G726Creation.h" 181248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "G726Interface.h" 182d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 183d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_GSMFR 184248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "GSMFRInterface.h" 185248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "GSMFRCreation.h" 186d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 187d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \ 188248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48)) 189248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "webrtc_cng.h" 190d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 191248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#if ((defined CODEC_SPEEX_8) || (defined CODEC_SPEEX_16)) 192248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "SpeexInterface.h" 193d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 194d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 195d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/***********************************/ 196d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/* Global codec instance variables */ 197d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/***********************************/ 198d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 199248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingWebRtcVadInst* VAD_inst[2]; 200d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 201d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722 202248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingG722EncInst* g722EncState[2]; 203d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 204d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 205d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1_24 206248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingG722_1_24_encinst_t* G722_1_24enc_inst[2]; 207d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 208d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1_32 209248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingG722_1_32_encinst_t* G722_1_32enc_inst[2]; 210d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 211d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1_16 212248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingG722_1_16_encinst_t* G722_1_16enc_inst[2]; 213d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 214d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1C_24 215248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingG722_1C_24_encinst_t* G722_1C_24enc_inst[2]; 216d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 217d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1C_32 218248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingG722_1C_32_encinst_t* G722_1C_32enc_inst[2]; 219d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 220d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1C_48 221248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingG722_1C_48_encinst_t* G722_1C_48enc_inst[2]; 222d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 223d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G726 224248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingG726_encinst_t* G726enc_inst[2]; 225d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 226d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G729 227248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingG729_encinst_t* G729enc_inst[2]; 228d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 229d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G729_1 230248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingG729_1_inst_t* G729_1_inst[2]; 231d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 232d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_AMR 233248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingAMR_encinst_t* AMRenc_inst[2]; 234248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kastingint16_t AMR_bitrate; 235d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 236d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_AMRWB 237248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingAMRWB_encinst_t* AMRWBenc_inst[2]; 238248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kastingint16_t AMRWB_bitrate; 239d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 240d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ILBC 241248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingIlbcEncoderInstance* iLBCenc_inst[2]; 242d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 243d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ISAC 244248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingISACStruct* ISAC_inst[2]; 245d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 246d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef NETEQ_ISACFIX_CODEC 247248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingISACFIX_MainStruct* ISAC_inst[2]; 248d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 249d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ISAC_SWB 250248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingISACStruct* ISACSWB_inst[2]; 251d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 252d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_GSMFR 253248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingGSMFR_encinst_t* GSMFRenc_inst[2]; 254d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 255d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \ 256248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48)) 257248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingCNG_enc_inst* CNGenc_inst[2]; 258d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 259d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_SPEEX_8 260248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingSPEEX_encinst_t* SPEEX8enc_inst[2]; 261d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 262d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_SPEEX_16 263248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingSPEEX_encinst_t* SPEEX16enc_inst[2]; 264248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#endif 265248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 266248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kastingint main(int argc, char* argv[]) { 267248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int packet_size, fs; 268248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting webrtc::NetEqDecoder usedCodec; 269248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int payloadType; 270248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int bitrate = 0; 271248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int useVAD, vad; 272248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int useRed = 0; 273248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int len, enc_len; 274248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int16_t org_data[4000]; 275248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting unsigned char rtp_data[8000]; 276248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int16_t seqNo = 0xFFF; 277248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting uint32_t ssrc = 1235412312; 278248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting uint32_t timestamp = 0xAC1245; 279248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting uint16_t length, plen; 280248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting uint32_t offset; 281248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting double sendtime = 0; 282248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int red_PT[2] = {0}; 283248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting uint32_t red_TS[2] = {0}; 284248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting uint16_t red_len[2] = {0}; 285248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int RTPheaderLen = 12; 286248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting uint8_t red_data[8000]; 287d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef INSERT_OLD_PACKETS 288248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting uint16_t old_length, old_plen; 289248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int old_enc_len; 290248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int first_old_packet = 1; 291248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting unsigned char old_rtp_data[8000]; 292248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int packet_age = 0; 293d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 294d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef INSERT_DTMF_PACKETS 295248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int NTone = 1; 296248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int DTMFfirst = 1; 297248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting uint32_t DTMFtimestamp; 298248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting bool dtmfSent = false; 299248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#endif 300248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting bool usingStereo = false; 301248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int stereoMode = 0; 302248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int numChannels = 1; 303248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 304248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* check number of parameters */ 305248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((argc != 6) && (argc != 7)) { 306248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* print help text and exit */ 307248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Application to encode speech into an RTP stream.\n"); 3082a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("The program reads a PCM file and encodes is using the specified " 3092a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "codec.\n"); 3102a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("The coded speech is packetized in RTP packest and written to the " 3112a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "output file.\n"); 3122a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("The format of the RTP stream file is simlilar to that of " 3132a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "rtpplay,\n"); 314248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("but with the receive time euqal to 0 for all packets.\n"); 315248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Usage:\n\n"); 316248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("%s PCMfile RTPfile frameLen codec useVAD bitrate\n", argv[0]); 317248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("where:\n"); 318248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 319248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("PCMfile : PCM speech input file\n\n"); 320248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 321248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("RTPfile : RTP stream output file\n\n"); 322248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 3232a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("frameLen : 80...960... Number of samples per packet (limit " 3242a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "depends on codec)\n\n"); 325248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 326248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("codecName\n"); 327d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_PCM16B 328248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf(" : pcm16b 16 bit PCM (8kHz)\n"); 329d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 330d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_PCM16B_WB 331248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf(" : pcm16b_wb 16 bit PCM (16kHz)\n"); 332d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 333d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_PCM16B_32KHZ 334248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf(" : pcm16b_swb32 16 bit PCM (32kHz)\n"); 335d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 336d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_PCM16B_48KHZ 337248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf(" : pcm16b_swb48 16 bit PCM (48kHz)\n"); 338d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 339d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G711 340248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf(" : pcma g711 A-law (8kHz)\n"); 341d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 342d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G711 343248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf(" : pcmu g711 u-law (8kHz)\n"); 344d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 345d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G729 3462a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf(" : g729 G729 (8kHz and 8kbps) CELP (One-Three " 3472a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "frame(s)/packet)\n"); 348d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 349d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G729_1 3502a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf(" : g729.1 G729.1 (16kHz) variable rate (8--32 " 3512a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "kbps)\n"); 352d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 353d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1_16 3542a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf(" : g722.1_16 G722.1 coder (16kHz) (g722.1 with " 3552a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "16kbps)\n"); 356d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 357d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1_24 3582a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf(" : g722.1_24 G722.1 coder (16kHz) (the 24kbps " 3592a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "version)\n"); 360d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 361d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1_32 3622a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf(" : g722.1_32 G722.1 coder (16kHz) (the 32kbps " 3632a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "version)\n"); 364d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 365d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1C_24 3662a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf(" : g722.1C_24 G722.1 C coder (32kHz) (the 24kbps " 3672a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "version)\n"); 368d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 369d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1C_32 3702a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf(" : g722.1C_32 G722.1 C coder (32kHz) (the 32kbps " 3712a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "version)\n"); 372d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 373d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1C_48 3742a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf(" : g722.1C_48 G722.1 C coder (32kHz) (the 48kbps " 3752a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "version)\n"); 376d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 377d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 378d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G726 379248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf(" : g726_16 G726 coder (8kHz) 16kbps\n"); 380248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf(" : g726_24 G726 coder (8kHz) 24kbps\n"); 381248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf(" : g726_32 G726 coder (8kHz) 32kbps\n"); 382248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf(" : g726_40 G726 coder (8kHz) 40kbps\n"); 383d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 384d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_AMR 3852a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf(" : AMRXk Adaptive Multi Rate CELP codec " 3862a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "(8kHz)\n"); 3872a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf(" X = 4.75, 5.15, 5.9, 6.7, 7.4, 7.95, " 3882a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "10.2 or 12.2\n"); 389d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 390d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_AMRWB 3912a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf(" : AMRwbXk Adaptive Multi Rate Wideband CELP " 3922a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "codec (16kHz)\n"); 3932a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf(" X = 7, 9, 12, 14, 16, 18, 20, 23 or " 3942a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "24\n"); 395d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 396d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ILBC 397248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf(" : ilbc iLBC codec (8kHz and 13.8kbps)\n"); 398d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 399d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ISAC 4002a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf(" : isac iSAC (16kHz and 32.0 kbps). To set " 4012a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "rate specify a rate parameter as last parameter\n"); 402d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 403d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ISAC_SWB 4042a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf(" : isacswb iSAC SWB (32kHz and 32.0-52.0 kbps). " 4052a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "To set rate specify a rate parameter as last parameter\n"); 406d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 407d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_GSMFR 408248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf(" : gsmfr GSM FR codec (8kHz and 13kbps)\n"); 409d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 410d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722 4112a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf(" : g722 g722 coder (16kHz) (the 64kbps " 4122a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "version)\n"); 413d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 414d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_SPEEX_8 415248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf(" : speex8 speex coder (8 kHz)\n"); 416d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 417d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_SPEEX_16 418248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf(" : speex16 speex coder (16 kHz)\n"); 419d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 420d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_RED 421d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G711 4222a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf(" : red_pcm Redundancy RTP packet with 2*G711A " 4232a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "frames\n"); 424d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 425d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ISAC 4262a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf(" : red_isac Redundancy RTP packet with 2*iSAC " 4272a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "frames\n"); 428d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 429d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 430248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\n"); 431d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 432d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \ 433248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48)) 434248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("useVAD : 0 Voice Activity Detection is switched off\n"); 435248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf(" : 1 Voice Activity Detection is switched on\n\n"); 436d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#else 4372a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("useVAD : 0 Voice Activity Detection switched off (on not " 4382a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "supported)\n\n"); 439248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#endif 4402a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("bitrate : Codec bitrate in bps (only applies to vbr " 4412a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "codecs)\n\n"); 442248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 443248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return (0); 444248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 445248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 446248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting FILE* in_file = fopen(argv[1], "rb"); 447248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting CHECK_NOT_NULL(in_file); 448248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Input file: %s\n", argv[1]); 449248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting FILE* out_file = fopen(argv[2], "wb"); 450248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting CHECK_NOT_NULL(out_file); 451248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Output file: %s\n\n", argv[2]); 452248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting packet_size = atoi(argv[3]); 453f045e4da43e671ae511aa1d9b6ef2968256a745dPeter Kasting if (packet_size <= 0) { 454f045e4da43e671ae511aa1d9b6ef2968256a745dPeter Kasting printf("Packet size %d must be positive", packet_size); 455f045e4da43e671ae511aa1d9b6ef2968256a745dPeter Kasting return -1; 456f045e4da43e671ae511aa1d9b6ef2968256a745dPeter Kasting } 457248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Packet size: %i\n", packet_size); 458248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 459248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // check for stereo 460248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (argv[4][strlen(argv[4]) - 1] == '*') { 461248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // use stereo 462248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting usingStereo = true; 463248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting numChannels = 2; 464248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting argv[4][strlen(argv[4]) - 1] = '\0'; 465248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 466248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 467248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting NetEQTest_GetCodec_and_PT(argv[4], &usedCodec, &payloadType, packet_size, &fs, 468248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting &bitrate, &useRed); 469248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 470248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (useRed) { 471248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting RTPheaderLen = 12 + 4 + 1; /* standard RTP = 12; 4 bytes per redundant 472248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting payload, except last one which is 1 byte */ 473248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 474248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 475248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting useVAD = atoi(argv[5]); 476d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#if !(defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \ 477248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48)) 478248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (useVAD != 0) { 479248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: this simulation does not support VAD/DTX/CNG\n"); 480248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 481248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#endif 482248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 483248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // check stereo type 484248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (usingStereo) { 485248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting switch (usedCodec) { 486248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // sample based codecs 487248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderPCMu: 488248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderPCMa: 489248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderG722: { 490248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // 1 octet per sample 491248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting stereoMode = STEREO_MODE_SAMPLE_1; 492248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 493248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 494248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderPCM16B: 495248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderPCM16Bwb: 496248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderPCM16Bswb32kHz: 497248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderPCM16Bswb48kHz: { 498248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // 2 octets per sample 499248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting stereoMode = STEREO_MODE_SAMPLE_2; 500248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 501248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 502d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 503248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // fixed-rate frame codecs (with internal VAD) 504248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting default: { 505248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Cannot use codec %s as stereo codec\n", argv[4]); 506248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 507248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 508d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 509248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 510248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 511248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((usedCodec == webrtc::kDecoderISAC) || 512248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (usedCodec == webrtc::kDecoderISACswb)) { 513248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (argc != 7) { 514248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (usedCodec == webrtc::kDecoderISAC) { 515248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting bitrate = 32000; 5162a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("Running iSAC at default bitrate of 32000 bps (to specify " 5172a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "explicitly add the bps as last parameter)\n"); 518248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else // (usedCodec==webrtc::kDecoderISACswb) 519248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting { 520248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting bitrate = 56000; 5212a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("Running iSAC at default bitrate of 56000 bps (to specify " 5222a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "explicitly add the bps as last parameter)\n"); 523248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 524248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 525248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting bitrate = atoi(argv[6]); 526248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (usedCodec == webrtc::kDecoderISAC) { 527248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((bitrate < 10000) || (bitrate > 32000)) { 5282a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("Error: iSAC bitrate must be between 10000 and 32000 bps (%i " 5292a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "is invalid)\n", bitrate); 530248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 531d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 532248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Running iSAC at bitrate of %i bps\n", bitrate); 533248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else // (usedCodec==webrtc::kDecoderISACswb) 534248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting { 535248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((bitrate < 32000) || (bitrate > 56000)) { 5362a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("Error: iSAC SWB bitrate must be between 32000 and 56000 bps " 5372a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "(%i is invalid)\n", bitrate); 538248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 539d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 540248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 541d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 542248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 543248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (argc == 7) { 5442a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("Error: Bitrate parameter can only be specified for iSAC, G.723, " 5452a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "and G.729.1\n"); 546248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 547d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 548248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 549248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 550248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (useRed) { 551248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Redundancy engaged. "); 552248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 553248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Used codec: %i\n", usedCodec); 554248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Payload type: %i\n", payloadType); 555248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 556248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting NetEQTest_init_coders(usedCodec, packet_size, bitrate, fs, useVAD, 557248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting numChannels); 558248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 559248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* write file header */ 560248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // fprintf(out_file, "#!RTPencode%s\n", "1.0"); 561248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting fprintf(out_file, "#!rtpplay%s \n", 562248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting "1.0"); // this is the string that rtpplay needs 563248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting uint32_t dummy_variable = 0; // should be converted to network endian format, 564248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // but does not matter when 0 565248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (fwrite(&dummy_variable, 4, 1, out_file) != 1) { 566248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return -1; 567248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 568248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (fwrite(&dummy_variable, 4, 1, out_file) != 1) { 569248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return -1; 570248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 571248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (fwrite(&dummy_variable, 4, 1, out_file) != 1) { 572248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return -1; 573248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 574248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (fwrite(&dummy_variable, 2, 1, out_file) != 1) { 575248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return -1; 576248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 577248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (fwrite(&dummy_variable, 2, 1, out_file) != 1) { 578248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return -1; 579248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 580d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 581d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef TIMESTAMP_WRAPAROUND 582248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting timestamp = 0xFFFFFFFF - fs * 10; /* should give wrap-around in 10 seconds */ 583d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 584d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#if defined(RANDOM_DATA) | defined(RANDOM_PAYLOAD_DATA) 585248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting srand(RANDOM_SEED); 586d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 587d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 588248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* if redundancy is used, the first redundant payload is zero length */ 589248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting red_len[0] = 0; 590d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 591248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* read first frame */ 592248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting len = fread(org_data, 2, packet_size * numChannels, in_file) / numChannels; 593d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 594248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* de-interleave if stereo */ 595248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (usingStereo) { 596248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting stereoDeInterleave(org_data, len * numChannels); 597248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 598d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 599248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting while (len == packet_size) { 600d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef INSERT_DTMF_PACKETS 601248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting dtmfSent = false; 602248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 603248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sendtime >= NTone * DTMF_PACKET_INTERVAL) { 604248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sendtime < NTone * DTMF_PACKET_INTERVAL + DTMF_DURATION) { 605248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // tone has not ended 606248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (DTMFfirst == 1) { 607248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting DTMFtimestamp = timestamp; // save this timestamp 608248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting DTMFfirst = 0; 609d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 610248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting makeRTPheader(rtp_data, NETEQ_CODEC_AVT_PT, seqNo, DTMFtimestamp, ssrc); 611248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting enc_len = makeDTMFpayload( 612248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting &rtp_data[12], NTone % 12, 0, 4, 613248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (int)(sendtime - NTone * DTMF_PACKET_INTERVAL) * (fs / 1000) + len); 614248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 615248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // tone has ended 616248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting makeRTPheader(rtp_data, NETEQ_CODEC_AVT_PT, seqNo, DTMFtimestamp, ssrc); 617248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting enc_len = makeDTMFpayload(&rtp_data[12], NTone % 12, 1, 4, 618248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting DTMF_DURATION * (fs / 1000)); 619248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting NTone++; 620248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting DTMFfirst = 1; 621248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 622248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 623248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* write RTP packet to file */ 624248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting length = htons(12 + enc_len + 8); 625248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting plen = htons(12 + enc_len); 626248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting offset = (uint32_t)sendtime; //(timestamp/(fs/1000)); 627248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting offset = htonl(offset); 628248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (fwrite(&length, 2, 1, out_file) != 1) { 629248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return -1; 630248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 631248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (fwrite(&plen, 2, 1, out_file) != 1) { 632248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return -1; 633248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 634248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (fwrite(&offset, 4, 1, out_file) != 1) { 635248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return -1; 636248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 637248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (fwrite(rtp_data, 12 + enc_len, 1, out_file) != 1) { 638248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return -1; 639248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 640248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 641248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting dtmfSent = true; 642248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 643d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 644d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 645d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef NO_DTMF_OVERDUB 646248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* If DTMF is sent, we should not send any speech packets during the same 647248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting * time */ 648248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (dtmfSent) { 649248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting enc_len = 0; 650248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 651d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 652248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* encode frame */ 653248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting enc_len = 654248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting NetEQTest_encode(usedCodec, org_data, packet_size, &rtp_data[12], fs, 655248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting &vad, useVAD, bitrate, numChannels); 656248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (enc_len == -1) { 657248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error encoding frame\n"); 658248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 659248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 660d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 661248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (usingStereo && stereoMode != STEREO_MODE_FRAME && vad == 1) { 662248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // interleave the encoded payload for sample-based codecs (not for CNG) 663248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting stereoInterleave(&rtp_data[12], enc_len, stereoMode); 664248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 665248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#ifdef NO_DTMF_OVERDUB 666248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 667248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#endif 668d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 669248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (enc_len > 0 && 670248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (sendtime <= STOPSENDTIME || sendtime > RESTARTSENDTIME)) { 671248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (useRed) { 672248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (red_len[0] > 0) { 673248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting memmove(&rtp_data[RTPheaderLen + red_len[0]], &rtp_data[12], enc_len); 674248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting memcpy(&rtp_data[RTPheaderLen], red_data, red_len[0]); 675248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 676248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting red_len[1] = enc_len; 677248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting red_TS[1] = timestamp; 678248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (vad) 679248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting red_PT[1] = payloadType; 680248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting else 681248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting red_PT[1] = NETEQ_CODEC_CN_PT; 682248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 683248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting makeRedundantHeader(rtp_data, red_PT, 2, red_TS, red_len, seqNo++, 684248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ssrc); 685248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 686248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting enc_len += red_len[0] + RTPheaderLen - 12; 687248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { // do not use redundancy payload for this packet, i.e., only 688248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // last payload 689248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting memmove(&rtp_data[RTPheaderLen - 4], &rtp_data[12], enc_len); 690248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // memcpy(&rtp_data[RTPheaderLen], red_data, red_len[0]); 691248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 692248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting red_len[1] = enc_len; 693248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting red_TS[1] = timestamp; 694248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (vad) 695248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting red_PT[1] = payloadType; 696248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting else 697248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting red_PT[1] = NETEQ_CODEC_CN_PT; 698248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 699248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting makeRedundantHeader(rtp_data, red_PT, 2, red_TS, red_len, seqNo++, 700248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ssrc); 701248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 702248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting enc_len += red_len[0] + RTPheaderLen - 4 - 703248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 12; // 4 is length of redundancy header (not used) 704248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 705248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 706248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* make RTP header */ 707248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (vad) // regular speech data 708248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting makeRTPheader(rtp_data, payloadType, seqNo++, timestamp, ssrc); 709248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting else // CNG data 710248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting makeRTPheader(rtp_data, NETEQ_CODEC_CN_PT, seqNo++, timestamp, ssrc); 711248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 712d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef MULTIPLE_SAME_TIMESTAMP 713248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int mult_pack = 0; 714248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting do { 715248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#endif // MULTIPLE_SAME_TIMESTAMP 716248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* write RTP packet to file */ 717248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting length = htons(12 + enc_len + 8); 718248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting plen = htons(12 + enc_len); 719248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting offset = (uint32_t)sendtime; 720248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting //(timestamp/(fs/1000)); 721248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting offset = htonl(offset); 722248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (fwrite(&length, 2, 1, out_file) != 1) { 723248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return -1; 724248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 725248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (fwrite(&plen, 2, 1, out_file) != 1) { 726248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return -1; 727248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 728248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (fwrite(&offset, 4, 1, out_file) != 1) { 729248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return -1; 730248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 731d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef RANDOM_DATA 732248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting for (int k = 0; k < 12 + enc_len; k++) { 733248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtp_data[k] = rand() + rand(); 734248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 735d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 736d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef RANDOM_PAYLOAD_DATA 737248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting for (int k = 12; k < 12 + enc_len; k++) { 738248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtp_data[k] = rand() + rand(); 739248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 740d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 741248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (fwrite(rtp_data, 12 + enc_len, 1, out_file) != 1) { 742248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return -1; 743248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 744d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef MULTIPLE_SAME_TIMESTAMP 745248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } while ((seqNo % REPEAT_PACKET_DISTANCE == 0) && 746248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (mult_pack++ < REPEAT_PACKET_COUNT)); 747248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#endif // MULTIPLE_SAME_TIMESTAMP 748d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 749d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef INSERT_OLD_PACKETS 750248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (packet_age >= OLD_PACKET * fs) { 751248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (!first_old_packet) { 752248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // send the old packet 753248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (fwrite(&old_length, 2, 1, out_file) != 1) { 754248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return -1; 755248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 756248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (fwrite(&old_plen, 2, 1, out_file) != 1) { 757248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return -1; 758248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 759248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (fwrite(&offset, 4, 1, out_file) != 1) { 760248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return -1; 761248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 762248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (fwrite(old_rtp_data, 12 + old_enc_len, 1, out_file) != 1) { 763248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return -1; 764248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 765248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 766248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // store current packet as old 767248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting old_length = length; 768248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting old_plen = plen; 769248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting memcpy(old_rtp_data, rtp_data, 12 + enc_len); 770248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting old_enc_len = enc_len; 771248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting first_old_packet = 0; 772248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting packet_age = 0; 773248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 774248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting packet_age += packet_size; 775248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#endif 776248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 777248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (useRed) { 778248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting/* move data to redundancy store */ 779d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ISAC 780248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (usedCodec == webrtc::kDecoderISAC) { 781248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting assert(!usingStereo); // Cannot handle stereo yet 782248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting red_len[0] = WebRtcIsac_GetRedPayload(ISAC_inst[0], red_data); 783248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 784d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 785248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting memcpy(red_data, &rtp_data[RTPheaderLen + red_len[0]], enc_len); 786248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting red_len[0] = red_len[1]; 787248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#ifdef CODEC_ISAC 788d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 789248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#endif 790248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting red_TS[0] = red_TS[1]; 791248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting red_PT[0] = red_PT[1]; 792248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 793248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 794d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 795248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* read next frame */ 796248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting len = fread(org_data, 2, packet_size * numChannels, in_file) / numChannels; 797248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* de-interleave if stereo */ 798248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (usingStereo) { 799248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting stereoDeInterleave(org_data, len * numChannels); 800248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 801d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 802248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (payloadType == NETEQ_CODEC_G722_PT) 803248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting timestamp += len >> 1; 804248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting else 805248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting timestamp += len; 806d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 807248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting sendtime += (double)len / (fs / 1000); 808248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 809d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 810248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting NetEQTest_free_coders(usedCodec, numChannels); 811248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting fclose(in_file); 812248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting fclose(out_file); 813248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Done!\n"); 814d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 815248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return (0); 816248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting} 817d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 818d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/****************/ 819d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/* Subfunctions */ 820d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/****************/ 821d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 822d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.orgvoid NetEQTest_GetCodec_and_PT(char* name, 823d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org webrtc::NetEqDecoder* codec, 824d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int* PT, 825d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int frameLen, 826d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int* fs, 827d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int* bitrate, 828d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int* useRed) { 829248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *bitrate = 0; /* Default bitrate setting */ 830248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *useRed = 0; /* Default no redundancy */ 831248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 832248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (!strcmp(name, "pcmu")) { 833248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *codec = webrtc::kDecoderPCMu; 834248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *PT = NETEQ_CODEC_PCMU_PT; 835248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *fs = 8000; 836248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (!strcmp(name, "pcma")) { 837248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *codec = webrtc::kDecoderPCMa; 838248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *PT = NETEQ_CODEC_PCMA_PT; 839248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *fs = 8000; 840248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (!strcmp(name, "pcm16b")) { 841248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *codec = webrtc::kDecoderPCM16B; 842248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *PT = NETEQ_CODEC_PCM16B_PT; 843248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *fs = 8000; 844248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (!strcmp(name, "pcm16b_wb")) { 845248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *codec = webrtc::kDecoderPCM16Bwb; 846248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *PT = NETEQ_CODEC_PCM16B_WB_PT; 847248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *fs = 16000; 848248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (!strcmp(name, "pcm16b_swb32")) { 849248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *codec = webrtc::kDecoderPCM16Bswb32kHz; 850248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *PT = NETEQ_CODEC_PCM16B_SWB32KHZ_PT; 851248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *fs = 32000; 852248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (!strcmp(name, "pcm16b_swb48")) { 853248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *codec = webrtc::kDecoderPCM16Bswb48kHz; 854248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *PT = NETEQ_CODEC_PCM16B_SWB48KHZ_PT; 855248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *fs = 48000; 856248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (!strcmp(name, "g722")) { 857248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *codec = webrtc::kDecoderG722; 858248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *PT = NETEQ_CODEC_G722_PT; 859248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *fs = 16000; 860248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if ((!strcmp(name, "ilbc")) && 861248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ((frameLen % 240 == 0) || (frameLen % 160 == 0))) { 862248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *fs = 8000; 863248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *codec = webrtc::kDecoderILBC; 864248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *PT = NETEQ_CODEC_ILBC_PT; 865248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (!strcmp(name, "isac")) { 866248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *fs = 16000; 867248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *codec = webrtc::kDecoderISAC; 868248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *PT = NETEQ_CODEC_ISAC_PT; 869248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (!strcmp(name, "isacswb")) { 870248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *fs = 32000; 871248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *codec = webrtc::kDecoderISACswb; 872248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *PT = NETEQ_CODEC_ISACSWB_PT; 873248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (!strcmp(name, "red_pcm")) { 874248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *codec = webrtc::kDecoderPCMa; 875248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *PT = NETEQ_CODEC_PCMA_PT; /* this will be the PT for the sub-headers */ 876248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *fs = 8000; 877248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *useRed = 1; 878248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (!strcmp(name, "red_isac")) { 879248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *codec = webrtc::kDecoderISAC; 880248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *PT = NETEQ_CODEC_ISAC_PT; /* this will be the PT for the sub-headers */ 881248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *fs = 16000; 882248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *useRed = 1; 883248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 884248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: Not a supported codec (%s)\n", name); 885248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 886248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 887d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org} 888d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 889248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kastingint NetEQTest_init_coders(webrtc::NetEqDecoder coder, 890248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int enc_frameSize, 891248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int bitrate, 892248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int sampfreq, 893248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int vad, 894248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int numChannels) { 895248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int ok = 0; 896248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 897248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting for (int k = 0; k < numChannels; k++) { 898248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting VAD_inst[k] = WebRtcVad_Create(); 899248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (!VAD_inst[k]) { 900248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: Couldn't allocate memory for VAD instance\n"); 901248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 902248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 903248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcVad_Init(VAD_inst[k]); 904248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok == -1) { 905248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: Initialization of VAD struct failed\n"); 906248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 907248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 908d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 909d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \ 910248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48)) 911248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcCng_CreateEnc(&CNGenc_inst[k]); 912248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 913248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: Couldn't allocate memory for CNG encoding instance\n"); 914248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 915248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 916248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq <= 16000) { 917248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcCng_InitEnc(CNGenc_inst[k], sampfreq, 200, 5); 918248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok == -1) { 919248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: Initialization of CNG struct failed. Error code %d\n", 920248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcCng_GetErrorCodeEnc(CNGenc_inst[k])); 921248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 922248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 923248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 924d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 925d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 926248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting switch (coder) { 927d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_PCM16B 928248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderPCM16B: 929d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 930d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_PCM16B_WB 931248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderPCM16Bwb: 932d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 933d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_PCM16B_32KHZ 934248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderPCM16Bswb32kHz: 935d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 936d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_PCM16B_48KHZ 937248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderPCM16Bswb48kHz: 938d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 939d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G711 940248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderPCMu: 941248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderPCMa: 942d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 943d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org // do nothing 944d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 945d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G729 946248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderG729: 947248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 8000) { 948248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((enc_frameSize == 80) || (enc_frameSize == 160) || 949248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (enc_frameSize == 240) || (enc_frameSize == 320) || 950248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (enc_frameSize == 400) || (enc_frameSize == 480)) { 951248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcG729_CreateEnc(&G729enc_inst[k]); 952248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 9532a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("Error: Couldn't allocate memory for G729 encoding " 9542a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "instance\n"); 955248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 956d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 957248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 9582a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("\nError: g729 only supports 10, 20, 30, 40, 50 or 60 " 9592a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "ms!!\n\n"); 960d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org exit(0); 961248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 962248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG729_EncoderInit(G729enc_inst[k], vad); 963248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((vad == 1) && (enc_frameSize != 80)) { 9642a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("\nError - This simulation only supports VAD for G729 at " 9652a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "10ms packets (not %dms)\n", (enc_frameSize >> 3)); 966248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 967248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 968248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - g729 is only developed for 8kHz \n"); 969248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 970d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 971d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 972d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 973d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G729_1 974248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderG729_1: 975248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 16000) { 976248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((enc_frameSize == 320) || (enc_frameSize == 640) || 977248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (enc_frameSize == 960)) { 978248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcG7291_Create(&G729_1_inst[k]); 979248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 9802a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("Error: Couldn't allocate memory for G.729.1 codec " 9812a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "instance\n"); 982248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 983248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 984248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 985248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError: G.729.1 only supports 20, 40 or 60 ms!!\n\n"); 986248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 987248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 988248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (!(((bitrate >= 12000) && (bitrate <= 32000) && 989248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (bitrate % 2000 == 0)) || 990248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (bitrate == 8000))) { 991248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* must be 8, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, or 32 kbps */ 9922a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("\nError: G.729.1 bitrate must be 8000 or 12000--32000 in " 9932a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "steps of 2000 bps\n"); 994d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org exit(0); 995248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 996248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG7291_EncoderInit(G729_1_inst[k], bitrate, 0 /* flag8kHz*/, 997248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 0 /*flagG729mode*/); 998248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 999248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - G.729.1 input is always 16 kHz \n"); 1000248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1001d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1002d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1003d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1004d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_SPEEX_8 1005248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderSPEEX_8: 1006248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 8000) { 1007248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((enc_frameSize == 160) || (enc_frameSize == 320) || 1008248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (enc_frameSize == 480)) { 1009248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcSpeex_CreateEnc(&SPEEX8enc_inst[k], sampfreq); 1010248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 10112a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("Error: Couldn't allocate memory for Speex encoding " 10122a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "instance\n"); 1013248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1014d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1015248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1016248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError: Speex only supports 20, 40, and 60 ms!!\n\n"); 1017248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1018248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1019248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((vad == 1) && (enc_frameSize != 160)) { 10202a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("\nError - This simulation only supports VAD for Speex at " 10212a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "20ms packets (not %dms)\n", 1022248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (enc_frameSize >> 3)); 1023248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting vad = 0; 1024248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1025248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcSpeex_EncoderInit(SPEEX8enc_inst[k], 0 /*vbr*/, 1026248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 3 /*complexity*/, vad); 1027248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) 1028248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1029d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } else { 10302a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("\nError - Speex8 called with sample frequency other than 8 " 10312a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "kHz.\n\n"); 1032d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1033d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1034d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1035d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_SPEEX_16 1036248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderSPEEX_16: 1037248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 16000) { 1038248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((enc_frameSize == 320) || (enc_frameSize == 640) || 1039248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (enc_frameSize == 960)) { 1040248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcSpeex_CreateEnc(&SPEEX16enc_inst[k], sampfreq); 1041248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 10422a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("Error: Couldn't allocate memory for Speex encoding " 10432a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "instance\n"); 1044248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1045d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1046248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1047248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError: Speex only supports 20, 40, and 60 ms!!\n\n"); 1048248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1049248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1050248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((vad == 1) && (enc_frameSize != 320)) { 10512a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("\nError - This simulation only supports VAD for Speex at " 10522a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "20ms packets (not %dms)\n", 1053248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (enc_frameSize >> 4)); 1054248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting vad = 0; 1055248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1056248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcSpeex_EncoderInit(SPEEX16enc_inst[k], 0 /*vbr*/, 1057248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 3 /*complexity*/, vad); 1058248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) 1059248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1060d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } else { 10612a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("\nError - Speex16 called with sample frequency other than 16 " 10622a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "kHz.\n\n"); 1063d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1064d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1065d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1066d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1067d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1_16 1068248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderG722_1_16: 1069248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 16000) { 1070248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcG7221_CreateEnc16(&G722_1_16enc_inst[k]); 1071248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 1072248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: Couldn't allocate memory for G.722.1 instance\n"); 1073248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1074248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1075248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (enc_frameSize == 320) { 1076248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1077248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError: G722.1 only supports 20 ms!!\n\n"); 1078d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org exit(0); 1079248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1080248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG7221_EncoderInit16((G722_1_16_encinst_t*)G722_1_16enc_inst[k]); 1081248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1082248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - G722.1 is only developed for 16kHz \n"); 1083248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1084d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1085d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1086d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1087d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1_24 1088248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderG722_1_24: 1089248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 16000) { 1090248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcG7221_CreateEnc24(&G722_1_24enc_inst[k]); 1091248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 1092248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: Couldn't allocate memory for G.722.1 instance\n"); 1093248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1094248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1095248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (enc_frameSize == 320) { 1096248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1097248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError: G722.1 only supports 20 ms!!\n\n"); 1098d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org exit(0); 1099248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1100248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG7221_EncoderInit24((G722_1_24_encinst_t*)G722_1_24enc_inst[k]); 1101248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1102248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - G722.1 is only developed for 16kHz \n"); 1103248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1104d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1105d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1106d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1107d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1_32 1108248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderG722_1_32: 1109248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 16000) { 1110248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcG7221_CreateEnc32(&G722_1_32enc_inst[k]); 1111248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 1112248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: Couldn't allocate memory for G.722.1 instance\n"); 1113248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1114248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1115248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (enc_frameSize == 320) { 1116248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1117248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError: G722.1 only supports 20 ms!!\n\n"); 1118d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org exit(0); 1119248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1120248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG7221_EncoderInit32((G722_1_32_encinst_t*)G722_1_32enc_inst[k]); 1121248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1122248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - G722.1 is only developed for 16kHz \n"); 1123248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1124d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1125d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1126d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1127d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1C_24 1128248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderG722_1C_24: 1129248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 32000) { 1130248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcG7221C_CreateEnc24(&G722_1C_24enc_inst[k]); 1131248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 1132248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: Couldn't allocate memory for G.722.1C instance\n"); 1133248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1134248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1135248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (enc_frameSize == 640) { 1136248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1137248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError: G722.1 C only supports 20 ms!!\n\n"); 1138d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org exit(0); 1139248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1140248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG7221C_EncoderInit24( 1141248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (G722_1C_24_encinst_t*)G722_1C_24enc_inst[k]); 1142248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1143248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - G722.1 C is only developed for 32kHz \n"); 1144248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1145d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1146d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1147d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1148d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1C_32 1149248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderG722_1C_32: 1150248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 32000) { 1151248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcG7221C_CreateEnc32(&G722_1C_32enc_inst[k]); 1152248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 1153248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: Couldn't allocate memory for G.722.1C instance\n"); 1154248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1155248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1156248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (enc_frameSize == 640) { 1157248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1158248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError: G722.1 C only supports 20 ms!!\n\n"); 1159d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org exit(0); 1160248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1161248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG7221C_EncoderInit32( 1162248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (G722_1C_32_encinst_t*)G722_1C_32enc_inst[k]); 1163248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1164248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - G722.1 C is only developed for 32kHz \n"); 1165248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1166d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1167d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1168d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1169d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1C_48 1170248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderG722_1C_48: 1171248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 32000) { 1172248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcG7221C_CreateEnc48(&G722_1C_48enc_inst[k]); 1173248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 1174248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: Couldn't allocate memory for G.722.1C instance\n"); 1175248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1176248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1177248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (enc_frameSize == 640) { 1178248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1179248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError: G722.1 C only supports 20 ms!!\n\n"); 1180d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org exit(0); 1181248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1182248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG7221C_EncoderInit48( 1183248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (G722_1C_48_encinst_t*)G722_1C_48enc_inst[k]); 1184248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1185248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - G722.1 C is only developed for 32kHz \n"); 1186248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1187d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1188d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1189d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1190d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722 1191248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderG722: 1192248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 16000) { 1193248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (enc_frameSize % 2 == 0) { 1194248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1195248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf( 1196248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting "\nError - g722 frames must have an even number of " 1197248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting "enc_frameSize\n"); 1198d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org exit(0); 1199248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1200248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG722_CreateEncoder(&g722EncState[k]); 1201248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG722_EncoderInit(g722EncState[k]); 1202248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1203248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - g722 is only developed for 16kHz \n"); 1204248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1205d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1206d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1207d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1208d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_AMR 1209248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderAMR: 1210248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 8000) { 1211248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcAmr_CreateEnc(&AMRenc_inst[k]); 1212248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 1213248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf( 1214248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting "Error: Couldn't allocate memory for AMR encoding instance\n"); 1215248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1216248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1217248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((enc_frameSize == 160) || (enc_frameSize == 320) || 1218248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (enc_frameSize == 480)) { 1219248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1220248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - AMR must have a multiple of 160 enc_frameSize\n"); 1221d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org exit(0); 1222248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1223248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcAmr_EncoderInit(AMRenc_inst[k], vad); 1224248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcAmr_EncodeBitmode(AMRenc_inst[k], AMRBandwidthEfficient); 1225248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting AMR_bitrate = bitrate; 1226248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1227248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - AMR is only developed for 8kHz \n"); 1228248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1229d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1230d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1231d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1232d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_AMRWB 1233248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderAMRWB: 1234248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 16000) { 1235248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcAmrWb_CreateEnc(&AMRWBenc_inst[k]); 1236248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 12372a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("Error: Couldn't allocate memory for AMRWB encoding " 12382a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "instance\n"); 1239248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1240248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1241248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (((enc_frameSize / 320) < 0) || ((enc_frameSize / 320) > 3) || 1242248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ((enc_frameSize % 320) != 0)) { 1243248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - AMRwb must have frameSize of 20, 40 or 60ms\n"); 1244248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1245248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1246248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcAmrWb_EncoderInit(AMRWBenc_inst[k], vad); 1247248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (bitrate == 7000) { 1248248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting AMRWB_bitrate = AMRWB_MODE_7k; 1249248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (bitrate == 9000) { 1250248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting AMRWB_bitrate = AMRWB_MODE_9k; 1251248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (bitrate == 12000) { 1252248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting AMRWB_bitrate = AMRWB_MODE_12k; 1253248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (bitrate == 14000) { 1254248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting AMRWB_bitrate = AMRWB_MODE_14k; 1255248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (bitrate == 16000) { 1256248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting AMRWB_bitrate = AMRWB_MODE_16k; 1257248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (bitrate == 18000) { 1258248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting AMRWB_bitrate = AMRWB_MODE_18k; 1259248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (bitrate == 20000) { 1260248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting AMRWB_bitrate = AMRWB_MODE_20k; 1261248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (bitrate == 23000) { 1262248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting AMRWB_bitrate = AMRWB_MODE_23k; 1263248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (bitrate == 24000) { 1264248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting AMRWB_bitrate = AMRWB_MODE_24k; 1265248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1266248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcAmrWb_EncodeBitmode(AMRWBenc_inst[k], AMRBandwidthEfficient); 1267d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1268d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } else { 1269248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - AMRwb is only developed for 16kHz \n"); 1270248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1271d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1272d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1273d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1274d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ILBC 1275248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderILBC: 1276248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 8000) { 1277248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcIlbcfix_EncoderCreate(&iLBCenc_inst[k]); 1278248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 12792a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("Error: Couldn't allocate memory for iLBC encoding " 12802a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "instance\n"); 1281d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org exit(0); 1282248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1283248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((enc_frameSize == 160) || (enc_frameSize == 240) || 1284248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (enc_frameSize == 320) || (enc_frameSize == 480)) { 1285248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 12862a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("\nError - iLBC only supports 160, 240, 320 and 480 " 12872a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "enc_frameSize (20, 30, 40 and 60 ms)\n"); 1288248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1289248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1290248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((enc_frameSize == 160) || (enc_frameSize == 320)) { 1291248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* 20 ms version */ 1292248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcIlbcfix_EncoderInit(iLBCenc_inst[k], 20); 1293248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1294248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* 30 ms version */ 1295248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcIlbcfix_EncoderInit(iLBCenc_inst[k], 30); 1296248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1297248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1298248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - iLBC is only developed for 8kHz \n"); 1299248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1300d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1301d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1302d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1303d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ISAC 1304248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderISAC: 1305248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 16000) { 1306248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcIsac_Create(&ISAC_inst[k]); 1307248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 1308248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: Couldn't allocate memory for iSAC instance\n"); 1309248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1310248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1311248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((enc_frameSize == 480) || (enc_frameSize == 960)) { 1312248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1313248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - iSAC only supports frameSize (30 and 60 ms)\n"); 1314248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1315248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1316248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcIsac_EncoderInit(ISAC_inst[k], 1); 1317248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((bitrate < 10000) || (bitrate > 32000)) { 13182a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("\nError - iSAC bitrate has to be between 10000 and 32000 " 13192a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "bps (not %i)\n", 1320248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting bitrate); 1321d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org exit(0); 1322248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1323248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcIsac_Control(ISAC_inst[k], bitrate, enc_frameSize >> 4); 1324248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 13252a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("\nError - iSAC only supports 480 or 960 enc_frameSize (30 or " 13262a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "60 ms)\n"); 1327248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1328d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1329d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1330d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1331d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef NETEQ_ISACFIX_CODEC 1332248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderISAC: 1333248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 16000) { 1334248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcIsacfix_Create(&ISAC_inst[k]); 1335248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 1336248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: Couldn't allocate memory for iSAC instance\n"); 1337248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1338248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1339248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((enc_frameSize == 480) || (enc_frameSize == 960)) { 1340248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1341248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - iSAC only supports frameSize (30 and 60 ms)\n"); 1342d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org exit(0); 1343248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1344248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcIsacfix_EncoderInit(ISAC_inst[k], 1); 1345248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((bitrate < 10000) || (bitrate > 32000)) { 13462a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("\nError - iSAC bitrate has to be between 10000 and 32000 " 13472a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "bps (not %i)\n", bitrate); 1348248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1349248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1350248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcIsacfix_Control(ISAC_inst[k], bitrate, enc_frameSize >> 4); 1351248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 13522a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("\nError - iSAC only supports 480 or 960 enc_frameSize (30 or " 13532a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "60 ms)\n"); 1354248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1355d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1356d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1357d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1358d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ISAC_SWB 1359248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderISACswb: 1360248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 32000) { 1361248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcIsac_Create(&ISACSWB_inst[k]); 1362248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 1363248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: Couldn't allocate memory for iSAC SWB instance\n"); 1364248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1365248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1366248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (enc_frameSize == 960) { 1367248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1368248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - iSAC SWB only supports frameSize 30 ms\n"); 1369d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org exit(0); 1370248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1371248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcIsac_SetEncSampRate(ISACSWB_inst[k], 32000); 1372248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 1373248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: Couldn't set sample rate for iSAC SWB instance\n"); 1374248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1375248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1376248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcIsac_EncoderInit(ISACSWB_inst[k], 1); 1377248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((bitrate < 32000) || (bitrate > 56000)) { 13782a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("\nError - iSAC SWB bitrate has to be between 32000 and " 13792a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "56000 bps (not %i)\n", bitrate); 1380248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1381248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1382248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcIsac_Control(ISACSWB_inst[k], bitrate, enc_frameSize >> 5); 1383248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 13842a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("\nError - iSAC SWB only supports 960 enc_frameSize (30 " 13852a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "ms)\n"); 1386248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1387d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1388d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1389d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1390d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_GSMFR 1391248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderGSMFR: 1392248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 8000) { 1393248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcGSMFR_CreateEnc(&GSMFRenc_inst[k]); 1394248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 13952a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("Error: Couldn't allocate memory for GSM FR encoding " 13962a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "instance\n"); 1397d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org exit(0); 1398248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1399248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((enc_frameSize == 160) || (enc_frameSize == 320) || 1400248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (enc_frameSize == 480)) { 1401248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 14022a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("\nError - GSM FR must have a multiple of 160 " 14032a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "enc_frameSize\n"); 1404248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1405248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1406248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcGSMFR_EncoderInit(GSMFRenc_inst[k], 0); 1407248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1408248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - GSM FR is only developed for 8kHz \n"); 1409248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1410d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1411d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1412d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1413248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting default: 1414d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org printf("Error: unknown codec in call to NetEQTest_init_coders.\n"); 1415d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org exit(0); 1416d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1417248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1418d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1419248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 1420248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return (ok); 1421248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1422248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } // end for 1423d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1424248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return (0); 1425248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting} 1426d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1427d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.orgint NetEQTest_free_coders(webrtc::NetEqDecoder coder, int numChannels) { 1428248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting for (int k = 0; k < numChannels; k++) { 1429248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcVad_Free(VAD_inst[k]); 1430d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \ 1431248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48)) 1432248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcCng_FreeEnc(CNGenc_inst[k]); 1433d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1434d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1435248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting switch (coder) { 1436d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_PCM16B 1437248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderPCM16B: 1438d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1439d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_PCM16B_WB 1440248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderPCM16Bwb: 1441d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1442d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_PCM16B_32KHZ 1443248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderPCM16Bswb32kHz: 1444d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1445d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_PCM16B_48KHZ 1446248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderPCM16Bswb48kHz: 1447d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1448d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G711 1449248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderPCMu: 1450248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderPCMa: 1451d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1452248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // do nothing 1453248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1454d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G729 1455248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderG729: 1456248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG729_FreeEnc(G729enc_inst[k]); 1457248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1458d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1459d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G729_1 1460248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderG729_1: 1461248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG7291_Free(G729_1_inst[k]); 1462248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1463d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1464d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_SPEEX_8 1465248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderSPEEX_8: 1466248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcSpeex_FreeEnc(SPEEX8enc_inst[k]); 1467248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1468d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1469d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_SPEEX_16 1470248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderSPEEX_16: 1471248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcSpeex_FreeEnc(SPEEX16enc_inst[k]); 1472248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1473d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1474d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1475d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1_16 1476248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderG722_1_16: 1477248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG7221_FreeEnc16(G722_1_16enc_inst[k]); 1478248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1479d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1480d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1_24 1481248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderG722_1_24: 1482248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG7221_FreeEnc24(G722_1_24enc_inst[k]); 1483248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1484d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1485d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1_32 1486248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderG722_1_32: 1487248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG7221_FreeEnc32(G722_1_32enc_inst[k]); 1488248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1489d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1490d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1C_24 1491248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderG722_1C_24: 1492248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG7221C_FreeEnc24(G722_1C_24enc_inst[k]); 1493248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1494d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1495d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1C_32 1496248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderG722_1C_32: 1497248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG7221C_FreeEnc32(G722_1C_32enc_inst[k]); 1498248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1499d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1500d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1C_48 1501248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderG722_1C_48: 1502248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG7221C_FreeEnc48(G722_1C_48enc_inst[k]); 1503248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1504d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1505d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722 1506248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderG722: 1507248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG722_FreeEncoder(g722EncState[k]); 1508248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1509d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1510d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_AMR 1511248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderAMR: 1512248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcAmr_FreeEnc(AMRenc_inst[k]); 1513248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1514d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1515d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_AMRWB 1516248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderAMRWB: 1517248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcAmrWb_FreeEnc(AMRWBenc_inst[k]); 1518248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1519d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1520d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ILBC 1521248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderILBC: 1522248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcIlbcfix_EncoderFree(iLBCenc_inst[k]); 1523248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1524d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1525d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ISAC 1526248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderISAC: 1527248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcIsac_Free(ISAC_inst[k]); 1528248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1529d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1530d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef NETEQ_ISACFIX_CODEC 1531248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderISAC: 1532248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcIsacfix_Free(ISAC_inst[k]); 1533248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1534d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1535d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ISAC_SWB 1536248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderISACswb: 1537248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcIsac_Free(ISACSWB_inst[k]); 1538248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1539d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1540d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_GSMFR 1541248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderGSMFR: 1542248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcGSMFR_FreeEnc(GSMFRenc_inst[k]); 1543248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1544d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1545248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting default: 1546248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: unknown codec in call to NetEQTest_init_coders.\n"); 1547248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1548248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1549d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1550248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1551d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1552248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return (0); 1553d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org} 1554d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1555248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kastingint NetEQTest_encode(int coder, 1556248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int16_t* indata, 1557248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int frameLen, 1558248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting unsigned char* encoded, 1559248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int sampleRate, 1560248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int* vad, 1561248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int useVAD, 1562248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int bitrate, 1563248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int numChannels) { 156483ad33a8aed1fb00e422b6abd33c3e8942821c24Peter Kasting int cdlen = 0; 1565248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int16_t* tempdata; 1566248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting static int first_cng = 1; 1567248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int16_t tempLen; 1568248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 1569248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *vad = 1; 1570248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 1571248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // check VAD first 1572248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (useVAD) { 1573248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *vad = 0; 1574248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 1575248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting for (int k = 0; k < numChannels; k++) { 1576248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting tempLen = frameLen; 1577248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting tempdata = &indata[k * frameLen]; 1578248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int localVad = 0; 1579248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* Partition the signal and test each chunk for VAD. 1580248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting All chunks must be VAD=0 to produce a total VAD=0. */ 1581248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting while (tempLen >= 10 * sampleRate / 1000) { 1582248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((tempLen % 30 * sampleRate / 1000) == 1583248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 0) { // tempLen is multiple of 30ms 1584248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting localVad |= WebRtcVad_Process(VAD_inst[k], sampleRate, tempdata, 1585248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 30 * sampleRate / 1000); 1586248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting tempdata += 30 * sampleRate / 1000; 1587248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting tempLen -= 30 * sampleRate / 1000; 1588248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (tempLen >= 20 * sampleRate / 1000) { // tempLen >= 20ms 1589248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting localVad |= WebRtcVad_Process(VAD_inst[k], sampleRate, tempdata, 1590248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 20 * sampleRate / 1000); 1591248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting tempdata += 20 * sampleRate / 1000; 1592248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting tempLen -= 20 * sampleRate / 1000; 1593248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { // use 10ms 1594248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting localVad |= WebRtcVad_Process(VAD_inst[k], sampleRate, tempdata, 1595248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 10 * sampleRate / 1000); 1596248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting tempdata += 10 * sampleRate / 1000; 1597248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting tempLen -= 10 * sampleRate / 1000; 1598d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1599248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1600d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1601248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // aggregate all VAD decisions over all channels 1602248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *vad |= localVad; 1603248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1604d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1605248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (!*vad) { 1606248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // all channels are silent 1607248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting cdlen = 0; 1608248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting for (int k = 0; k < numChannels; k++) { 1609248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcCng_Encode(CNGenc_inst[k], &indata[k * frameLen], 1610248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (frameLen <= 640 ? frameLen : 640) /* max 640 */, 1611248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting encoded, &tempLen, first_cng); 1612248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting encoded += tempLen; 1613248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting cdlen += tempLen; 1614248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1615248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *vad = 0; 1616248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting first_cng = 0; 1617248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return (cdlen); 1618248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1619248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1620d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1621248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // loop over all channels 1622248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int totalLen = 0; 1623d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1624248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting for (int k = 0; k < numChannels; k++) { 1625248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* Encode with the selected coder type */ 1626248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (coder == webrtc::kDecoderPCMu) { /*g711 u-law */ 1627d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G711 1628248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting cdlen = WebRtcG711_EncodeU(indata, frameLen, encoded); 1629d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1630248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (coder == webrtc::kDecoderPCMa) { /*g711 A-law */ 1631d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G711 1632248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting cdlen = WebRtcG711_EncodeA(indata, frameLen, encoded); 1633248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1634d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1635d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_PCM16B 1636248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting else if ((coder == webrtc::kDecoderPCM16B) || 1637248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (coder == webrtc::kDecoderPCM16Bwb) || 1638248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (coder == webrtc::kDecoderPCM16Bswb32kHz) || 1639248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (coder == webrtc:: 1640248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting kDecoderPCM16Bswb48kHz)) { /*pcm16b (8kHz, 16kHz, 1641248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 32kHz or 48kHz) */ 1642248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting cdlen = WebRtcPcm16b_Encode(indata, frameLen, encoded); 1643248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1644d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1645d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722 1646248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting else if (coder == webrtc::kDecoderG722) { /*g722 */ 1647248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting cdlen = WebRtcG722_Encode(g722EncState[k], indata, frameLen, encoded); 1648248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting assert(cdlen == frameLen >> 1); 1649248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1650d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1651d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ILBC 1652248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting else if (coder == webrtc::kDecoderILBC) { /*iLBC */ 1653248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting cdlen = WebRtcIlbcfix_Encode(iLBCenc_inst[k], indata, frameLen, encoded); 1654248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1655d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1656248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#if (defined(CODEC_ISAC) || \ 1657248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting defined(NETEQ_ISACFIX_CODEC)) // TODO(hlundin): remove all 1658248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // NETEQ_ISACFIX_CODEC 1659248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting else if (coder == webrtc::kDecoderISAC) { /*iSAC */ 1660248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int noOfCalls = 0; 1661248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting cdlen = 0; 1662248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting while (cdlen <= 0) { 1663d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ISAC /* floating point */ 1664248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting cdlen = 1665248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcIsac_Encode(ISAC_inst[k], &indata[noOfCalls * 160], encoded); 1666d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#else /* fixed point */ 1667248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting cdlen = WebRtcIsacfix_Encode(ISAC_inst[k], &indata[noOfCalls * 160], 1668248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting encoded); 1669d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1670248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting noOfCalls++; 1671248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1672248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1673d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1674d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ISAC_SWB 1675248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting else if (coder == webrtc::kDecoderISACswb) { /* iSAC SWB */ 1676248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int noOfCalls = 0; 1677248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting cdlen = 0; 1678248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting while (cdlen <= 0) { 1679248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting cdlen = WebRtcIsac_Encode(ISACSWB_inst[k], &indata[noOfCalls * 320], 1680248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting encoded); 1681248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting noOfCalls++; 1682248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1683248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1684d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1685248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting indata += frameLen; 1686248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting encoded += cdlen; 1687248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting totalLen += cdlen; 1688d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1689248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } // end for 1690d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1691248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting first_cng = 1; 1692248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return (totalLen); 1693d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org} 1694d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1695d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.orgvoid makeRTPheader(unsigned char* rtp_data, 1696d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int payloadType, 1697d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int seqNo, 1698d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org uint32_t timestamp, 1699d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org uint32_t ssrc) { 1700248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtp_data[0] = 0x80; 1701248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtp_data[1] = payloadType & 0xFF; 1702248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtp_data[2] = (seqNo >> 8) & 0xFF; 1703248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtp_data[3] = seqNo & 0xFF; 1704248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtp_data[4] = timestamp >> 24; 1705248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtp_data[5] = (timestamp >> 16) & 0xFF; 1706248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtp_data[6] = (timestamp >> 8) & 0xFF; 1707248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtp_data[7] = timestamp & 0xFF; 1708248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtp_data[8] = ssrc >> 24; 1709248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtp_data[9] = (ssrc >> 16) & 0xFF; 1710248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtp_data[10] = (ssrc >> 8) & 0xFF; 1711248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtp_data[11] = ssrc & 0xFF; 1712d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org} 1713d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1714d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.orgint makeRedundantHeader(unsigned char* rtp_data, 1715d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int* payloadType, 1716d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int numPayloads, 1717d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org uint32_t* timestamp, 1718d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org uint16_t* blockLen, 1719d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int seqNo, 1720248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting uint32_t ssrc) { 1721248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int i; 1722248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting unsigned char* rtpPointer; 1723248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting uint16_t offset; 1724248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 1725248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* first create "standard" RTP header */ 1726248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting makeRTPheader(rtp_data, NETEQ_CODEC_RED_PT, seqNo, timestamp[numPayloads - 1], 1727248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ssrc); 1728248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 1729248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtpPointer = &rtp_data[12]; 1730248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 1731248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* add one sub-header for each redundant payload (not the primary) */ 1732248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting for (i = 0; i < numPayloads - 1; i++) { 1733248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (blockLen[i] > 0) { 1734248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting offset = static_cast<uint16_t>(timestamp[numPayloads - 1] - timestamp[i]); 1735248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 1736248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // Byte |0| |1 2 | 3 | 1737248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // Bit |0|1234567|01234567012345|6701234567| 1738248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // |F|payload| timestamp | block | 1739248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // | | type | offset | length | 1740248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtpPointer[0] = (payloadType[i] & 0x7F) | 0x80; 1741248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtpPointer[1] = (offset >> 6) & 0xFF; 1742248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtpPointer[2] = ((offset & 0x3F) << 2) | ((blockLen[i] >> 8) & 0x03); 1743248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtpPointer[3] = blockLen[i] & 0xFF; 1744248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 1745248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtpPointer += 4; 1746d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1747248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1748d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1749248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // Bit |0|1234567| 1750248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // |0|payload| 1751248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // | | type | 1752248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtpPointer[0] = payloadType[numPayloads - 1] & 0x7F; 1753248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ++rtpPointer; 1754d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1755248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return rtpPointer - rtp_data; // length of header in bytes 1756d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org} 1757d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1758248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kastingint makeDTMFpayload(unsigned char* payload_data, 1759248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int Event, 1760248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int End, 1761248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int Volume, 1762248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int Duration) { 1763248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting unsigned char E, R, V; 1764248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting R = 0; 1765248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting V = (unsigned char)Volume; 1766248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (End == 0) { 1767248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting E = 0x00; 1768248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1769248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting E = 0x80; 1770248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1771248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting payload_data[0] = (unsigned char)Event; 1772248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting payload_data[1] = (unsigned char)(E | R | V); 1773248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // Duration equals 8 times time_ms, default is 8000 Hz. 1774248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting payload_data[2] = (unsigned char)((Duration >> 8) & 0xFF); 1775248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting payload_data[3] = (unsigned char)(Duration & 0xFF); 1776248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return (4); 1777d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org} 1778d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1779248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kastingvoid stereoDeInterleave(int16_t* audioSamples, int numSamples) { 1780248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int16_t* tempVec; 1781248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int16_t* readPtr, *writeL, *writeR; 1782d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1783248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (numSamples <= 0) 1784248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return; 1785d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1786248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting tempVec = (int16_t*)malloc(sizeof(int16_t) * numSamples); 1787248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (tempVec == NULL) { 1788248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error allocating memory\n"); 1789248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1790248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1791d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1792248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting memcpy(tempVec, audioSamples, numSamples * sizeof(int16_t)); 1793d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1794248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting writeL = audioSamples; 1795248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting writeR = &audioSamples[numSamples / 2]; 1796248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting readPtr = tempVec; 1797d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1798248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting for (int k = 0; k < numSamples; k += 2) { 1799248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *writeL = *readPtr; 1800248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting readPtr++; 1801248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *writeR = *readPtr; 1802248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting readPtr++; 1803248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting writeL++; 1804248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting writeR++; 1805248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1806d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1807248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting free(tempVec); 1808d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org} 1809d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1810248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kastingvoid stereoInterleave(unsigned char* data, int dataLen, int stride) { 1811248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting unsigned char* ptrL, *ptrR; 1812248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting unsigned char temp[10]; 1813d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1814248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (stride > 10) { 1815248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1816248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1817d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1818248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (dataLen % 1 != 0) { 1819248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // must be even number of samples 1820248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: cannot interleave odd sample number\n"); 1821248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1822248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1823d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1824248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ptrL = data + stride; 1825248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ptrR = &data[dataLen / 2]; 1826d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1827248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting while (ptrL < ptrR) { 1828248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // copy from right pointer to temp 1829248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting memcpy(temp, ptrR, stride); 1830d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1831248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // shift data between pointers 1832248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting memmove(ptrL + stride, ptrL, ptrR - ptrL); 1833d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1834248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // copy from temp to left pointer 1835248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting memcpy(ptrL, temp, stride); 1836d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1837248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // advance pointers 1838248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ptrL += stride * 2; 1839248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ptrR += stride; 1840248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1841d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org} 1842