blob: 45586ee111c655ae0b6f28ffd339ed74bcfc32fc [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))
268CNG_enc_inst* CNGenc_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000269#endif
270#ifdef CODEC_SPEEX_8
Peter Kasting248b0b02015-06-03 12:32:41 -0700271SPEEX_encinst_t* SPEEX8enc_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000272#endif
273#ifdef CODEC_SPEEX_16
Peter Kasting248b0b02015-06-03 12:32:41 -0700274SPEEX_encinst_t* SPEEX16enc_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000275#endif
minyuecb23c0d2015-12-11 01:58:26 -0800276#ifdef CODEC_OPUS
277OpusEncInst* opus_inst[2];
278#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000279
Peter Kasting248b0b02015-06-03 12:32:41 -0700280int main(int argc, char* argv[]) {
Peter Kastingdce40cf2015-08-24 14:52:23 -0700281 size_t packet_size;
282 int fs;
Peter Kasting248b0b02015-06-03 12:32:41 -0700283 webrtc::NetEqDecoder usedCodec;
284 int payloadType;
285 int bitrate = 0;
286 int useVAD, vad;
287 int useRed = 0;
Peter Kastingdce40cf2015-08-24 14:52:23 -0700288 size_t len, enc_len;
Peter Kasting248b0b02015-06-03 12:32:41 -0700289 int16_t org_data[4000];
minyuecb23c0d2015-12-11 01:58:26 -0800290 unsigned char rtp_data[kRtpDataSize];
Peter Kasting248b0b02015-06-03 12:32:41 -0700291 int16_t seqNo = 0xFFF;
292 uint32_t ssrc = 1235412312;
293 uint32_t timestamp = 0xAC1245;
294 uint16_t length, plen;
295 uint32_t offset;
296 double sendtime = 0;
297 int red_PT[2] = {0};
298 uint32_t red_TS[2] = {0};
299 uint16_t red_len[2] = {0};
Peter Kastingdce40cf2015-08-24 14:52:23 -0700300 size_t RTPheaderLen = 12;
minyuecb23c0d2015-12-11 01:58:26 -0800301 uint8_t red_data[kRtpDataSize];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000302#ifdef INSERT_OLD_PACKETS
Peter Kasting248b0b02015-06-03 12:32:41 -0700303 uint16_t old_length, old_plen;
Peter Kastingdce40cf2015-08-24 14:52:23 -0700304 size_t old_enc_len;
Peter Kasting248b0b02015-06-03 12:32:41 -0700305 int first_old_packet = 1;
minyuecb23c0d2015-12-11 01:58:26 -0800306 unsigned char old_rtp_data[kRtpDataSize];
Peter Kastingdce40cf2015-08-24 14:52:23 -0700307 size_t packet_age = 0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000308#endif
309#ifdef INSERT_DTMF_PACKETS
Peter Kasting248b0b02015-06-03 12:32:41 -0700310 int NTone = 1;
311 int DTMFfirst = 1;
312 uint32_t DTMFtimestamp;
313 bool dtmfSent = false;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000314#endif
Peter Kasting248b0b02015-06-03 12:32:41 -0700315 bool usingStereo = false;
Peter Kastingdce40cf2015-08-24 14:52:23 -0700316 size_t stereoMode = 0;
317 size_t numChannels = 1;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000318
Peter Kasting248b0b02015-06-03 12:32:41 -0700319 /* check number of parameters */
320 if ((argc != 6) && (argc != 7)) {
321 /* print help text and exit */
322 printf("Application to encode speech into an RTP stream.\n");
Peter Kasting2a100872015-06-09 17:26:40 -0700323 printf("The program reads a PCM file and encodes is using the specified "
324 "codec.\n");
325 printf("The coded speech is packetized in RTP packest and written to the "
326 "output file.\n");
327 printf("The format of the RTP stream file is simlilar to that of "
328 "rtpplay,\n");
Peter Kasting248b0b02015-06-03 12:32:41 -0700329 printf("but with the receive time euqal to 0 for all packets.\n");
330 printf("Usage:\n\n");
331 printf("%s PCMfile RTPfile frameLen codec useVAD bitrate\n", argv[0]);
332 printf("where:\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000333
Peter Kasting248b0b02015-06-03 12:32:41 -0700334 printf("PCMfile : PCM speech input file\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000335
Peter Kasting248b0b02015-06-03 12:32:41 -0700336 printf("RTPfile : RTP stream output file\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000337
Peter Kasting2a100872015-06-09 17:26:40 -0700338 printf("frameLen : 80...960... Number of samples per packet (limit "
339 "depends on codec)\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000340
Peter Kasting248b0b02015-06-03 12:32:41 -0700341 printf("codecName\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000342#ifdef CODEC_PCM16B
Peter Kasting248b0b02015-06-03 12:32:41 -0700343 printf(" : pcm16b 16 bit PCM (8kHz)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000344#endif
345#ifdef CODEC_PCM16B_WB
Peter Kasting248b0b02015-06-03 12:32:41 -0700346 printf(" : pcm16b_wb 16 bit PCM (16kHz)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000347#endif
348#ifdef CODEC_PCM16B_32KHZ
Peter Kasting248b0b02015-06-03 12:32:41 -0700349 printf(" : pcm16b_swb32 16 bit PCM (32kHz)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000350#endif
351#ifdef CODEC_PCM16B_48KHZ
Peter Kasting248b0b02015-06-03 12:32:41 -0700352 printf(" : pcm16b_swb48 16 bit PCM (48kHz)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000353#endif
354#ifdef CODEC_G711
Peter Kasting248b0b02015-06-03 12:32:41 -0700355 printf(" : pcma g711 A-law (8kHz)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000356#endif
357#ifdef CODEC_G711
Peter Kasting248b0b02015-06-03 12:32:41 -0700358 printf(" : pcmu g711 u-law (8kHz)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000359#endif
360#ifdef CODEC_G729
Peter Kasting2a100872015-06-09 17:26:40 -0700361 printf(" : g729 G729 (8kHz and 8kbps) CELP (One-Three "
362 "frame(s)/packet)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000363#endif
364#ifdef CODEC_G729_1
Peter Kasting2a100872015-06-09 17:26:40 -0700365 printf(" : g729.1 G729.1 (16kHz) variable rate (8--32 "
366 "kbps)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000367#endif
368#ifdef CODEC_G722_1_16
Peter Kasting2a100872015-06-09 17:26:40 -0700369 printf(" : g722.1_16 G722.1 coder (16kHz) (g722.1 with "
370 "16kbps)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000371#endif
372#ifdef CODEC_G722_1_24
Peter Kasting2a100872015-06-09 17:26:40 -0700373 printf(" : g722.1_24 G722.1 coder (16kHz) (the 24kbps "
374 "version)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000375#endif
376#ifdef CODEC_G722_1_32
Peter Kasting2a100872015-06-09 17:26:40 -0700377 printf(" : g722.1_32 G722.1 coder (16kHz) (the 32kbps "
378 "version)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000379#endif
380#ifdef CODEC_G722_1C_24
Peter Kasting2a100872015-06-09 17:26:40 -0700381 printf(" : g722.1C_24 G722.1 C coder (32kHz) (the 24kbps "
382 "version)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000383#endif
384#ifdef CODEC_G722_1C_32
Peter Kasting2a100872015-06-09 17:26:40 -0700385 printf(" : g722.1C_32 G722.1 C coder (32kHz) (the 32kbps "
386 "version)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000387#endif
388#ifdef CODEC_G722_1C_48
Peter Kasting2a100872015-06-09 17:26:40 -0700389 printf(" : g722.1C_48 G722.1 C coder (32kHz) (the 48kbps "
390 "version)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000391#endif
392
393#ifdef CODEC_G726
Peter Kasting248b0b02015-06-03 12:32:41 -0700394 printf(" : g726_16 G726 coder (8kHz) 16kbps\n");
395 printf(" : g726_24 G726 coder (8kHz) 24kbps\n");
396 printf(" : g726_32 G726 coder (8kHz) 32kbps\n");
397 printf(" : g726_40 G726 coder (8kHz) 40kbps\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000398#endif
399#ifdef CODEC_AMR
Peter Kasting2a100872015-06-09 17:26:40 -0700400 printf(" : AMRXk Adaptive Multi Rate CELP codec "
401 "(8kHz)\n");
402 printf(" X = 4.75, 5.15, 5.9, 6.7, 7.4, 7.95, "
403 "10.2 or 12.2\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000404#endif
405#ifdef CODEC_AMRWB
Peter Kasting2a100872015-06-09 17:26:40 -0700406 printf(" : AMRwbXk Adaptive Multi Rate Wideband CELP "
407 "codec (16kHz)\n");
408 printf(" X = 7, 9, 12, 14, 16, 18, 20, 23 or "
409 "24\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000410#endif
411#ifdef CODEC_ILBC
Peter Kasting248b0b02015-06-03 12:32:41 -0700412 printf(" : ilbc iLBC codec (8kHz and 13.8kbps)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000413#endif
414#ifdef CODEC_ISAC
Peter Kasting2a100872015-06-09 17:26:40 -0700415 printf(" : isac iSAC (16kHz and 32.0 kbps). To set "
416 "rate specify a rate parameter as last parameter\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000417#endif
418#ifdef CODEC_ISAC_SWB
Peter Kasting2a100872015-06-09 17:26:40 -0700419 printf(" : isacswb iSAC SWB (32kHz and 32.0-52.0 kbps). "
420 "To set rate specify a rate parameter as last parameter\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000421#endif
422#ifdef CODEC_GSMFR
Peter Kasting248b0b02015-06-03 12:32:41 -0700423 printf(" : gsmfr GSM FR codec (8kHz and 13kbps)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000424#endif
425#ifdef CODEC_G722
Peter Kasting2a100872015-06-09 17:26:40 -0700426 printf(" : g722 g722 coder (16kHz) (the 64kbps "
427 "version)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000428#endif
429#ifdef CODEC_SPEEX_8
Peter Kasting248b0b02015-06-03 12:32:41 -0700430 printf(" : speex8 speex coder (8 kHz)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000431#endif
432#ifdef CODEC_SPEEX_16
Peter Kasting248b0b02015-06-03 12:32:41 -0700433 printf(" : speex16 speex coder (16 kHz)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000434#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000435#ifdef CODEC_RED
436#ifdef CODEC_G711
Peter Kasting2a100872015-06-09 17:26:40 -0700437 printf(" : red_pcm Redundancy RTP packet with 2*G711A "
438 "frames\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000439#endif
440#ifdef CODEC_ISAC
Peter Kasting2a100872015-06-09 17:26:40 -0700441 printf(" : red_isac Redundancy RTP packet with 2*iSAC "
442 "frames\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000443#endif
minyuecb23c0d2015-12-11 01:58:26 -0800444#endif // CODEC_RED
445#ifdef CODEC_OPUS
446 printf(" : opus Opus codec with FEC (48kHz, 32kbps, FEC"
447 " on and tuned for 5%% packet losses)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000448#endif
Peter Kasting248b0b02015-06-03 12:32:41 -0700449 printf("\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000450
451#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
Peter Kasting248b0b02015-06-03 12:32:41 -0700452 defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
453 printf("useVAD : 0 Voice Activity Detection is switched off\n");
454 printf(" : 1 Voice Activity Detection is switched on\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000455#else
Peter Kasting2a100872015-06-09 17:26:40 -0700456 printf("useVAD : 0 Voice Activity Detection switched off (on not "
457 "supported)\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000458#endif
Peter Kasting2a100872015-06-09 17:26:40 -0700459 printf("bitrate : Codec bitrate in bps (only applies to vbr "
460 "codecs)\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000461
Peter Kasting248b0b02015-06-03 12:32:41 -0700462 return (0);
463 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000464
Peter Kasting248b0b02015-06-03 12:32:41 -0700465 FILE* in_file = fopen(argv[1], "rb");
466 CHECK_NOT_NULL(in_file);
467 printf("Input file: %s\n", argv[1]);
468 FILE* out_file = fopen(argv[2], "wb");
469 CHECK_NOT_NULL(out_file);
470 printf("Output file: %s\n\n", argv[2]);
Peter Kastingdce40cf2015-08-24 14:52:23 -0700471 int packet_size_int = atoi(argv[3]);
472 if (packet_size_int <= 0) {
473 printf("Packet size %d must be positive", packet_size_int);
Peter Kastingf045e4d2015-06-10 21:15:38 -0700474 return -1;
475 }
Peter Kastingdce40cf2015-08-24 14:52:23 -0700476 printf("Packet size: %d\n", packet_size_int);
477 packet_size = static_cast<size_t>(packet_size_int);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000478
Peter Kasting248b0b02015-06-03 12:32:41 -0700479 // check for stereo
480 if (argv[4][strlen(argv[4]) - 1] == '*') {
481 // use stereo
482 usingStereo = true;
483 numChannels = 2;
484 argv[4][strlen(argv[4]) - 1] = '\0';
485 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000486
Peter Kasting248b0b02015-06-03 12:32:41 -0700487 NetEQTest_GetCodec_and_PT(argv[4], &usedCodec, &payloadType, packet_size, &fs,
488 &bitrate, &useRed);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000489
Peter Kasting248b0b02015-06-03 12:32:41 -0700490 if (useRed) {
491 RTPheaderLen = 12 + 4 + 1; /* standard RTP = 12; 4 bytes per redundant
492 payload, except last one which is 1 byte */
493 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000494
Peter Kasting248b0b02015-06-03 12:32:41 -0700495 useVAD = atoi(argv[5]);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000496#if !(defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
Peter Kasting248b0b02015-06-03 12:32:41 -0700497 defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
498 if (useVAD != 0) {
499 printf("Error: this simulation does not support VAD/DTX/CNG\n");
500 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000501#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000502
Peter Kasting248b0b02015-06-03 12:32:41 -0700503 // check stereo type
504 if (usingStereo) {
505 switch (usedCodec) {
506 // sample based codecs
kwibergee1879c2015-10-29 06:20:28 -0700507 case webrtc::NetEqDecoder::kDecoderPCMu:
508 case webrtc::NetEqDecoder::kDecoderPCMa:
509 case webrtc::NetEqDecoder::kDecoderG722: {
Peter Kasting248b0b02015-06-03 12:32:41 -0700510 // 1 octet per sample
511 stereoMode = STEREO_MODE_SAMPLE_1;
512 break;
513 }
kwibergee1879c2015-10-29 06:20:28 -0700514 case webrtc::NetEqDecoder::kDecoderPCM16B:
515 case webrtc::NetEqDecoder::kDecoderPCM16Bwb:
516 case webrtc::NetEqDecoder::kDecoderPCM16Bswb32kHz:
517 case webrtc::NetEqDecoder::kDecoderPCM16Bswb48kHz: {
Peter Kasting248b0b02015-06-03 12:32:41 -0700518 // 2 octets per sample
519 stereoMode = STEREO_MODE_SAMPLE_2;
520 break;
521 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000522
Peter Kasting248b0b02015-06-03 12:32:41 -0700523 // fixed-rate frame codecs (with internal VAD)
524 default: {
525 printf("Cannot use codec %s as stereo codec\n", argv[4]);
526 exit(0);
527 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000528 }
Peter Kasting248b0b02015-06-03 12:32:41 -0700529 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000530
kwibergee1879c2015-10-29 06:20:28 -0700531 if ((usedCodec == webrtc::NetEqDecoder::kDecoderISAC) ||
532 (usedCodec == webrtc::NetEqDecoder::kDecoderISACswb)) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700533 if (argc != 7) {
kwibergee1879c2015-10-29 06:20:28 -0700534 if (usedCodec == webrtc::NetEqDecoder::kDecoderISAC) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700535 bitrate = 32000;
Peter Kasting2a100872015-06-09 17:26:40 -0700536 printf("Running iSAC at default bitrate of 32000 bps (to specify "
537 "explicitly add the bps as last parameter)\n");
Peter Kasting248b0b02015-06-03 12:32:41 -0700538 } else // (usedCodec==webrtc::kDecoderISACswb)
539 {
540 bitrate = 56000;
Peter Kasting2a100872015-06-09 17:26:40 -0700541 printf("Running iSAC at default bitrate of 56000 bps (to specify "
542 "explicitly add the bps as last parameter)\n");
Peter Kasting248b0b02015-06-03 12:32:41 -0700543 }
544 } else {
545 bitrate = atoi(argv[6]);
kwibergee1879c2015-10-29 06:20:28 -0700546 if (usedCodec == webrtc::NetEqDecoder::kDecoderISAC) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700547 if ((bitrate < 10000) || (bitrate > 32000)) {
Peter Kasting2a100872015-06-09 17:26:40 -0700548 printf("Error: iSAC bitrate must be between 10000 and 32000 bps (%i "
549 "is invalid)\n", bitrate);
Peter Kasting248b0b02015-06-03 12:32:41 -0700550 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000551 }
Peter Kasting248b0b02015-06-03 12:32:41 -0700552 printf("Running iSAC at bitrate of %i bps\n", bitrate);
553 } else // (usedCodec==webrtc::kDecoderISACswb)
554 {
555 if ((bitrate < 32000) || (bitrate > 56000)) {
Peter Kasting2a100872015-06-09 17:26:40 -0700556 printf("Error: iSAC SWB bitrate must be between 32000 and 56000 bps "
557 "(%i is invalid)\n", bitrate);
Peter Kasting248b0b02015-06-03 12:32:41 -0700558 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000559 }
Peter Kasting248b0b02015-06-03 12:32:41 -0700560 }
561 }
562 } else {
563 if (argc == 7) {
Peter Kasting2a100872015-06-09 17:26:40 -0700564 printf("Error: Bitrate parameter can only be specified for iSAC, G.723, "
565 "and G.729.1\n");
Peter Kasting248b0b02015-06-03 12:32:41 -0700566 exit(0);
567 }
568 }
569
570 if (useRed) {
571 printf("Redundancy engaged. ");
572 }
kwibergee1879c2015-10-29 06:20:28 -0700573 printf("Used codec: %i\n", static_cast<int>(usedCodec));
Peter Kasting248b0b02015-06-03 12:32:41 -0700574 printf("Payload type: %i\n", payloadType);
575
576 NetEQTest_init_coders(usedCodec, packet_size, bitrate, fs, useVAD,
577 numChannels);
578
579 /* write file header */
580 // fprintf(out_file, "#!RTPencode%s\n", "1.0");
581 fprintf(out_file, "#!rtpplay%s \n",
582 "1.0"); // this is the string that rtpplay needs
583 uint32_t dummy_variable = 0; // should be converted to network endian format,
584 // but does not matter when 0
585 if (fwrite(&dummy_variable, 4, 1, out_file) != 1) {
586 return -1;
587 }
588 if (fwrite(&dummy_variable, 4, 1, out_file) != 1) {
589 return -1;
590 }
591 if (fwrite(&dummy_variable, 4, 1, out_file) != 1) {
592 return -1;
593 }
594 if (fwrite(&dummy_variable, 2, 1, out_file) != 1) {
595 return -1;
596 }
597 if (fwrite(&dummy_variable, 2, 1, out_file) != 1) {
598 return -1;
599 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000600
601#ifdef TIMESTAMP_WRAPAROUND
Peter Kasting248b0b02015-06-03 12:32:41 -0700602 timestamp = 0xFFFFFFFF - fs * 10; /* should give wrap-around in 10 seconds */
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000603#endif
604#if defined(RANDOM_DATA) | defined(RANDOM_PAYLOAD_DATA)
Peter Kasting248b0b02015-06-03 12:32:41 -0700605 srand(RANDOM_SEED);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000606#endif
607
Peter Kasting248b0b02015-06-03 12:32:41 -0700608 /* if redundancy is used, the first redundant payload is zero length */
609 red_len[0] = 0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000610
Peter Kasting248b0b02015-06-03 12:32:41 -0700611 /* read first frame */
612 len = fread(org_data, 2, packet_size * numChannels, in_file) / numChannels;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000613
Peter Kasting248b0b02015-06-03 12:32:41 -0700614 /* de-interleave if stereo */
615 if (usingStereo) {
616 stereoDeInterleave(org_data, len * numChannels);
617 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000618
Peter Kasting248b0b02015-06-03 12:32:41 -0700619 while (len == packet_size) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000620#ifdef INSERT_DTMF_PACKETS
Peter Kasting248b0b02015-06-03 12:32:41 -0700621 dtmfSent = false;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000622
Peter Kasting248b0b02015-06-03 12:32:41 -0700623 if (sendtime >= NTone * DTMF_PACKET_INTERVAL) {
624 if (sendtime < NTone * DTMF_PACKET_INTERVAL + DTMF_DURATION) {
625 // tone has not ended
626 if (DTMFfirst == 1) {
627 DTMFtimestamp = timestamp; // save this timestamp
628 DTMFfirst = 0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000629 }
Peter Kasting248b0b02015-06-03 12:32:41 -0700630 makeRTPheader(rtp_data, NETEQ_CODEC_AVT_PT, seqNo, DTMFtimestamp, ssrc);
631 enc_len = makeDTMFpayload(
632 &rtp_data[12], NTone % 12, 0, 4,
633 (int)(sendtime - NTone * DTMF_PACKET_INTERVAL) * (fs / 1000) + len);
634 } else {
635 // tone has ended
636 makeRTPheader(rtp_data, NETEQ_CODEC_AVT_PT, seqNo, DTMFtimestamp, ssrc);
637 enc_len = makeDTMFpayload(&rtp_data[12], NTone % 12, 1, 4,
638 DTMF_DURATION * (fs / 1000));
639 NTone++;
640 DTMFfirst = 1;
641 }
642
643 /* write RTP packet to file */
Peter Kastingb7e50542015-06-11 12:55:50 -0700644 length = htons(static_cast<unsigned short>(12 + enc_len + 8));
645 plen = htons(static_cast<unsigned short>(12 + enc_len));
Peter Kasting248b0b02015-06-03 12:32:41 -0700646 offset = (uint32_t)sendtime; //(timestamp/(fs/1000));
647 offset = htonl(offset);
648 if (fwrite(&length, 2, 1, out_file) != 1) {
649 return -1;
650 }
651 if (fwrite(&plen, 2, 1, out_file) != 1) {
652 return -1;
653 }
654 if (fwrite(&offset, 4, 1, out_file) != 1) {
655 return -1;
656 }
657 if (fwrite(rtp_data, 12 + enc_len, 1, out_file) != 1) {
658 return -1;
659 }
660
661 dtmfSent = true;
662 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000663#endif
664
665#ifdef NO_DTMF_OVERDUB
Peter Kasting248b0b02015-06-03 12:32:41 -0700666 /* If DTMF is sent, we should not send any speech packets during the same
667 * time */
668 if (dtmfSent) {
669 enc_len = 0;
670 } else {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000671#endif
Peter Kasting248b0b02015-06-03 12:32:41 -0700672 /* encode frame */
673 enc_len =
674 NetEQTest_encode(usedCodec, org_data, packet_size, &rtp_data[12], fs,
675 &vad, useVAD, bitrate, numChannels);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000676
Peter Kasting248b0b02015-06-03 12:32:41 -0700677 if (usingStereo && stereoMode != STEREO_MODE_FRAME && vad == 1) {
678 // interleave the encoded payload for sample-based codecs (not for CNG)
679 stereoInterleave(&rtp_data[12], enc_len, stereoMode);
680 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000681#ifdef NO_DTMF_OVERDUB
Peter Kasting248b0b02015-06-03 12:32:41 -0700682 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000683#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000684
Peter Kasting248b0b02015-06-03 12:32:41 -0700685 if (enc_len > 0 &&
686 (sendtime <= STOPSENDTIME || sendtime > RESTARTSENDTIME)) {
687 if (useRed) {
688 if (red_len[0] > 0) {
689 memmove(&rtp_data[RTPheaderLen + red_len[0]], &rtp_data[12], enc_len);
690 memcpy(&rtp_data[RTPheaderLen], red_data, red_len[0]);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000691
Peter Kastingb7e50542015-06-11 12:55:50 -0700692 red_len[1] = static_cast<uint16_t>(enc_len);
Peter Kasting248b0b02015-06-03 12:32:41 -0700693 red_TS[1] = timestamp;
694 if (vad)
695 red_PT[1] = payloadType;
696 else
697 red_PT[1] = NETEQ_CODEC_CN_PT;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000698
Peter Kasting248b0b02015-06-03 12:32:41 -0700699 makeRedundantHeader(rtp_data, red_PT, 2, red_TS, red_len, seqNo++,
700 ssrc);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000701
Peter Kasting248b0b02015-06-03 12:32:41 -0700702 enc_len += red_len[0] + RTPheaderLen - 12;
703 } else { // do not use redundancy payload for this packet, i.e., only
704 // last payload
705 memmove(&rtp_data[RTPheaderLen - 4], &rtp_data[12], enc_len);
706 // memcpy(&rtp_data[RTPheaderLen], red_data, red_len[0]);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000707
Peter Kastingb7e50542015-06-11 12:55:50 -0700708 red_len[1] = static_cast<uint16_t>(enc_len);
Peter Kasting248b0b02015-06-03 12:32:41 -0700709 red_TS[1] = timestamp;
710 if (vad)
711 red_PT[1] = payloadType;
712 else
713 red_PT[1] = NETEQ_CODEC_CN_PT;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000714
Peter Kasting248b0b02015-06-03 12:32:41 -0700715 makeRedundantHeader(rtp_data, red_PT, 2, red_TS, red_len, seqNo++,
716 ssrc);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000717
Peter Kasting248b0b02015-06-03 12:32:41 -0700718 enc_len += red_len[0] + RTPheaderLen - 4 -
719 12; // 4 is length of redundancy header (not used)
720 }
721 } else {
722 /* make RTP header */
723 if (vad) // regular speech data
724 makeRTPheader(rtp_data, payloadType, seqNo++, timestamp, ssrc);
725 else // CNG data
726 makeRTPheader(rtp_data, NETEQ_CODEC_CN_PT, seqNo++, timestamp, ssrc);
727 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000728#ifdef MULTIPLE_SAME_TIMESTAMP
Peter Kasting248b0b02015-06-03 12:32:41 -0700729 int mult_pack = 0;
730 do {
731#endif // MULTIPLE_SAME_TIMESTAMP
732 /* write RTP packet to file */
Peter Kastingb7e50542015-06-11 12:55:50 -0700733 length = htons(static_cast<unsigned short>(12 + enc_len + 8));
734 plen = htons(static_cast<unsigned short>(12 + enc_len));
Peter Kasting248b0b02015-06-03 12:32:41 -0700735 offset = (uint32_t)sendtime;
736 //(timestamp/(fs/1000));
737 offset = htonl(offset);
738 if (fwrite(&length, 2, 1, out_file) != 1) {
739 return -1;
740 }
741 if (fwrite(&plen, 2, 1, out_file) != 1) {
742 return -1;
743 }
744 if (fwrite(&offset, 4, 1, out_file) != 1) {
745 return -1;
746 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000747#ifdef RANDOM_DATA
Peter Kastingdce40cf2015-08-24 14:52:23 -0700748 for (size_t k = 0; k < 12 + enc_len; k++) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700749 rtp_data[k] = rand() + rand();
750 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000751#endif
752#ifdef RANDOM_PAYLOAD_DATA
Peter Kastingdce40cf2015-08-24 14:52:23 -0700753 for (size_t k = 12; k < 12 + enc_len; k++) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700754 rtp_data[k] = rand() + rand();
755 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000756#endif
Peter Kasting248b0b02015-06-03 12:32:41 -0700757 if (fwrite(rtp_data, 12 + enc_len, 1, out_file) != 1) {
758 return -1;
759 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000760#ifdef MULTIPLE_SAME_TIMESTAMP
Peter Kasting248b0b02015-06-03 12:32:41 -0700761 } while ((seqNo % REPEAT_PACKET_DISTANCE == 0) &&
762 (mult_pack++ < REPEAT_PACKET_COUNT));
763#endif // MULTIPLE_SAME_TIMESTAMP
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000764
765#ifdef INSERT_OLD_PACKETS
Peter Kasting248b0b02015-06-03 12:32:41 -0700766 if (packet_age >= OLD_PACKET * fs) {
767 if (!first_old_packet) {
768 // send the old packet
769 if (fwrite(&old_length, 2, 1, out_file) != 1) {
770 return -1;
771 }
772 if (fwrite(&old_plen, 2, 1, out_file) != 1) {
773 return -1;
774 }
775 if (fwrite(&offset, 4, 1, out_file) != 1) {
776 return -1;
777 }
778 if (fwrite(old_rtp_data, 12 + old_enc_len, 1, out_file) != 1) {
779 return -1;
780 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000781 }
Peter Kasting248b0b02015-06-03 12:32:41 -0700782 // store current packet as old
783 old_length = length;
784 old_plen = plen;
785 memcpy(old_rtp_data, rtp_data, 12 + enc_len);
786 old_enc_len = enc_len;
787 first_old_packet = 0;
788 packet_age = 0;
789 }
790 packet_age += packet_size;
791#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000792
Peter Kasting248b0b02015-06-03 12:32:41 -0700793 if (useRed) {
794/* move data to redundancy store */
795#ifdef CODEC_ISAC
kwibergee1879c2015-10-29 06:20:28 -0700796 if (usedCodec == webrtc::NetEqDecoder::kDecoderISAC) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700797 assert(!usingStereo); // Cannot handle stereo yet
798 red_len[0] = WebRtcIsac_GetRedPayload(ISAC_inst[0], red_data);
799 } else {
800#endif
801 memcpy(red_data, &rtp_data[RTPheaderLen + red_len[0]], enc_len);
802 red_len[0] = red_len[1];
803#ifdef CODEC_ISAC
804 }
805#endif
806 red_TS[0] = red_TS[1];
807 red_PT[0] = red_PT[1];
808 }
809 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000810
Peter Kasting248b0b02015-06-03 12:32:41 -0700811 /* read next frame */
812 len = fread(org_data, 2, packet_size * numChannels, in_file) / numChannels;
813 /* de-interleave if stereo */
814 if (usingStereo) {
815 stereoDeInterleave(org_data, len * numChannels);
816 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000817
Peter Kasting248b0b02015-06-03 12:32:41 -0700818 if (payloadType == NETEQ_CODEC_G722_PT)
819 timestamp += len >> 1;
820 else
821 timestamp += len;
822
823 sendtime += (double)len / (fs / 1000);
824 }
825
826 NetEQTest_free_coders(usedCodec, numChannels);
827 fclose(in_file);
828 fclose(out_file);
829 printf("Done!\n");
830
831 return (0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000832}
833
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000834/****************/
835/* Subfunctions */
836/****************/
837
pkasting@chromium.orgd3245462015-02-23 21:28:22 +0000838void NetEQTest_GetCodec_and_PT(char* name,
839 webrtc::NetEqDecoder* codec,
840 int* PT,
Peter Kastingdce40cf2015-08-24 14:52:23 -0700841 size_t frameLen,
pkasting@chromium.orgd3245462015-02-23 21:28:22 +0000842 int* fs,
843 int* bitrate,
844 int* useRed) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700845 *bitrate = 0; /* Default bitrate setting */
846 *useRed = 0; /* Default no redundancy */
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000847
Peter Kasting248b0b02015-06-03 12:32:41 -0700848 if (!strcmp(name, "pcmu")) {
kwibergee1879c2015-10-29 06:20:28 -0700849 *codec = webrtc::NetEqDecoder::kDecoderPCMu;
Peter Kasting248b0b02015-06-03 12:32:41 -0700850 *PT = NETEQ_CODEC_PCMU_PT;
851 *fs = 8000;
852 } else if (!strcmp(name, "pcma")) {
kwibergee1879c2015-10-29 06:20:28 -0700853 *codec = webrtc::NetEqDecoder::kDecoderPCMa;
Peter Kasting248b0b02015-06-03 12:32:41 -0700854 *PT = NETEQ_CODEC_PCMA_PT;
855 *fs = 8000;
856 } else if (!strcmp(name, "pcm16b")) {
kwibergee1879c2015-10-29 06:20:28 -0700857 *codec = webrtc::NetEqDecoder::kDecoderPCM16B;
Peter Kasting248b0b02015-06-03 12:32:41 -0700858 *PT = NETEQ_CODEC_PCM16B_PT;
859 *fs = 8000;
860 } else if (!strcmp(name, "pcm16b_wb")) {
kwibergee1879c2015-10-29 06:20:28 -0700861 *codec = webrtc::NetEqDecoder::kDecoderPCM16Bwb;
Peter Kasting248b0b02015-06-03 12:32:41 -0700862 *PT = NETEQ_CODEC_PCM16B_WB_PT;
863 *fs = 16000;
864 } else if (!strcmp(name, "pcm16b_swb32")) {
kwibergee1879c2015-10-29 06:20:28 -0700865 *codec = webrtc::NetEqDecoder::kDecoderPCM16Bswb32kHz;
Peter Kasting248b0b02015-06-03 12:32:41 -0700866 *PT = NETEQ_CODEC_PCM16B_SWB32KHZ_PT;
867 *fs = 32000;
868 } else if (!strcmp(name, "pcm16b_swb48")) {
kwibergee1879c2015-10-29 06:20:28 -0700869 *codec = webrtc::NetEqDecoder::kDecoderPCM16Bswb48kHz;
Peter Kasting248b0b02015-06-03 12:32:41 -0700870 *PT = NETEQ_CODEC_PCM16B_SWB48KHZ_PT;
871 *fs = 48000;
872 } else if (!strcmp(name, "g722")) {
kwibergee1879c2015-10-29 06:20:28 -0700873 *codec = webrtc::NetEqDecoder::kDecoderG722;
Peter Kasting248b0b02015-06-03 12:32:41 -0700874 *PT = NETEQ_CODEC_G722_PT;
875 *fs = 16000;
876 } else if ((!strcmp(name, "ilbc")) &&
877 ((frameLen % 240 == 0) || (frameLen % 160 == 0))) {
878 *fs = 8000;
kwibergee1879c2015-10-29 06:20:28 -0700879 *codec = webrtc::NetEqDecoder::kDecoderILBC;
Peter Kasting248b0b02015-06-03 12:32:41 -0700880 *PT = NETEQ_CODEC_ILBC_PT;
881 } else if (!strcmp(name, "isac")) {
882 *fs = 16000;
kwibergee1879c2015-10-29 06:20:28 -0700883 *codec = webrtc::NetEqDecoder::kDecoderISAC;
Peter Kasting248b0b02015-06-03 12:32:41 -0700884 *PT = NETEQ_CODEC_ISAC_PT;
885 } else if (!strcmp(name, "isacswb")) {
886 *fs = 32000;
kwibergee1879c2015-10-29 06:20:28 -0700887 *codec = webrtc::NetEqDecoder::kDecoderISACswb;
Peter Kasting248b0b02015-06-03 12:32:41 -0700888 *PT = NETEQ_CODEC_ISACSWB_PT;
889 } else if (!strcmp(name, "red_pcm")) {
kwibergee1879c2015-10-29 06:20:28 -0700890 *codec = webrtc::NetEqDecoder::kDecoderPCMa;
Peter Kasting248b0b02015-06-03 12:32:41 -0700891 *PT = NETEQ_CODEC_PCMA_PT; /* this will be the PT for the sub-headers */
892 *fs = 8000;
893 *useRed = 1;
894 } else if (!strcmp(name, "red_isac")) {
kwibergee1879c2015-10-29 06:20:28 -0700895 *codec = webrtc::NetEqDecoder::kDecoderISAC;
Peter Kasting248b0b02015-06-03 12:32:41 -0700896 *PT = NETEQ_CODEC_ISAC_PT; /* this will be the PT for the sub-headers */
897 *fs = 16000;
898 *useRed = 1;
minyuecb23c0d2015-12-11 01:58:26 -0800899 } else if (!strcmp(name, "opus")) {
900 *codec = webrtc::NetEqDecoder::kDecoderOpus;
901 *PT = NETEQ_CODEC_OPUS_PT; /* this will be the PT for the sub-headers */
902 *fs = 48000;
Peter Kasting248b0b02015-06-03 12:32:41 -0700903 } else {
904 printf("Error: Not a supported codec (%s)\n", name);
905 exit(0);
906 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000907}
908
Peter Kasting248b0b02015-06-03 12:32:41 -0700909int NetEQTest_init_coders(webrtc::NetEqDecoder coder,
Peter Kastingdce40cf2015-08-24 14:52:23 -0700910 size_t enc_frameSize,
Peter Kasting248b0b02015-06-03 12:32:41 -0700911 int bitrate,
912 int sampfreq,
913 int vad,
Peter Kastingdce40cf2015-08-24 14:52:23 -0700914 size_t numChannels) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700915 int ok = 0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000916
Peter Kastingdce40cf2015-08-24 14:52:23 -0700917 for (size_t k = 0; k < numChannels; k++) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700918 VAD_inst[k] = WebRtcVad_Create();
919 if (!VAD_inst[k]) {
920 printf("Error: Couldn't allocate memory for VAD instance\n");
921 exit(0);
922 }
923 ok = WebRtcVad_Init(VAD_inst[k]);
924 if (ok == -1) {
925 printf("Error: Initialization of VAD struct failed\n");
926 exit(0);
927 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000928
929#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
Peter Kasting248b0b02015-06-03 12:32:41 -0700930 defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
931 ok = WebRtcCng_CreateEnc(&CNGenc_inst[k]);
932 if (ok != 0) {
933 printf("Error: Couldn't allocate memory for CNG encoding instance\n");
934 exit(0);
935 }
936 if (sampfreq <= 16000) {
937 ok = WebRtcCng_InitEnc(CNGenc_inst[k], sampfreq, 200, 5);
938 if (ok == -1) {
939 printf("Error: Initialization of CNG struct failed. Error code %d\n",
940 WebRtcCng_GetErrorCodeEnc(CNGenc_inst[k]));
941 exit(0);
942 }
943 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000944#endif
945
Peter Kasting248b0b02015-06-03 12:32:41 -0700946 switch (coder) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000947#ifdef CODEC_PCM16B
kwibergee1879c2015-10-29 06:20:28 -0700948 case webrtc::NetEqDecoder::kDecoderPCM16B:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000949#endif
950#ifdef CODEC_PCM16B_WB
kwibergee1879c2015-10-29 06:20:28 -0700951 case webrtc::NetEqDecoder::kDecoderPCM16Bwb:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000952#endif
953#ifdef CODEC_PCM16B_32KHZ
kwibergee1879c2015-10-29 06:20:28 -0700954 case webrtc::NetEqDecoder::kDecoderPCM16Bswb32kHz:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000955#endif
956#ifdef CODEC_PCM16B_48KHZ
kwibergee1879c2015-10-29 06:20:28 -0700957 case webrtc::NetEqDecoder::kDecoderPCM16Bswb48kHz:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000958#endif
959#ifdef CODEC_G711
kwibergee1879c2015-10-29 06:20:28 -0700960 case webrtc::NetEqDecoder::kDecoderPCMu:
961 case webrtc::NetEqDecoder::kDecoderPCMa:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000962#endif
963 // do nothing
964 break;
965#ifdef CODEC_G729
Peter Kasting248b0b02015-06-03 12:32:41 -0700966 case webrtc::kDecoderG729:
967 if (sampfreq == 8000) {
968 if ((enc_frameSize == 80) || (enc_frameSize == 160) ||
969 (enc_frameSize == 240) || (enc_frameSize == 320) ||
970 (enc_frameSize == 400) || (enc_frameSize == 480)) {
971 ok = WebRtcG729_CreateEnc(&G729enc_inst[k]);
972 if (ok != 0) {
Peter Kasting2a100872015-06-09 17:26:40 -0700973 printf("Error: Couldn't allocate memory for G729 encoding "
974 "instance\n");
Peter Kasting248b0b02015-06-03 12:32:41 -0700975 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000976 }
Peter Kasting248b0b02015-06-03 12:32:41 -0700977 } else {
Peter Kasting2a100872015-06-09 17:26:40 -0700978 printf("\nError: g729 only supports 10, 20, 30, 40, 50 or 60 "
979 "ms!!\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000980 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -0700981 }
982 WebRtcG729_EncoderInit(G729enc_inst[k], vad);
983 if ((vad == 1) && (enc_frameSize != 80)) {
Peter Kasting2a100872015-06-09 17:26:40 -0700984 printf("\nError - This simulation only supports VAD for G729 at "
Peter Kastingdce40cf2015-08-24 14:52:23 -0700985 "10ms packets (not %" PRIuS "ms)\n", (enc_frameSize >> 3));
Peter Kasting248b0b02015-06-03 12:32:41 -0700986 }
987 } else {
988 printf("\nError - g729 is only developed for 8kHz \n");
989 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000990 }
991 break;
992#endif
993#ifdef CODEC_G729_1
Peter Kasting248b0b02015-06-03 12:32:41 -0700994 case webrtc::kDecoderG729_1:
995 if (sampfreq == 16000) {
996 if ((enc_frameSize == 320) || (enc_frameSize == 640) ||
997 (enc_frameSize == 960)) {
998 ok = WebRtcG7291_Create(&G729_1_inst[k]);
999 if (ok != 0) {
Peter Kasting2a100872015-06-09 17:26:40 -07001000 printf("Error: Couldn't allocate memory for G.729.1 codec "
1001 "instance\n");
Peter Kasting248b0b02015-06-03 12:32:41 -07001002 exit(0);
1003 }
1004 } else {
1005 printf("\nError: G.729.1 only supports 20, 40 or 60 ms!!\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001006 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001007 }
1008 if (!(((bitrate >= 12000) && (bitrate <= 32000) &&
1009 (bitrate % 2000 == 0)) ||
1010 (bitrate == 8000))) {
1011 /* must be 8, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, or 32 kbps */
Peter Kasting2a100872015-06-09 17:26:40 -07001012 printf("\nError: G.729.1 bitrate must be 8000 or 12000--32000 in "
1013 "steps of 2000 bps\n");
Peter Kasting248b0b02015-06-03 12:32:41 -07001014 exit(0);
1015 }
1016 WebRtcG7291_EncoderInit(G729_1_inst[k], bitrate, 0 /* flag8kHz*/,
1017 0 /*flagG729mode*/);
1018 } else {
1019 printf("\nError - G.729.1 input is always 16 kHz \n");
1020 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001021 }
1022 break;
1023#endif
1024#ifdef CODEC_SPEEX_8
Peter Kasting248b0b02015-06-03 12:32:41 -07001025 case webrtc::kDecoderSPEEX_8:
1026 if (sampfreq == 8000) {
1027 if ((enc_frameSize == 160) || (enc_frameSize == 320) ||
1028 (enc_frameSize == 480)) {
1029 ok = WebRtcSpeex_CreateEnc(&SPEEX8enc_inst[k], sampfreq);
1030 if (ok != 0) {
Peter Kasting2a100872015-06-09 17:26:40 -07001031 printf("Error: Couldn't allocate memory for Speex encoding "
1032 "instance\n");
Peter Kasting248b0b02015-06-03 12:32:41 -07001033 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001034 }
Peter Kasting248b0b02015-06-03 12:32:41 -07001035 } else {
1036 printf("\nError: Speex only supports 20, 40, and 60 ms!!\n\n");
1037 exit(0);
1038 }
1039 if ((vad == 1) && (enc_frameSize != 160)) {
Peter Kasting2a100872015-06-09 17:26:40 -07001040 printf("\nError - This simulation only supports VAD for Speex at "
Peter Kastingdce40cf2015-08-24 14:52:23 -07001041 "20ms packets (not %" PRIuS "ms)\n",
Peter Kasting248b0b02015-06-03 12:32:41 -07001042 (enc_frameSize >> 3));
1043 vad = 0;
1044 }
1045 ok = WebRtcSpeex_EncoderInit(SPEEX8enc_inst[k], 0 /*vbr*/,
1046 3 /*complexity*/, vad);
1047 if (ok != 0)
1048 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001049 } else {
Peter Kasting2a100872015-06-09 17:26:40 -07001050 printf("\nError - Speex8 called with sample frequency other than 8 "
1051 "kHz.\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001052 }
1053 break;
1054#endif
1055#ifdef CODEC_SPEEX_16
Peter Kasting248b0b02015-06-03 12:32:41 -07001056 case webrtc::kDecoderSPEEX_16:
1057 if (sampfreq == 16000) {
1058 if ((enc_frameSize == 320) || (enc_frameSize == 640) ||
1059 (enc_frameSize == 960)) {
1060 ok = WebRtcSpeex_CreateEnc(&SPEEX16enc_inst[k], sampfreq);
1061 if (ok != 0) {
Peter Kasting2a100872015-06-09 17:26:40 -07001062 printf("Error: Couldn't allocate memory for Speex encoding "
1063 "instance\n");
Peter Kasting248b0b02015-06-03 12:32:41 -07001064 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001065 }
Peter Kasting248b0b02015-06-03 12:32:41 -07001066 } else {
1067 printf("\nError: Speex only supports 20, 40, and 60 ms!!\n\n");
1068 exit(0);
1069 }
1070 if ((vad == 1) && (enc_frameSize != 320)) {
Peter Kasting2a100872015-06-09 17:26:40 -07001071 printf("\nError - This simulation only supports VAD for Speex at "
Peter Kastingdce40cf2015-08-24 14:52:23 -07001072 "20ms packets (not %" PRIuS "ms)\n",
Peter Kasting248b0b02015-06-03 12:32:41 -07001073 (enc_frameSize >> 4));
1074 vad = 0;
1075 }
1076 ok = WebRtcSpeex_EncoderInit(SPEEX16enc_inst[k], 0 /*vbr*/,
1077 3 /*complexity*/, vad);
1078 if (ok != 0)
1079 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001080 } else {
Peter Kasting2a100872015-06-09 17:26:40 -07001081 printf("\nError - Speex16 called with sample frequency other than 16 "
1082 "kHz.\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001083 }
1084 break;
1085#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001086
1087#ifdef CODEC_G722_1_16
Peter Kasting248b0b02015-06-03 12:32:41 -07001088 case webrtc::kDecoderG722_1_16:
1089 if (sampfreq == 16000) {
1090 ok = WebRtcG7221_CreateEnc16(&G722_1_16enc_inst[k]);
1091 if (ok != 0) {
1092 printf("Error: Couldn't allocate memory for G.722.1 instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001093 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001094 }
1095 if (enc_frameSize == 320) {
1096 } else {
1097 printf("\nError: G722.1 only supports 20 ms!!\n\n");
1098 exit(0);
1099 }
1100 WebRtcG7221_EncoderInit16((G722_1_16_encinst_t*)G722_1_16enc_inst[k]);
1101 } else {
1102 printf("\nError - G722.1 is only developed for 16kHz \n");
1103 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001104 }
1105 break;
1106#endif
1107#ifdef CODEC_G722_1_24
Peter Kasting248b0b02015-06-03 12:32:41 -07001108 case webrtc::kDecoderG722_1_24:
1109 if (sampfreq == 16000) {
1110 ok = WebRtcG7221_CreateEnc24(&G722_1_24enc_inst[k]);
1111 if (ok != 0) {
1112 printf("Error: Couldn't allocate memory for G.722.1 instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001113 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001114 }
1115 if (enc_frameSize == 320) {
1116 } else {
1117 printf("\nError: G722.1 only supports 20 ms!!\n\n");
1118 exit(0);
1119 }
1120 WebRtcG7221_EncoderInit24((G722_1_24_encinst_t*)G722_1_24enc_inst[k]);
1121 } else {
1122 printf("\nError - G722.1 is only developed for 16kHz \n");
1123 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001124 }
1125 break;
1126#endif
1127#ifdef CODEC_G722_1_32
Peter Kasting248b0b02015-06-03 12:32:41 -07001128 case webrtc::kDecoderG722_1_32:
1129 if (sampfreq == 16000) {
1130 ok = WebRtcG7221_CreateEnc32(&G722_1_32enc_inst[k]);
1131 if (ok != 0) {
1132 printf("Error: Couldn't allocate memory for G.722.1 instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001133 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001134 }
1135 if (enc_frameSize == 320) {
1136 } else {
1137 printf("\nError: G722.1 only supports 20 ms!!\n\n");
1138 exit(0);
1139 }
1140 WebRtcG7221_EncoderInit32((G722_1_32_encinst_t*)G722_1_32enc_inst[k]);
1141 } else {
1142 printf("\nError - G722.1 is only developed for 16kHz \n");
1143 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001144 }
1145 break;
1146#endif
1147#ifdef CODEC_G722_1C_24
Peter Kasting248b0b02015-06-03 12:32:41 -07001148 case webrtc::kDecoderG722_1C_24:
1149 if (sampfreq == 32000) {
1150 ok = WebRtcG7221C_CreateEnc24(&G722_1C_24enc_inst[k]);
1151 if (ok != 0) {
1152 printf("Error: Couldn't allocate memory for G.722.1C instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001153 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001154 }
1155 if (enc_frameSize == 640) {
1156 } else {
1157 printf("\nError: G722.1 C only supports 20 ms!!\n\n");
1158 exit(0);
1159 }
1160 WebRtcG7221C_EncoderInit24(
1161 (G722_1C_24_encinst_t*)G722_1C_24enc_inst[k]);
1162 } else {
1163 printf("\nError - G722.1 C is only developed for 32kHz \n");
1164 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001165 }
1166 break;
1167#endif
1168#ifdef CODEC_G722_1C_32
Peter Kasting248b0b02015-06-03 12:32:41 -07001169 case webrtc::kDecoderG722_1C_32:
1170 if (sampfreq == 32000) {
1171 ok = WebRtcG7221C_CreateEnc32(&G722_1C_32enc_inst[k]);
1172 if (ok != 0) {
1173 printf("Error: Couldn't allocate memory for G.722.1C instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001174 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001175 }
1176 if (enc_frameSize == 640) {
1177 } else {
1178 printf("\nError: G722.1 C only supports 20 ms!!\n\n");
1179 exit(0);
1180 }
1181 WebRtcG7221C_EncoderInit32(
1182 (G722_1C_32_encinst_t*)G722_1C_32enc_inst[k]);
1183 } else {
1184 printf("\nError - G722.1 C is only developed for 32kHz \n");
1185 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001186 }
1187 break;
1188#endif
1189#ifdef CODEC_G722_1C_48
Peter Kasting248b0b02015-06-03 12:32:41 -07001190 case webrtc::kDecoderG722_1C_48:
1191 if (sampfreq == 32000) {
1192 ok = WebRtcG7221C_CreateEnc48(&G722_1C_48enc_inst[k]);
1193 if (ok != 0) {
1194 printf("Error: Couldn't allocate memory for G.722.1C instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001195 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001196 }
1197 if (enc_frameSize == 640) {
1198 } else {
1199 printf("\nError: G722.1 C only supports 20 ms!!\n\n");
1200 exit(0);
1201 }
1202 WebRtcG7221C_EncoderInit48(
1203 (G722_1C_48_encinst_t*)G722_1C_48enc_inst[k]);
1204 } else {
1205 printf("\nError - G722.1 C is only developed for 32kHz \n");
1206 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001207 }
1208 break;
1209#endif
1210#ifdef CODEC_G722
kwibergee1879c2015-10-29 06:20:28 -07001211 case webrtc::NetEqDecoder::kDecoderG722:
Peter Kasting248b0b02015-06-03 12:32:41 -07001212 if (sampfreq == 16000) {
1213 if (enc_frameSize % 2 == 0) {
1214 } else {
1215 printf(
1216 "\nError - g722 frames must have an even number of "
1217 "enc_frameSize\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001218 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001219 }
1220 WebRtcG722_CreateEncoder(&g722EncState[k]);
1221 WebRtcG722_EncoderInit(g722EncState[k]);
1222 } else {
1223 printf("\nError - g722 is only developed for 16kHz \n");
1224 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001225 }
1226 break;
1227#endif
1228#ifdef CODEC_AMR
Peter Kasting248b0b02015-06-03 12:32:41 -07001229 case webrtc::kDecoderAMR:
1230 if (sampfreq == 8000) {
1231 ok = WebRtcAmr_CreateEnc(&AMRenc_inst[k]);
1232 if (ok != 0) {
1233 printf(
1234 "Error: Couldn't allocate memory for AMR encoding instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001235 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001236 }
1237 if ((enc_frameSize == 160) || (enc_frameSize == 320) ||
1238 (enc_frameSize == 480)) {
1239 } else {
1240 printf("\nError - AMR must have a multiple of 160 enc_frameSize\n");
1241 exit(0);
1242 }
1243 WebRtcAmr_EncoderInit(AMRenc_inst[k], vad);
1244 WebRtcAmr_EncodeBitmode(AMRenc_inst[k], AMRBandwidthEfficient);
1245 AMR_bitrate = bitrate;
1246 } else {
1247 printf("\nError - AMR is only developed for 8kHz \n");
1248 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001249 }
1250 break;
1251#endif
1252#ifdef CODEC_AMRWB
Peter Kasting248b0b02015-06-03 12:32:41 -07001253 case webrtc::kDecoderAMRWB:
1254 if (sampfreq == 16000) {
1255 ok = WebRtcAmrWb_CreateEnc(&AMRWBenc_inst[k]);
1256 if (ok != 0) {
Peter Kasting2a100872015-06-09 17:26:40 -07001257 printf("Error: Couldn't allocate memory for AMRWB encoding "
1258 "instance\n");
Peter Kasting248b0b02015-06-03 12:32:41 -07001259 exit(0);
1260 }
Peter Kastingdce40cf2015-08-24 14:52:23 -07001261 if (((enc_frameSize / 320) > 3) || ((enc_frameSize % 320) != 0)) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001262 printf("\nError - AMRwb must have frameSize of 20, 40 or 60ms\n");
1263 exit(0);
1264 }
1265 WebRtcAmrWb_EncoderInit(AMRWBenc_inst[k], vad);
1266 if (bitrate == 7000) {
1267 AMRWB_bitrate = AMRWB_MODE_7k;
1268 } else if (bitrate == 9000) {
1269 AMRWB_bitrate = AMRWB_MODE_9k;
1270 } else if (bitrate == 12000) {
1271 AMRWB_bitrate = AMRWB_MODE_12k;
1272 } else if (bitrate == 14000) {
1273 AMRWB_bitrate = AMRWB_MODE_14k;
1274 } else if (bitrate == 16000) {
1275 AMRWB_bitrate = AMRWB_MODE_16k;
1276 } else if (bitrate == 18000) {
1277 AMRWB_bitrate = AMRWB_MODE_18k;
1278 } else if (bitrate == 20000) {
1279 AMRWB_bitrate = AMRWB_MODE_20k;
1280 } else if (bitrate == 23000) {
1281 AMRWB_bitrate = AMRWB_MODE_23k;
1282 } else if (bitrate == 24000) {
1283 AMRWB_bitrate = AMRWB_MODE_24k;
1284 }
1285 WebRtcAmrWb_EncodeBitmode(AMRWBenc_inst[k], AMRBandwidthEfficient);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001286
1287 } else {
Peter Kasting248b0b02015-06-03 12:32:41 -07001288 printf("\nError - AMRwb is only developed for 16kHz \n");
1289 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001290 }
1291 break;
1292#endif
1293#ifdef CODEC_ILBC
kwibergee1879c2015-10-29 06:20:28 -07001294 case webrtc::NetEqDecoder::kDecoderILBC:
Peter Kasting248b0b02015-06-03 12:32:41 -07001295 if (sampfreq == 8000) {
1296 ok = WebRtcIlbcfix_EncoderCreate(&iLBCenc_inst[k]);
1297 if (ok != 0) {
Peter Kasting2a100872015-06-09 17:26:40 -07001298 printf("Error: Couldn't allocate memory for iLBC encoding "
1299 "instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001300 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001301 }
1302 if ((enc_frameSize == 160) || (enc_frameSize == 240) ||
1303 (enc_frameSize == 320) || (enc_frameSize == 480)) {
1304 } else {
Peter Kasting2a100872015-06-09 17:26:40 -07001305 printf("\nError - iLBC only supports 160, 240, 320 and 480 "
1306 "enc_frameSize (20, 30, 40 and 60 ms)\n");
Peter Kasting248b0b02015-06-03 12:32:41 -07001307 exit(0);
1308 }
1309 if ((enc_frameSize == 160) || (enc_frameSize == 320)) {
1310 /* 20 ms version */
1311 WebRtcIlbcfix_EncoderInit(iLBCenc_inst[k], 20);
1312 } else {
1313 /* 30 ms version */
1314 WebRtcIlbcfix_EncoderInit(iLBCenc_inst[k], 30);
1315 }
1316 } else {
1317 printf("\nError - iLBC is only developed for 8kHz \n");
1318 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001319 }
1320 break;
1321#endif
1322#ifdef CODEC_ISAC
kwibergee1879c2015-10-29 06:20:28 -07001323 case webrtc::NetEqDecoder::kDecoderISAC:
Peter Kasting248b0b02015-06-03 12:32:41 -07001324 if (sampfreq == 16000) {
1325 ok = WebRtcIsac_Create(&ISAC_inst[k]);
1326 if (ok != 0) {
1327 printf("Error: Couldn't allocate memory for iSAC instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001328 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001329 }
1330 if ((enc_frameSize == 480) || (enc_frameSize == 960)) {
1331 } else {
1332 printf("\nError - iSAC only supports frameSize (30 and 60 ms)\n");
1333 exit(0);
1334 }
1335 WebRtcIsac_EncoderInit(ISAC_inst[k], 1);
1336 if ((bitrate < 10000) || (bitrate > 32000)) {
Peter Kasting2a100872015-06-09 17:26:40 -07001337 printf("\nError - iSAC bitrate has to be between 10000 and 32000 "
1338 "bps (not %i)\n",
Peter Kasting248b0b02015-06-03 12:32:41 -07001339 bitrate);
1340 exit(0);
1341 }
Peter Kastingdce40cf2015-08-24 14:52:23 -07001342 WebRtcIsac_Control(ISAC_inst[k], bitrate,
1343 static_cast<int>(enc_frameSize >> 4));
Peter Kasting248b0b02015-06-03 12:32:41 -07001344 } else {
Peter Kasting2a100872015-06-09 17:26:40 -07001345 printf("\nError - iSAC only supports 480 or 960 enc_frameSize (30 or "
1346 "60 ms)\n");
Peter Kasting248b0b02015-06-03 12:32:41 -07001347 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001348 }
1349 break;
1350#endif
1351#ifdef NETEQ_ISACFIX_CODEC
Peter Kasting248b0b02015-06-03 12:32:41 -07001352 case webrtc::kDecoderISAC:
1353 if (sampfreq == 16000) {
1354 ok = WebRtcIsacfix_Create(&ISAC_inst[k]);
1355 if (ok != 0) {
1356 printf("Error: Couldn't allocate memory for iSAC instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001357 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001358 }
1359 if ((enc_frameSize == 480) || (enc_frameSize == 960)) {
1360 } else {
1361 printf("\nError - iSAC only supports frameSize (30 and 60 ms)\n");
1362 exit(0);
1363 }
1364 WebRtcIsacfix_EncoderInit(ISAC_inst[k], 1);
1365 if ((bitrate < 10000) || (bitrate > 32000)) {
Peter Kasting2a100872015-06-09 17:26:40 -07001366 printf("\nError - iSAC bitrate has to be between 10000 and 32000 "
1367 "bps (not %i)\n", bitrate);
Peter Kasting248b0b02015-06-03 12:32:41 -07001368 exit(0);
1369 }
1370 WebRtcIsacfix_Control(ISAC_inst[k], bitrate, enc_frameSize >> 4);
1371 } else {
Peter Kasting2a100872015-06-09 17:26:40 -07001372 printf("\nError - iSAC only supports 480 or 960 enc_frameSize (30 or "
1373 "60 ms)\n");
Peter Kasting248b0b02015-06-03 12:32:41 -07001374 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001375 }
1376 break;
1377#endif
1378#ifdef CODEC_ISAC_SWB
kwibergee1879c2015-10-29 06:20:28 -07001379 case webrtc::NetEqDecoder::kDecoderISACswb:
Peter Kasting248b0b02015-06-03 12:32:41 -07001380 if (sampfreq == 32000) {
1381 ok = WebRtcIsac_Create(&ISACSWB_inst[k]);
1382 if (ok != 0) {
1383 printf("Error: Couldn't allocate memory for iSAC SWB instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001384 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001385 }
1386 if (enc_frameSize == 960) {
1387 } else {
1388 printf("\nError - iSAC SWB only supports frameSize 30 ms\n");
1389 exit(0);
1390 }
1391 ok = WebRtcIsac_SetEncSampRate(ISACSWB_inst[k], 32000);
1392 if (ok != 0) {
1393 printf("Error: Couldn't set sample rate for iSAC SWB instance\n");
1394 exit(0);
1395 }
1396 WebRtcIsac_EncoderInit(ISACSWB_inst[k], 1);
1397 if ((bitrate < 32000) || (bitrate > 56000)) {
Peter Kasting2a100872015-06-09 17:26:40 -07001398 printf("\nError - iSAC SWB bitrate has to be between 32000 and "
1399 "56000 bps (not %i)\n", bitrate);
Peter Kasting248b0b02015-06-03 12:32:41 -07001400 exit(0);
1401 }
Peter Kastingdce40cf2015-08-24 14:52:23 -07001402 WebRtcIsac_Control(ISACSWB_inst[k], bitrate,
1403 static_cast<int>(enc_frameSize >> 5));
Peter Kasting248b0b02015-06-03 12:32:41 -07001404 } else {
Peter Kasting2a100872015-06-09 17:26:40 -07001405 printf("\nError - iSAC SWB only supports 960 enc_frameSize (30 "
1406 "ms)\n");
Peter Kasting248b0b02015-06-03 12:32:41 -07001407 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001408 }
1409 break;
1410#endif
1411#ifdef CODEC_GSMFR
Peter Kasting248b0b02015-06-03 12:32:41 -07001412 case webrtc::kDecoderGSMFR:
1413 if (sampfreq == 8000) {
1414 ok = WebRtcGSMFR_CreateEnc(&GSMFRenc_inst[k]);
1415 if (ok != 0) {
Peter Kasting2a100872015-06-09 17:26:40 -07001416 printf("Error: Couldn't allocate memory for GSM FR encoding "
1417 "instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001418 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001419 }
1420 if ((enc_frameSize == 160) || (enc_frameSize == 320) ||
1421 (enc_frameSize == 480)) {
1422 } else {
Peter Kasting2a100872015-06-09 17:26:40 -07001423 printf("\nError - GSM FR must have a multiple of 160 "
1424 "enc_frameSize\n");
Peter Kasting248b0b02015-06-03 12:32:41 -07001425 exit(0);
1426 }
1427 WebRtcGSMFR_EncoderInit(GSMFRenc_inst[k], 0);
1428 } else {
1429 printf("\nError - GSM FR is only developed for 8kHz \n");
1430 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001431 }
1432 break;
1433#endif
minyuecb23c0d2015-12-11 01:58:26 -08001434#ifdef CODEC_OPUS
1435 case webrtc::NetEqDecoder::kDecoderOpus:
1436 ok = WebRtcOpus_EncoderCreate(&opus_inst[k], 1, 0);
1437 if (ok != 0) {
1438 printf("Error: Couldn't allocate memory for Opus encoding "
1439 "instance\n");
1440 exit(0);
1441 }
1442 WebRtcOpus_EnableFec(opus_inst[k]);
1443 WebRtcOpus_SetPacketLossRate(opus_inst[k], 5);
1444 break;
1445#endif
Peter Kasting248b0b02015-06-03 12:32:41 -07001446 default:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001447 printf("Error: unknown codec in call to NetEQTest_init_coders.\n");
1448 exit(0);
1449 break;
Peter Kasting248b0b02015-06-03 12:32:41 -07001450 }
Peter Kasting248b0b02015-06-03 12:32:41 -07001451 if (ok != 0) {
1452 return (ok);
1453 }
1454 } // end for
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001455
Peter Kasting248b0b02015-06-03 12:32:41 -07001456 return (0);
1457}
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001458
Peter Kastingdce40cf2015-08-24 14:52:23 -07001459int NetEQTest_free_coders(webrtc::NetEqDecoder coder, size_t numChannels) {
1460 for (size_t k = 0; k < numChannels; k++) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001461 WebRtcVad_Free(VAD_inst[k]);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001462#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
Peter Kasting248b0b02015-06-03 12:32:41 -07001463 defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
1464 WebRtcCng_FreeEnc(CNGenc_inst[k]);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001465#endif
1466
Peter Kasting248b0b02015-06-03 12:32:41 -07001467 switch (coder) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001468#ifdef CODEC_PCM16B
kwibergee1879c2015-10-29 06:20:28 -07001469 case webrtc::NetEqDecoder::kDecoderPCM16B:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001470#endif
1471#ifdef CODEC_PCM16B_WB
kwibergee1879c2015-10-29 06:20:28 -07001472 case webrtc::NetEqDecoder::kDecoderPCM16Bwb:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001473#endif
1474#ifdef CODEC_PCM16B_32KHZ
kwibergee1879c2015-10-29 06:20:28 -07001475 case webrtc::NetEqDecoder::kDecoderPCM16Bswb32kHz:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001476#endif
1477#ifdef CODEC_PCM16B_48KHZ
kwibergee1879c2015-10-29 06:20:28 -07001478 case webrtc::NetEqDecoder::kDecoderPCM16Bswb48kHz:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001479#endif
1480#ifdef CODEC_G711
kwibergee1879c2015-10-29 06:20:28 -07001481 case webrtc::NetEqDecoder::kDecoderPCMu:
1482 case webrtc::NetEqDecoder::kDecoderPCMa:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001483#endif
Peter Kasting248b0b02015-06-03 12:32:41 -07001484 // do nothing
1485 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001486#ifdef CODEC_G729
kwibergee1879c2015-10-29 06:20:28 -07001487 case webrtc::NetEqDecoder::kDecoderG729:
Peter Kasting248b0b02015-06-03 12:32:41 -07001488 WebRtcG729_FreeEnc(G729enc_inst[k]);
1489 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001490#endif
1491#ifdef CODEC_G729_1
kwibergee1879c2015-10-29 06:20:28 -07001492 case webrtc::NetEqDecoder::kDecoderG729_1:
Peter Kasting248b0b02015-06-03 12:32:41 -07001493 WebRtcG7291_Free(G729_1_inst[k]);
1494 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001495#endif
1496#ifdef CODEC_SPEEX_8
kwibergee1879c2015-10-29 06:20:28 -07001497 case webrtc::NetEqDecoder::kDecoderSPEEX_8:
Peter Kasting248b0b02015-06-03 12:32:41 -07001498 WebRtcSpeex_FreeEnc(SPEEX8enc_inst[k]);
1499 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001500#endif
1501#ifdef CODEC_SPEEX_16
kwibergee1879c2015-10-29 06:20:28 -07001502 case webrtc::NetEqDecoder::kDecoderSPEEX_16:
Peter Kasting248b0b02015-06-03 12:32:41 -07001503 WebRtcSpeex_FreeEnc(SPEEX16enc_inst[k]);
1504 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001505#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001506
1507#ifdef CODEC_G722_1_16
kwibergee1879c2015-10-29 06:20:28 -07001508 case webrtc::NetEqDecoder::kDecoderG722_1_16:
Peter Kasting248b0b02015-06-03 12:32:41 -07001509 WebRtcG7221_FreeEnc16(G722_1_16enc_inst[k]);
1510 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001511#endif
1512#ifdef CODEC_G722_1_24
kwibergee1879c2015-10-29 06:20:28 -07001513 case webrtc::NetEqDecoder::kDecoderG722_1_24:
Peter Kasting248b0b02015-06-03 12:32:41 -07001514 WebRtcG7221_FreeEnc24(G722_1_24enc_inst[k]);
1515 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001516#endif
1517#ifdef CODEC_G722_1_32
kwibergee1879c2015-10-29 06:20:28 -07001518 case webrtc::NetEqDecoder::kDecoderG722_1_32:
Peter Kasting248b0b02015-06-03 12:32:41 -07001519 WebRtcG7221_FreeEnc32(G722_1_32enc_inst[k]);
1520 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001521#endif
1522#ifdef CODEC_G722_1C_24
kwibergee1879c2015-10-29 06:20:28 -07001523 case webrtc::NetEqDecoder::kDecoderG722_1C_24:
Peter Kasting248b0b02015-06-03 12:32:41 -07001524 WebRtcG7221C_FreeEnc24(G722_1C_24enc_inst[k]);
1525 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001526#endif
1527#ifdef CODEC_G722_1C_32
kwibergee1879c2015-10-29 06:20:28 -07001528 case webrtc::NetEqDecoder::kDecoderG722_1C_32:
Peter Kasting248b0b02015-06-03 12:32:41 -07001529 WebRtcG7221C_FreeEnc32(G722_1C_32enc_inst[k]);
1530 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001531#endif
1532#ifdef CODEC_G722_1C_48
kwibergee1879c2015-10-29 06:20:28 -07001533 case webrtc::NetEqDecoder::kDecoderG722_1C_48:
Peter Kasting248b0b02015-06-03 12:32:41 -07001534 WebRtcG7221C_FreeEnc48(G722_1C_48enc_inst[k]);
1535 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001536#endif
1537#ifdef CODEC_G722
kwibergee1879c2015-10-29 06:20:28 -07001538 case webrtc::NetEqDecoder::kDecoderG722:
Peter Kasting248b0b02015-06-03 12:32:41 -07001539 WebRtcG722_FreeEncoder(g722EncState[k]);
1540 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001541#endif
1542#ifdef CODEC_AMR
kwibergee1879c2015-10-29 06:20:28 -07001543 case webrtc::NetEqDecoder::kDecoderAMR:
Peter Kasting248b0b02015-06-03 12:32:41 -07001544 WebRtcAmr_FreeEnc(AMRenc_inst[k]);
1545 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001546#endif
1547#ifdef CODEC_AMRWB
kwibergee1879c2015-10-29 06:20:28 -07001548 case webrtc::NetEqDecoder::kDecoderAMRWB:
Peter Kasting248b0b02015-06-03 12:32:41 -07001549 WebRtcAmrWb_FreeEnc(AMRWBenc_inst[k]);
1550 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001551#endif
1552#ifdef CODEC_ILBC
kwibergee1879c2015-10-29 06:20:28 -07001553 case webrtc::NetEqDecoder::kDecoderILBC:
Peter Kasting248b0b02015-06-03 12:32:41 -07001554 WebRtcIlbcfix_EncoderFree(iLBCenc_inst[k]);
1555 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001556#endif
1557#ifdef CODEC_ISAC
kwibergee1879c2015-10-29 06:20:28 -07001558 case webrtc::NetEqDecoder::kDecoderISAC:
Peter Kasting248b0b02015-06-03 12:32:41 -07001559 WebRtcIsac_Free(ISAC_inst[k]);
1560 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001561#endif
1562#ifdef NETEQ_ISACFIX_CODEC
kwibergee1879c2015-10-29 06:20:28 -07001563 case webrtc::NetEqDecoder::kDecoderISAC:
Peter Kasting248b0b02015-06-03 12:32:41 -07001564 WebRtcIsacfix_Free(ISAC_inst[k]);
1565 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001566#endif
1567#ifdef CODEC_ISAC_SWB
kwibergee1879c2015-10-29 06:20:28 -07001568 case webrtc::NetEqDecoder::kDecoderISACswb:
Peter Kasting248b0b02015-06-03 12:32:41 -07001569 WebRtcIsac_Free(ISACSWB_inst[k]);
1570 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001571#endif
1572#ifdef CODEC_GSMFR
kwibergee1879c2015-10-29 06:20:28 -07001573 case webrtc::NetEqDecoder::kDecoderGSMFR:
Peter Kasting248b0b02015-06-03 12:32:41 -07001574 WebRtcGSMFR_FreeEnc(GSMFRenc_inst[k]);
1575 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001576#endif
minyuecb23c0d2015-12-11 01:58:26 -08001577#ifdef CODEC_OPUS
1578 case webrtc::NetEqDecoder::kDecoderOpus:
1579 WebRtcOpus_EncoderFree(opus_inst[k]);
1580 break;
1581#endif
Peter Kasting248b0b02015-06-03 12:32:41 -07001582 default:
1583 printf("Error: unknown codec in call to NetEQTest_init_coders.\n");
1584 exit(0);
1585 break;
1586 }
1587 }
1588
1589 return (0);
1590}
1591
kwibergee1879c2015-10-29 06:20:28 -07001592size_t NetEQTest_encode(webrtc::NetEqDecoder coder,
Peter Kastingdce40cf2015-08-24 14:52:23 -07001593 int16_t* indata,
1594 size_t frameLen,
1595 unsigned char* encoded,
1596 int sampleRate,
1597 int* vad,
1598 int useVAD,
1599 int bitrate,
1600 size_t numChannels) {
1601 size_t cdlen = 0;
Peter Kasting248b0b02015-06-03 12:32:41 -07001602 int16_t* tempdata;
1603 static int first_cng = 1;
Peter Kastingdce40cf2015-08-24 14:52:23 -07001604 size_t tempLen;
Peter Kasting248b0b02015-06-03 12:32:41 -07001605 *vad = 1;
1606
1607 // check VAD first
1608 if (useVAD) {
1609 *vad = 0;
1610
Peter Kastingdce40cf2015-08-24 14:52:23 -07001611 size_t sampleRate_10 = static_cast<size_t>(10 * sampleRate / 1000);
1612 size_t sampleRate_20 = static_cast<size_t>(20 * sampleRate / 1000);
1613 size_t sampleRate_30 = static_cast<size_t>(30 * sampleRate / 1000);
1614 for (size_t k = 0; k < numChannels; k++) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001615 tempLen = frameLen;
1616 tempdata = &indata[k * frameLen];
1617 int localVad = 0;
1618 /* Partition the signal and test each chunk for VAD.
Peter Kastingdce40cf2015-08-24 14:52:23 -07001619 All chunks must be VAD=0 to produce a total VAD=0. */
pkastingb297c5a2015-07-22 15:17:22 -07001620 while (tempLen >= sampleRate_10) {
1621 if ((tempLen % sampleRate_30) == 0) { // tempLen is multiple of 30ms
Peter Kasting248b0b02015-06-03 12:32:41 -07001622 localVad |= WebRtcVad_Process(VAD_inst[k], sampleRate, tempdata,
pkastingb297c5a2015-07-22 15:17:22 -07001623 sampleRate_30);
1624 tempdata += sampleRate_30;
1625 tempLen -= sampleRate_30;
1626 } else if (tempLen >= sampleRate_20) { // tempLen >= 20ms
Peter Kasting248b0b02015-06-03 12:32:41 -07001627 localVad |= WebRtcVad_Process(VAD_inst[k], sampleRate, tempdata,
pkastingb297c5a2015-07-22 15:17:22 -07001628 sampleRate_20);
1629 tempdata += sampleRate_20;
1630 tempLen -= sampleRate_20;
Peter Kasting248b0b02015-06-03 12:32:41 -07001631 } else { // use 10ms
1632 localVad |= WebRtcVad_Process(VAD_inst[k], sampleRate, tempdata,
pkastingb297c5a2015-07-22 15:17:22 -07001633 sampleRate_10);
1634 tempdata += sampleRate_10;
1635 tempLen -= sampleRate_10;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001636 }
Peter Kasting248b0b02015-06-03 12:32:41 -07001637 }
1638
1639 // aggregate all VAD decisions over all channels
1640 *vad |= localVad;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001641 }
1642
Peter Kasting248b0b02015-06-03 12:32:41 -07001643 if (!*vad) {
1644 // all channels are silent
1645 cdlen = 0;
Peter Kastingdce40cf2015-08-24 14:52:23 -07001646 for (size_t k = 0; k < numChannels; k++) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001647 WebRtcCng_Encode(CNGenc_inst[k], &indata[k * frameLen],
1648 (frameLen <= 640 ? frameLen : 640) /* max 640 */,
1649 encoded, &tempLen, first_cng);
1650 encoded += tempLen;
1651 cdlen += tempLen;
1652 }
1653 *vad = 0;
1654 first_cng = 0;
1655 return (cdlen);
1656 }
1657 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001658
Peter Kasting248b0b02015-06-03 12:32:41 -07001659 // loop over all channels
Peter Kastingdce40cf2015-08-24 14:52:23 -07001660 size_t totalLen = 0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001661
Peter Kastingdce40cf2015-08-24 14:52:23 -07001662 for (size_t k = 0; k < numChannels; k++) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001663 /* Encode with the selected coder type */
kwibergee1879c2015-10-29 06:20:28 -07001664 if (coder == webrtc::NetEqDecoder::kDecoderPCMu) { /*g711 u-law */
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001665#ifdef CODEC_G711
Peter Kasting248b0b02015-06-03 12:32:41 -07001666 cdlen = WebRtcG711_EncodeU(indata, frameLen, encoded);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001667#endif
kwibergee1879c2015-10-29 06:20:28 -07001668 } else if (coder == webrtc::NetEqDecoder::kDecoderPCMa) { /*g711 A-law */
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001669#ifdef CODEC_G711
Peter Kasting248b0b02015-06-03 12:32:41 -07001670 cdlen = WebRtcG711_EncodeA(indata, frameLen, encoded);
1671 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001672#endif
1673#ifdef CODEC_PCM16B
kwibergee1879c2015-10-29 06:20:28 -07001674 else if ((coder == webrtc::NetEqDecoder::kDecoderPCM16B) ||
1675 (coder == webrtc::NetEqDecoder::kDecoderPCM16Bwb) ||
1676 (coder == webrtc::NetEqDecoder::kDecoderPCM16Bswb32kHz) ||
1677 (coder == webrtc::NetEqDecoder::
Peter Kasting248b0b02015-06-03 12:32:41 -07001678 kDecoderPCM16Bswb48kHz)) { /*pcm16b (8kHz, 16kHz,
kwibergee1879c2015-10-29 06:20:28 -07001679 32kHz or 48kHz) */
Peter Kasting248b0b02015-06-03 12:32:41 -07001680 cdlen = WebRtcPcm16b_Encode(indata, frameLen, encoded);
1681 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001682#endif
1683#ifdef CODEC_G722
kwibergee1879c2015-10-29 06:20:28 -07001684 else if (coder == webrtc::NetEqDecoder::kDecoderG722) { /*g722 */
Peter Kasting248b0b02015-06-03 12:32:41 -07001685 cdlen = WebRtcG722_Encode(g722EncState[k], indata, frameLen, encoded);
1686 assert(cdlen == frameLen >> 1);
1687 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001688#endif
1689#ifdef CODEC_ILBC
kwibergee1879c2015-10-29 06:20:28 -07001690 else if (coder == webrtc::NetEqDecoder::kDecoderILBC) { /*iLBC */
Peter Kastingdce40cf2015-08-24 14:52:23 -07001691 cdlen = static_cast<size_t>(std::max(
1692 WebRtcIlbcfix_Encode(iLBCenc_inst[k], indata, frameLen, encoded), 0));
Peter Kasting248b0b02015-06-03 12:32:41 -07001693 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001694#endif
Peter Kasting248b0b02015-06-03 12:32:41 -07001695#if (defined(CODEC_ISAC) || \
1696 defined(NETEQ_ISACFIX_CODEC)) // TODO(hlundin): remove all
1697 // NETEQ_ISACFIX_CODEC
kwibergee1879c2015-10-29 06:20:28 -07001698 else if (coder == webrtc::NetEqDecoder::kDecoderISAC) { /*iSAC */
Peter Kasting248b0b02015-06-03 12:32:41 -07001699 int noOfCalls = 0;
Peter Kastingdce40cf2015-08-24 14:52:23 -07001700 int res = 0;
1701 while (res <= 0) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001702#ifdef CODEC_ISAC /* floating point */
Peter Kastingdce40cf2015-08-24 14:52:23 -07001703 res =
Peter Kasting248b0b02015-06-03 12:32:41 -07001704 WebRtcIsac_Encode(ISAC_inst[k], &indata[noOfCalls * 160], encoded);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001705#else /* fixed point */
Peter Kastingdce40cf2015-08-24 14:52:23 -07001706 res = WebRtcIsacfix_Encode(ISAC_inst[k], &indata[noOfCalls * 160],
1707 encoded);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001708#endif
Peter Kasting248b0b02015-06-03 12:32:41 -07001709 noOfCalls++;
1710 }
Peter Kastingdce40cf2015-08-24 14:52:23 -07001711 cdlen = static_cast<size_t>(res);
Peter Kasting248b0b02015-06-03 12:32:41 -07001712 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001713#endif
1714#ifdef CODEC_ISAC_SWB
kwibergee1879c2015-10-29 06:20:28 -07001715 else if (coder == webrtc::NetEqDecoder::kDecoderISACswb) { /* iSAC SWB */
Peter Kasting248b0b02015-06-03 12:32:41 -07001716 int noOfCalls = 0;
Peter Kastingdce40cf2015-08-24 14:52:23 -07001717 int res = 0;
1718 while (res <= 0) {
1719 res = WebRtcIsac_Encode(ISACSWB_inst[k], &indata[noOfCalls * 320],
1720 encoded);
Peter Kasting248b0b02015-06-03 12:32:41 -07001721 noOfCalls++;
1722 }
Peter Kastingdce40cf2015-08-24 14:52:23 -07001723 cdlen = static_cast<size_t>(res);
Peter Kasting248b0b02015-06-03 12:32:41 -07001724 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001725#endif
minyuecb23c0d2015-12-11 01:58:26 -08001726#ifdef CODEC_OPUS
1727 cdlen = WebRtcOpus_Encode(opus_inst[k], indata, frameLen, kRtpDataSize - 12,
1728 encoded);
1729 RTC_CHECK_GT(cdlen, 0u);
1730#endif
Peter Kasting248b0b02015-06-03 12:32:41 -07001731 indata += frameLen;
1732 encoded += cdlen;
1733 totalLen += cdlen;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001734
Peter Kasting248b0b02015-06-03 12:32:41 -07001735 } // end for
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001736
Peter Kasting248b0b02015-06-03 12:32:41 -07001737 first_cng = 1;
1738 return (totalLen);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001739}
1740
pkasting@chromium.orgd3245462015-02-23 21:28:22 +00001741void makeRTPheader(unsigned char* rtp_data,
1742 int payloadType,
1743 int seqNo,
1744 uint32_t timestamp,
1745 uint32_t ssrc) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001746 rtp_data[0] = 0x80;
1747 rtp_data[1] = payloadType & 0xFF;
1748 rtp_data[2] = (seqNo >> 8) & 0xFF;
1749 rtp_data[3] = seqNo & 0xFF;
1750 rtp_data[4] = timestamp >> 24;
1751 rtp_data[5] = (timestamp >> 16) & 0xFF;
1752 rtp_data[6] = (timestamp >> 8) & 0xFF;
1753 rtp_data[7] = timestamp & 0xFF;
1754 rtp_data[8] = ssrc >> 24;
1755 rtp_data[9] = (ssrc >> 16) & 0xFF;
1756 rtp_data[10] = (ssrc >> 8) & 0xFF;
1757 rtp_data[11] = ssrc & 0xFF;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001758}
1759
pkasting@chromium.orgd3245462015-02-23 21:28:22 +00001760int makeRedundantHeader(unsigned char* rtp_data,
1761 int* payloadType,
1762 int numPayloads,
1763 uint32_t* timestamp,
1764 uint16_t* blockLen,
1765 int seqNo,
Peter Kasting248b0b02015-06-03 12:32:41 -07001766 uint32_t ssrc) {
1767 int i;
1768 unsigned char* rtpPointer;
1769 uint16_t offset;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001770
Peter Kasting248b0b02015-06-03 12:32:41 -07001771 /* first create "standard" RTP header */
1772 makeRTPheader(rtp_data, NETEQ_CODEC_RED_PT, seqNo, timestamp[numPayloads - 1],
1773 ssrc);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001774
Peter Kasting248b0b02015-06-03 12:32:41 -07001775 rtpPointer = &rtp_data[12];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001776
Peter Kasting248b0b02015-06-03 12:32:41 -07001777 /* add one sub-header for each redundant payload (not the primary) */
1778 for (i = 0; i < numPayloads - 1; i++) {
1779 if (blockLen[i] > 0) {
1780 offset = static_cast<uint16_t>(timestamp[numPayloads - 1] - timestamp[i]);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001781
Peter Kasting248b0b02015-06-03 12:32:41 -07001782 // Byte |0| |1 2 | 3 |
1783 // Bit |0|1234567|01234567012345|6701234567|
1784 // |F|payload| timestamp | block |
1785 // | | type | offset | length |
1786 rtpPointer[0] = (payloadType[i] & 0x7F) | 0x80;
1787 rtpPointer[1] = (offset >> 6) & 0xFF;
1788 rtpPointer[2] = ((offset & 0x3F) << 2) | ((blockLen[i] >> 8) & 0x03);
1789 rtpPointer[3] = blockLen[i] & 0xFF;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001790
Peter Kasting248b0b02015-06-03 12:32:41 -07001791 rtpPointer += 4;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001792 }
Peter Kasting248b0b02015-06-03 12:32:41 -07001793 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001794
Peter Kasting248b0b02015-06-03 12:32:41 -07001795 // Bit |0|1234567|
1796 // |0|payload|
1797 // | | type |
1798 rtpPointer[0] = payloadType[numPayloads - 1] & 0x7F;
1799 ++rtpPointer;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001800
Peter Kasting248b0b02015-06-03 12:32:41 -07001801 return rtpPointer - rtp_data; // length of header in bytes
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001802}
1803
Peter Kastingdce40cf2015-08-24 14:52:23 -07001804size_t makeDTMFpayload(unsigned char* payload_data,
1805 int Event,
1806 int End,
1807 int Volume,
1808 int Duration) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001809 unsigned char E, R, V;
1810 R = 0;
1811 V = (unsigned char)Volume;
1812 if (End == 0) {
1813 E = 0x00;
1814 } else {
1815 E = 0x80;
1816 }
1817 payload_data[0] = (unsigned char)Event;
1818 payload_data[1] = (unsigned char)(E | R | V);
1819 // Duration equals 8 times time_ms, default is 8000 Hz.
1820 payload_data[2] = (unsigned char)((Duration >> 8) & 0xFF);
1821 payload_data[3] = (unsigned char)(Duration & 0xFF);
1822 return (4);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001823}
1824
Peter Kastingdce40cf2015-08-24 14:52:23 -07001825void stereoDeInterleave(int16_t* audioSamples, size_t numSamples) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001826 int16_t* tempVec;
1827 int16_t* readPtr, *writeL, *writeR;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001828
Peter Kastingdce40cf2015-08-24 14:52:23 -07001829 if (numSamples == 0)
Peter Kasting248b0b02015-06-03 12:32:41 -07001830 return;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001831
Peter Kasting248b0b02015-06-03 12:32:41 -07001832 tempVec = (int16_t*)malloc(sizeof(int16_t) * numSamples);
1833 if (tempVec == NULL) {
1834 printf("Error allocating memory\n");
1835 exit(0);
1836 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001837
Peter Kasting248b0b02015-06-03 12:32:41 -07001838 memcpy(tempVec, audioSamples, numSamples * sizeof(int16_t));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001839
Peter Kasting248b0b02015-06-03 12:32:41 -07001840 writeL = audioSamples;
1841 writeR = &audioSamples[numSamples / 2];
1842 readPtr = tempVec;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001843
Peter Kastingdce40cf2015-08-24 14:52:23 -07001844 for (size_t k = 0; k < numSamples; k += 2) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001845 *writeL = *readPtr;
1846 readPtr++;
1847 *writeR = *readPtr;
1848 readPtr++;
1849 writeL++;
1850 writeR++;
1851 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001852
Peter Kasting248b0b02015-06-03 12:32:41 -07001853 free(tempVec);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001854}
1855
Peter Kastingdce40cf2015-08-24 14:52:23 -07001856void stereoInterleave(unsigned char* data, size_t dataLen, size_t stride) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001857 unsigned char* ptrL, *ptrR;
1858 unsigned char temp[10];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001859
Peter Kasting248b0b02015-06-03 12:32:41 -07001860 if (stride > 10) {
1861 exit(0);
1862 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001863
Peter Kasting248b0b02015-06-03 12:32:41 -07001864 if (dataLen % 1 != 0) {
1865 // must be even number of samples
1866 printf("Error: cannot interleave odd sample number\n");
1867 exit(0);
1868 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001869
Peter Kasting248b0b02015-06-03 12:32:41 -07001870 ptrL = data + stride;
1871 ptrR = &data[dataLen / 2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001872
Peter Kasting248b0b02015-06-03 12:32:41 -07001873 while (ptrL < ptrR) {
1874 // copy from right pointer to temp
1875 memcpy(temp, ptrR, stride);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001876
Peter Kasting248b0b02015-06-03 12:32:41 -07001877 // shift data between pointers
1878 memmove(ptrL + stride, ptrL, ptrR - ptrL);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001879
Peter Kasting248b0b02015-06-03 12:32:41 -07001880 // copy from temp to left pointer
1881 memcpy(ptrL, temp, stride);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001882
Peter Kasting248b0b02015-06-03 12:32:41 -07001883 // advance pointers
1884 ptrL += stride * 2;
1885 ptrR += stride;
1886 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001887}