blob: f390f5330bb26f576e0f70caddf4369e60f5d96e [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");
aleloi82667732016-08-02 01:45:50 -0700325 printf(
326 "The coded speech is packetized in RTP packets and written to the "
327 "output file.\n");
Peter Kasting2a100872015-06-09 17:26:40 -0700328 printf("The format of the RTP stream file is simlilar to that of "
329 "rtpplay,\n");
Peter Kasting248b0b02015-06-03 12:32:41 -0700330 printf("but with the receive time euqal to 0 for all packets.\n");
331 printf("Usage:\n\n");
332 printf("%s PCMfile RTPfile frameLen codec useVAD bitrate\n", argv[0]);
333 printf("where:\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000334
Peter Kasting248b0b02015-06-03 12:32:41 -0700335 printf("PCMfile : PCM speech input file\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000336
Peter Kasting248b0b02015-06-03 12:32:41 -0700337 printf("RTPfile : RTP stream output file\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000338
Peter Kasting2a100872015-06-09 17:26:40 -0700339 printf("frameLen : 80...960... Number of samples per packet (limit "
340 "depends on codec)\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000341
Peter Kasting248b0b02015-06-03 12:32:41 -0700342 printf("codecName\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000343#ifdef CODEC_PCM16B
Peter Kasting248b0b02015-06-03 12:32:41 -0700344 printf(" : pcm16b 16 bit PCM (8kHz)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000345#endif
346#ifdef CODEC_PCM16B_WB
Peter Kasting248b0b02015-06-03 12:32:41 -0700347 printf(" : pcm16b_wb 16 bit PCM (16kHz)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000348#endif
349#ifdef CODEC_PCM16B_32KHZ
Peter Kasting248b0b02015-06-03 12:32:41 -0700350 printf(" : pcm16b_swb32 16 bit PCM (32kHz)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000351#endif
352#ifdef CODEC_PCM16B_48KHZ
Peter Kasting248b0b02015-06-03 12:32:41 -0700353 printf(" : pcm16b_swb48 16 bit PCM (48kHz)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000354#endif
355#ifdef CODEC_G711
Peter Kasting248b0b02015-06-03 12:32:41 -0700356 printf(" : pcma g711 A-law (8kHz)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000357#endif
358#ifdef CODEC_G711
Peter Kasting248b0b02015-06-03 12:32:41 -0700359 printf(" : pcmu g711 u-law (8kHz)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000360#endif
361#ifdef CODEC_G729
Peter Kasting2a100872015-06-09 17:26:40 -0700362 printf(" : g729 G729 (8kHz and 8kbps) CELP (One-Three "
363 "frame(s)/packet)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000364#endif
365#ifdef CODEC_G729_1
Peter Kasting2a100872015-06-09 17:26:40 -0700366 printf(" : g729.1 G729.1 (16kHz) variable rate (8--32 "
367 "kbps)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000368#endif
369#ifdef CODEC_G722_1_16
Peter Kasting2a100872015-06-09 17:26:40 -0700370 printf(" : g722.1_16 G722.1 coder (16kHz) (g722.1 with "
371 "16kbps)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000372#endif
373#ifdef CODEC_G722_1_24
Peter Kasting2a100872015-06-09 17:26:40 -0700374 printf(" : g722.1_24 G722.1 coder (16kHz) (the 24kbps "
375 "version)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000376#endif
377#ifdef CODEC_G722_1_32
Peter Kasting2a100872015-06-09 17:26:40 -0700378 printf(" : g722.1_32 G722.1 coder (16kHz) (the 32kbps "
379 "version)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000380#endif
381#ifdef CODEC_G722_1C_24
Peter Kasting2a100872015-06-09 17:26:40 -0700382 printf(" : g722.1C_24 G722.1 C coder (32kHz) (the 24kbps "
383 "version)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000384#endif
385#ifdef CODEC_G722_1C_32
Peter Kasting2a100872015-06-09 17:26:40 -0700386 printf(" : g722.1C_32 G722.1 C coder (32kHz) (the 32kbps "
387 "version)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000388#endif
389#ifdef CODEC_G722_1C_48
Peter Kasting2a100872015-06-09 17:26:40 -0700390 printf(" : g722.1C_48 G722.1 C coder (32kHz) (the 48kbps "
391 "version)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000392#endif
393
394#ifdef CODEC_G726
Peter Kasting248b0b02015-06-03 12:32:41 -0700395 printf(" : g726_16 G726 coder (8kHz) 16kbps\n");
396 printf(" : g726_24 G726 coder (8kHz) 24kbps\n");
397 printf(" : g726_32 G726 coder (8kHz) 32kbps\n");
398 printf(" : g726_40 G726 coder (8kHz) 40kbps\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000399#endif
400#ifdef CODEC_AMR
Peter Kasting2a100872015-06-09 17:26:40 -0700401 printf(" : AMRXk Adaptive Multi Rate CELP codec "
402 "(8kHz)\n");
403 printf(" X = 4.75, 5.15, 5.9, 6.7, 7.4, 7.95, "
404 "10.2 or 12.2\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000405#endif
406#ifdef CODEC_AMRWB
Peter Kasting2a100872015-06-09 17:26:40 -0700407 printf(" : AMRwbXk Adaptive Multi Rate Wideband CELP "
408 "codec (16kHz)\n");
409 printf(" X = 7, 9, 12, 14, 16, 18, 20, 23 or "
410 "24\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000411#endif
412#ifdef CODEC_ILBC
Peter Kasting248b0b02015-06-03 12:32:41 -0700413 printf(" : ilbc iLBC codec (8kHz and 13.8kbps)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000414#endif
415#ifdef CODEC_ISAC
Peter Kasting2a100872015-06-09 17:26:40 -0700416 printf(" : isac iSAC (16kHz and 32.0 kbps). To set "
417 "rate specify a rate parameter as last parameter\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000418#endif
419#ifdef CODEC_ISAC_SWB
Peter Kasting2a100872015-06-09 17:26:40 -0700420 printf(" : isacswb iSAC SWB (32kHz and 32.0-52.0 kbps). "
421 "To set rate specify a rate parameter as last parameter\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000422#endif
423#ifdef CODEC_GSMFR
Peter Kasting248b0b02015-06-03 12:32:41 -0700424 printf(" : gsmfr GSM FR codec (8kHz and 13kbps)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000425#endif
426#ifdef CODEC_G722
Peter Kasting2a100872015-06-09 17:26:40 -0700427 printf(" : g722 g722 coder (16kHz) (the 64kbps "
428 "version)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000429#endif
430#ifdef CODEC_SPEEX_8
Peter Kasting248b0b02015-06-03 12:32:41 -0700431 printf(" : speex8 speex coder (8 kHz)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000432#endif
433#ifdef CODEC_SPEEX_16
Peter Kasting248b0b02015-06-03 12:32:41 -0700434 printf(" : speex16 speex coder (16 kHz)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000435#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000436#ifdef CODEC_RED
437#ifdef CODEC_G711
Peter Kasting2a100872015-06-09 17:26:40 -0700438 printf(" : red_pcm Redundancy RTP packet with 2*G711A "
439 "frames\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000440#endif
441#ifdef CODEC_ISAC
Peter Kasting2a100872015-06-09 17:26:40 -0700442 printf(" : red_isac Redundancy RTP packet with 2*iSAC "
443 "frames\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000444#endif
minyuecb23c0d2015-12-11 01:58:26 -0800445#endif // CODEC_RED
446#ifdef CODEC_OPUS
447 printf(" : opus Opus codec with FEC (48kHz, 32kbps, FEC"
448 " on and tuned for 5%% packet losses)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000449#endif
Peter Kasting248b0b02015-06-03 12:32:41 -0700450 printf("\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000451
452#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
Peter Kasting248b0b02015-06-03 12:32:41 -0700453 defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
454 printf("useVAD : 0 Voice Activity Detection is switched off\n");
455 printf(" : 1 Voice Activity Detection is switched on\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000456#else
Peter Kasting2a100872015-06-09 17:26:40 -0700457 printf("useVAD : 0 Voice Activity Detection switched off (on not "
458 "supported)\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000459#endif
Peter Kasting2a100872015-06-09 17:26:40 -0700460 printf("bitrate : Codec bitrate in bps (only applies to vbr "
461 "codecs)\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000462
Peter Kasting248b0b02015-06-03 12:32:41 -0700463 return (0);
464 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000465
Peter Kasting248b0b02015-06-03 12:32:41 -0700466 FILE* in_file = fopen(argv[1], "rb");
467 CHECK_NOT_NULL(in_file);
468 printf("Input file: %s\n", argv[1]);
469 FILE* out_file = fopen(argv[2], "wb");
470 CHECK_NOT_NULL(out_file);
471 printf("Output file: %s\n\n", argv[2]);
Peter Kastingdce40cf2015-08-24 14:52:23 -0700472 int packet_size_int = atoi(argv[3]);
473 if (packet_size_int <= 0) {
474 printf("Packet size %d must be positive", packet_size_int);
Peter Kastingf045e4d2015-06-10 21:15:38 -0700475 return -1;
476 }
Peter Kastingdce40cf2015-08-24 14:52:23 -0700477 printf("Packet size: %d\n", packet_size_int);
478 packet_size = static_cast<size_t>(packet_size_int);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000479
Peter Kasting248b0b02015-06-03 12:32:41 -0700480 // check for stereo
481 if (argv[4][strlen(argv[4]) - 1] == '*') {
482 // use stereo
483 usingStereo = true;
484 numChannels = 2;
485 argv[4][strlen(argv[4]) - 1] = '\0';
486 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000487
Peter Kasting248b0b02015-06-03 12:32:41 -0700488 NetEQTest_GetCodec_and_PT(argv[4], &usedCodec, &payloadType, packet_size, &fs,
489 &bitrate, &useRed);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000490
Peter Kasting248b0b02015-06-03 12:32:41 -0700491 if (useRed) {
492 RTPheaderLen = 12 + 4 + 1; /* standard RTP = 12; 4 bytes per redundant
493 payload, except last one which is 1 byte */
494 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000495
Peter Kasting248b0b02015-06-03 12:32:41 -0700496 useVAD = atoi(argv[5]);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000497#if !(defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
Peter Kasting248b0b02015-06-03 12:32:41 -0700498 defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
499 if (useVAD != 0) {
500 printf("Error: this simulation does not support VAD/DTX/CNG\n");
501 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000502#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000503
Peter Kasting248b0b02015-06-03 12:32:41 -0700504 // check stereo type
505 if (usingStereo) {
506 switch (usedCodec) {
507 // sample based codecs
kwibergee1879c2015-10-29 06:20:28 -0700508 case webrtc::NetEqDecoder::kDecoderPCMu:
509 case webrtc::NetEqDecoder::kDecoderPCMa:
510 case webrtc::NetEqDecoder::kDecoderG722: {
Peter Kasting248b0b02015-06-03 12:32:41 -0700511 // 1 octet per sample
512 stereoMode = STEREO_MODE_SAMPLE_1;
513 break;
514 }
kwibergee1879c2015-10-29 06:20:28 -0700515 case webrtc::NetEqDecoder::kDecoderPCM16B:
516 case webrtc::NetEqDecoder::kDecoderPCM16Bwb:
517 case webrtc::NetEqDecoder::kDecoderPCM16Bswb32kHz:
518 case webrtc::NetEqDecoder::kDecoderPCM16Bswb48kHz: {
Peter Kasting248b0b02015-06-03 12:32:41 -0700519 // 2 octets per sample
520 stereoMode = STEREO_MODE_SAMPLE_2;
521 break;
522 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000523
Peter Kasting248b0b02015-06-03 12:32:41 -0700524 // fixed-rate frame codecs (with internal VAD)
525 default: {
526 printf("Cannot use codec %s as stereo codec\n", argv[4]);
527 exit(0);
528 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000529 }
Peter Kasting248b0b02015-06-03 12:32:41 -0700530 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000531
kwibergee1879c2015-10-29 06:20:28 -0700532 if ((usedCodec == webrtc::NetEqDecoder::kDecoderISAC) ||
533 (usedCodec == webrtc::NetEqDecoder::kDecoderISACswb)) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700534 if (argc != 7) {
kwibergee1879c2015-10-29 06:20:28 -0700535 if (usedCodec == webrtc::NetEqDecoder::kDecoderISAC) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700536 bitrate = 32000;
Peter Kasting2a100872015-06-09 17:26:40 -0700537 printf("Running iSAC at default bitrate of 32000 bps (to specify "
538 "explicitly add the bps as last parameter)\n");
Peter Kasting248b0b02015-06-03 12:32:41 -0700539 } else // (usedCodec==webrtc::kDecoderISACswb)
540 {
541 bitrate = 56000;
Peter Kasting2a100872015-06-09 17:26:40 -0700542 printf("Running iSAC at default bitrate of 56000 bps (to specify "
543 "explicitly add the bps as last parameter)\n");
Peter Kasting248b0b02015-06-03 12:32:41 -0700544 }
545 } else {
546 bitrate = atoi(argv[6]);
kwibergee1879c2015-10-29 06:20:28 -0700547 if (usedCodec == webrtc::NetEqDecoder::kDecoderISAC) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700548 if ((bitrate < 10000) || (bitrate > 32000)) {
Peter Kasting2a100872015-06-09 17:26:40 -0700549 printf("Error: iSAC bitrate must be between 10000 and 32000 bps (%i "
550 "is invalid)\n", bitrate);
Peter Kasting248b0b02015-06-03 12:32:41 -0700551 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000552 }
Peter Kasting248b0b02015-06-03 12:32:41 -0700553 printf("Running iSAC at bitrate of %i bps\n", bitrate);
554 } else // (usedCodec==webrtc::kDecoderISACswb)
555 {
556 if ((bitrate < 32000) || (bitrate > 56000)) {
Peter Kasting2a100872015-06-09 17:26:40 -0700557 printf("Error: iSAC SWB bitrate must be between 32000 and 56000 bps "
558 "(%i is invalid)\n", bitrate);
Peter Kasting248b0b02015-06-03 12:32:41 -0700559 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000560 }
Peter Kasting248b0b02015-06-03 12:32:41 -0700561 }
562 }
563 } else {
564 if (argc == 7) {
Peter Kasting2a100872015-06-09 17:26:40 -0700565 printf("Error: Bitrate parameter can only be specified for iSAC, G.723, "
566 "and G.729.1\n");
Peter Kasting248b0b02015-06-03 12:32:41 -0700567 exit(0);
568 }
569 }
570
571 if (useRed) {
572 printf("Redundancy engaged. ");
573 }
kwibergee1879c2015-10-29 06:20:28 -0700574 printf("Used codec: %i\n", static_cast<int>(usedCodec));
Peter Kasting248b0b02015-06-03 12:32:41 -0700575 printf("Payload type: %i\n", payloadType);
576
577 NetEQTest_init_coders(usedCodec, packet_size, bitrate, fs, useVAD,
578 numChannels);
579
580 /* write file header */
581 // fprintf(out_file, "#!RTPencode%s\n", "1.0");
582 fprintf(out_file, "#!rtpplay%s \n",
583 "1.0"); // this is the string that rtpplay needs
584 uint32_t dummy_variable = 0; // should be converted to network endian format,
585 // but does not matter when 0
586 if (fwrite(&dummy_variable, 4, 1, out_file) != 1) {
587 return -1;
588 }
589 if (fwrite(&dummy_variable, 4, 1, out_file) != 1) {
590 return -1;
591 }
592 if (fwrite(&dummy_variable, 4, 1, out_file) != 1) {
593 return -1;
594 }
595 if (fwrite(&dummy_variable, 2, 1, out_file) != 1) {
596 return -1;
597 }
598 if (fwrite(&dummy_variable, 2, 1, out_file) != 1) {
599 return -1;
600 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000601
602#ifdef TIMESTAMP_WRAPAROUND
Peter Kasting248b0b02015-06-03 12:32:41 -0700603 timestamp = 0xFFFFFFFF - fs * 10; /* should give wrap-around in 10 seconds */
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000604#endif
605#if defined(RANDOM_DATA) | defined(RANDOM_PAYLOAD_DATA)
Peter Kasting248b0b02015-06-03 12:32:41 -0700606 srand(RANDOM_SEED);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000607#endif
608
Peter Kasting248b0b02015-06-03 12:32:41 -0700609 /* if redundancy is used, the first redundant payload is zero length */
610 red_len[0] = 0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000611
Peter Kasting248b0b02015-06-03 12:32:41 -0700612 /* read first frame */
613 len = fread(org_data, 2, packet_size * numChannels, in_file) / numChannels;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000614
Peter Kasting248b0b02015-06-03 12:32:41 -0700615 /* de-interleave if stereo */
616 if (usingStereo) {
617 stereoDeInterleave(org_data, len * numChannels);
618 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000619
Peter Kasting248b0b02015-06-03 12:32:41 -0700620 while (len == packet_size) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000621#ifdef INSERT_DTMF_PACKETS
Peter Kasting248b0b02015-06-03 12:32:41 -0700622 dtmfSent = false;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000623
Peter Kasting248b0b02015-06-03 12:32:41 -0700624 if (sendtime >= NTone * DTMF_PACKET_INTERVAL) {
625 if (sendtime < NTone * DTMF_PACKET_INTERVAL + DTMF_DURATION) {
626 // tone has not ended
627 if (DTMFfirst == 1) {
628 DTMFtimestamp = timestamp; // save this timestamp
629 DTMFfirst = 0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000630 }
Peter Kasting248b0b02015-06-03 12:32:41 -0700631 makeRTPheader(rtp_data, NETEQ_CODEC_AVT_PT, seqNo, DTMFtimestamp, ssrc);
632 enc_len = makeDTMFpayload(
633 &rtp_data[12], NTone % 12, 0, 4,
634 (int)(sendtime - NTone * DTMF_PACKET_INTERVAL) * (fs / 1000) + len);
635 } else {
636 // tone has ended
637 makeRTPheader(rtp_data, NETEQ_CODEC_AVT_PT, seqNo, DTMFtimestamp, ssrc);
638 enc_len = makeDTMFpayload(&rtp_data[12], NTone % 12, 1, 4,
639 DTMF_DURATION * (fs / 1000));
640 NTone++;
641 DTMFfirst = 1;
642 }
643
644 /* write RTP packet to file */
Peter Kastingb7e50542015-06-11 12:55:50 -0700645 length = htons(static_cast<unsigned short>(12 + enc_len + 8));
646 plen = htons(static_cast<unsigned short>(12 + enc_len));
Peter Kasting248b0b02015-06-03 12:32:41 -0700647 offset = (uint32_t)sendtime; //(timestamp/(fs/1000));
648 offset = htonl(offset);
649 if (fwrite(&length, 2, 1, out_file) != 1) {
650 return -1;
651 }
652 if (fwrite(&plen, 2, 1, out_file) != 1) {
653 return -1;
654 }
655 if (fwrite(&offset, 4, 1, out_file) != 1) {
656 return -1;
657 }
658 if (fwrite(rtp_data, 12 + enc_len, 1, out_file) != 1) {
659 return -1;
660 }
661
662 dtmfSent = true;
663 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000664#endif
665
666#ifdef NO_DTMF_OVERDUB
Peter Kasting248b0b02015-06-03 12:32:41 -0700667 /* If DTMF is sent, we should not send any speech packets during the same
668 * time */
669 if (dtmfSent) {
670 enc_len = 0;
671 } else {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000672#endif
Peter Kasting248b0b02015-06-03 12:32:41 -0700673 /* encode frame */
674 enc_len =
675 NetEQTest_encode(usedCodec, org_data, packet_size, &rtp_data[12], fs,
676 &vad, useVAD, bitrate, numChannels);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000677
Peter Kasting248b0b02015-06-03 12:32:41 -0700678 if (usingStereo && stereoMode != STEREO_MODE_FRAME && vad == 1) {
679 // interleave the encoded payload for sample-based codecs (not for CNG)
680 stereoInterleave(&rtp_data[12], enc_len, stereoMode);
681 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000682#ifdef NO_DTMF_OVERDUB
Peter Kasting248b0b02015-06-03 12:32:41 -0700683 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000684#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000685
Peter Kasting248b0b02015-06-03 12:32:41 -0700686 if (enc_len > 0 &&
687 (sendtime <= STOPSENDTIME || sendtime > RESTARTSENDTIME)) {
688 if (useRed) {
689 if (red_len[0] > 0) {
690 memmove(&rtp_data[RTPheaderLen + red_len[0]], &rtp_data[12], enc_len);
691 memcpy(&rtp_data[RTPheaderLen], red_data, red_len[0]);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000692
Peter Kastingb7e50542015-06-11 12:55:50 -0700693 red_len[1] = static_cast<uint16_t>(enc_len);
Peter Kasting248b0b02015-06-03 12:32:41 -0700694 red_TS[1] = timestamp;
695 if (vad)
696 red_PT[1] = payloadType;
697 else
698 red_PT[1] = NETEQ_CODEC_CN_PT;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000699
Peter Kasting248b0b02015-06-03 12:32:41 -0700700 makeRedundantHeader(rtp_data, red_PT, 2, red_TS, red_len, seqNo++,
701 ssrc);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000702
Peter Kasting248b0b02015-06-03 12:32:41 -0700703 enc_len += red_len[0] + RTPheaderLen - 12;
704 } else { // do not use redundancy payload for this packet, i.e., only
705 // last payload
706 memmove(&rtp_data[RTPheaderLen - 4], &rtp_data[12], enc_len);
707 // memcpy(&rtp_data[RTPheaderLen], red_data, red_len[0]);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000708
Peter Kastingb7e50542015-06-11 12:55:50 -0700709 red_len[1] = static_cast<uint16_t>(enc_len);
Peter Kasting248b0b02015-06-03 12:32:41 -0700710 red_TS[1] = timestamp;
711 if (vad)
712 red_PT[1] = payloadType;
713 else
714 red_PT[1] = NETEQ_CODEC_CN_PT;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000715
Peter Kasting248b0b02015-06-03 12:32:41 -0700716 makeRedundantHeader(rtp_data, red_PT, 2, red_TS, red_len, seqNo++,
717 ssrc);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000718
Peter Kasting248b0b02015-06-03 12:32:41 -0700719 enc_len += red_len[0] + RTPheaderLen - 4 -
720 12; // 4 is length of redundancy header (not used)
721 }
722 } else {
723 /* make RTP header */
724 if (vad) // regular speech data
725 makeRTPheader(rtp_data, payloadType, seqNo++, timestamp, ssrc);
726 else // CNG data
727 makeRTPheader(rtp_data, NETEQ_CODEC_CN_PT, seqNo++, timestamp, ssrc);
728 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000729#ifdef MULTIPLE_SAME_TIMESTAMP
Peter Kasting248b0b02015-06-03 12:32:41 -0700730 int mult_pack = 0;
731 do {
732#endif // MULTIPLE_SAME_TIMESTAMP
733 /* write RTP packet to file */
Peter Kastingb7e50542015-06-11 12:55:50 -0700734 length = htons(static_cast<unsigned short>(12 + enc_len + 8));
735 plen = htons(static_cast<unsigned short>(12 + enc_len));
Peter Kasting248b0b02015-06-03 12:32:41 -0700736 offset = (uint32_t)sendtime;
737 //(timestamp/(fs/1000));
738 offset = htonl(offset);
739 if (fwrite(&length, 2, 1, out_file) != 1) {
740 return -1;
741 }
742 if (fwrite(&plen, 2, 1, out_file) != 1) {
743 return -1;
744 }
745 if (fwrite(&offset, 4, 1, out_file) != 1) {
746 return -1;
747 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000748#ifdef RANDOM_DATA
Peter Kastingdce40cf2015-08-24 14:52:23 -0700749 for (size_t k = 0; k < 12 + enc_len; k++) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700750 rtp_data[k] = rand() + rand();
751 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000752#endif
753#ifdef RANDOM_PAYLOAD_DATA
Peter Kastingdce40cf2015-08-24 14:52:23 -0700754 for (size_t k = 12; k < 12 + enc_len; k++) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700755 rtp_data[k] = rand() + rand();
756 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000757#endif
Peter Kasting248b0b02015-06-03 12:32:41 -0700758 if (fwrite(rtp_data, 12 + enc_len, 1, out_file) != 1) {
759 return -1;
760 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000761#ifdef MULTIPLE_SAME_TIMESTAMP
Peter Kasting248b0b02015-06-03 12:32:41 -0700762 } while ((seqNo % REPEAT_PACKET_DISTANCE == 0) &&
763 (mult_pack++ < REPEAT_PACKET_COUNT));
764#endif // MULTIPLE_SAME_TIMESTAMP
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000765
766#ifdef INSERT_OLD_PACKETS
Peter Kasting248b0b02015-06-03 12:32:41 -0700767 if (packet_age >= OLD_PACKET * fs) {
768 if (!first_old_packet) {
769 // send the old packet
770 if (fwrite(&old_length, 2, 1, out_file) != 1) {
771 return -1;
772 }
773 if (fwrite(&old_plen, 2, 1, out_file) != 1) {
774 return -1;
775 }
776 if (fwrite(&offset, 4, 1, out_file) != 1) {
777 return -1;
778 }
779 if (fwrite(old_rtp_data, 12 + old_enc_len, 1, out_file) != 1) {
780 return -1;
781 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000782 }
Peter Kasting248b0b02015-06-03 12:32:41 -0700783 // store current packet as old
784 old_length = length;
785 old_plen = plen;
786 memcpy(old_rtp_data, rtp_data, 12 + enc_len);
787 old_enc_len = enc_len;
788 first_old_packet = 0;
789 packet_age = 0;
790 }
791 packet_age += packet_size;
792#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000793
Peter Kasting248b0b02015-06-03 12:32:41 -0700794 if (useRed) {
795/* move data to redundancy store */
796#ifdef CODEC_ISAC
kwibergee1879c2015-10-29 06:20:28 -0700797 if (usedCodec == webrtc::NetEqDecoder::kDecoderISAC) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700798 assert(!usingStereo); // Cannot handle stereo yet
799 red_len[0] = WebRtcIsac_GetRedPayload(ISAC_inst[0], red_data);
800 } else {
801#endif
802 memcpy(red_data, &rtp_data[RTPheaderLen + red_len[0]], enc_len);
803 red_len[0] = red_len[1];
804#ifdef CODEC_ISAC
805 }
806#endif
807 red_TS[0] = red_TS[1];
808 red_PT[0] = red_PT[1];
809 }
810 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000811
Peter Kasting248b0b02015-06-03 12:32:41 -0700812 /* read next frame */
813 len = fread(org_data, 2, packet_size * numChannels, in_file) / numChannels;
814 /* de-interleave if stereo */
815 if (usingStereo) {
816 stereoDeInterleave(org_data, len * numChannels);
817 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000818
Peter Kasting248b0b02015-06-03 12:32:41 -0700819 if (payloadType == NETEQ_CODEC_G722_PT)
820 timestamp += len >> 1;
821 else
822 timestamp += len;
823
824 sendtime += (double)len / (fs / 1000);
825 }
826
827 NetEQTest_free_coders(usedCodec, numChannels);
828 fclose(in_file);
829 fclose(out_file);
830 printf("Done!\n");
831
832 return (0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000833}
834
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000835/****************/
836/* Subfunctions */
837/****************/
838
pkasting@chromium.orgd3245462015-02-23 21:28:22 +0000839void NetEQTest_GetCodec_and_PT(char* name,
840 webrtc::NetEqDecoder* codec,
841 int* PT,
Peter Kastingdce40cf2015-08-24 14:52:23 -0700842 size_t frameLen,
pkasting@chromium.orgd3245462015-02-23 21:28:22 +0000843 int* fs,
844 int* bitrate,
845 int* useRed) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700846 *bitrate = 0; /* Default bitrate setting */
847 *useRed = 0; /* Default no redundancy */
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000848
Peter Kasting248b0b02015-06-03 12:32:41 -0700849 if (!strcmp(name, "pcmu")) {
kwibergee1879c2015-10-29 06:20:28 -0700850 *codec = webrtc::NetEqDecoder::kDecoderPCMu;
Peter Kasting248b0b02015-06-03 12:32:41 -0700851 *PT = NETEQ_CODEC_PCMU_PT;
852 *fs = 8000;
853 } else if (!strcmp(name, "pcma")) {
kwibergee1879c2015-10-29 06:20:28 -0700854 *codec = webrtc::NetEqDecoder::kDecoderPCMa;
Peter Kasting248b0b02015-06-03 12:32:41 -0700855 *PT = NETEQ_CODEC_PCMA_PT;
856 *fs = 8000;
857 } else if (!strcmp(name, "pcm16b")) {
kwibergee1879c2015-10-29 06:20:28 -0700858 *codec = webrtc::NetEqDecoder::kDecoderPCM16B;
Peter Kasting248b0b02015-06-03 12:32:41 -0700859 *PT = NETEQ_CODEC_PCM16B_PT;
860 *fs = 8000;
861 } else if (!strcmp(name, "pcm16b_wb")) {
kwibergee1879c2015-10-29 06:20:28 -0700862 *codec = webrtc::NetEqDecoder::kDecoderPCM16Bwb;
Peter Kasting248b0b02015-06-03 12:32:41 -0700863 *PT = NETEQ_CODEC_PCM16B_WB_PT;
864 *fs = 16000;
865 } else if (!strcmp(name, "pcm16b_swb32")) {
kwibergee1879c2015-10-29 06:20:28 -0700866 *codec = webrtc::NetEqDecoder::kDecoderPCM16Bswb32kHz;
Peter Kasting248b0b02015-06-03 12:32:41 -0700867 *PT = NETEQ_CODEC_PCM16B_SWB32KHZ_PT;
868 *fs = 32000;
869 } else if (!strcmp(name, "pcm16b_swb48")) {
kwibergee1879c2015-10-29 06:20:28 -0700870 *codec = webrtc::NetEqDecoder::kDecoderPCM16Bswb48kHz;
Peter Kasting248b0b02015-06-03 12:32:41 -0700871 *PT = NETEQ_CODEC_PCM16B_SWB48KHZ_PT;
872 *fs = 48000;
873 } else if (!strcmp(name, "g722")) {
kwibergee1879c2015-10-29 06:20:28 -0700874 *codec = webrtc::NetEqDecoder::kDecoderG722;
Peter Kasting248b0b02015-06-03 12:32:41 -0700875 *PT = NETEQ_CODEC_G722_PT;
876 *fs = 16000;
877 } else if ((!strcmp(name, "ilbc")) &&
878 ((frameLen % 240 == 0) || (frameLen % 160 == 0))) {
879 *fs = 8000;
kwibergee1879c2015-10-29 06:20:28 -0700880 *codec = webrtc::NetEqDecoder::kDecoderILBC;
Peter Kasting248b0b02015-06-03 12:32:41 -0700881 *PT = NETEQ_CODEC_ILBC_PT;
882 } else if (!strcmp(name, "isac")) {
883 *fs = 16000;
kwibergee1879c2015-10-29 06:20:28 -0700884 *codec = webrtc::NetEqDecoder::kDecoderISAC;
Peter Kasting248b0b02015-06-03 12:32:41 -0700885 *PT = NETEQ_CODEC_ISAC_PT;
886 } else if (!strcmp(name, "isacswb")) {
887 *fs = 32000;
kwibergee1879c2015-10-29 06:20:28 -0700888 *codec = webrtc::NetEqDecoder::kDecoderISACswb;
Peter Kasting248b0b02015-06-03 12:32:41 -0700889 *PT = NETEQ_CODEC_ISACSWB_PT;
890 } else if (!strcmp(name, "red_pcm")) {
kwibergee1879c2015-10-29 06:20:28 -0700891 *codec = webrtc::NetEqDecoder::kDecoderPCMa;
Peter Kasting248b0b02015-06-03 12:32:41 -0700892 *PT = NETEQ_CODEC_PCMA_PT; /* this will be the PT for the sub-headers */
893 *fs = 8000;
894 *useRed = 1;
895 } else if (!strcmp(name, "red_isac")) {
kwibergee1879c2015-10-29 06:20:28 -0700896 *codec = webrtc::NetEqDecoder::kDecoderISAC;
Peter Kasting248b0b02015-06-03 12:32:41 -0700897 *PT = NETEQ_CODEC_ISAC_PT; /* this will be the PT for the sub-headers */
898 *fs = 16000;
899 *useRed = 1;
minyuecb23c0d2015-12-11 01:58:26 -0800900 } else if (!strcmp(name, "opus")) {
901 *codec = webrtc::NetEqDecoder::kDecoderOpus;
902 *PT = NETEQ_CODEC_OPUS_PT; /* this will be the PT for the sub-headers */
903 *fs = 48000;
Peter Kasting248b0b02015-06-03 12:32:41 -0700904 } else {
905 printf("Error: Not a supported codec (%s)\n", name);
906 exit(0);
907 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000908}
909
Peter Kasting248b0b02015-06-03 12:32:41 -0700910int NetEQTest_init_coders(webrtc::NetEqDecoder coder,
Peter Kastingdce40cf2015-08-24 14:52:23 -0700911 size_t enc_frameSize,
Peter Kasting248b0b02015-06-03 12:32:41 -0700912 int bitrate,
913 int sampfreq,
914 int vad,
Peter Kastingdce40cf2015-08-24 14:52:23 -0700915 size_t numChannels) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700916 int ok = 0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000917
Peter Kastingdce40cf2015-08-24 14:52:23 -0700918 for (size_t k = 0; k < numChannels; k++) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700919 VAD_inst[k] = WebRtcVad_Create();
920 if (!VAD_inst[k]) {
921 printf("Error: Couldn't allocate memory for VAD instance\n");
922 exit(0);
923 }
924 ok = WebRtcVad_Init(VAD_inst[k]);
925 if (ok == -1) {
926 printf("Error: Initialization of VAD struct failed\n");
927 exit(0);
928 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000929
930#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
Peter Kasting248b0b02015-06-03 12:32:41 -0700931 defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
Peter Kasting248b0b02015-06-03 12:32:41 -0700932 if (sampfreq <= 16000) {
ossu97ba30e2016-04-25 07:55:58 -0700933 CNG_encoder[k] = new webrtc::ComfortNoiseEncoder(sampfreq, 200, 5);
Peter Kasting248b0b02015-06-03 12:32:41 -0700934 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000935#endif
936
Peter Kasting248b0b02015-06-03 12:32:41 -0700937 switch (coder) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000938#ifdef CODEC_PCM16B
kwibergee1879c2015-10-29 06:20:28 -0700939 case webrtc::NetEqDecoder::kDecoderPCM16B:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000940#endif
941#ifdef CODEC_PCM16B_WB
kwibergee1879c2015-10-29 06:20:28 -0700942 case webrtc::NetEqDecoder::kDecoderPCM16Bwb:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000943#endif
944#ifdef CODEC_PCM16B_32KHZ
kwibergee1879c2015-10-29 06:20:28 -0700945 case webrtc::NetEqDecoder::kDecoderPCM16Bswb32kHz:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000946#endif
947#ifdef CODEC_PCM16B_48KHZ
kwibergee1879c2015-10-29 06:20:28 -0700948 case webrtc::NetEqDecoder::kDecoderPCM16Bswb48kHz:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000949#endif
950#ifdef CODEC_G711
kwibergee1879c2015-10-29 06:20:28 -0700951 case webrtc::NetEqDecoder::kDecoderPCMu:
952 case webrtc::NetEqDecoder::kDecoderPCMa:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000953#endif
954 // do nothing
955 break;
956#ifdef CODEC_G729
Peter Kasting248b0b02015-06-03 12:32:41 -0700957 case webrtc::kDecoderG729:
958 if (sampfreq == 8000) {
959 if ((enc_frameSize == 80) || (enc_frameSize == 160) ||
960 (enc_frameSize == 240) || (enc_frameSize == 320) ||
961 (enc_frameSize == 400) || (enc_frameSize == 480)) {
962 ok = WebRtcG729_CreateEnc(&G729enc_inst[k]);
963 if (ok != 0) {
Peter Kasting2a100872015-06-09 17:26:40 -0700964 printf("Error: Couldn't allocate memory for G729 encoding "
965 "instance\n");
Peter Kasting248b0b02015-06-03 12:32:41 -0700966 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000967 }
Peter Kasting248b0b02015-06-03 12:32:41 -0700968 } else {
Peter Kasting2a100872015-06-09 17:26:40 -0700969 printf("\nError: g729 only supports 10, 20, 30, 40, 50 or 60 "
970 "ms!!\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000971 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -0700972 }
973 WebRtcG729_EncoderInit(G729enc_inst[k], vad);
974 if ((vad == 1) && (enc_frameSize != 80)) {
Peter Kasting2a100872015-06-09 17:26:40 -0700975 printf("\nError - This simulation only supports VAD for G729 at "
Peter Kastingdce40cf2015-08-24 14:52:23 -0700976 "10ms packets (not %" PRIuS "ms)\n", (enc_frameSize >> 3));
Peter Kasting248b0b02015-06-03 12:32:41 -0700977 }
978 } else {
979 printf("\nError - g729 is only developed for 8kHz \n");
980 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000981 }
982 break;
983#endif
984#ifdef CODEC_G729_1
Peter Kasting248b0b02015-06-03 12:32:41 -0700985 case webrtc::kDecoderG729_1:
986 if (sampfreq == 16000) {
987 if ((enc_frameSize == 320) || (enc_frameSize == 640) ||
988 (enc_frameSize == 960)) {
989 ok = WebRtcG7291_Create(&G729_1_inst[k]);
990 if (ok != 0) {
Peter Kasting2a100872015-06-09 17:26:40 -0700991 printf("Error: Couldn't allocate memory for G.729.1 codec "
992 "instance\n");
Peter Kasting248b0b02015-06-03 12:32:41 -0700993 exit(0);
994 }
995 } else {
996 printf("\nError: G.729.1 only supports 20, 40 or 60 ms!!\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000997 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -0700998 }
999 if (!(((bitrate >= 12000) && (bitrate <= 32000) &&
1000 (bitrate % 2000 == 0)) ||
1001 (bitrate == 8000))) {
1002 /* must be 8, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, or 32 kbps */
Peter Kasting2a100872015-06-09 17:26:40 -07001003 printf("\nError: G.729.1 bitrate must be 8000 or 12000--32000 in "
1004 "steps of 2000 bps\n");
Peter Kasting248b0b02015-06-03 12:32:41 -07001005 exit(0);
1006 }
1007 WebRtcG7291_EncoderInit(G729_1_inst[k], bitrate, 0 /* flag8kHz*/,
1008 0 /*flagG729mode*/);
1009 } else {
1010 printf("\nError - G.729.1 input is always 16 kHz \n");
1011 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001012 }
1013 break;
1014#endif
1015#ifdef CODEC_SPEEX_8
Peter Kasting248b0b02015-06-03 12:32:41 -07001016 case webrtc::kDecoderSPEEX_8:
1017 if (sampfreq == 8000) {
1018 if ((enc_frameSize == 160) || (enc_frameSize == 320) ||
1019 (enc_frameSize == 480)) {
1020 ok = WebRtcSpeex_CreateEnc(&SPEEX8enc_inst[k], sampfreq);
1021 if (ok != 0) {
Peter Kasting2a100872015-06-09 17:26:40 -07001022 printf("Error: Couldn't allocate memory for Speex encoding "
1023 "instance\n");
Peter Kasting248b0b02015-06-03 12:32:41 -07001024 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001025 }
Peter Kasting248b0b02015-06-03 12:32:41 -07001026 } else {
1027 printf("\nError: Speex only supports 20, 40, and 60 ms!!\n\n");
1028 exit(0);
1029 }
1030 if ((vad == 1) && (enc_frameSize != 160)) {
Peter Kasting2a100872015-06-09 17:26:40 -07001031 printf("\nError - This simulation only supports VAD for Speex at "
Peter Kastingdce40cf2015-08-24 14:52:23 -07001032 "20ms packets (not %" PRIuS "ms)\n",
Peter Kasting248b0b02015-06-03 12:32:41 -07001033 (enc_frameSize >> 3));
1034 vad = 0;
1035 }
1036 ok = WebRtcSpeex_EncoderInit(SPEEX8enc_inst[k], 0 /*vbr*/,
1037 3 /*complexity*/, vad);
1038 if (ok != 0)
1039 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001040 } else {
Peter Kasting2a100872015-06-09 17:26:40 -07001041 printf("\nError - Speex8 called with sample frequency other than 8 "
1042 "kHz.\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001043 }
1044 break;
1045#endif
1046#ifdef CODEC_SPEEX_16
Peter Kasting248b0b02015-06-03 12:32:41 -07001047 case webrtc::kDecoderSPEEX_16:
1048 if (sampfreq == 16000) {
1049 if ((enc_frameSize == 320) || (enc_frameSize == 640) ||
1050 (enc_frameSize == 960)) {
1051 ok = WebRtcSpeex_CreateEnc(&SPEEX16enc_inst[k], sampfreq);
1052 if (ok != 0) {
Peter Kasting2a100872015-06-09 17:26:40 -07001053 printf("Error: Couldn't allocate memory for Speex encoding "
1054 "instance\n");
Peter Kasting248b0b02015-06-03 12:32:41 -07001055 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001056 }
Peter Kasting248b0b02015-06-03 12:32:41 -07001057 } else {
1058 printf("\nError: Speex only supports 20, 40, and 60 ms!!\n\n");
1059 exit(0);
1060 }
1061 if ((vad == 1) && (enc_frameSize != 320)) {
Peter Kasting2a100872015-06-09 17:26:40 -07001062 printf("\nError - This simulation only supports VAD for Speex at "
Peter Kastingdce40cf2015-08-24 14:52:23 -07001063 "20ms packets (not %" PRIuS "ms)\n",
Peter Kasting248b0b02015-06-03 12:32:41 -07001064 (enc_frameSize >> 4));
1065 vad = 0;
1066 }
1067 ok = WebRtcSpeex_EncoderInit(SPEEX16enc_inst[k], 0 /*vbr*/,
1068 3 /*complexity*/, vad);
1069 if (ok != 0)
1070 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001071 } else {
Peter Kasting2a100872015-06-09 17:26:40 -07001072 printf("\nError - Speex16 called with sample frequency other than 16 "
1073 "kHz.\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001074 }
1075 break;
1076#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001077
1078#ifdef CODEC_G722_1_16
Peter Kasting248b0b02015-06-03 12:32:41 -07001079 case webrtc::kDecoderG722_1_16:
1080 if (sampfreq == 16000) {
1081 ok = WebRtcG7221_CreateEnc16(&G722_1_16enc_inst[k]);
1082 if (ok != 0) {
1083 printf("Error: Couldn't allocate memory for G.722.1 instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001084 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001085 }
1086 if (enc_frameSize == 320) {
1087 } else {
1088 printf("\nError: G722.1 only supports 20 ms!!\n\n");
1089 exit(0);
1090 }
1091 WebRtcG7221_EncoderInit16((G722_1_16_encinst_t*)G722_1_16enc_inst[k]);
1092 } else {
1093 printf("\nError - G722.1 is only developed for 16kHz \n");
1094 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001095 }
1096 break;
1097#endif
1098#ifdef CODEC_G722_1_24
Peter Kasting248b0b02015-06-03 12:32:41 -07001099 case webrtc::kDecoderG722_1_24:
1100 if (sampfreq == 16000) {
1101 ok = WebRtcG7221_CreateEnc24(&G722_1_24enc_inst[k]);
1102 if (ok != 0) {
1103 printf("Error: Couldn't allocate memory for G.722.1 instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001104 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001105 }
1106 if (enc_frameSize == 320) {
1107 } else {
1108 printf("\nError: G722.1 only supports 20 ms!!\n\n");
1109 exit(0);
1110 }
1111 WebRtcG7221_EncoderInit24((G722_1_24_encinst_t*)G722_1_24enc_inst[k]);
1112 } else {
1113 printf("\nError - G722.1 is only developed for 16kHz \n");
1114 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001115 }
1116 break;
1117#endif
1118#ifdef CODEC_G722_1_32
Peter Kasting248b0b02015-06-03 12:32:41 -07001119 case webrtc::kDecoderG722_1_32:
1120 if (sampfreq == 16000) {
1121 ok = WebRtcG7221_CreateEnc32(&G722_1_32enc_inst[k]);
1122 if (ok != 0) {
1123 printf("Error: Couldn't allocate memory for G.722.1 instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001124 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001125 }
1126 if (enc_frameSize == 320) {
1127 } else {
1128 printf("\nError: G722.1 only supports 20 ms!!\n\n");
1129 exit(0);
1130 }
1131 WebRtcG7221_EncoderInit32((G722_1_32_encinst_t*)G722_1_32enc_inst[k]);
1132 } else {
1133 printf("\nError - G722.1 is only developed for 16kHz \n");
1134 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001135 }
1136 break;
1137#endif
1138#ifdef CODEC_G722_1C_24
Peter Kasting248b0b02015-06-03 12:32:41 -07001139 case webrtc::kDecoderG722_1C_24:
1140 if (sampfreq == 32000) {
1141 ok = WebRtcG7221C_CreateEnc24(&G722_1C_24enc_inst[k]);
1142 if (ok != 0) {
1143 printf("Error: Couldn't allocate memory for G.722.1C instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001144 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001145 }
1146 if (enc_frameSize == 640) {
1147 } else {
1148 printf("\nError: G722.1 C only supports 20 ms!!\n\n");
1149 exit(0);
1150 }
1151 WebRtcG7221C_EncoderInit24(
1152 (G722_1C_24_encinst_t*)G722_1C_24enc_inst[k]);
1153 } else {
1154 printf("\nError - G722.1 C is only developed for 32kHz \n");
1155 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001156 }
1157 break;
1158#endif
1159#ifdef CODEC_G722_1C_32
Peter Kasting248b0b02015-06-03 12:32:41 -07001160 case webrtc::kDecoderG722_1C_32:
1161 if (sampfreq == 32000) {
1162 ok = WebRtcG7221C_CreateEnc32(&G722_1C_32enc_inst[k]);
1163 if (ok != 0) {
1164 printf("Error: Couldn't allocate memory for G.722.1C instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001165 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001166 }
1167 if (enc_frameSize == 640) {
1168 } else {
1169 printf("\nError: G722.1 C only supports 20 ms!!\n\n");
1170 exit(0);
1171 }
1172 WebRtcG7221C_EncoderInit32(
1173 (G722_1C_32_encinst_t*)G722_1C_32enc_inst[k]);
1174 } else {
1175 printf("\nError - G722.1 C is only developed for 32kHz \n");
1176 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001177 }
1178 break;
1179#endif
1180#ifdef CODEC_G722_1C_48
Peter Kasting248b0b02015-06-03 12:32:41 -07001181 case webrtc::kDecoderG722_1C_48:
1182 if (sampfreq == 32000) {
1183 ok = WebRtcG7221C_CreateEnc48(&G722_1C_48enc_inst[k]);
1184 if (ok != 0) {
1185 printf("Error: Couldn't allocate memory for G.722.1C instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001186 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001187 }
1188 if (enc_frameSize == 640) {
1189 } else {
1190 printf("\nError: G722.1 C only supports 20 ms!!\n\n");
1191 exit(0);
1192 }
1193 WebRtcG7221C_EncoderInit48(
1194 (G722_1C_48_encinst_t*)G722_1C_48enc_inst[k]);
1195 } else {
1196 printf("\nError - G722.1 C is only developed for 32kHz \n");
1197 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001198 }
1199 break;
1200#endif
1201#ifdef CODEC_G722
kwibergee1879c2015-10-29 06:20:28 -07001202 case webrtc::NetEqDecoder::kDecoderG722:
Peter Kasting248b0b02015-06-03 12:32:41 -07001203 if (sampfreq == 16000) {
1204 if (enc_frameSize % 2 == 0) {
1205 } else {
1206 printf(
1207 "\nError - g722 frames must have an even number of "
1208 "enc_frameSize\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001209 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001210 }
1211 WebRtcG722_CreateEncoder(&g722EncState[k]);
1212 WebRtcG722_EncoderInit(g722EncState[k]);
1213 } else {
1214 printf("\nError - g722 is only developed for 16kHz \n");
1215 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001216 }
1217 break;
1218#endif
1219#ifdef CODEC_AMR
Peter Kasting248b0b02015-06-03 12:32:41 -07001220 case webrtc::kDecoderAMR:
1221 if (sampfreq == 8000) {
1222 ok = WebRtcAmr_CreateEnc(&AMRenc_inst[k]);
1223 if (ok != 0) {
1224 printf(
1225 "Error: Couldn't allocate memory for AMR encoding instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001226 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001227 }
1228 if ((enc_frameSize == 160) || (enc_frameSize == 320) ||
1229 (enc_frameSize == 480)) {
1230 } else {
1231 printf("\nError - AMR must have a multiple of 160 enc_frameSize\n");
1232 exit(0);
1233 }
1234 WebRtcAmr_EncoderInit(AMRenc_inst[k], vad);
1235 WebRtcAmr_EncodeBitmode(AMRenc_inst[k], AMRBandwidthEfficient);
1236 AMR_bitrate = bitrate;
1237 } else {
1238 printf("\nError - AMR is only developed for 8kHz \n");
1239 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001240 }
1241 break;
1242#endif
1243#ifdef CODEC_AMRWB
Peter Kasting248b0b02015-06-03 12:32:41 -07001244 case webrtc::kDecoderAMRWB:
1245 if (sampfreq == 16000) {
1246 ok = WebRtcAmrWb_CreateEnc(&AMRWBenc_inst[k]);
1247 if (ok != 0) {
Peter Kasting2a100872015-06-09 17:26:40 -07001248 printf("Error: Couldn't allocate memory for AMRWB encoding "
1249 "instance\n");
Peter Kasting248b0b02015-06-03 12:32:41 -07001250 exit(0);
1251 }
Peter Kastingdce40cf2015-08-24 14:52:23 -07001252 if (((enc_frameSize / 320) > 3) || ((enc_frameSize % 320) != 0)) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001253 printf("\nError - AMRwb must have frameSize of 20, 40 or 60ms\n");
1254 exit(0);
1255 }
1256 WebRtcAmrWb_EncoderInit(AMRWBenc_inst[k], vad);
1257 if (bitrate == 7000) {
1258 AMRWB_bitrate = AMRWB_MODE_7k;
1259 } else if (bitrate == 9000) {
1260 AMRWB_bitrate = AMRWB_MODE_9k;
1261 } else if (bitrate == 12000) {
1262 AMRWB_bitrate = AMRWB_MODE_12k;
1263 } else if (bitrate == 14000) {
1264 AMRWB_bitrate = AMRWB_MODE_14k;
1265 } else if (bitrate == 16000) {
1266 AMRWB_bitrate = AMRWB_MODE_16k;
1267 } else if (bitrate == 18000) {
1268 AMRWB_bitrate = AMRWB_MODE_18k;
1269 } else if (bitrate == 20000) {
1270 AMRWB_bitrate = AMRWB_MODE_20k;
1271 } else if (bitrate == 23000) {
1272 AMRWB_bitrate = AMRWB_MODE_23k;
1273 } else if (bitrate == 24000) {
1274 AMRWB_bitrate = AMRWB_MODE_24k;
1275 }
1276 WebRtcAmrWb_EncodeBitmode(AMRWBenc_inst[k], AMRBandwidthEfficient);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001277
1278 } else {
Peter Kasting248b0b02015-06-03 12:32:41 -07001279 printf("\nError - AMRwb is only developed for 16kHz \n");
1280 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001281 }
1282 break;
1283#endif
1284#ifdef CODEC_ILBC
kwibergee1879c2015-10-29 06:20:28 -07001285 case webrtc::NetEqDecoder::kDecoderILBC:
Peter Kasting248b0b02015-06-03 12:32:41 -07001286 if (sampfreq == 8000) {
1287 ok = WebRtcIlbcfix_EncoderCreate(&iLBCenc_inst[k]);
1288 if (ok != 0) {
Peter Kasting2a100872015-06-09 17:26:40 -07001289 printf("Error: Couldn't allocate memory for iLBC encoding "
1290 "instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001291 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001292 }
1293 if ((enc_frameSize == 160) || (enc_frameSize == 240) ||
1294 (enc_frameSize == 320) || (enc_frameSize == 480)) {
1295 } else {
Peter Kasting2a100872015-06-09 17:26:40 -07001296 printf("\nError - iLBC only supports 160, 240, 320 and 480 "
1297 "enc_frameSize (20, 30, 40 and 60 ms)\n");
Peter Kasting248b0b02015-06-03 12:32:41 -07001298 exit(0);
1299 }
1300 if ((enc_frameSize == 160) || (enc_frameSize == 320)) {
1301 /* 20 ms version */
1302 WebRtcIlbcfix_EncoderInit(iLBCenc_inst[k], 20);
1303 } else {
1304 /* 30 ms version */
1305 WebRtcIlbcfix_EncoderInit(iLBCenc_inst[k], 30);
1306 }
1307 } else {
1308 printf("\nError - iLBC is only developed for 8kHz \n");
1309 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001310 }
1311 break;
1312#endif
1313#ifdef CODEC_ISAC
kwibergee1879c2015-10-29 06:20:28 -07001314 case webrtc::NetEqDecoder::kDecoderISAC:
Peter Kasting248b0b02015-06-03 12:32:41 -07001315 if (sampfreq == 16000) {
1316 ok = WebRtcIsac_Create(&ISAC_inst[k]);
1317 if (ok != 0) {
1318 printf("Error: Couldn't allocate memory for iSAC instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001319 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001320 }
1321 if ((enc_frameSize == 480) || (enc_frameSize == 960)) {
1322 } else {
1323 printf("\nError - iSAC only supports frameSize (30 and 60 ms)\n");
1324 exit(0);
1325 }
1326 WebRtcIsac_EncoderInit(ISAC_inst[k], 1);
1327 if ((bitrate < 10000) || (bitrate > 32000)) {
Peter Kasting2a100872015-06-09 17:26:40 -07001328 printf("\nError - iSAC bitrate has to be between 10000 and 32000 "
1329 "bps (not %i)\n",
Peter Kasting248b0b02015-06-03 12:32:41 -07001330 bitrate);
1331 exit(0);
1332 }
Peter Kastingdce40cf2015-08-24 14:52:23 -07001333 WebRtcIsac_Control(ISAC_inst[k], bitrate,
1334 static_cast<int>(enc_frameSize >> 4));
Peter Kasting248b0b02015-06-03 12:32:41 -07001335 } else {
Peter Kasting2a100872015-06-09 17:26:40 -07001336 printf("\nError - iSAC only supports 480 or 960 enc_frameSize (30 or "
1337 "60 ms)\n");
Peter Kasting248b0b02015-06-03 12:32:41 -07001338 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001339 }
1340 break;
1341#endif
1342#ifdef NETEQ_ISACFIX_CODEC
Peter Kasting248b0b02015-06-03 12:32:41 -07001343 case webrtc::kDecoderISAC:
1344 if (sampfreq == 16000) {
1345 ok = WebRtcIsacfix_Create(&ISAC_inst[k]);
1346 if (ok != 0) {
1347 printf("Error: Couldn't allocate memory for iSAC instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001348 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001349 }
1350 if ((enc_frameSize == 480) || (enc_frameSize == 960)) {
1351 } else {
1352 printf("\nError - iSAC only supports frameSize (30 and 60 ms)\n");
1353 exit(0);
1354 }
1355 WebRtcIsacfix_EncoderInit(ISAC_inst[k], 1);
1356 if ((bitrate < 10000) || (bitrate > 32000)) {
Peter Kasting2a100872015-06-09 17:26:40 -07001357 printf("\nError - iSAC bitrate has to be between 10000 and 32000 "
1358 "bps (not %i)\n", bitrate);
Peter Kasting248b0b02015-06-03 12:32:41 -07001359 exit(0);
1360 }
1361 WebRtcIsacfix_Control(ISAC_inst[k], bitrate, enc_frameSize >> 4);
1362 } else {
Peter Kasting2a100872015-06-09 17:26:40 -07001363 printf("\nError - iSAC only supports 480 or 960 enc_frameSize (30 or "
1364 "60 ms)\n");
Peter Kasting248b0b02015-06-03 12:32:41 -07001365 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001366 }
1367 break;
1368#endif
1369#ifdef CODEC_ISAC_SWB
kwibergee1879c2015-10-29 06:20:28 -07001370 case webrtc::NetEqDecoder::kDecoderISACswb:
Peter Kasting248b0b02015-06-03 12:32:41 -07001371 if (sampfreq == 32000) {
1372 ok = WebRtcIsac_Create(&ISACSWB_inst[k]);
1373 if (ok != 0) {
1374 printf("Error: Couldn't allocate memory for iSAC SWB instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001375 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001376 }
1377 if (enc_frameSize == 960) {
1378 } else {
1379 printf("\nError - iSAC SWB only supports frameSize 30 ms\n");
1380 exit(0);
1381 }
1382 ok = WebRtcIsac_SetEncSampRate(ISACSWB_inst[k], 32000);
1383 if (ok != 0) {
1384 printf("Error: Couldn't set sample rate for iSAC SWB instance\n");
1385 exit(0);
1386 }
1387 WebRtcIsac_EncoderInit(ISACSWB_inst[k], 1);
1388 if ((bitrate < 32000) || (bitrate > 56000)) {
Peter Kasting2a100872015-06-09 17:26:40 -07001389 printf("\nError - iSAC SWB bitrate has to be between 32000 and "
1390 "56000 bps (not %i)\n", bitrate);
Peter Kasting248b0b02015-06-03 12:32:41 -07001391 exit(0);
1392 }
Peter Kastingdce40cf2015-08-24 14:52:23 -07001393 WebRtcIsac_Control(ISACSWB_inst[k], bitrate,
1394 static_cast<int>(enc_frameSize >> 5));
Peter Kasting248b0b02015-06-03 12:32:41 -07001395 } else {
Peter Kasting2a100872015-06-09 17:26:40 -07001396 printf("\nError - iSAC SWB only supports 960 enc_frameSize (30 "
1397 "ms)\n");
Peter Kasting248b0b02015-06-03 12:32:41 -07001398 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001399 }
1400 break;
1401#endif
1402#ifdef CODEC_GSMFR
Peter Kasting248b0b02015-06-03 12:32:41 -07001403 case webrtc::kDecoderGSMFR:
1404 if (sampfreq == 8000) {
1405 ok = WebRtcGSMFR_CreateEnc(&GSMFRenc_inst[k]);
1406 if (ok != 0) {
Peter Kasting2a100872015-06-09 17:26:40 -07001407 printf("Error: Couldn't allocate memory for GSM FR encoding "
1408 "instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001409 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001410 }
1411 if ((enc_frameSize == 160) || (enc_frameSize == 320) ||
1412 (enc_frameSize == 480)) {
1413 } else {
Peter Kasting2a100872015-06-09 17:26:40 -07001414 printf("\nError - GSM FR must have a multiple of 160 "
1415 "enc_frameSize\n");
Peter Kasting248b0b02015-06-03 12:32:41 -07001416 exit(0);
1417 }
1418 WebRtcGSMFR_EncoderInit(GSMFRenc_inst[k], 0);
1419 } else {
1420 printf("\nError - GSM FR is only developed for 8kHz \n");
1421 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001422 }
1423 break;
1424#endif
minyuecb23c0d2015-12-11 01:58:26 -08001425#ifdef CODEC_OPUS
1426 case webrtc::NetEqDecoder::kDecoderOpus:
1427 ok = WebRtcOpus_EncoderCreate(&opus_inst[k], 1, 0);
1428 if (ok != 0) {
1429 printf("Error: Couldn't allocate memory for Opus encoding "
1430 "instance\n");
1431 exit(0);
1432 }
1433 WebRtcOpus_EnableFec(opus_inst[k]);
1434 WebRtcOpus_SetPacketLossRate(opus_inst[k], 5);
1435 break;
1436#endif
Peter Kasting248b0b02015-06-03 12:32:41 -07001437 default:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001438 printf("Error: unknown codec in call to NetEQTest_init_coders.\n");
1439 exit(0);
1440 break;
Peter Kasting248b0b02015-06-03 12:32:41 -07001441 }
Peter Kasting248b0b02015-06-03 12:32:41 -07001442 if (ok != 0) {
1443 return (ok);
1444 }
1445 } // end for
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001446
Peter Kasting248b0b02015-06-03 12:32:41 -07001447 return (0);
1448}
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001449
Peter Kastingdce40cf2015-08-24 14:52:23 -07001450int NetEQTest_free_coders(webrtc::NetEqDecoder coder, size_t numChannels) {
1451 for (size_t k = 0; k < numChannels; k++) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001452 WebRtcVad_Free(VAD_inst[k]);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001453#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
Peter Kasting248b0b02015-06-03 12:32:41 -07001454 defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
ossu97ba30e2016-04-25 07:55:58 -07001455 delete CNG_encoder[k];
1456 CNG_encoder[k] = nullptr;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001457#endif
1458
Peter Kasting248b0b02015-06-03 12:32:41 -07001459 switch (coder) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001460#ifdef CODEC_PCM16B
kwibergee1879c2015-10-29 06:20:28 -07001461 case webrtc::NetEqDecoder::kDecoderPCM16B:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001462#endif
1463#ifdef CODEC_PCM16B_WB
kwibergee1879c2015-10-29 06:20:28 -07001464 case webrtc::NetEqDecoder::kDecoderPCM16Bwb:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001465#endif
1466#ifdef CODEC_PCM16B_32KHZ
kwibergee1879c2015-10-29 06:20:28 -07001467 case webrtc::NetEqDecoder::kDecoderPCM16Bswb32kHz:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001468#endif
1469#ifdef CODEC_PCM16B_48KHZ
kwibergee1879c2015-10-29 06:20:28 -07001470 case webrtc::NetEqDecoder::kDecoderPCM16Bswb48kHz:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001471#endif
1472#ifdef CODEC_G711
kwibergee1879c2015-10-29 06:20:28 -07001473 case webrtc::NetEqDecoder::kDecoderPCMu:
1474 case webrtc::NetEqDecoder::kDecoderPCMa:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001475#endif
Peter Kasting248b0b02015-06-03 12:32:41 -07001476 // do nothing
1477 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001478#ifdef CODEC_G729
kwibergee1879c2015-10-29 06:20:28 -07001479 case webrtc::NetEqDecoder::kDecoderG729:
Peter Kasting248b0b02015-06-03 12:32:41 -07001480 WebRtcG729_FreeEnc(G729enc_inst[k]);
1481 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001482#endif
1483#ifdef CODEC_G729_1
kwibergee1879c2015-10-29 06:20:28 -07001484 case webrtc::NetEqDecoder::kDecoderG729_1:
Peter Kasting248b0b02015-06-03 12:32:41 -07001485 WebRtcG7291_Free(G729_1_inst[k]);
1486 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001487#endif
1488#ifdef CODEC_SPEEX_8
kwibergee1879c2015-10-29 06:20:28 -07001489 case webrtc::NetEqDecoder::kDecoderSPEEX_8:
Peter Kasting248b0b02015-06-03 12:32:41 -07001490 WebRtcSpeex_FreeEnc(SPEEX8enc_inst[k]);
1491 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001492#endif
1493#ifdef CODEC_SPEEX_16
kwibergee1879c2015-10-29 06:20:28 -07001494 case webrtc::NetEqDecoder::kDecoderSPEEX_16:
Peter Kasting248b0b02015-06-03 12:32:41 -07001495 WebRtcSpeex_FreeEnc(SPEEX16enc_inst[k]);
1496 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001497#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001498
1499#ifdef CODEC_G722_1_16
kwibergee1879c2015-10-29 06:20:28 -07001500 case webrtc::NetEqDecoder::kDecoderG722_1_16:
Peter Kasting248b0b02015-06-03 12:32:41 -07001501 WebRtcG7221_FreeEnc16(G722_1_16enc_inst[k]);
1502 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001503#endif
1504#ifdef CODEC_G722_1_24
kwibergee1879c2015-10-29 06:20:28 -07001505 case webrtc::NetEqDecoder::kDecoderG722_1_24:
Peter Kasting248b0b02015-06-03 12:32:41 -07001506 WebRtcG7221_FreeEnc24(G722_1_24enc_inst[k]);
1507 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001508#endif
1509#ifdef CODEC_G722_1_32
kwibergee1879c2015-10-29 06:20:28 -07001510 case webrtc::NetEqDecoder::kDecoderG722_1_32:
Peter Kasting248b0b02015-06-03 12:32:41 -07001511 WebRtcG7221_FreeEnc32(G722_1_32enc_inst[k]);
1512 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001513#endif
1514#ifdef CODEC_G722_1C_24
kwibergee1879c2015-10-29 06:20:28 -07001515 case webrtc::NetEqDecoder::kDecoderG722_1C_24:
Peter Kasting248b0b02015-06-03 12:32:41 -07001516 WebRtcG7221C_FreeEnc24(G722_1C_24enc_inst[k]);
1517 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001518#endif
1519#ifdef CODEC_G722_1C_32
kwibergee1879c2015-10-29 06:20:28 -07001520 case webrtc::NetEqDecoder::kDecoderG722_1C_32:
Peter Kasting248b0b02015-06-03 12:32:41 -07001521 WebRtcG7221C_FreeEnc32(G722_1C_32enc_inst[k]);
1522 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001523#endif
1524#ifdef CODEC_G722_1C_48
kwibergee1879c2015-10-29 06:20:28 -07001525 case webrtc::NetEqDecoder::kDecoderG722_1C_48:
Peter Kasting248b0b02015-06-03 12:32:41 -07001526 WebRtcG7221C_FreeEnc48(G722_1C_48enc_inst[k]);
1527 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001528#endif
1529#ifdef CODEC_G722
kwibergee1879c2015-10-29 06:20:28 -07001530 case webrtc::NetEqDecoder::kDecoderG722:
Peter Kasting248b0b02015-06-03 12:32:41 -07001531 WebRtcG722_FreeEncoder(g722EncState[k]);
1532 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001533#endif
1534#ifdef CODEC_AMR
kwibergee1879c2015-10-29 06:20:28 -07001535 case webrtc::NetEqDecoder::kDecoderAMR:
Peter Kasting248b0b02015-06-03 12:32:41 -07001536 WebRtcAmr_FreeEnc(AMRenc_inst[k]);
1537 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001538#endif
1539#ifdef CODEC_AMRWB
kwibergee1879c2015-10-29 06:20:28 -07001540 case webrtc::NetEqDecoder::kDecoderAMRWB:
Peter Kasting248b0b02015-06-03 12:32:41 -07001541 WebRtcAmrWb_FreeEnc(AMRWBenc_inst[k]);
1542 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001543#endif
1544#ifdef CODEC_ILBC
kwibergee1879c2015-10-29 06:20:28 -07001545 case webrtc::NetEqDecoder::kDecoderILBC:
Peter Kasting248b0b02015-06-03 12:32:41 -07001546 WebRtcIlbcfix_EncoderFree(iLBCenc_inst[k]);
1547 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001548#endif
1549#ifdef CODEC_ISAC
kwibergee1879c2015-10-29 06:20:28 -07001550 case webrtc::NetEqDecoder::kDecoderISAC:
Peter Kasting248b0b02015-06-03 12:32:41 -07001551 WebRtcIsac_Free(ISAC_inst[k]);
1552 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001553#endif
1554#ifdef NETEQ_ISACFIX_CODEC
kwibergee1879c2015-10-29 06:20:28 -07001555 case webrtc::NetEqDecoder::kDecoderISAC:
Peter Kasting248b0b02015-06-03 12:32:41 -07001556 WebRtcIsacfix_Free(ISAC_inst[k]);
1557 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001558#endif
1559#ifdef CODEC_ISAC_SWB
kwibergee1879c2015-10-29 06:20:28 -07001560 case webrtc::NetEqDecoder::kDecoderISACswb:
Peter Kasting248b0b02015-06-03 12:32:41 -07001561 WebRtcIsac_Free(ISACSWB_inst[k]);
1562 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001563#endif
1564#ifdef CODEC_GSMFR
kwibergee1879c2015-10-29 06:20:28 -07001565 case webrtc::NetEqDecoder::kDecoderGSMFR:
Peter Kasting248b0b02015-06-03 12:32:41 -07001566 WebRtcGSMFR_FreeEnc(GSMFRenc_inst[k]);
1567 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001568#endif
minyuecb23c0d2015-12-11 01:58:26 -08001569#ifdef CODEC_OPUS
1570 case webrtc::NetEqDecoder::kDecoderOpus:
1571 WebRtcOpus_EncoderFree(opus_inst[k]);
1572 break;
1573#endif
Peter Kasting248b0b02015-06-03 12:32:41 -07001574 default:
1575 printf("Error: unknown codec in call to NetEQTest_init_coders.\n");
1576 exit(0);
1577 break;
1578 }
1579 }
1580
1581 return (0);
1582}
1583
kwibergee1879c2015-10-29 06:20:28 -07001584size_t NetEQTest_encode(webrtc::NetEqDecoder coder,
Peter Kastingdce40cf2015-08-24 14:52:23 -07001585 int16_t* indata,
1586 size_t frameLen,
1587 unsigned char* encoded,
1588 int sampleRate,
1589 int* vad,
1590 int useVAD,
1591 int bitrate,
1592 size_t numChannels) {
1593 size_t cdlen = 0;
Peter Kasting248b0b02015-06-03 12:32:41 -07001594 int16_t* tempdata;
ossu97ba30e2016-04-25 07:55:58 -07001595 static bool first_cng = true;
Peter Kastingdce40cf2015-08-24 14:52:23 -07001596 size_t tempLen;
Peter Kasting248b0b02015-06-03 12:32:41 -07001597 *vad = 1;
1598
1599 // check VAD first
1600 if (useVAD) {
1601 *vad = 0;
1602
ossu97ba30e2016-04-25 07:55:58 -07001603 const size_t sampleRate_10 = static_cast<size_t>(10 * sampleRate / 1000);
1604 const size_t sampleRate_20 = static_cast<size_t>(20 * sampleRate / 1000);
1605 const size_t sampleRate_30 = static_cast<size_t>(30 * sampleRate / 1000);
Peter Kastingdce40cf2015-08-24 14:52:23 -07001606 for (size_t k = 0; k < numChannels; k++) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001607 tempLen = frameLen;
1608 tempdata = &indata[k * frameLen];
1609 int localVad = 0;
1610 /* Partition the signal and test each chunk for VAD.
Peter Kastingdce40cf2015-08-24 14:52:23 -07001611 All chunks must be VAD=0 to produce a total VAD=0. */
pkastingb297c5a2015-07-22 15:17:22 -07001612 while (tempLen >= sampleRate_10) {
1613 if ((tempLen % sampleRate_30) == 0) { // tempLen is multiple of 30ms
Peter Kasting248b0b02015-06-03 12:32:41 -07001614 localVad |= WebRtcVad_Process(VAD_inst[k], sampleRate, tempdata,
pkastingb297c5a2015-07-22 15:17:22 -07001615 sampleRate_30);
1616 tempdata += sampleRate_30;
1617 tempLen -= sampleRate_30;
1618 } else if (tempLen >= sampleRate_20) { // tempLen >= 20ms
Peter Kasting248b0b02015-06-03 12:32:41 -07001619 localVad |= WebRtcVad_Process(VAD_inst[k], sampleRate, tempdata,
pkastingb297c5a2015-07-22 15:17:22 -07001620 sampleRate_20);
1621 tempdata += sampleRate_20;
1622 tempLen -= sampleRate_20;
Peter Kasting248b0b02015-06-03 12:32:41 -07001623 } else { // use 10ms
1624 localVad |= WebRtcVad_Process(VAD_inst[k], sampleRate, tempdata,
pkastingb297c5a2015-07-22 15:17:22 -07001625 sampleRate_10);
1626 tempdata += sampleRate_10;
1627 tempLen -= sampleRate_10;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001628 }
Peter Kasting248b0b02015-06-03 12:32:41 -07001629 }
1630
1631 // aggregate all VAD decisions over all channels
1632 *vad |= localVad;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001633 }
1634
Peter Kasting248b0b02015-06-03 12:32:41 -07001635 if (!*vad) {
1636 // all channels are silent
ossu97ba30e2016-04-25 07:55:58 -07001637 rtc::Buffer workaround;
Peter Kasting248b0b02015-06-03 12:32:41 -07001638 cdlen = 0;
Peter Kastingdce40cf2015-08-24 14:52:23 -07001639 for (size_t k = 0; k < numChannels; k++) {
ossu97ba30e2016-04-25 07:55:58 -07001640 workaround.Clear();
1641 tempLen = CNG_encoder[k]->Encode(
1642 rtc::ArrayView<const int16_t>(
1643 &indata[k * frameLen],
1644 (frameLen <= 640 ? frameLen : 640) /* max 640 */),
1645 first_cng,
1646 &workaround);
1647 memcpy(encoded, workaround.data(), tempLen);
Peter Kasting248b0b02015-06-03 12:32:41 -07001648 encoded += tempLen;
1649 cdlen += tempLen;
1650 }
1651 *vad = 0;
ossu97ba30e2016-04-25 07:55:58 -07001652 first_cng = false;
Peter Kasting248b0b02015-06-03 12:32:41 -07001653 return (cdlen);
1654 }
1655 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001656
Peter Kasting248b0b02015-06-03 12:32:41 -07001657 // loop over all channels
Peter Kastingdce40cf2015-08-24 14:52:23 -07001658 size_t totalLen = 0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001659
Peter Kastingdce40cf2015-08-24 14:52:23 -07001660 for (size_t k = 0; k < numChannels; k++) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001661 /* Encode with the selected coder type */
kwibergee1879c2015-10-29 06:20:28 -07001662 if (coder == webrtc::NetEqDecoder::kDecoderPCMu) { /*g711 u-law */
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001663#ifdef CODEC_G711
Peter Kasting248b0b02015-06-03 12:32:41 -07001664 cdlen = WebRtcG711_EncodeU(indata, frameLen, encoded);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001665#endif
kwibergee1879c2015-10-29 06:20:28 -07001666 } else if (coder == webrtc::NetEqDecoder::kDecoderPCMa) { /*g711 A-law */
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001667#ifdef CODEC_G711
Peter Kasting248b0b02015-06-03 12:32:41 -07001668 cdlen = WebRtcG711_EncodeA(indata, frameLen, encoded);
1669 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001670#endif
1671#ifdef CODEC_PCM16B
kwibergee1879c2015-10-29 06:20:28 -07001672 else if ((coder == webrtc::NetEqDecoder::kDecoderPCM16B) ||
1673 (coder == webrtc::NetEqDecoder::kDecoderPCM16Bwb) ||
1674 (coder == webrtc::NetEqDecoder::kDecoderPCM16Bswb32kHz) ||
1675 (coder == webrtc::NetEqDecoder::
Peter Kasting248b0b02015-06-03 12:32:41 -07001676 kDecoderPCM16Bswb48kHz)) { /*pcm16b (8kHz, 16kHz,
kwibergee1879c2015-10-29 06:20:28 -07001677 32kHz or 48kHz) */
Peter Kasting248b0b02015-06-03 12:32:41 -07001678 cdlen = WebRtcPcm16b_Encode(indata, frameLen, encoded);
1679 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001680#endif
1681#ifdef CODEC_G722
kwibergee1879c2015-10-29 06:20:28 -07001682 else if (coder == webrtc::NetEqDecoder::kDecoderG722) { /*g722 */
Peter Kasting248b0b02015-06-03 12:32:41 -07001683 cdlen = WebRtcG722_Encode(g722EncState[k], indata, frameLen, encoded);
1684 assert(cdlen == frameLen >> 1);
1685 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001686#endif
1687#ifdef CODEC_ILBC
kwibergee1879c2015-10-29 06:20:28 -07001688 else if (coder == webrtc::NetEqDecoder::kDecoderILBC) { /*iLBC */
Peter Kastingdce40cf2015-08-24 14:52:23 -07001689 cdlen = static_cast<size_t>(std::max(
1690 WebRtcIlbcfix_Encode(iLBCenc_inst[k], indata, frameLen, encoded), 0));
Peter Kasting248b0b02015-06-03 12:32:41 -07001691 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001692#endif
Peter Kasting248b0b02015-06-03 12:32:41 -07001693#if (defined(CODEC_ISAC) || \
1694 defined(NETEQ_ISACFIX_CODEC)) // TODO(hlundin): remove all
1695 // NETEQ_ISACFIX_CODEC
kwibergee1879c2015-10-29 06:20:28 -07001696 else if (coder == webrtc::NetEqDecoder::kDecoderISAC) { /*iSAC */
Peter Kasting248b0b02015-06-03 12:32:41 -07001697 int noOfCalls = 0;
Peter Kastingdce40cf2015-08-24 14:52:23 -07001698 int res = 0;
1699 while (res <= 0) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001700#ifdef CODEC_ISAC /* floating point */
Peter Kastingdce40cf2015-08-24 14:52:23 -07001701 res =
Peter Kasting248b0b02015-06-03 12:32:41 -07001702 WebRtcIsac_Encode(ISAC_inst[k], &indata[noOfCalls * 160], encoded);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001703#else /* fixed point */
Peter Kastingdce40cf2015-08-24 14:52:23 -07001704 res = WebRtcIsacfix_Encode(ISAC_inst[k], &indata[noOfCalls * 160],
1705 encoded);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001706#endif
Peter Kasting248b0b02015-06-03 12:32:41 -07001707 noOfCalls++;
1708 }
Peter Kastingdce40cf2015-08-24 14:52:23 -07001709 cdlen = static_cast<size_t>(res);
Peter Kasting248b0b02015-06-03 12:32:41 -07001710 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001711#endif
1712#ifdef CODEC_ISAC_SWB
kwibergee1879c2015-10-29 06:20:28 -07001713 else if (coder == webrtc::NetEqDecoder::kDecoderISACswb) { /* iSAC SWB */
Peter Kasting248b0b02015-06-03 12:32:41 -07001714 int noOfCalls = 0;
Peter Kastingdce40cf2015-08-24 14:52:23 -07001715 int res = 0;
1716 while (res <= 0) {
1717 res = WebRtcIsac_Encode(ISACSWB_inst[k], &indata[noOfCalls * 320],
1718 encoded);
Peter Kasting248b0b02015-06-03 12:32:41 -07001719 noOfCalls++;
1720 }
Peter Kastingdce40cf2015-08-24 14:52:23 -07001721 cdlen = static_cast<size_t>(res);
Peter Kasting248b0b02015-06-03 12:32:41 -07001722 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001723#endif
minyuecb23c0d2015-12-11 01:58:26 -08001724#ifdef CODEC_OPUS
1725 cdlen = WebRtcOpus_Encode(opus_inst[k], indata, frameLen, kRtpDataSize - 12,
1726 encoded);
kwibergaf476c72016-11-28 15:21:39 -08001727 RTC_CHECK_GT(cdlen, 0);
minyuecb23c0d2015-12-11 01:58:26 -08001728#endif
Peter Kasting248b0b02015-06-03 12:32:41 -07001729 indata += frameLen;
1730 encoded += cdlen;
1731 totalLen += cdlen;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001732
Peter Kasting248b0b02015-06-03 12:32:41 -07001733 } // end for
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001734
ossu97ba30e2016-04-25 07:55:58 -07001735 first_cng = true;
Peter Kasting248b0b02015-06-03 12:32:41 -07001736 return (totalLen);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001737}
1738
pkasting@chromium.orgd3245462015-02-23 21:28:22 +00001739void makeRTPheader(unsigned char* rtp_data,
1740 int payloadType,
1741 int seqNo,
1742 uint32_t timestamp,
1743 uint32_t ssrc) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001744 rtp_data[0] = 0x80;
1745 rtp_data[1] = payloadType & 0xFF;
1746 rtp_data[2] = (seqNo >> 8) & 0xFF;
1747 rtp_data[3] = seqNo & 0xFF;
1748 rtp_data[4] = timestamp >> 24;
1749 rtp_data[5] = (timestamp >> 16) & 0xFF;
1750 rtp_data[6] = (timestamp >> 8) & 0xFF;
1751 rtp_data[7] = timestamp & 0xFF;
1752 rtp_data[8] = ssrc >> 24;
1753 rtp_data[9] = (ssrc >> 16) & 0xFF;
1754 rtp_data[10] = (ssrc >> 8) & 0xFF;
1755 rtp_data[11] = ssrc & 0xFF;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001756}
1757
pkasting@chromium.orgd3245462015-02-23 21:28:22 +00001758int makeRedundantHeader(unsigned char* rtp_data,
1759 int* payloadType,
1760 int numPayloads,
1761 uint32_t* timestamp,
1762 uint16_t* blockLen,
1763 int seqNo,
Peter Kasting248b0b02015-06-03 12:32:41 -07001764 uint32_t ssrc) {
1765 int i;
1766 unsigned char* rtpPointer;
1767 uint16_t offset;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001768
Peter Kasting248b0b02015-06-03 12:32:41 -07001769 /* first create "standard" RTP header */
1770 makeRTPheader(rtp_data, NETEQ_CODEC_RED_PT, seqNo, timestamp[numPayloads - 1],
1771 ssrc);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001772
Peter Kasting248b0b02015-06-03 12:32:41 -07001773 rtpPointer = &rtp_data[12];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001774
Peter Kasting248b0b02015-06-03 12:32:41 -07001775 /* add one sub-header for each redundant payload (not the primary) */
1776 for (i = 0; i < numPayloads - 1; i++) {
1777 if (blockLen[i] > 0) {
1778 offset = static_cast<uint16_t>(timestamp[numPayloads - 1] - timestamp[i]);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001779
Peter Kasting248b0b02015-06-03 12:32:41 -07001780 // Byte |0| |1 2 | 3 |
1781 // Bit |0|1234567|01234567012345|6701234567|
1782 // |F|payload| timestamp | block |
1783 // | | type | offset | length |
1784 rtpPointer[0] = (payloadType[i] & 0x7F) | 0x80;
1785 rtpPointer[1] = (offset >> 6) & 0xFF;
1786 rtpPointer[2] = ((offset & 0x3F) << 2) | ((blockLen[i] >> 8) & 0x03);
1787 rtpPointer[3] = blockLen[i] & 0xFF;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001788
Peter Kasting248b0b02015-06-03 12:32:41 -07001789 rtpPointer += 4;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001790 }
Peter Kasting248b0b02015-06-03 12:32:41 -07001791 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001792
Peter Kasting248b0b02015-06-03 12:32:41 -07001793 // Bit |0|1234567|
1794 // |0|payload|
1795 // | | type |
1796 rtpPointer[0] = payloadType[numPayloads - 1] & 0x7F;
1797 ++rtpPointer;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001798
Peter Kasting248b0b02015-06-03 12:32:41 -07001799 return rtpPointer - rtp_data; // length of header in bytes
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001800}
1801
Peter Kastingdce40cf2015-08-24 14:52:23 -07001802size_t makeDTMFpayload(unsigned char* payload_data,
1803 int Event,
1804 int End,
1805 int Volume,
1806 int Duration) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001807 unsigned char E, R, V;
1808 R = 0;
1809 V = (unsigned char)Volume;
1810 if (End == 0) {
1811 E = 0x00;
1812 } else {
1813 E = 0x80;
1814 }
1815 payload_data[0] = (unsigned char)Event;
1816 payload_data[1] = (unsigned char)(E | R | V);
1817 // Duration equals 8 times time_ms, default is 8000 Hz.
1818 payload_data[2] = (unsigned char)((Duration >> 8) & 0xFF);
1819 payload_data[3] = (unsigned char)(Duration & 0xFF);
1820 return (4);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001821}
1822
Peter Kastingdce40cf2015-08-24 14:52:23 -07001823void stereoDeInterleave(int16_t* audioSamples, size_t numSamples) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001824 int16_t* tempVec;
1825 int16_t* readPtr, *writeL, *writeR;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001826
Peter Kastingdce40cf2015-08-24 14:52:23 -07001827 if (numSamples == 0)
Peter Kasting248b0b02015-06-03 12:32:41 -07001828 return;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001829
Peter Kasting248b0b02015-06-03 12:32:41 -07001830 tempVec = (int16_t*)malloc(sizeof(int16_t) * numSamples);
1831 if (tempVec == NULL) {
1832 printf("Error allocating memory\n");
1833 exit(0);
1834 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001835
Peter Kasting248b0b02015-06-03 12:32:41 -07001836 memcpy(tempVec, audioSamples, numSamples * sizeof(int16_t));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001837
Peter Kasting248b0b02015-06-03 12:32:41 -07001838 writeL = audioSamples;
1839 writeR = &audioSamples[numSamples / 2];
1840 readPtr = tempVec;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001841
Peter Kastingdce40cf2015-08-24 14:52:23 -07001842 for (size_t k = 0; k < numSamples; k += 2) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001843 *writeL = *readPtr;
1844 readPtr++;
1845 *writeR = *readPtr;
1846 readPtr++;
1847 writeL++;
1848 writeR++;
1849 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001850
Peter Kasting248b0b02015-06-03 12:32:41 -07001851 free(tempVec);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001852}
1853
Peter Kastingdce40cf2015-08-24 14:52:23 -07001854void stereoInterleave(unsigned char* data, size_t dataLen, size_t stride) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001855 unsigned char* ptrL, *ptrR;
1856 unsigned char temp[10];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001857
Peter Kasting248b0b02015-06-03 12:32:41 -07001858 if (stride > 10) {
1859 exit(0);
1860 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001861
Peter Kasting248b0b02015-06-03 12:32:41 -07001862 if (dataLen % 1 != 0) {
1863 // must be even number of samples
1864 printf("Error: cannot interleave odd sample number\n");
1865 exit(0);
1866 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001867
Peter Kasting248b0b02015-06-03 12:32:41 -07001868 ptrL = data + stride;
1869 ptrR = &data[dataLen / 2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001870
Peter Kasting248b0b02015-06-03 12:32:41 -07001871 while (ptrL < ptrR) {
1872 // copy from right pointer to temp
1873 memcpy(temp, ptrR, stride);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001874
Peter Kasting248b0b02015-06-03 12:32:41 -07001875 // shift data between pointers
1876 memmove(ptrL + stride, ptrL, ptrR - ptrL);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001877
Peter Kasting248b0b02015-06-03 12:32:41 -07001878 // copy from temp to left pointer
1879 memcpy(ptrL, temp, stride);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001880
Peter Kasting248b0b02015-06-03 12:32:41 -07001881 // advance pointers
1882 ptrL += stride * 2;
1883 ptrR += stride;
1884 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001885}