blob: 149f2826582929d5454743c20bb5363df63893b8 [file] [log] [blame]
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001/*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Peter Kasting248b0b02015-06-03 12:32:41 -070011// TODO(hlundin): Reformat file to meet style guide.
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000012
13/* header includes */
14#include <stdio.h>
15#include <stdlib.h>
16#include <string.h>
17#ifdef WIN32
18#include <winsock2.h>
19#endif
20#ifdef WEBRTC_LINUX
21#include <netinet/in.h>
22#endif
23
pbos@webrtc.org12dc1a32013-08-05 16:22:53 +000024#include <assert.h>
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000025
Peter Kastingdce40cf2015-08-24 14:52:23 -070026#include <algorithm>
27
minyuecb23c0d2015-12-11 01:58:26 -080028#include "webrtc/base/checks.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000029#include "webrtc/typedefs.h"
minyuecb23c0d2015-12-11 01:58:26 -080030
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000031// needed for NetEqDecoder
kwiberg@webrtc.orge04a93b2014-12-09 10:12:53 +000032#include "webrtc/modules/audio_coding/neteq/audio_decoder_impl.h"
Henrik Kjellander74640892015-10-29 11:31:02 +010033#include "webrtc/modules/audio_coding/neteq/include/neteq.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000034
35/************************/
36/* Define payload types */
37/************************/
38
39#include "PayloadTypes.h"
40
minyuecb23c0d2015-12-11 01:58:26 -080041namespace {
42const size_t kRtpDataSize = 8000;
43}
44
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000045/*********************/
46/* Misc. definitions */
47/*********************/
48
49#define STOPSENDTIME 3000
Peter Kasting248b0b02015-06-03 12:32:41 -070050#define RESTARTSENDTIME 0 // 162500
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000051#define FIRSTLINELEN 40
Peter Kasting248b0b02015-06-03 12:32:41 -070052#define CHECK_NOT_NULL(a) \
53 if ((a) == 0) { \
54 printf("\n %s \n line: %d \nerror at %s\n", __FILE__, __LINE__, #a); \
55 return (-1); \
56 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000057
58//#define MULTIPLE_SAME_TIMESTAMP
59#define REPEAT_PACKET_DISTANCE 17
60#define REPEAT_PACKET_COUNT 1 // number of extra packets to send
61
62//#define INSERT_OLD_PACKETS
Peter Kasting248b0b02015-06-03 12:32:41 -070063#define OLD_PACKET 5 // how many seconds too old should the packet be?
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000064
65//#define TIMESTAMP_WRAPAROUND
66
67//#define RANDOM_DATA
68//#define RANDOM_PAYLOAD_DATA
69#define RANDOM_SEED 10
70
71//#define INSERT_DTMF_PACKETS
72//#define NO_DTMF_OVERDUB
73#define DTMF_PACKET_INTERVAL 2000
74#define DTMF_DURATION 500
75
76#define STEREO_MODE_FRAME 0
Peter Kasting248b0b02015-06-03 12:32:41 -070077#define STEREO_MODE_SAMPLE_1 1 // 1 octet per sample
78#define STEREO_MODE_SAMPLE_2 2 // 2 octets per sample
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000079
80/*************************/
81/* Function declarations */
82/*************************/
83
pkasting@chromium.orgd3245462015-02-23 21:28:22 +000084void NetEQTest_GetCodec_and_PT(char* name,
85 webrtc::NetEqDecoder* codec,
86 int* PT,
Peter Kastingdce40cf2015-08-24 14:52:23 -070087 size_t frameLen,
pkasting@chromium.orgd3245462015-02-23 21:28:22 +000088 int* fs,
89 int* bitrate,
90 int* useRed);
91int NetEQTest_init_coders(webrtc::NetEqDecoder coder,
Peter Kastingdce40cf2015-08-24 14:52:23 -070092 size_t enc_frameSize,
pkasting@chromium.orgd3245462015-02-23 21:28:22 +000093 int bitrate,
94 int sampfreq,
95 int vad,
Peter Kastingdce40cf2015-08-24 14:52:23 -070096 size_t numChannels);
pkasting@chromium.orgd3245462015-02-23 21:28:22 +000097void defineCodecs(webrtc::NetEqDecoder* usedCodec, int* noOfCodecs);
Peter Kastingdce40cf2015-08-24 14:52:23 -070098int NetEQTest_free_coders(webrtc::NetEqDecoder coder, size_t numChannels);
kwibergee1879c2015-10-29 06:20:28 -070099size_t NetEQTest_encode(webrtc::NetEqDecoder coder,
Peter Kastingdce40cf2015-08-24 14:52:23 -0700100 int16_t* indata,
101 size_t frameLen,
102 unsigned char* encoded,
103 int sampleRate,
104 int* vad,
105 int useVAD,
106 int bitrate,
107 size_t numChannels);
pkasting@chromium.orgd3245462015-02-23 21:28:22 +0000108void makeRTPheader(unsigned char* rtp_data,
109 int payloadType,
110 int seqNo,
111 uint32_t timestamp,
112 uint32_t ssrc);
113int makeRedundantHeader(unsigned char* rtp_data,
114 int* payloadType,
115 int numPayloads,
116 uint32_t* timestamp,
117 uint16_t* blockLen,
118 int seqNo,
119 uint32_t ssrc);
Peter Kastingdce40cf2015-08-24 14:52:23 -0700120size_t makeDTMFpayload(unsigned char* payload_data,
121 int Event,
122 int End,
123 int Volume,
124 int Duration);
125void stereoDeInterleave(int16_t* audioSamples, size_t numSamples);
126void stereoInterleave(unsigned char* data, size_t dataLen, size_t stride);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000127
128/*********************/
129/* Codec definitions */
130/*********************/
131
132#include "webrtc_vad.h"
133
Peter Kasting248b0b02015-06-03 12:32:41 -0700134#if ((defined CODEC_PCM16B) || (defined NETEQ_ARBITRARY_CODEC))
kjellander@webrtc.org3c652b62015-11-18 23:07:57 +0100135#include "webrtc/modules/audio_coding/codecs/pcm16b/pcm16b.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000136#endif
137#ifdef CODEC_G711
kjellander@webrtc.org3c652b62015-11-18 23:07:57 +0100138#include "webrtc/modules/audio_coding/codecs/g711/g711_interface.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000139#endif
140#ifdef CODEC_G729
Peter Kasting248b0b02015-06-03 12:32:41 -0700141#include "G729Interface.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000142#endif
143#ifdef CODEC_G729_1
Peter Kasting248b0b02015-06-03 12:32:41 -0700144#include "G729_1Interface.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000145#endif
146#ifdef CODEC_AMR
Peter Kasting248b0b02015-06-03 12:32:41 -0700147#include "AMRInterface.h"
148#include "AMRCreation.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000149#endif
150#ifdef CODEC_AMRWB
Peter Kasting248b0b02015-06-03 12:32:41 -0700151#include "AMRWBInterface.h"
152#include "AMRWBCreation.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000153#endif
154#ifdef CODEC_ILBC
kjellander@webrtc.org3c652b62015-11-18 23:07:57 +0100155#include "webrtc/modules/audio_coding/codecs/ilbc/ilbc.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000156#endif
Peter Kasting248b0b02015-06-03 12:32:41 -0700157#if (defined CODEC_ISAC || defined CODEC_ISAC_SWB)
kjellander@webrtc.org3c652b62015-11-18 23:07:57 +0100158#include "webrtc/modules/audio_coding/codecs/isac/main/include/isac.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000159#endif
160#ifdef NETEQ_ISACFIX_CODEC
kjellander@webrtc.org3c652b62015-11-18 23:07:57 +0100161#include "webrtc/modules/audio_coding/codecs/isac/fix/include/isacfix.h"
Peter Kasting248b0b02015-06-03 12:32:41 -0700162#ifdef CODEC_ISAC
Peter Kasting728d9032015-06-11 14:31:38 -0700163#error Cannot have both ISAC and ISACfix defined. Please de-select one.
Peter Kasting248b0b02015-06-03 12:32:41 -0700164#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000165#endif
166#ifdef CODEC_G722
kjellander@webrtc.org3c652b62015-11-18 23:07:57 +0100167#include "webrtc/modules/audio_coding/codecs/g722/g722_interface.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000168#endif
169#ifdef CODEC_G722_1_24
Peter Kasting248b0b02015-06-03 12:32:41 -0700170#include "G722_1Interface.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000171#endif
172#ifdef CODEC_G722_1_32
Peter Kasting248b0b02015-06-03 12:32:41 -0700173#include "G722_1Interface.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000174#endif
175#ifdef CODEC_G722_1_16
Peter Kasting248b0b02015-06-03 12:32:41 -0700176#include "G722_1Interface.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000177#endif
178#ifdef CODEC_G722_1C_24
Peter Kasting248b0b02015-06-03 12:32:41 -0700179#include "G722_1Interface.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000180#endif
181#ifdef CODEC_G722_1C_32
Peter Kasting248b0b02015-06-03 12:32:41 -0700182#include "G722_1Interface.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000183#endif
184#ifdef CODEC_G722_1C_48
Peter Kasting248b0b02015-06-03 12:32:41 -0700185#include "G722_1Interface.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000186#endif
187#ifdef CODEC_G726
Peter Kasting248b0b02015-06-03 12:32:41 -0700188#include "G726Creation.h"
189#include "G726Interface.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000190#endif
191#ifdef CODEC_GSMFR
Peter Kasting248b0b02015-06-03 12:32:41 -0700192#include "GSMFRInterface.h"
193#include "GSMFRCreation.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000194#endif
195#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
Peter Kasting248b0b02015-06-03 12:32:41 -0700196 defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
kjellander@webrtc.org3c652b62015-11-18 23:07:57 +0100197#include "webrtc/modules/audio_coding/codecs/cng/webrtc_cng.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000198#endif
Peter Kasting248b0b02015-06-03 12:32:41 -0700199#if ((defined CODEC_SPEEX_8) || (defined CODEC_SPEEX_16))
200#include "SpeexInterface.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000201#endif
minyuecb23c0d2015-12-11 01:58:26 -0800202#ifdef CODEC_OPUS
203#include "webrtc/modules/audio_coding/codecs/opus/opus_interface.h"
204#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000205
206/***********************************/
207/* Global codec instance variables */
208/***********************************/
209
Peter Kasting248b0b02015-06-03 12:32:41 -0700210WebRtcVadInst* VAD_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000211
212#ifdef CODEC_G722
Peter Kasting248b0b02015-06-03 12:32:41 -0700213G722EncInst* g722EncState[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000214#endif
215
216#ifdef CODEC_G722_1_24
Peter Kasting248b0b02015-06-03 12:32:41 -0700217G722_1_24_encinst_t* G722_1_24enc_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000218#endif
219#ifdef CODEC_G722_1_32
Peter Kasting248b0b02015-06-03 12:32:41 -0700220G722_1_32_encinst_t* G722_1_32enc_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000221#endif
222#ifdef CODEC_G722_1_16
Peter Kasting248b0b02015-06-03 12:32:41 -0700223G722_1_16_encinst_t* G722_1_16enc_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000224#endif
225#ifdef CODEC_G722_1C_24
Peter Kasting248b0b02015-06-03 12:32:41 -0700226G722_1C_24_encinst_t* G722_1C_24enc_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000227#endif
228#ifdef CODEC_G722_1C_32
Peter Kasting248b0b02015-06-03 12:32:41 -0700229G722_1C_32_encinst_t* G722_1C_32enc_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000230#endif
231#ifdef CODEC_G722_1C_48
Peter Kasting248b0b02015-06-03 12:32:41 -0700232G722_1C_48_encinst_t* G722_1C_48enc_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000233#endif
234#ifdef CODEC_G726
Peter Kasting248b0b02015-06-03 12:32:41 -0700235G726_encinst_t* G726enc_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000236#endif
237#ifdef CODEC_G729
Peter Kasting248b0b02015-06-03 12:32:41 -0700238G729_encinst_t* G729enc_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000239#endif
240#ifdef CODEC_G729_1
Peter Kasting248b0b02015-06-03 12:32:41 -0700241G729_1_inst_t* G729_1_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000242#endif
243#ifdef CODEC_AMR
Peter Kasting248b0b02015-06-03 12:32:41 -0700244AMR_encinst_t* AMRenc_inst[2];
245int16_t AMR_bitrate;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000246#endif
247#ifdef CODEC_AMRWB
Peter Kasting248b0b02015-06-03 12:32:41 -0700248AMRWB_encinst_t* AMRWBenc_inst[2];
249int16_t AMRWB_bitrate;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000250#endif
251#ifdef CODEC_ILBC
Peter Kasting248b0b02015-06-03 12:32:41 -0700252IlbcEncoderInstance* iLBCenc_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000253#endif
254#ifdef CODEC_ISAC
Peter Kasting248b0b02015-06-03 12:32:41 -0700255ISACStruct* ISAC_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000256#endif
257#ifdef NETEQ_ISACFIX_CODEC
Peter Kasting248b0b02015-06-03 12:32:41 -0700258ISACFIX_MainStruct* ISAC_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000259#endif
260#ifdef CODEC_ISAC_SWB
Peter Kasting248b0b02015-06-03 12:32:41 -0700261ISACStruct* ISACSWB_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000262#endif
263#ifdef CODEC_GSMFR
Peter Kasting248b0b02015-06-03 12:32:41 -0700264GSMFR_encinst_t* GSMFRenc_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000265#endif
266#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
Peter Kasting248b0b02015-06-03 12:32:41 -0700267 defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
ossu97ba30e2016-04-25 07:55:58 -0700268webrtc::ComfortNoiseEncoder *CNG_encoder[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000269#endif
270#ifdef CODEC_SPEEX_8
Peter Kasting248b0b02015-06-03 12:32:41 -0700271SPEEX_encinst_t* SPEEX8enc_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000272#endif
273#ifdef CODEC_SPEEX_16
Peter Kasting248b0b02015-06-03 12:32:41 -0700274SPEEX_encinst_t* SPEEX16enc_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000275#endif
minyuecb23c0d2015-12-11 01:58:26 -0800276#ifdef CODEC_OPUS
277OpusEncInst* opus_inst[2];
278#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000279
Peter Kasting248b0b02015-06-03 12:32:41 -0700280int main(int argc, char* argv[]) {
Peter Kastingdce40cf2015-08-24 14:52:23 -0700281 size_t packet_size;
282 int fs;
Peter Kasting248b0b02015-06-03 12:32:41 -0700283 webrtc::NetEqDecoder usedCodec;
284 int payloadType;
285 int bitrate = 0;
286 int useVAD, vad;
287 int useRed = 0;
Peter Kastingdce40cf2015-08-24 14:52:23 -0700288 size_t len, enc_len;
Peter Kasting248b0b02015-06-03 12:32:41 -0700289 int16_t org_data[4000];
minyuecb23c0d2015-12-11 01:58:26 -0800290 unsigned char rtp_data[kRtpDataSize];
Peter Kasting248b0b02015-06-03 12:32:41 -0700291 int16_t seqNo = 0xFFF;
292 uint32_t ssrc = 1235412312;
293 uint32_t timestamp = 0xAC1245;
294 uint16_t length, plen;
295 uint32_t offset;
296 double sendtime = 0;
297 int red_PT[2] = {0};
298 uint32_t red_TS[2] = {0};
299 uint16_t red_len[2] = {0};
Peter Kastingdce40cf2015-08-24 14:52:23 -0700300 size_t RTPheaderLen = 12;
minyuecb23c0d2015-12-11 01:58:26 -0800301 uint8_t red_data[kRtpDataSize];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000302#ifdef INSERT_OLD_PACKETS
Peter Kasting248b0b02015-06-03 12:32:41 -0700303 uint16_t old_length, old_plen;
Peter Kastingdce40cf2015-08-24 14:52:23 -0700304 size_t old_enc_len;
Peter Kasting248b0b02015-06-03 12:32:41 -0700305 int first_old_packet = 1;
minyuecb23c0d2015-12-11 01:58:26 -0800306 unsigned char old_rtp_data[kRtpDataSize];
Peter Kastingdce40cf2015-08-24 14:52:23 -0700307 size_t packet_age = 0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000308#endif
309#ifdef INSERT_DTMF_PACKETS
Peter Kasting248b0b02015-06-03 12:32:41 -0700310 int NTone = 1;
311 int DTMFfirst = 1;
312 uint32_t DTMFtimestamp;
313 bool dtmfSent = false;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000314#endif
Peter Kasting248b0b02015-06-03 12:32:41 -0700315 bool usingStereo = false;
Peter Kastingdce40cf2015-08-24 14:52:23 -0700316 size_t stereoMode = 0;
317 size_t numChannels = 1;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000318
Peter Kasting248b0b02015-06-03 12:32:41 -0700319 /* check number of parameters */
320 if ((argc != 6) && (argc != 7)) {
321 /* print help text and exit */
322 printf("Application to encode speech into an RTP stream.\n");
Peter Kasting2a100872015-06-09 17:26:40 -0700323 printf("The program reads a PCM file and encodes is using the specified "
324 "codec.\n");
325 printf("The coded speech is packetized in RTP packest and written to the "
326 "output file.\n");
327 printf("The format of the RTP stream file is simlilar to that of "
328 "rtpplay,\n");
Peter Kasting248b0b02015-06-03 12:32:41 -0700329 printf("but with the receive time euqal to 0 for all packets.\n");
330 printf("Usage:\n\n");
331 printf("%s PCMfile RTPfile frameLen codec useVAD bitrate\n", argv[0]);
332 printf("where:\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000333
Peter Kasting248b0b02015-06-03 12:32:41 -0700334 printf("PCMfile : PCM speech input file\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000335
Peter Kasting248b0b02015-06-03 12:32:41 -0700336 printf("RTPfile : RTP stream output file\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000337
Peter Kasting2a100872015-06-09 17:26:40 -0700338 printf("frameLen : 80...960... Number of samples per packet (limit "
339 "depends on codec)\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000340
Peter Kasting248b0b02015-06-03 12:32:41 -0700341 printf("codecName\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000342#ifdef CODEC_PCM16B
Peter Kasting248b0b02015-06-03 12:32:41 -0700343 printf(" : pcm16b 16 bit PCM (8kHz)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000344#endif
345#ifdef CODEC_PCM16B_WB
Peter Kasting248b0b02015-06-03 12:32:41 -0700346 printf(" : pcm16b_wb 16 bit PCM (16kHz)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000347#endif
348#ifdef CODEC_PCM16B_32KHZ
Peter Kasting248b0b02015-06-03 12:32:41 -0700349 printf(" : pcm16b_swb32 16 bit PCM (32kHz)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000350#endif
351#ifdef CODEC_PCM16B_48KHZ
Peter Kasting248b0b02015-06-03 12:32:41 -0700352 printf(" : pcm16b_swb48 16 bit PCM (48kHz)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000353#endif
354#ifdef CODEC_G711
Peter Kasting248b0b02015-06-03 12:32:41 -0700355 printf(" : pcma g711 A-law (8kHz)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000356#endif
357#ifdef CODEC_G711
Peter Kasting248b0b02015-06-03 12:32:41 -0700358 printf(" : pcmu g711 u-law (8kHz)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000359#endif
360#ifdef CODEC_G729
Peter Kasting2a100872015-06-09 17:26:40 -0700361 printf(" : g729 G729 (8kHz and 8kbps) CELP (One-Three "
362 "frame(s)/packet)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000363#endif
364#ifdef CODEC_G729_1
Peter Kasting2a100872015-06-09 17:26:40 -0700365 printf(" : g729.1 G729.1 (16kHz) variable rate (8--32 "
366 "kbps)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000367#endif
368#ifdef CODEC_G722_1_16
Peter Kasting2a100872015-06-09 17:26:40 -0700369 printf(" : g722.1_16 G722.1 coder (16kHz) (g722.1 with "
370 "16kbps)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000371#endif
372#ifdef CODEC_G722_1_24
Peter Kasting2a100872015-06-09 17:26:40 -0700373 printf(" : g722.1_24 G722.1 coder (16kHz) (the 24kbps "
374 "version)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000375#endif
376#ifdef CODEC_G722_1_32
Peter Kasting2a100872015-06-09 17:26:40 -0700377 printf(" : g722.1_32 G722.1 coder (16kHz) (the 32kbps "
378 "version)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000379#endif
380#ifdef CODEC_G722_1C_24
Peter Kasting2a100872015-06-09 17:26:40 -0700381 printf(" : g722.1C_24 G722.1 C coder (32kHz) (the 24kbps "
382 "version)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000383#endif
384#ifdef CODEC_G722_1C_32
Peter Kasting2a100872015-06-09 17:26:40 -0700385 printf(" : g722.1C_32 G722.1 C coder (32kHz) (the 32kbps "
386 "version)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000387#endif
388#ifdef CODEC_G722_1C_48
Peter Kasting2a100872015-06-09 17:26:40 -0700389 printf(" : g722.1C_48 G722.1 C coder (32kHz) (the 48kbps "
390 "version)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000391#endif
392
393#ifdef CODEC_G726
Peter Kasting248b0b02015-06-03 12:32:41 -0700394 printf(" : g726_16 G726 coder (8kHz) 16kbps\n");
395 printf(" : g726_24 G726 coder (8kHz) 24kbps\n");
396 printf(" : g726_32 G726 coder (8kHz) 32kbps\n");
397 printf(" : g726_40 G726 coder (8kHz) 40kbps\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000398#endif
399#ifdef CODEC_AMR
Peter Kasting2a100872015-06-09 17:26:40 -0700400 printf(" : AMRXk Adaptive Multi Rate CELP codec "
401 "(8kHz)\n");
402 printf(" X = 4.75, 5.15, 5.9, 6.7, 7.4, 7.95, "
403 "10.2 or 12.2\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000404#endif
405#ifdef CODEC_AMRWB
Peter Kasting2a100872015-06-09 17:26:40 -0700406 printf(" : AMRwbXk Adaptive Multi Rate Wideband CELP "
407 "codec (16kHz)\n");
408 printf(" X = 7, 9, 12, 14, 16, 18, 20, 23 or "
409 "24\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000410#endif
411#ifdef CODEC_ILBC
Peter Kasting248b0b02015-06-03 12:32:41 -0700412 printf(" : ilbc iLBC codec (8kHz and 13.8kbps)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000413#endif
414#ifdef CODEC_ISAC
Peter Kasting2a100872015-06-09 17:26:40 -0700415 printf(" : isac iSAC (16kHz and 32.0 kbps). To set "
416 "rate specify a rate parameter as last parameter\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000417#endif
418#ifdef CODEC_ISAC_SWB
Peter Kasting2a100872015-06-09 17:26:40 -0700419 printf(" : isacswb iSAC SWB (32kHz and 32.0-52.0 kbps). "
420 "To set rate specify a rate parameter as last parameter\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000421#endif
422#ifdef CODEC_GSMFR
Peter Kasting248b0b02015-06-03 12:32:41 -0700423 printf(" : gsmfr GSM FR codec (8kHz and 13kbps)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000424#endif
425#ifdef CODEC_G722
Peter Kasting2a100872015-06-09 17:26:40 -0700426 printf(" : g722 g722 coder (16kHz) (the 64kbps "
427 "version)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000428#endif
429#ifdef CODEC_SPEEX_8
Peter Kasting248b0b02015-06-03 12:32:41 -0700430 printf(" : speex8 speex coder (8 kHz)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000431#endif
432#ifdef CODEC_SPEEX_16
Peter Kasting248b0b02015-06-03 12:32:41 -0700433 printf(" : speex16 speex coder (16 kHz)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000434#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000435#ifdef CODEC_RED
436#ifdef CODEC_G711
Peter Kasting2a100872015-06-09 17:26:40 -0700437 printf(" : red_pcm Redundancy RTP packet with 2*G711A "
438 "frames\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000439#endif
440#ifdef CODEC_ISAC
Peter Kasting2a100872015-06-09 17:26:40 -0700441 printf(" : red_isac Redundancy RTP packet with 2*iSAC "
442 "frames\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000443#endif
minyuecb23c0d2015-12-11 01:58:26 -0800444#endif // CODEC_RED
445#ifdef CODEC_OPUS
446 printf(" : opus Opus codec with FEC (48kHz, 32kbps, FEC"
447 " on and tuned for 5%% packet losses)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000448#endif
Peter Kasting248b0b02015-06-03 12:32:41 -0700449 printf("\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000450
451#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
Peter Kasting248b0b02015-06-03 12:32:41 -0700452 defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
453 printf("useVAD : 0 Voice Activity Detection is switched off\n");
454 printf(" : 1 Voice Activity Detection is switched on\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000455#else
Peter Kasting2a100872015-06-09 17:26:40 -0700456 printf("useVAD : 0 Voice Activity Detection switched off (on not "
457 "supported)\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000458#endif
Peter Kasting2a100872015-06-09 17:26:40 -0700459 printf("bitrate : Codec bitrate in bps (only applies to vbr "
460 "codecs)\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000461
Peter Kasting248b0b02015-06-03 12:32:41 -0700462 return (0);
463 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000464
Peter Kasting248b0b02015-06-03 12:32:41 -0700465 FILE* in_file = fopen(argv[1], "rb");
466 CHECK_NOT_NULL(in_file);
467 printf("Input file: %s\n", argv[1]);
468 FILE* out_file = fopen(argv[2], "wb");
469 CHECK_NOT_NULL(out_file);
470 printf("Output file: %s\n\n", argv[2]);
Peter Kastingdce40cf2015-08-24 14:52:23 -0700471 int packet_size_int = atoi(argv[3]);
472 if (packet_size_int <= 0) {
473 printf("Packet size %d must be positive", packet_size_int);
Peter Kastingf045e4d2015-06-10 21:15:38 -0700474 return -1;
475 }
Peter Kastingdce40cf2015-08-24 14:52:23 -0700476 printf("Packet size: %d\n", packet_size_int);
477 packet_size = static_cast<size_t>(packet_size_int);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000478
Peter Kasting248b0b02015-06-03 12:32:41 -0700479 // check for stereo
480 if (argv[4][strlen(argv[4]) - 1] == '*') {
481 // use stereo
482 usingStereo = true;
483 numChannels = 2;
484 argv[4][strlen(argv[4]) - 1] = '\0';
485 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000486
Peter Kasting248b0b02015-06-03 12:32:41 -0700487 NetEQTest_GetCodec_and_PT(argv[4], &usedCodec, &payloadType, packet_size, &fs,
488 &bitrate, &useRed);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000489
Peter Kasting248b0b02015-06-03 12:32:41 -0700490 if (useRed) {
491 RTPheaderLen = 12 + 4 + 1; /* standard RTP = 12; 4 bytes per redundant
492 payload, except last one which is 1 byte */
493 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000494
Peter Kasting248b0b02015-06-03 12:32:41 -0700495 useVAD = atoi(argv[5]);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000496#if !(defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
Peter Kasting248b0b02015-06-03 12:32:41 -0700497 defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
498 if (useVAD != 0) {
499 printf("Error: this simulation does not support VAD/DTX/CNG\n");
500 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000501#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000502
Peter Kasting248b0b02015-06-03 12:32:41 -0700503 // check stereo type
504 if (usingStereo) {
505 switch (usedCodec) {
506 // sample based codecs
kwibergee1879c2015-10-29 06:20:28 -0700507 case webrtc::NetEqDecoder::kDecoderPCMu:
508 case webrtc::NetEqDecoder::kDecoderPCMa:
509 case webrtc::NetEqDecoder::kDecoderG722: {
Peter Kasting248b0b02015-06-03 12:32:41 -0700510 // 1 octet per sample
511 stereoMode = STEREO_MODE_SAMPLE_1;
512 break;
513 }
kwibergee1879c2015-10-29 06:20:28 -0700514 case webrtc::NetEqDecoder::kDecoderPCM16B:
515 case webrtc::NetEqDecoder::kDecoderPCM16Bwb:
516 case webrtc::NetEqDecoder::kDecoderPCM16Bswb32kHz:
517 case webrtc::NetEqDecoder::kDecoderPCM16Bswb48kHz: {
Peter Kasting248b0b02015-06-03 12:32:41 -0700518 // 2 octets per sample
519 stereoMode = STEREO_MODE_SAMPLE_2;
520 break;
521 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000522
Peter Kasting248b0b02015-06-03 12:32:41 -0700523 // fixed-rate frame codecs (with internal VAD)
524 default: {
525 printf("Cannot use codec %s as stereo codec\n", argv[4]);
526 exit(0);
527 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000528 }
Peter Kasting248b0b02015-06-03 12:32:41 -0700529 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000530
kwibergee1879c2015-10-29 06:20:28 -0700531 if ((usedCodec == webrtc::NetEqDecoder::kDecoderISAC) ||
532 (usedCodec == webrtc::NetEqDecoder::kDecoderISACswb)) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700533 if (argc != 7) {
kwibergee1879c2015-10-29 06:20:28 -0700534 if (usedCodec == webrtc::NetEqDecoder::kDecoderISAC) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700535 bitrate = 32000;
Peter Kasting2a100872015-06-09 17:26:40 -0700536 printf("Running iSAC at default bitrate of 32000 bps (to specify "
537 "explicitly add the bps as last parameter)\n");
Peter Kasting248b0b02015-06-03 12:32:41 -0700538 } else // (usedCodec==webrtc::kDecoderISACswb)
539 {
540 bitrate = 56000;
Peter Kasting2a100872015-06-09 17:26:40 -0700541 printf("Running iSAC at default bitrate of 56000 bps (to specify "
542 "explicitly add the bps as last parameter)\n");
Peter Kasting248b0b02015-06-03 12:32:41 -0700543 }
544 } else {
545 bitrate = atoi(argv[6]);
kwibergee1879c2015-10-29 06:20:28 -0700546 if (usedCodec == webrtc::NetEqDecoder::kDecoderISAC) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700547 if ((bitrate < 10000) || (bitrate > 32000)) {
Peter Kasting2a100872015-06-09 17:26:40 -0700548 printf("Error: iSAC bitrate must be between 10000 and 32000 bps (%i "
549 "is invalid)\n", bitrate);
Peter Kasting248b0b02015-06-03 12:32:41 -0700550 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000551 }
Peter Kasting248b0b02015-06-03 12:32:41 -0700552 printf("Running iSAC at bitrate of %i bps\n", bitrate);
553 } else // (usedCodec==webrtc::kDecoderISACswb)
554 {
555 if ((bitrate < 32000) || (bitrate > 56000)) {
Peter Kasting2a100872015-06-09 17:26:40 -0700556 printf("Error: iSAC SWB bitrate must be between 32000 and 56000 bps "
557 "(%i is invalid)\n", bitrate);
Peter Kasting248b0b02015-06-03 12:32:41 -0700558 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000559 }
Peter Kasting248b0b02015-06-03 12:32:41 -0700560 }
561 }
562 } else {
563 if (argc == 7) {
Peter Kasting2a100872015-06-09 17:26:40 -0700564 printf("Error: Bitrate parameter can only be specified for iSAC, G.723, "
565 "and G.729.1\n");
Peter Kasting248b0b02015-06-03 12:32:41 -0700566 exit(0);
567 }
568 }
569
570 if (useRed) {
571 printf("Redundancy engaged. ");
572 }
kwibergee1879c2015-10-29 06:20:28 -0700573 printf("Used codec: %i\n", static_cast<int>(usedCodec));
Peter Kasting248b0b02015-06-03 12:32:41 -0700574 printf("Payload type: %i\n", payloadType);
575
576 NetEQTest_init_coders(usedCodec, packet_size, bitrate, fs, useVAD,
577 numChannels);
578
579 /* write file header */
580 // fprintf(out_file, "#!RTPencode%s\n", "1.0");
581 fprintf(out_file, "#!rtpplay%s \n",
582 "1.0"); // this is the string that rtpplay needs
583 uint32_t dummy_variable = 0; // should be converted to network endian format,
584 // but does not matter when 0
585 if (fwrite(&dummy_variable, 4, 1, out_file) != 1) {
586 return -1;
587 }
588 if (fwrite(&dummy_variable, 4, 1, out_file) != 1) {
589 return -1;
590 }
591 if (fwrite(&dummy_variable, 4, 1, out_file) != 1) {
592 return -1;
593 }
594 if (fwrite(&dummy_variable, 2, 1, out_file) != 1) {
595 return -1;
596 }
597 if (fwrite(&dummy_variable, 2, 1, out_file) != 1) {
598 return -1;
599 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000600
601#ifdef TIMESTAMP_WRAPAROUND
Peter Kasting248b0b02015-06-03 12:32:41 -0700602 timestamp = 0xFFFFFFFF - fs * 10; /* should give wrap-around in 10 seconds */
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000603#endif
604#if defined(RANDOM_DATA) | defined(RANDOM_PAYLOAD_DATA)
Peter Kasting248b0b02015-06-03 12:32:41 -0700605 srand(RANDOM_SEED);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000606#endif
607
Peter Kasting248b0b02015-06-03 12:32:41 -0700608 /* if redundancy is used, the first redundant payload is zero length */
609 red_len[0] = 0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000610
Peter Kasting248b0b02015-06-03 12:32:41 -0700611 /* read first frame */
612 len = fread(org_data, 2, packet_size * numChannels, in_file) / numChannels;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000613
Peter Kasting248b0b02015-06-03 12:32:41 -0700614 /* de-interleave if stereo */
615 if (usingStereo) {
616 stereoDeInterleave(org_data, len * numChannels);
617 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000618
Peter Kasting248b0b02015-06-03 12:32:41 -0700619 while (len == packet_size) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000620#ifdef INSERT_DTMF_PACKETS
Peter Kasting248b0b02015-06-03 12:32:41 -0700621 dtmfSent = false;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000622
Peter Kasting248b0b02015-06-03 12:32:41 -0700623 if (sendtime >= NTone * DTMF_PACKET_INTERVAL) {
624 if (sendtime < NTone * DTMF_PACKET_INTERVAL + DTMF_DURATION) {
625 // tone has not ended
626 if (DTMFfirst == 1) {
627 DTMFtimestamp = timestamp; // save this timestamp
628 DTMFfirst = 0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000629 }
Peter Kasting248b0b02015-06-03 12:32:41 -0700630 makeRTPheader(rtp_data, NETEQ_CODEC_AVT_PT, seqNo, DTMFtimestamp, ssrc);
631 enc_len = makeDTMFpayload(
632 &rtp_data[12], NTone % 12, 0, 4,
633 (int)(sendtime - NTone * DTMF_PACKET_INTERVAL) * (fs / 1000) + len);
634 } else {
635 // tone has ended
636 makeRTPheader(rtp_data, NETEQ_CODEC_AVT_PT, seqNo, DTMFtimestamp, ssrc);
637 enc_len = makeDTMFpayload(&rtp_data[12], NTone % 12, 1, 4,
638 DTMF_DURATION * (fs / 1000));
639 NTone++;
640 DTMFfirst = 1;
641 }
642
643 /* write RTP packet to file */
Peter Kastingb7e50542015-06-11 12:55:50 -0700644 length = htons(static_cast<unsigned short>(12 + enc_len + 8));
645 plen = htons(static_cast<unsigned short>(12 + enc_len));
Peter Kasting248b0b02015-06-03 12:32:41 -0700646 offset = (uint32_t)sendtime; //(timestamp/(fs/1000));
647 offset = htonl(offset);
648 if (fwrite(&length, 2, 1, out_file) != 1) {
649 return -1;
650 }
651 if (fwrite(&plen, 2, 1, out_file) != 1) {
652 return -1;
653 }
654 if (fwrite(&offset, 4, 1, out_file) != 1) {
655 return -1;
656 }
657 if (fwrite(rtp_data, 12 + enc_len, 1, out_file) != 1) {
658 return -1;
659 }
660
661 dtmfSent = true;
662 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000663#endif
664
665#ifdef NO_DTMF_OVERDUB
Peter Kasting248b0b02015-06-03 12:32:41 -0700666 /* If DTMF is sent, we should not send any speech packets during the same
667 * time */
668 if (dtmfSent) {
669 enc_len = 0;
670 } else {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000671#endif
Peter Kasting248b0b02015-06-03 12:32:41 -0700672 /* encode frame */
673 enc_len =
674 NetEQTest_encode(usedCodec, org_data, packet_size, &rtp_data[12], fs,
675 &vad, useVAD, bitrate, numChannels);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000676
Peter Kasting248b0b02015-06-03 12:32:41 -0700677 if (usingStereo && stereoMode != STEREO_MODE_FRAME && vad == 1) {
678 // interleave the encoded payload for sample-based codecs (not for CNG)
679 stereoInterleave(&rtp_data[12], enc_len, stereoMode);
680 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000681#ifdef NO_DTMF_OVERDUB
Peter Kasting248b0b02015-06-03 12:32:41 -0700682 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000683#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000684
Peter Kasting248b0b02015-06-03 12:32:41 -0700685 if (enc_len > 0 &&
686 (sendtime <= STOPSENDTIME || sendtime > RESTARTSENDTIME)) {
687 if (useRed) {
688 if (red_len[0] > 0) {
689 memmove(&rtp_data[RTPheaderLen + red_len[0]], &rtp_data[12], enc_len);
690 memcpy(&rtp_data[RTPheaderLen], red_data, red_len[0]);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000691
Peter Kastingb7e50542015-06-11 12:55:50 -0700692 red_len[1] = static_cast<uint16_t>(enc_len);
Peter Kasting248b0b02015-06-03 12:32:41 -0700693 red_TS[1] = timestamp;
694 if (vad)
695 red_PT[1] = payloadType;
696 else
697 red_PT[1] = NETEQ_CODEC_CN_PT;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000698
Peter Kasting248b0b02015-06-03 12:32:41 -0700699 makeRedundantHeader(rtp_data, red_PT, 2, red_TS, red_len, seqNo++,
700 ssrc);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000701
Peter Kasting248b0b02015-06-03 12:32:41 -0700702 enc_len += red_len[0] + RTPheaderLen - 12;
703 } else { // do not use redundancy payload for this packet, i.e., only
704 // last payload
705 memmove(&rtp_data[RTPheaderLen - 4], &rtp_data[12], enc_len);
706 // memcpy(&rtp_data[RTPheaderLen], red_data, red_len[0]);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000707
Peter Kastingb7e50542015-06-11 12:55:50 -0700708 red_len[1] = static_cast<uint16_t>(enc_len);
Peter Kasting248b0b02015-06-03 12:32:41 -0700709 red_TS[1] = timestamp;
710 if (vad)
711 red_PT[1] = payloadType;
712 else
713 red_PT[1] = NETEQ_CODEC_CN_PT;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000714
Peter Kasting248b0b02015-06-03 12:32:41 -0700715 makeRedundantHeader(rtp_data, red_PT, 2, red_TS, red_len, seqNo++,
716 ssrc);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000717
Peter Kasting248b0b02015-06-03 12:32:41 -0700718 enc_len += red_len[0] + RTPheaderLen - 4 -
719 12; // 4 is length of redundancy header (not used)
720 }
721 } else {
722 /* make RTP header */
723 if (vad) // regular speech data
724 makeRTPheader(rtp_data, payloadType, seqNo++, timestamp, ssrc);
725 else // CNG data
726 makeRTPheader(rtp_data, NETEQ_CODEC_CN_PT, seqNo++, timestamp, ssrc);
727 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000728#ifdef MULTIPLE_SAME_TIMESTAMP
Peter Kasting248b0b02015-06-03 12:32:41 -0700729 int mult_pack = 0;
730 do {
731#endif // MULTIPLE_SAME_TIMESTAMP
732 /* write RTP packet to file */
Peter Kastingb7e50542015-06-11 12:55:50 -0700733 length = htons(static_cast<unsigned short>(12 + enc_len + 8));
734 plen = htons(static_cast<unsigned short>(12 + enc_len));
Peter Kasting248b0b02015-06-03 12:32:41 -0700735 offset = (uint32_t)sendtime;
736 //(timestamp/(fs/1000));
737 offset = htonl(offset);
738 if (fwrite(&length, 2, 1, out_file) != 1) {
739 return -1;
740 }
741 if (fwrite(&plen, 2, 1, out_file) != 1) {
742 return -1;
743 }
744 if (fwrite(&offset, 4, 1, out_file) != 1) {
745 return -1;
746 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000747#ifdef RANDOM_DATA
Peter Kastingdce40cf2015-08-24 14:52:23 -0700748 for (size_t k = 0; k < 12 + enc_len; k++) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700749 rtp_data[k] = rand() + rand();
750 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000751#endif
752#ifdef RANDOM_PAYLOAD_DATA
Peter Kastingdce40cf2015-08-24 14:52:23 -0700753 for (size_t k = 12; k < 12 + enc_len; k++) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700754 rtp_data[k] = rand() + rand();
755 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000756#endif
Peter Kasting248b0b02015-06-03 12:32:41 -0700757 if (fwrite(rtp_data, 12 + enc_len, 1, out_file) != 1) {
758 return -1;
759 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000760#ifdef MULTIPLE_SAME_TIMESTAMP
Peter Kasting248b0b02015-06-03 12:32:41 -0700761 } while ((seqNo % REPEAT_PACKET_DISTANCE == 0) &&
762 (mult_pack++ < REPEAT_PACKET_COUNT));
763#endif // MULTIPLE_SAME_TIMESTAMP
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000764
765#ifdef INSERT_OLD_PACKETS
Peter Kasting248b0b02015-06-03 12:32:41 -0700766 if (packet_age >= OLD_PACKET * fs) {
767 if (!first_old_packet) {
768 // send the old packet
769 if (fwrite(&old_length, 2, 1, out_file) != 1) {
770 return -1;
771 }
772 if (fwrite(&old_plen, 2, 1, out_file) != 1) {
773 return -1;
774 }
775 if (fwrite(&offset, 4, 1, out_file) != 1) {
776 return -1;
777 }
778 if (fwrite(old_rtp_data, 12 + old_enc_len, 1, out_file) != 1) {
779 return -1;
780 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000781 }
Peter Kasting248b0b02015-06-03 12:32:41 -0700782 // store current packet as old
783 old_length = length;
784 old_plen = plen;
785 memcpy(old_rtp_data, rtp_data, 12 + enc_len);
786 old_enc_len = enc_len;
787 first_old_packet = 0;
788 packet_age = 0;
789 }
790 packet_age += packet_size;
791#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000792
Peter Kasting248b0b02015-06-03 12:32:41 -0700793 if (useRed) {
794/* move data to redundancy store */
795#ifdef CODEC_ISAC
kwibergee1879c2015-10-29 06:20:28 -0700796 if (usedCodec == webrtc::NetEqDecoder::kDecoderISAC) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700797 assert(!usingStereo); // Cannot handle stereo yet
798 red_len[0] = WebRtcIsac_GetRedPayload(ISAC_inst[0], red_data);
799 } else {
800#endif
801 memcpy(red_data, &rtp_data[RTPheaderLen + red_len[0]], enc_len);
802 red_len[0] = red_len[1];
803#ifdef CODEC_ISAC
804 }
805#endif
806 red_TS[0] = red_TS[1];
807 red_PT[0] = red_PT[1];
808 }
809 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000810
Peter Kasting248b0b02015-06-03 12:32:41 -0700811 /* read next frame */
812 len = fread(org_data, 2, packet_size * numChannels, in_file) / numChannels;
813 /* de-interleave if stereo */
814 if (usingStereo) {
815 stereoDeInterleave(org_data, len * numChannels);
816 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000817
Peter Kasting248b0b02015-06-03 12:32:41 -0700818 if (payloadType == NETEQ_CODEC_G722_PT)
819 timestamp += len >> 1;
820 else
821 timestamp += len;
822
823 sendtime += (double)len / (fs / 1000);
824 }
825
826 NetEQTest_free_coders(usedCodec, numChannels);
827 fclose(in_file);
828 fclose(out_file);
829 printf("Done!\n");
830
831 return (0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000832}
833
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000834/****************/
835/* Subfunctions */
836/****************/
837
pkasting@chromium.orgd3245462015-02-23 21:28:22 +0000838void NetEQTest_GetCodec_and_PT(char* name,
839 webrtc::NetEqDecoder* codec,
840 int* PT,
Peter Kastingdce40cf2015-08-24 14:52:23 -0700841 size_t frameLen,
pkasting@chromium.orgd3245462015-02-23 21:28:22 +0000842 int* fs,
843 int* bitrate,
844 int* useRed) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700845 *bitrate = 0; /* Default bitrate setting */
846 *useRed = 0; /* Default no redundancy */
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000847
Peter Kasting248b0b02015-06-03 12:32:41 -0700848 if (!strcmp(name, "pcmu")) {
kwibergee1879c2015-10-29 06:20:28 -0700849 *codec = webrtc::NetEqDecoder::kDecoderPCMu;
Peter Kasting248b0b02015-06-03 12:32:41 -0700850 *PT = NETEQ_CODEC_PCMU_PT;
851 *fs = 8000;
852 } else if (!strcmp(name, "pcma")) {
kwibergee1879c2015-10-29 06:20:28 -0700853 *codec = webrtc::NetEqDecoder::kDecoderPCMa;
Peter Kasting248b0b02015-06-03 12:32:41 -0700854 *PT = NETEQ_CODEC_PCMA_PT;
855 *fs = 8000;
856 } else if (!strcmp(name, "pcm16b")) {
kwibergee1879c2015-10-29 06:20:28 -0700857 *codec = webrtc::NetEqDecoder::kDecoderPCM16B;
Peter Kasting248b0b02015-06-03 12:32:41 -0700858 *PT = NETEQ_CODEC_PCM16B_PT;
859 *fs = 8000;
860 } else if (!strcmp(name, "pcm16b_wb")) {
kwibergee1879c2015-10-29 06:20:28 -0700861 *codec = webrtc::NetEqDecoder::kDecoderPCM16Bwb;
Peter Kasting248b0b02015-06-03 12:32:41 -0700862 *PT = NETEQ_CODEC_PCM16B_WB_PT;
863 *fs = 16000;
864 } else if (!strcmp(name, "pcm16b_swb32")) {
kwibergee1879c2015-10-29 06:20:28 -0700865 *codec = webrtc::NetEqDecoder::kDecoderPCM16Bswb32kHz;
Peter Kasting248b0b02015-06-03 12:32:41 -0700866 *PT = NETEQ_CODEC_PCM16B_SWB32KHZ_PT;
867 *fs = 32000;
868 } else if (!strcmp(name, "pcm16b_swb48")) {
kwibergee1879c2015-10-29 06:20:28 -0700869 *codec = webrtc::NetEqDecoder::kDecoderPCM16Bswb48kHz;
Peter Kasting248b0b02015-06-03 12:32:41 -0700870 *PT = NETEQ_CODEC_PCM16B_SWB48KHZ_PT;
871 *fs = 48000;
872 } else if (!strcmp(name, "g722")) {
kwibergee1879c2015-10-29 06:20:28 -0700873 *codec = webrtc::NetEqDecoder::kDecoderG722;
Peter Kasting248b0b02015-06-03 12:32:41 -0700874 *PT = NETEQ_CODEC_G722_PT;
875 *fs = 16000;
876 } else if ((!strcmp(name, "ilbc")) &&
877 ((frameLen % 240 == 0) || (frameLen % 160 == 0))) {
878 *fs = 8000;
kwibergee1879c2015-10-29 06:20:28 -0700879 *codec = webrtc::NetEqDecoder::kDecoderILBC;
Peter Kasting248b0b02015-06-03 12:32:41 -0700880 *PT = NETEQ_CODEC_ILBC_PT;
881 } else if (!strcmp(name, "isac")) {
882 *fs = 16000;
kwibergee1879c2015-10-29 06:20:28 -0700883 *codec = webrtc::NetEqDecoder::kDecoderISAC;
Peter Kasting248b0b02015-06-03 12:32:41 -0700884 *PT = NETEQ_CODEC_ISAC_PT;
885 } else if (!strcmp(name, "isacswb")) {
886 *fs = 32000;
kwibergee1879c2015-10-29 06:20:28 -0700887 *codec = webrtc::NetEqDecoder::kDecoderISACswb;
Peter Kasting248b0b02015-06-03 12:32:41 -0700888 *PT = NETEQ_CODEC_ISACSWB_PT;
889 } else if (!strcmp(name, "red_pcm")) {
kwibergee1879c2015-10-29 06:20:28 -0700890 *codec = webrtc::NetEqDecoder::kDecoderPCMa;
Peter Kasting248b0b02015-06-03 12:32:41 -0700891 *PT = NETEQ_CODEC_PCMA_PT; /* this will be the PT for the sub-headers */
892 *fs = 8000;
893 *useRed = 1;
894 } else if (!strcmp(name, "red_isac")) {
kwibergee1879c2015-10-29 06:20:28 -0700895 *codec = webrtc::NetEqDecoder::kDecoderISAC;
Peter Kasting248b0b02015-06-03 12:32:41 -0700896 *PT = NETEQ_CODEC_ISAC_PT; /* this will be the PT for the sub-headers */
897 *fs = 16000;
898 *useRed = 1;
minyuecb23c0d2015-12-11 01:58:26 -0800899 } else if (!strcmp(name, "opus")) {
900 *codec = webrtc::NetEqDecoder::kDecoderOpus;
901 *PT = NETEQ_CODEC_OPUS_PT; /* this will be the PT for the sub-headers */
902 *fs = 48000;
Peter Kasting248b0b02015-06-03 12:32:41 -0700903 } else {
904 printf("Error: Not a supported codec (%s)\n", name);
905 exit(0);
906 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000907}
908
Peter Kasting248b0b02015-06-03 12:32:41 -0700909int NetEQTest_init_coders(webrtc::NetEqDecoder coder,
Peter Kastingdce40cf2015-08-24 14:52:23 -0700910 size_t enc_frameSize,
Peter Kasting248b0b02015-06-03 12:32:41 -0700911 int bitrate,
912 int sampfreq,
913 int vad,
Peter Kastingdce40cf2015-08-24 14:52:23 -0700914 size_t numChannels) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700915 int ok = 0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000916
Peter Kastingdce40cf2015-08-24 14:52:23 -0700917 for (size_t k = 0; k < numChannels; k++) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700918 VAD_inst[k] = WebRtcVad_Create();
919 if (!VAD_inst[k]) {
920 printf("Error: Couldn't allocate memory for VAD instance\n");
921 exit(0);
922 }
923 ok = WebRtcVad_Init(VAD_inst[k]);
924 if (ok == -1) {
925 printf("Error: Initialization of VAD struct failed\n");
926 exit(0);
927 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000928
929#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
Peter Kasting248b0b02015-06-03 12:32:41 -0700930 defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
Peter Kasting248b0b02015-06-03 12:32:41 -0700931 if (sampfreq <= 16000) {
ossu97ba30e2016-04-25 07:55:58 -0700932 CNG_encoder[k] = new webrtc::ComfortNoiseEncoder(sampfreq, 200, 5);
Peter Kasting248b0b02015-06-03 12:32:41 -0700933 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000934#endif
935
Peter Kasting248b0b02015-06-03 12:32:41 -0700936 switch (coder) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000937#ifdef CODEC_PCM16B
kwibergee1879c2015-10-29 06:20:28 -0700938 case webrtc::NetEqDecoder::kDecoderPCM16B:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000939#endif
940#ifdef CODEC_PCM16B_WB
kwibergee1879c2015-10-29 06:20:28 -0700941 case webrtc::NetEqDecoder::kDecoderPCM16Bwb:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000942#endif
943#ifdef CODEC_PCM16B_32KHZ
kwibergee1879c2015-10-29 06:20:28 -0700944 case webrtc::NetEqDecoder::kDecoderPCM16Bswb32kHz:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000945#endif
946#ifdef CODEC_PCM16B_48KHZ
kwibergee1879c2015-10-29 06:20:28 -0700947 case webrtc::NetEqDecoder::kDecoderPCM16Bswb48kHz:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000948#endif
949#ifdef CODEC_G711
kwibergee1879c2015-10-29 06:20:28 -0700950 case webrtc::NetEqDecoder::kDecoderPCMu:
951 case webrtc::NetEqDecoder::kDecoderPCMa:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000952#endif
953 // do nothing
954 break;
955#ifdef CODEC_G729
Peter Kasting248b0b02015-06-03 12:32:41 -0700956 case webrtc::kDecoderG729:
957 if (sampfreq == 8000) {
958 if ((enc_frameSize == 80) || (enc_frameSize == 160) ||
959 (enc_frameSize == 240) || (enc_frameSize == 320) ||
960 (enc_frameSize == 400) || (enc_frameSize == 480)) {
961 ok = WebRtcG729_CreateEnc(&G729enc_inst[k]);
962 if (ok != 0) {
Peter Kasting2a100872015-06-09 17:26:40 -0700963 printf("Error: Couldn't allocate memory for G729 encoding "
964 "instance\n");
Peter Kasting248b0b02015-06-03 12:32:41 -0700965 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000966 }
Peter Kasting248b0b02015-06-03 12:32:41 -0700967 } else {
Peter Kasting2a100872015-06-09 17:26:40 -0700968 printf("\nError: g729 only supports 10, 20, 30, 40, 50 or 60 "
969 "ms!!\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000970 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -0700971 }
972 WebRtcG729_EncoderInit(G729enc_inst[k], vad);
973 if ((vad == 1) && (enc_frameSize != 80)) {
Peter Kasting2a100872015-06-09 17:26:40 -0700974 printf("\nError - This simulation only supports VAD for G729 at "
Peter Kastingdce40cf2015-08-24 14:52:23 -0700975 "10ms packets (not %" PRIuS "ms)\n", (enc_frameSize >> 3));
Peter Kasting248b0b02015-06-03 12:32:41 -0700976 }
977 } else {
978 printf("\nError - g729 is only developed for 8kHz \n");
979 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000980 }
981 break;
982#endif
983#ifdef CODEC_G729_1
Peter Kasting248b0b02015-06-03 12:32:41 -0700984 case webrtc::kDecoderG729_1:
985 if (sampfreq == 16000) {
986 if ((enc_frameSize == 320) || (enc_frameSize == 640) ||
987 (enc_frameSize == 960)) {
988 ok = WebRtcG7291_Create(&G729_1_inst[k]);
989 if (ok != 0) {
Peter Kasting2a100872015-06-09 17:26:40 -0700990 printf("Error: Couldn't allocate memory for G.729.1 codec "
991 "instance\n");
Peter Kasting248b0b02015-06-03 12:32:41 -0700992 exit(0);
993 }
994 } else {
995 printf("\nError: G.729.1 only supports 20, 40 or 60 ms!!\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000996 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -0700997 }
998 if (!(((bitrate >= 12000) && (bitrate <= 32000) &&
999 (bitrate % 2000 == 0)) ||
1000 (bitrate == 8000))) {
1001 /* must be 8, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, or 32 kbps */
Peter Kasting2a100872015-06-09 17:26:40 -07001002 printf("\nError: G.729.1 bitrate must be 8000 or 12000--32000 in "
1003 "steps of 2000 bps\n");
Peter Kasting248b0b02015-06-03 12:32:41 -07001004 exit(0);
1005 }
1006 WebRtcG7291_EncoderInit(G729_1_inst[k], bitrate, 0 /* flag8kHz*/,
1007 0 /*flagG729mode*/);
1008 } else {
1009 printf("\nError - G.729.1 input is always 16 kHz \n");
1010 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001011 }
1012 break;
1013#endif
1014#ifdef CODEC_SPEEX_8
Peter Kasting248b0b02015-06-03 12:32:41 -07001015 case webrtc::kDecoderSPEEX_8:
1016 if (sampfreq == 8000) {
1017 if ((enc_frameSize == 160) || (enc_frameSize == 320) ||
1018 (enc_frameSize == 480)) {
1019 ok = WebRtcSpeex_CreateEnc(&SPEEX8enc_inst[k], sampfreq);
1020 if (ok != 0) {
Peter Kasting2a100872015-06-09 17:26:40 -07001021 printf("Error: Couldn't allocate memory for Speex encoding "
1022 "instance\n");
Peter Kasting248b0b02015-06-03 12:32:41 -07001023 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001024 }
Peter Kasting248b0b02015-06-03 12:32:41 -07001025 } else {
1026 printf("\nError: Speex only supports 20, 40, and 60 ms!!\n\n");
1027 exit(0);
1028 }
1029 if ((vad == 1) && (enc_frameSize != 160)) {
Peter Kasting2a100872015-06-09 17:26:40 -07001030 printf("\nError - This simulation only supports VAD for Speex at "
Peter Kastingdce40cf2015-08-24 14:52:23 -07001031 "20ms packets (not %" PRIuS "ms)\n",
Peter Kasting248b0b02015-06-03 12:32:41 -07001032 (enc_frameSize >> 3));
1033 vad = 0;
1034 }
1035 ok = WebRtcSpeex_EncoderInit(SPEEX8enc_inst[k], 0 /*vbr*/,
1036 3 /*complexity*/, vad);
1037 if (ok != 0)
1038 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001039 } else {
Peter Kasting2a100872015-06-09 17:26:40 -07001040 printf("\nError - Speex8 called with sample frequency other than 8 "
1041 "kHz.\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001042 }
1043 break;
1044#endif
1045#ifdef CODEC_SPEEX_16
Peter Kasting248b0b02015-06-03 12:32:41 -07001046 case webrtc::kDecoderSPEEX_16:
1047 if (sampfreq == 16000) {
1048 if ((enc_frameSize == 320) || (enc_frameSize == 640) ||
1049 (enc_frameSize == 960)) {
1050 ok = WebRtcSpeex_CreateEnc(&SPEEX16enc_inst[k], sampfreq);
1051 if (ok != 0) {
Peter Kasting2a100872015-06-09 17:26:40 -07001052 printf("Error: Couldn't allocate memory for Speex encoding "
1053 "instance\n");
Peter Kasting248b0b02015-06-03 12:32:41 -07001054 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001055 }
Peter Kasting248b0b02015-06-03 12:32:41 -07001056 } else {
1057 printf("\nError: Speex only supports 20, 40, and 60 ms!!\n\n");
1058 exit(0);
1059 }
1060 if ((vad == 1) && (enc_frameSize != 320)) {
Peter Kasting2a100872015-06-09 17:26:40 -07001061 printf("\nError - This simulation only supports VAD for Speex at "
Peter Kastingdce40cf2015-08-24 14:52:23 -07001062 "20ms packets (not %" PRIuS "ms)\n",
Peter Kasting248b0b02015-06-03 12:32:41 -07001063 (enc_frameSize >> 4));
1064 vad = 0;
1065 }
1066 ok = WebRtcSpeex_EncoderInit(SPEEX16enc_inst[k], 0 /*vbr*/,
1067 3 /*complexity*/, vad);
1068 if (ok != 0)
1069 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001070 } else {
Peter Kasting2a100872015-06-09 17:26:40 -07001071 printf("\nError - Speex16 called with sample frequency other than 16 "
1072 "kHz.\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001073 }
1074 break;
1075#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001076
1077#ifdef CODEC_G722_1_16
Peter Kasting248b0b02015-06-03 12:32:41 -07001078 case webrtc::kDecoderG722_1_16:
1079 if (sampfreq == 16000) {
1080 ok = WebRtcG7221_CreateEnc16(&G722_1_16enc_inst[k]);
1081 if (ok != 0) {
1082 printf("Error: Couldn't allocate memory for G.722.1 instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001083 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001084 }
1085 if (enc_frameSize == 320) {
1086 } else {
1087 printf("\nError: G722.1 only supports 20 ms!!\n\n");
1088 exit(0);
1089 }
1090 WebRtcG7221_EncoderInit16((G722_1_16_encinst_t*)G722_1_16enc_inst[k]);
1091 } else {
1092 printf("\nError - G722.1 is only developed for 16kHz \n");
1093 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001094 }
1095 break;
1096#endif
1097#ifdef CODEC_G722_1_24
Peter Kasting248b0b02015-06-03 12:32:41 -07001098 case webrtc::kDecoderG722_1_24:
1099 if (sampfreq == 16000) {
1100 ok = WebRtcG7221_CreateEnc24(&G722_1_24enc_inst[k]);
1101 if (ok != 0) {
1102 printf("Error: Couldn't allocate memory for G.722.1 instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001103 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001104 }
1105 if (enc_frameSize == 320) {
1106 } else {
1107 printf("\nError: G722.1 only supports 20 ms!!\n\n");
1108 exit(0);
1109 }
1110 WebRtcG7221_EncoderInit24((G722_1_24_encinst_t*)G722_1_24enc_inst[k]);
1111 } else {
1112 printf("\nError - G722.1 is only developed for 16kHz \n");
1113 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001114 }
1115 break;
1116#endif
1117#ifdef CODEC_G722_1_32
Peter Kasting248b0b02015-06-03 12:32:41 -07001118 case webrtc::kDecoderG722_1_32:
1119 if (sampfreq == 16000) {
1120 ok = WebRtcG7221_CreateEnc32(&G722_1_32enc_inst[k]);
1121 if (ok != 0) {
1122 printf("Error: Couldn't allocate memory for G.722.1 instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001123 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001124 }
1125 if (enc_frameSize == 320) {
1126 } else {
1127 printf("\nError: G722.1 only supports 20 ms!!\n\n");
1128 exit(0);
1129 }
1130 WebRtcG7221_EncoderInit32((G722_1_32_encinst_t*)G722_1_32enc_inst[k]);
1131 } else {
1132 printf("\nError - G722.1 is only developed for 16kHz \n");
1133 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001134 }
1135 break;
1136#endif
1137#ifdef CODEC_G722_1C_24
Peter Kasting248b0b02015-06-03 12:32:41 -07001138 case webrtc::kDecoderG722_1C_24:
1139 if (sampfreq == 32000) {
1140 ok = WebRtcG7221C_CreateEnc24(&G722_1C_24enc_inst[k]);
1141 if (ok != 0) {
1142 printf("Error: Couldn't allocate memory for G.722.1C instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001143 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001144 }
1145 if (enc_frameSize == 640) {
1146 } else {
1147 printf("\nError: G722.1 C only supports 20 ms!!\n\n");
1148 exit(0);
1149 }
1150 WebRtcG7221C_EncoderInit24(
1151 (G722_1C_24_encinst_t*)G722_1C_24enc_inst[k]);
1152 } else {
1153 printf("\nError - G722.1 C is only developed for 32kHz \n");
1154 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001155 }
1156 break;
1157#endif
1158#ifdef CODEC_G722_1C_32
Peter Kasting248b0b02015-06-03 12:32:41 -07001159 case webrtc::kDecoderG722_1C_32:
1160 if (sampfreq == 32000) {
1161 ok = WebRtcG7221C_CreateEnc32(&G722_1C_32enc_inst[k]);
1162 if (ok != 0) {
1163 printf("Error: Couldn't allocate memory for G.722.1C instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001164 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001165 }
1166 if (enc_frameSize == 640) {
1167 } else {
1168 printf("\nError: G722.1 C only supports 20 ms!!\n\n");
1169 exit(0);
1170 }
1171 WebRtcG7221C_EncoderInit32(
1172 (G722_1C_32_encinst_t*)G722_1C_32enc_inst[k]);
1173 } else {
1174 printf("\nError - G722.1 C is only developed for 32kHz \n");
1175 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001176 }
1177 break;
1178#endif
1179#ifdef CODEC_G722_1C_48
Peter Kasting248b0b02015-06-03 12:32:41 -07001180 case webrtc::kDecoderG722_1C_48:
1181 if (sampfreq == 32000) {
1182 ok = WebRtcG7221C_CreateEnc48(&G722_1C_48enc_inst[k]);
1183 if (ok != 0) {
1184 printf("Error: Couldn't allocate memory for G.722.1C instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001185 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001186 }
1187 if (enc_frameSize == 640) {
1188 } else {
1189 printf("\nError: G722.1 C only supports 20 ms!!\n\n");
1190 exit(0);
1191 }
1192 WebRtcG7221C_EncoderInit48(
1193 (G722_1C_48_encinst_t*)G722_1C_48enc_inst[k]);
1194 } else {
1195 printf("\nError - G722.1 C is only developed for 32kHz \n");
1196 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001197 }
1198 break;
1199#endif
1200#ifdef CODEC_G722
kwibergee1879c2015-10-29 06:20:28 -07001201 case webrtc::NetEqDecoder::kDecoderG722:
Peter Kasting248b0b02015-06-03 12:32:41 -07001202 if (sampfreq == 16000) {
1203 if (enc_frameSize % 2 == 0) {
1204 } else {
1205 printf(
1206 "\nError - g722 frames must have an even number of "
1207 "enc_frameSize\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001208 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001209 }
1210 WebRtcG722_CreateEncoder(&g722EncState[k]);
1211 WebRtcG722_EncoderInit(g722EncState[k]);
1212 } else {
1213 printf("\nError - g722 is only developed for 16kHz \n");
1214 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001215 }
1216 break;
1217#endif
1218#ifdef CODEC_AMR
Peter Kasting248b0b02015-06-03 12:32:41 -07001219 case webrtc::kDecoderAMR:
1220 if (sampfreq == 8000) {
1221 ok = WebRtcAmr_CreateEnc(&AMRenc_inst[k]);
1222 if (ok != 0) {
1223 printf(
1224 "Error: Couldn't allocate memory for AMR encoding instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001225 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001226 }
1227 if ((enc_frameSize == 160) || (enc_frameSize == 320) ||
1228 (enc_frameSize == 480)) {
1229 } else {
1230 printf("\nError - AMR must have a multiple of 160 enc_frameSize\n");
1231 exit(0);
1232 }
1233 WebRtcAmr_EncoderInit(AMRenc_inst[k], vad);
1234 WebRtcAmr_EncodeBitmode(AMRenc_inst[k], AMRBandwidthEfficient);
1235 AMR_bitrate = bitrate;
1236 } else {
1237 printf("\nError - AMR is only developed for 8kHz \n");
1238 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001239 }
1240 break;
1241#endif
1242#ifdef CODEC_AMRWB
Peter Kasting248b0b02015-06-03 12:32:41 -07001243 case webrtc::kDecoderAMRWB:
1244 if (sampfreq == 16000) {
1245 ok = WebRtcAmrWb_CreateEnc(&AMRWBenc_inst[k]);
1246 if (ok != 0) {
Peter Kasting2a100872015-06-09 17:26:40 -07001247 printf("Error: Couldn't allocate memory for AMRWB encoding "
1248 "instance\n");
Peter Kasting248b0b02015-06-03 12:32:41 -07001249 exit(0);
1250 }
Peter Kastingdce40cf2015-08-24 14:52:23 -07001251 if (((enc_frameSize / 320) > 3) || ((enc_frameSize % 320) != 0)) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001252 printf("\nError - AMRwb must have frameSize of 20, 40 or 60ms\n");
1253 exit(0);
1254 }
1255 WebRtcAmrWb_EncoderInit(AMRWBenc_inst[k], vad);
1256 if (bitrate == 7000) {
1257 AMRWB_bitrate = AMRWB_MODE_7k;
1258 } else if (bitrate == 9000) {
1259 AMRWB_bitrate = AMRWB_MODE_9k;
1260 } else if (bitrate == 12000) {
1261 AMRWB_bitrate = AMRWB_MODE_12k;
1262 } else if (bitrate == 14000) {
1263 AMRWB_bitrate = AMRWB_MODE_14k;
1264 } else if (bitrate == 16000) {
1265 AMRWB_bitrate = AMRWB_MODE_16k;
1266 } else if (bitrate == 18000) {
1267 AMRWB_bitrate = AMRWB_MODE_18k;
1268 } else if (bitrate == 20000) {
1269 AMRWB_bitrate = AMRWB_MODE_20k;
1270 } else if (bitrate == 23000) {
1271 AMRWB_bitrate = AMRWB_MODE_23k;
1272 } else if (bitrate == 24000) {
1273 AMRWB_bitrate = AMRWB_MODE_24k;
1274 }
1275 WebRtcAmrWb_EncodeBitmode(AMRWBenc_inst[k], AMRBandwidthEfficient);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001276
1277 } else {
Peter Kasting248b0b02015-06-03 12:32:41 -07001278 printf("\nError - AMRwb is only developed for 16kHz \n");
1279 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001280 }
1281 break;
1282#endif
1283#ifdef CODEC_ILBC
kwibergee1879c2015-10-29 06:20:28 -07001284 case webrtc::NetEqDecoder::kDecoderILBC:
Peter Kasting248b0b02015-06-03 12:32:41 -07001285 if (sampfreq == 8000) {
1286 ok = WebRtcIlbcfix_EncoderCreate(&iLBCenc_inst[k]);
1287 if (ok != 0) {
Peter Kasting2a100872015-06-09 17:26:40 -07001288 printf("Error: Couldn't allocate memory for iLBC encoding "
1289 "instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001290 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001291 }
1292 if ((enc_frameSize == 160) || (enc_frameSize == 240) ||
1293 (enc_frameSize == 320) || (enc_frameSize == 480)) {
1294 } else {
Peter Kasting2a100872015-06-09 17:26:40 -07001295 printf("\nError - iLBC only supports 160, 240, 320 and 480 "
1296 "enc_frameSize (20, 30, 40 and 60 ms)\n");
Peter Kasting248b0b02015-06-03 12:32:41 -07001297 exit(0);
1298 }
1299 if ((enc_frameSize == 160) || (enc_frameSize == 320)) {
1300 /* 20 ms version */
1301 WebRtcIlbcfix_EncoderInit(iLBCenc_inst[k], 20);
1302 } else {
1303 /* 30 ms version */
1304 WebRtcIlbcfix_EncoderInit(iLBCenc_inst[k], 30);
1305 }
1306 } else {
1307 printf("\nError - iLBC is only developed for 8kHz \n");
1308 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001309 }
1310 break;
1311#endif
1312#ifdef CODEC_ISAC
kwibergee1879c2015-10-29 06:20:28 -07001313 case webrtc::NetEqDecoder::kDecoderISAC:
Peter Kasting248b0b02015-06-03 12:32:41 -07001314 if (sampfreq == 16000) {
1315 ok = WebRtcIsac_Create(&ISAC_inst[k]);
1316 if (ok != 0) {
1317 printf("Error: Couldn't allocate memory for iSAC instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001318 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001319 }
1320 if ((enc_frameSize == 480) || (enc_frameSize == 960)) {
1321 } else {
1322 printf("\nError - iSAC only supports frameSize (30 and 60 ms)\n");
1323 exit(0);
1324 }
1325 WebRtcIsac_EncoderInit(ISAC_inst[k], 1);
1326 if ((bitrate < 10000) || (bitrate > 32000)) {
Peter Kasting2a100872015-06-09 17:26:40 -07001327 printf("\nError - iSAC bitrate has to be between 10000 and 32000 "
1328 "bps (not %i)\n",
Peter Kasting248b0b02015-06-03 12:32:41 -07001329 bitrate);
1330 exit(0);
1331 }
Peter Kastingdce40cf2015-08-24 14:52:23 -07001332 WebRtcIsac_Control(ISAC_inst[k], bitrate,
1333 static_cast<int>(enc_frameSize >> 4));
Peter Kasting248b0b02015-06-03 12:32:41 -07001334 } else {
Peter Kasting2a100872015-06-09 17:26:40 -07001335 printf("\nError - iSAC only supports 480 or 960 enc_frameSize (30 or "
1336 "60 ms)\n");
Peter Kasting248b0b02015-06-03 12:32:41 -07001337 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001338 }
1339 break;
1340#endif
1341#ifdef NETEQ_ISACFIX_CODEC
Peter Kasting248b0b02015-06-03 12:32:41 -07001342 case webrtc::kDecoderISAC:
1343 if (sampfreq == 16000) {
1344 ok = WebRtcIsacfix_Create(&ISAC_inst[k]);
1345 if (ok != 0) {
1346 printf("Error: Couldn't allocate memory for iSAC instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001347 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001348 }
1349 if ((enc_frameSize == 480) || (enc_frameSize == 960)) {
1350 } else {
1351 printf("\nError - iSAC only supports frameSize (30 and 60 ms)\n");
1352 exit(0);
1353 }
1354 WebRtcIsacfix_EncoderInit(ISAC_inst[k], 1);
1355 if ((bitrate < 10000) || (bitrate > 32000)) {
Peter Kasting2a100872015-06-09 17:26:40 -07001356 printf("\nError - iSAC bitrate has to be between 10000 and 32000 "
1357 "bps (not %i)\n", bitrate);
Peter Kasting248b0b02015-06-03 12:32:41 -07001358 exit(0);
1359 }
1360 WebRtcIsacfix_Control(ISAC_inst[k], bitrate, enc_frameSize >> 4);
1361 } else {
Peter Kasting2a100872015-06-09 17:26:40 -07001362 printf("\nError - iSAC only supports 480 or 960 enc_frameSize (30 or "
1363 "60 ms)\n");
Peter Kasting248b0b02015-06-03 12:32:41 -07001364 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001365 }
1366 break;
1367#endif
1368#ifdef CODEC_ISAC_SWB
kwibergee1879c2015-10-29 06:20:28 -07001369 case webrtc::NetEqDecoder::kDecoderISACswb:
Peter Kasting248b0b02015-06-03 12:32:41 -07001370 if (sampfreq == 32000) {
1371 ok = WebRtcIsac_Create(&ISACSWB_inst[k]);
1372 if (ok != 0) {
1373 printf("Error: Couldn't allocate memory for iSAC SWB instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001374 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001375 }
1376 if (enc_frameSize == 960) {
1377 } else {
1378 printf("\nError - iSAC SWB only supports frameSize 30 ms\n");
1379 exit(0);
1380 }
1381 ok = WebRtcIsac_SetEncSampRate(ISACSWB_inst[k], 32000);
1382 if (ok != 0) {
1383 printf("Error: Couldn't set sample rate for iSAC SWB instance\n");
1384 exit(0);
1385 }
1386 WebRtcIsac_EncoderInit(ISACSWB_inst[k], 1);
1387 if ((bitrate < 32000) || (bitrate > 56000)) {
Peter Kasting2a100872015-06-09 17:26:40 -07001388 printf("\nError - iSAC SWB bitrate has to be between 32000 and "
1389 "56000 bps (not %i)\n", bitrate);
Peter Kasting248b0b02015-06-03 12:32:41 -07001390 exit(0);
1391 }
Peter Kastingdce40cf2015-08-24 14:52:23 -07001392 WebRtcIsac_Control(ISACSWB_inst[k], bitrate,
1393 static_cast<int>(enc_frameSize >> 5));
Peter Kasting248b0b02015-06-03 12:32:41 -07001394 } else {
Peter Kasting2a100872015-06-09 17:26:40 -07001395 printf("\nError - iSAC SWB only supports 960 enc_frameSize (30 "
1396 "ms)\n");
Peter Kasting248b0b02015-06-03 12:32:41 -07001397 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001398 }
1399 break;
1400#endif
1401#ifdef CODEC_GSMFR
Peter Kasting248b0b02015-06-03 12:32:41 -07001402 case webrtc::kDecoderGSMFR:
1403 if (sampfreq == 8000) {
1404 ok = WebRtcGSMFR_CreateEnc(&GSMFRenc_inst[k]);
1405 if (ok != 0) {
Peter Kasting2a100872015-06-09 17:26:40 -07001406 printf("Error: Couldn't allocate memory for GSM FR encoding "
1407 "instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001408 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001409 }
1410 if ((enc_frameSize == 160) || (enc_frameSize == 320) ||
1411 (enc_frameSize == 480)) {
1412 } else {
Peter Kasting2a100872015-06-09 17:26:40 -07001413 printf("\nError - GSM FR must have a multiple of 160 "
1414 "enc_frameSize\n");
Peter Kasting248b0b02015-06-03 12:32:41 -07001415 exit(0);
1416 }
1417 WebRtcGSMFR_EncoderInit(GSMFRenc_inst[k], 0);
1418 } else {
1419 printf("\nError - GSM FR is only developed for 8kHz \n");
1420 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001421 }
1422 break;
1423#endif
minyuecb23c0d2015-12-11 01:58:26 -08001424#ifdef CODEC_OPUS
1425 case webrtc::NetEqDecoder::kDecoderOpus:
1426 ok = WebRtcOpus_EncoderCreate(&opus_inst[k], 1, 0);
1427 if (ok != 0) {
1428 printf("Error: Couldn't allocate memory for Opus encoding "
1429 "instance\n");
1430 exit(0);
1431 }
1432 WebRtcOpus_EnableFec(opus_inst[k]);
1433 WebRtcOpus_SetPacketLossRate(opus_inst[k], 5);
1434 break;
1435#endif
Peter Kasting248b0b02015-06-03 12:32:41 -07001436 default:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001437 printf("Error: unknown codec in call to NetEQTest_init_coders.\n");
1438 exit(0);
1439 break;
Peter Kasting248b0b02015-06-03 12:32:41 -07001440 }
Peter Kasting248b0b02015-06-03 12:32:41 -07001441 if (ok != 0) {
1442 return (ok);
1443 }
1444 } // end for
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001445
Peter Kasting248b0b02015-06-03 12:32:41 -07001446 return (0);
1447}
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001448
Peter Kastingdce40cf2015-08-24 14:52:23 -07001449int NetEQTest_free_coders(webrtc::NetEqDecoder coder, size_t numChannels) {
1450 for (size_t k = 0; k < numChannels; k++) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001451 WebRtcVad_Free(VAD_inst[k]);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001452#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
Peter Kasting248b0b02015-06-03 12:32:41 -07001453 defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
ossu97ba30e2016-04-25 07:55:58 -07001454 delete CNG_encoder[k];
1455 CNG_encoder[k] = nullptr;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001456#endif
1457
Peter Kasting248b0b02015-06-03 12:32:41 -07001458 switch (coder) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001459#ifdef CODEC_PCM16B
kwibergee1879c2015-10-29 06:20:28 -07001460 case webrtc::NetEqDecoder::kDecoderPCM16B:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001461#endif
1462#ifdef CODEC_PCM16B_WB
kwibergee1879c2015-10-29 06:20:28 -07001463 case webrtc::NetEqDecoder::kDecoderPCM16Bwb:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001464#endif
1465#ifdef CODEC_PCM16B_32KHZ
kwibergee1879c2015-10-29 06:20:28 -07001466 case webrtc::NetEqDecoder::kDecoderPCM16Bswb32kHz:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001467#endif
1468#ifdef CODEC_PCM16B_48KHZ
kwibergee1879c2015-10-29 06:20:28 -07001469 case webrtc::NetEqDecoder::kDecoderPCM16Bswb48kHz:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001470#endif
1471#ifdef CODEC_G711
kwibergee1879c2015-10-29 06:20:28 -07001472 case webrtc::NetEqDecoder::kDecoderPCMu:
1473 case webrtc::NetEqDecoder::kDecoderPCMa:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001474#endif
Peter Kasting248b0b02015-06-03 12:32:41 -07001475 // do nothing
1476 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001477#ifdef CODEC_G729
kwibergee1879c2015-10-29 06:20:28 -07001478 case webrtc::NetEqDecoder::kDecoderG729:
Peter Kasting248b0b02015-06-03 12:32:41 -07001479 WebRtcG729_FreeEnc(G729enc_inst[k]);
1480 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001481#endif
1482#ifdef CODEC_G729_1
kwibergee1879c2015-10-29 06:20:28 -07001483 case webrtc::NetEqDecoder::kDecoderG729_1:
Peter Kasting248b0b02015-06-03 12:32:41 -07001484 WebRtcG7291_Free(G729_1_inst[k]);
1485 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001486#endif
1487#ifdef CODEC_SPEEX_8
kwibergee1879c2015-10-29 06:20:28 -07001488 case webrtc::NetEqDecoder::kDecoderSPEEX_8:
Peter Kasting248b0b02015-06-03 12:32:41 -07001489 WebRtcSpeex_FreeEnc(SPEEX8enc_inst[k]);
1490 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001491#endif
1492#ifdef CODEC_SPEEX_16
kwibergee1879c2015-10-29 06:20:28 -07001493 case webrtc::NetEqDecoder::kDecoderSPEEX_16:
Peter Kasting248b0b02015-06-03 12:32:41 -07001494 WebRtcSpeex_FreeEnc(SPEEX16enc_inst[k]);
1495 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001496#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001497
1498#ifdef CODEC_G722_1_16
kwibergee1879c2015-10-29 06:20:28 -07001499 case webrtc::NetEqDecoder::kDecoderG722_1_16:
Peter Kasting248b0b02015-06-03 12:32:41 -07001500 WebRtcG7221_FreeEnc16(G722_1_16enc_inst[k]);
1501 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001502#endif
1503#ifdef CODEC_G722_1_24
kwibergee1879c2015-10-29 06:20:28 -07001504 case webrtc::NetEqDecoder::kDecoderG722_1_24:
Peter Kasting248b0b02015-06-03 12:32:41 -07001505 WebRtcG7221_FreeEnc24(G722_1_24enc_inst[k]);
1506 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001507#endif
1508#ifdef CODEC_G722_1_32
kwibergee1879c2015-10-29 06:20:28 -07001509 case webrtc::NetEqDecoder::kDecoderG722_1_32:
Peter Kasting248b0b02015-06-03 12:32:41 -07001510 WebRtcG7221_FreeEnc32(G722_1_32enc_inst[k]);
1511 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001512#endif
1513#ifdef CODEC_G722_1C_24
kwibergee1879c2015-10-29 06:20:28 -07001514 case webrtc::NetEqDecoder::kDecoderG722_1C_24:
Peter Kasting248b0b02015-06-03 12:32:41 -07001515 WebRtcG7221C_FreeEnc24(G722_1C_24enc_inst[k]);
1516 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001517#endif
1518#ifdef CODEC_G722_1C_32
kwibergee1879c2015-10-29 06:20:28 -07001519 case webrtc::NetEqDecoder::kDecoderG722_1C_32:
Peter Kasting248b0b02015-06-03 12:32:41 -07001520 WebRtcG7221C_FreeEnc32(G722_1C_32enc_inst[k]);
1521 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001522#endif
1523#ifdef CODEC_G722_1C_48
kwibergee1879c2015-10-29 06:20:28 -07001524 case webrtc::NetEqDecoder::kDecoderG722_1C_48:
Peter Kasting248b0b02015-06-03 12:32:41 -07001525 WebRtcG7221C_FreeEnc48(G722_1C_48enc_inst[k]);
1526 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001527#endif
1528#ifdef CODEC_G722
kwibergee1879c2015-10-29 06:20:28 -07001529 case webrtc::NetEqDecoder::kDecoderG722:
Peter Kasting248b0b02015-06-03 12:32:41 -07001530 WebRtcG722_FreeEncoder(g722EncState[k]);
1531 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001532#endif
1533#ifdef CODEC_AMR
kwibergee1879c2015-10-29 06:20:28 -07001534 case webrtc::NetEqDecoder::kDecoderAMR:
Peter Kasting248b0b02015-06-03 12:32:41 -07001535 WebRtcAmr_FreeEnc(AMRenc_inst[k]);
1536 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001537#endif
1538#ifdef CODEC_AMRWB
kwibergee1879c2015-10-29 06:20:28 -07001539 case webrtc::NetEqDecoder::kDecoderAMRWB:
Peter Kasting248b0b02015-06-03 12:32:41 -07001540 WebRtcAmrWb_FreeEnc(AMRWBenc_inst[k]);
1541 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001542#endif
1543#ifdef CODEC_ILBC
kwibergee1879c2015-10-29 06:20:28 -07001544 case webrtc::NetEqDecoder::kDecoderILBC:
Peter Kasting248b0b02015-06-03 12:32:41 -07001545 WebRtcIlbcfix_EncoderFree(iLBCenc_inst[k]);
1546 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001547#endif
1548#ifdef CODEC_ISAC
kwibergee1879c2015-10-29 06:20:28 -07001549 case webrtc::NetEqDecoder::kDecoderISAC:
Peter Kasting248b0b02015-06-03 12:32:41 -07001550 WebRtcIsac_Free(ISAC_inst[k]);
1551 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001552#endif
1553#ifdef NETEQ_ISACFIX_CODEC
kwibergee1879c2015-10-29 06:20:28 -07001554 case webrtc::NetEqDecoder::kDecoderISAC:
Peter Kasting248b0b02015-06-03 12:32:41 -07001555 WebRtcIsacfix_Free(ISAC_inst[k]);
1556 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001557#endif
1558#ifdef CODEC_ISAC_SWB
kwibergee1879c2015-10-29 06:20:28 -07001559 case webrtc::NetEqDecoder::kDecoderISACswb:
Peter Kasting248b0b02015-06-03 12:32:41 -07001560 WebRtcIsac_Free(ISACSWB_inst[k]);
1561 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001562#endif
1563#ifdef CODEC_GSMFR
kwibergee1879c2015-10-29 06:20:28 -07001564 case webrtc::NetEqDecoder::kDecoderGSMFR:
Peter Kasting248b0b02015-06-03 12:32:41 -07001565 WebRtcGSMFR_FreeEnc(GSMFRenc_inst[k]);
1566 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001567#endif
minyuecb23c0d2015-12-11 01:58:26 -08001568#ifdef CODEC_OPUS
1569 case webrtc::NetEqDecoder::kDecoderOpus:
1570 WebRtcOpus_EncoderFree(opus_inst[k]);
1571 break;
1572#endif
Peter Kasting248b0b02015-06-03 12:32:41 -07001573 default:
1574 printf("Error: unknown codec in call to NetEQTest_init_coders.\n");
1575 exit(0);
1576 break;
1577 }
1578 }
1579
1580 return (0);
1581}
1582
kwibergee1879c2015-10-29 06:20:28 -07001583size_t NetEQTest_encode(webrtc::NetEqDecoder coder,
Peter Kastingdce40cf2015-08-24 14:52:23 -07001584 int16_t* indata,
1585 size_t frameLen,
1586 unsigned char* encoded,
1587 int sampleRate,
1588 int* vad,
1589 int useVAD,
1590 int bitrate,
1591 size_t numChannels) {
1592 size_t cdlen = 0;
Peter Kasting248b0b02015-06-03 12:32:41 -07001593 int16_t* tempdata;
ossu97ba30e2016-04-25 07:55:58 -07001594 static bool first_cng = true;
Peter Kastingdce40cf2015-08-24 14:52:23 -07001595 size_t tempLen;
Peter Kasting248b0b02015-06-03 12:32:41 -07001596 *vad = 1;
1597
1598 // check VAD first
1599 if (useVAD) {
1600 *vad = 0;
1601
ossu97ba30e2016-04-25 07:55:58 -07001602 const size_t sampleRate_10 = static_cast<size_t>(10 * sampleRate / 1000);
1603 const size_t sampleRate_20 = static_cast<size_t>(20 * sampleRate / 1000);
1604 const size_t sampleRate_30 = static_cast<size_t>(30 * sampleRate / 1000);
Peter Kastingdce40cf2015-08-24 14:52:23 -07001605 for (size_t k = 0; k < numChannels; k++) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001606 tempLen = frameLen;
1607 tempdata = &indata[k * frameLen];
1608 int localVad = 0;
1609 /* Partition the signal and test each chunk for VAD.
Peter Kastingdce40cf2015-08-24 14:52:23 -07001610 All chunks must be VAD=0 to produce a total VAD=0. */
pkastingb297c5a2015-07-22 15:17:22 -07001611 while (tempLen >= sampleRate_10) {
1612 if ((tempLen % sampleRate_30) == 0) { // tempLen is multiple of 30ms
Peter Kasting248b0b02015-06-03 12:32:41 -07001613 localVad |= WebRtcVad_Process(VAD_inst[k], sampleRate, tempdata,
pkastingb297c5a2015-07-22 15:17:22 -07001614 sampleRate_30);
1615 tempdata += sampleRate_30;
1616 tempLen -= sampleRate_30;
1617 } else if (tempLen >= sampleRate_20) { // tempLen >= 20ms
Peter Kasting248b0b02015-06-03 12:32:41 -07001618 localVad |= WebRtcVad_Process(VAD_inst[k], sampleRate, tempdata,
pkastingb297c5a2015-07-22 15:17:22 -07001619 sampleRate_20);
1620 tempdata += sampleRate_20;
1621 tempLen -= sampleRate_20;
Peter Kasting248b0b02015-06-03 12:32:41 -07001622 } else { // use 10ms
1623 localVad |= WebRtcVad_Process(VAD_inst[k], sampleRate, tempdata,
pkastingb297c5a2015-07-22 15:17:22 -07001624 sampleRate_10);
1625 tempdata += sampleRate_10;
1626 tempLen -= sampleRate_10;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001627 }
Peter Kasting248b0b02015-06-03 12:32:41 -07001628 }
1629
1630 // aggregate all VAD decisions over all channels
1631 *vad |= localVad;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001632 }
1633
Peter Kasting248b0b02015-06-03 12:32:41 -07001634 if (!*vad) {
1635 // all channels are silent
ossu97ba30e2016-04-25 07:55:58 -07001636 rtc::Buffer workaround;
Peter Kasting248b0b02015-06-03 12:32:41 -07001637 cdlen = 0;
Peter Kastingdce40cf2015-08-24 14:52:23 -07001638 for (size_t k = 0; k < numChannels; k++) {
ossu97ba30e2016-04-25 07:55:58 -07001639 workaround.Clear();
1640 tempLen = CNG_encoder[k]->Encode(
1641 rtc::ArrayView<const int16_t>(
1642 &indata[k * frameLen],
1643 (frameLen <= 640 ? frameLen : 640) /* max 640 */),
1644 first_cng,
1645 &workaround);
1646 memcpy(encoded, workaround.data(), tempLen);
Peter Kasting248b0b02015-06-03 12:32:41 -07001647 encoded += tempLen;
1648 cdlen += tempLen;
1649 }
1650 *vad = 0;
ossu97ba30e2016-04-25 07:55:58 -07001651 first_cng = false;
Peter Kasting248b0b02015-06-03 12:32:41 -07001652 return (cdlen);
1653 }
1654 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001655
Peter Kasting248b0b02015-06-03 12:32:41 -07001656 // loop over all channels
Peter Kastingdce40cf2015-08-24 14:52:23 -07001657 size_t totalLen = 0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001658
Peter Kastingdce40cf2015-08-24 14:52:23 -07001659 for (size_t k = 0; k < numChannels; k++) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001660 /* Encode with the selected coder type */
kwibergee1879c2015-10-29 06:20:28 -07001661 if (coder == webrtc::NetEqDecoder::kDecoderPCMu) { /*g711 u-law */
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001662#ifdef CODEC_G711
Peter Kasting248b0b02015-06-03 12:32:41 -07001663 cdlen = WebRtcG711_EncodeU(indata, frameLen, encoded);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001664#endif
kwibergee1879c2015-10-29 06:20:28 -07001665 } else if (coder == webrtc::NetEqDecoder::kDecoderPCMa) { /*g711 A-law */
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001666#ifdef CODEC_G711
Peter Kasting248b0b02015-06-03 12:32:41 -07001667 cdlen = WebRtcG711_EncodeA(indata, frameLen, encoded);
1668 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001669#endif
1670#ifdef CODEC_PCM16B
kwibergee1879c2015-10-29 06:20:28 -07001671 else if ((coder == webrtc::NetEqDecoder::kDecoderPCM16B) ||
1672 (coder == webrtc::NetEqDecoder::kDecoderPCM16Bwb) ||
1673 (coder == webrtc::NetEqDecoder::kDecoderPCM16Bswb32kHz) ||
1674 (coder == webrtc::NetEqDecoder::
Peter Kasting248b0b02015-06-03 12:32:41 -07001675 kDecoderPCM16Bswb48kHz)) { /*pcm16b (8kHz, 16kHz,
kwibergee1879c2015-10-29 06:20:28 -07001676 32kHz or 48kHz) */
Peter Kasting248b0b02015-06-03 12:32:41 -07001677 cdlen = WebRtcPcm16b_Encode(indata, frameLen, encoded);
1678 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001679#endif
1680#ifdef CODEC_G722
kwibergee1879c2015-10-29 06:20:28 -07001681 else if (coder == webrtc::NetEqDecoder::kDecoderG722) { /*g722 */
Peter Kasting248b0b02015-06-03 12:32:41 -07001682 cdlen = WebRtcG722_Encode(g722EncState[k], indata, frameLen, encoded);
1683 assert(cdlen == frameLen >> 1);
1684 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001685#endif
1686#ifdef CODEC_ILBC
kwibergee1879c2015-10-29 06:20:28 -07001687 else if (coder == webrtc::NetEqDecoder::kDecoderILBC) { /*iLBC */
Peter Kastingdce40cf2015-08-24 14:52:23 -07001688 cdlen = static_cast<size_t>(std::max(
1689 WebRtcIlbcfix_Encode(iLBCenc_inst[k], indata, frameLen, encoded), 0));
Peter Kasting248b0b02015-06-03 12:32:41 -07001690 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001691#endif
Peter Kasting248b0b02015-06-03 12:32:41 -07001692#if (defined(CODEC_ISAC) || \
1693 defined(NETEQ_ISACFIX_CODEC)) // TODO(hlundin): remove all
1694 // NETEQ_ISACFIX_CODEC
kwibergee1879c2015-10-29 06:20:28 -07001695 else if (coder == webrtc::NetEqDecoder::kDecoderISAC) { /*iSAC */
Peter Kasting248b0b02015-06-03 12:32:41 -07001696 int noOfCalls = 0;
Peter Kastingdce40cf2015-08-24 14:52:23 -07001697 int res = 0;
1698 while (res <= 0) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001699#ifdef CODEC_ISAC /* floating point */
Peter Kastingdce40cf2015-08-24 14:52:23 -07001700 res =
Peter Kasting248b0b02015-06-03 12:32:41 -07001701 WebRtcIsac_Encode(ISAC_inst[k], &indata[noOfCalls * 160], encoded);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001702#else /* fixed point */
Peter Kastingdce40cf2015-08-24 14:52:23 -07001703 res = WebRtcIsacfix_Encode(ISAC_inst[k], &indata[noOfCalls * 160],
1704 encoded);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001705#endif
Peter Kasting248b0b02015-06-03 12:32:41 -07001706 noOfCalls++;
1707 }
Peter Kastingdce40cf2015-08-24 14:52:23 -07001708 cdlen = static_cast<size_t>(res);
Peter Kasting248b0b02015-06-03 12:32:41 -07001709 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001710#endif
1711#ifdef CODEC_ISAC_SWB
kwibergee1879c2015-10-29 06:20:28 -07001712 else if (coder == webrtc::NetEqDecoder::kDecoderISACswb) { /* iSAC SWB */
Peter Kasting248b0b02015-06-03 12:32:41 -07001713 int noOfCalls = 0;
Peter Kastingdce40cf2015-08-24 14:52:23 -07001714 int res = 0;
1715 while (res <= 0) {
1716 res = WebRtcIsac_Encode(ISACSWB_inst[k], &indata[noOfCalls * 320],
1717 encoded);
Peter Kasting248b0b02015-06-03 12:32:41 -07001718 noOfCalls++;
1719 }
Peter Kastingdce40cf2015-08-24 14:52:23 -07001720 cdlen = static_cast<size_t>(res);
Peter Kasting248b0b02015-06-03 12:32:41 -07001721 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001722#endif
minyuecb23c0d2015-12-11 01:58:26 -08001723#ifdef CODEC_OPUS
1724 cdlen = WebRtcOpus_Encode(opus_inst[k], indata, frameLen, kRtpDataSize - 12,
1725 encoded);
1726 RTC_CHECK_GT(cdlen, 0u);
1727#endif
Peter Kasting248b0b02015-06-03 12:32:41 -07001728 indata += frameLen;
1729 encoded += cdlen;
1730 totalLen += cdlen;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001731
Peter Kasting248b0b02015-06-03 12:32:41 -07001732 } // end for
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001733
ossu97ba30e2016-04-25 07:55:58 -07001734 first_cng = true;
Peter Kasting248b0b02015-06-03 12:32:41 -07001735 return (totalLen);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001736}
1737
pkasting@chromium.orgd3245462015-02-23 21:28:22 +00001738void makeRTPheader(unsigned char* rtp_data,
1739 int payloadType,
1740 int seqNo,
1741 uint32_t timestamp,
1742 uint32_t ssrc) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001743 rtp_data[0] = 0x80;
1744 rtp_data[1] = payloadType & 0xFF;
1745 rtp_data[2] = (seqNo >> 8) & 0xFF;
1746 rtp_data[3] = seqNo & 0xFF;
1747 rtp_data[4] = timestamp >> 24;
1748 rtp_data[5] = (timestamp >> 16) & 0xFF;
1749 rtp_data[6] = (timestamp >> 8) & 0xFF;
1750 rtp_data[7] = timestamp & 0xFF;
1751 rtp_data[8] = ssrc >> 24;
1752 rtp_data[9] = (ssrc >> 16) & 0xFF;
1753 rtp_data[10] = (ssrc >> 8) & 0xFF;
1754 rtp_data[11] = ssrc & 0xFF;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001755}
1756
pkasting@chromium.orgd3245462015-02-23 21:28:22 +00001757int makeRedundantHeader(unsigned char* rtp_data,
1758 int* payloadType,
1759 int numPayloads,
1760 uint32_t* timestamp,
1761 uint16_t* blockLen,
1762 int seqNo,
Peter Kasting248b0b02015-06-03 12:32:41 -07001763 uint32_t ssrc) {
1764 int i;
1765 unsigned char* rtpPointer;
1766 uint16_t offset;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001767
Peter Kasting248b0b02015-06-03 12:32:41 -07001768 /* first create "standard" RTP header */
1769 makeRTPheader(rtp_data, NETEQ_CODEC_RED_PT, seqNo, timestamp[numPayloads - 1],
1770 ssrc);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001771
Peter Kasting248b0b02015-06-03 12:32:41 -07001772 rtpPointer = &rtp_data[12];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001773
Peter Kasting248b0b02015-06-03 12:32:41 -07001774 /* add one sub-header for each redundant payload (not the primary) */
1775 for (i = 0; i < numPayloads - 1; i++) {
1776 if (blockLen[i] > 0) {
1777 offset = static_cast<uint16_t>(timestamp[numPayloads - 1] - timestamp[i]);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001778
Peter Kasting248b0b02015-06-03 12:32:41 -07001779 // Byte |0| |1 2 | 3 |
1780 // Bit |0|1234567|01234567012345|6701234567|
1781 // |F|payload| timestamp | block |
1782 // | | type | offset | length |
1783 rtpPointer[0] = (payloadType[i] & 0x7F) | 0x80;
1784 rtpPointer[1] = (offset >> 6) & 0xFF;
1785 rtpPointer[2] = ((offset & 0x3F) << 2) | ((blockLen[i] >> 8) & 0x03);
1786 rtpPointer[3] = blockLen[i] & 0xFF;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001787
Peter Kasting248b0b02015-06-03 12:32:41 -07001788 rtpPointer += 4;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001789 }
Peter Kasting248b0b02015-06-03 12:32:41 -07001790 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001791
Peter Kasting248b0b02015-06-03 12:32:41 -07001792 // Bit |0|1234567|
1793 // |0|payload|
1794 // | | type |
1795 rtpPointer[0] = payloadType[numPayloads - 1] & 0x7F;
1796 ++rtpPointer;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001797
Peter Kasting248b0b02015-06-03 12:32:41 -07001798 return rtpPointer - rtp_data; // length of header in bytes
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001799}
1800
Peter Kastingdce40cf2015-08-24 14:52:23 -07001801size_t makeDTMFpayload(unsigned char* payload_data,
1802 int Event,
1803 int End,
1804 int Volume,
1805 int Duration) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001806 unsigned char E, R, V;
1807 R = 0;
1808 V = (unsigned char)Volume;
1809 if (End == 0) {
1810 E = 0x00;
1811 } else {
1812 E = 0x80;
1813 }
1814 payload_data[0] = (unsigned char)Event;
1815 payload_data[1] = (unsigned char)(E | R | V);
1816 // Duration equals 8 times time_ms, default is 8000 Hz.
1817 payload_data[2] = (unsigned char)((Duration >> 8) & 0xFF);
1818 payload_data[3] = (unsigned char)(Duration & 0xFF);
1819 return (4);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001820}
1821
Peter Kastingdce40cf2015-08-24 14:52:23 -07001822void stereoDeInterleave(int16_t* audioSamples, size_t numSamples) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001823 int16_t* tempVec;
1824 int16_t* readPtr, *writeL, *writeR;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001825
Peter Kastingdce40cf2015-08-24 14:52:23 -07001826 if (numSamples == 0)
Peter Kasting248b0b02015-06-03 12:32:41 -07001827 return;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001828
Peter Kasting248b0b02015-06-03 12:32:41 -07001829 tempVec = (int16_t*)malloc(sizeof(int16_t) * numSamples);
1830 if (tempVec == NULL) {
1831 printf("Error allocating memory\n");
1832 exit(0);
1833 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001834
Peter Kasting248b0b02015-06-03 12:32:41 -07001835 memcpy(tempVec, audioSamples, numSamples * sizeof(int16_t));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001836
Peter Kasting248b0b02015-06-03 12:32:41 -07001837 writeL = audioSamples;
1838 writeR = &audioSamples[numSamples / 2];
1839 readPtr = tempVec;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001840
Peter Kastingdce40cf2015-08-24 14:52:23 -07001841 for (size_t k = 0; k < numSamples; k += 2) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001842 *writeL = *readPtr;
1843 readPtr++;
1844 *writeR = *readPtr;
1845 readPtr++;
1846 writeL++;
1847 writeR++;
1848 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001849
Peter Kasting248b0b02015-06-03 12:32:41 -07001850 free(tempVec);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001851}
1852
Peter Kastingdce40cf2015-08-24 14:52:23 -07001853void stereoInterleave(unsigned char* data, size_t dataLen, size_t stride) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001854 unsigned char* ptrL, *ptrR;
1855 unsigned char temp[10];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001856
Peter Kasting248b0b02015-06-03 12:32:41 -07001857 if (stride > 10) {
1858 exit(0);
1859 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001860
Peter Kasting248b0b02015-06-03 12:32:41 -07001861 if (dataLen % 1 != 0) {
1862 // must be even number of samples
1863 printf("Error: cannot interleave odd sample number\n");
1864 exit(0);
1865 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001866
Peter Kasting248b0b02015-06-03 12:32:41 -07001867 ptrL = data + stride;
1868 ptrR = &data[dataLen / 2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001869
Peter Kasting248b0b02015-06-03 12:32:41 -07001870 while (ptrL < ptrR) {
1871 // copy from right pointer to temp
1872 memcpy(temp, ptrR, stride);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001873
Peter Kasting248b0b02015-06-03 12:32:41 -07001874 // shift data between pointers
1875 memmove(ptrL + stride, ptrL, ptrR - ptrL);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001876
Peter Kasting248b0b02015-06-03 12:32:41 -07001877 // copy from temp to left pointer
1878 memcpy(ptrL, temp, stride);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001879
Peter Kasting248b0b02015-06-03 12:32:41 -07001880 // advance pointers
1881 ptrL += stride * 2;
1882 ptrR += stride;
1883 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001884}