blob: 289993e7de219603b003be46b96007ea4c70e72b [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
henrik.lundinab980d02017-03-20 05:56:22 -070011// TODO(henrik.lundin): Refactor or replace all of this application.
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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020028#include "rtc_base/checks.h"
Mirko Bonadei71207422017-09-15 13:58:09 +020029#include "typedefs.h" // NOLINT(build/include)
minyuecb23c0d2015-12-11 01:58:26 -080030
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000031// needed for NetEqDecoder
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020032#include "modules/audio_coding/neteq/audio_decoder_impl.h"
33#include "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))
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200135#include "modules/audio_coding/codecs/pcm16b/pcm16b.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000136#endif
137#ifdef CODEC_G711
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200138#include "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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200155#include "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)
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200158#include "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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200161#include "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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200167#include "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))
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200197#include "modules/audio_coding/codecs/cng/webrtc_cng.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000198#endif
minyuecb23c0d2015-12-11 01:58:26 -0800199#ifdef CODEC_OPUS
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200200#include "modules/audio_coding/codecs/opus/opus_interface.h"
minyuecb23c0d2015-12-11 01:58:26 -0800201#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000202
203/***********************************/
204/* Global codec instance variables */
205/***********************************/
206
Peter Kasting248b0b02015-06-03 12:32:41 -0700207WebRtcVadInst* VAD_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000208
209#ifdef CODEC_G722
Peter Kasting248b0b02015-06-03 12:32:41 -0700210G722EncInst* g722EncState[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000211#endif
212
213#ifdef CODEC_G722_1_24
Peter Kasting248b0b02015-06-03 12:32:41 -0700214G722_1_24_encinst_t* G722_1_24enc_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000215#endif
216#ifdef CODEC_G722_1_32
Peter Kasting248b0b02015-06-03 12:32:41 -0700217G722_1_32_encinst_t* G722_1_32enc_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000218#endif
219#ifdef CODEC_G722_1_16
Peter Kasting248b0b02015-06-03 12:32:41 -0700220G722_1_16_encinst_t* G722_1_16enc_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000221#endif
222#ifdef CODEC_G722_1C_24
Peter Kasting248b0b02015-06-03 12:32:41 -0700223G722_1C_24_encinst_t* G722_1C_24enc_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000224#endif
225#ifdef CODEC_G722_1C_32
Peter Kasting248b0b02015-06-03 12:32:41 -0700226G722_1C_32_encinst_t* G722_1C_32enc_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000227#endif
228#ifdef CODEC_G722_1C_48
Peter Kasting248b0b02015-06-03 12:32:41 -0700229G722_1C_48_encinst_t* G722_1C_48enc_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000230#endif
231#ifdef CODEC_G726
Peter Kasting248b0b02015-06-03 12:32:41 -0700232G726_encinst_t* G726enc_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000233#endif
234#ifdef CODEC_G729
Peter Kasting248b0b02015-06-03 12:32:41 -0700235G729_encinst_t* G729enc_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000236#endif
237#ifdef CODEC_G729_1
Peter Kasting248b0b02015-06-03 12:32:41 -0700238G729_1_inst_t* G729_1_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000239#endif
240#ifdef CODEC_AMR
Peter Kasting248b0b02015-06-03 12:32:41 -0700241AMR_encinst_t* AMRenc_inst[2];
242int16_t AMR_bitrate;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000243#endif
244#ifdef CODEC_AMRWB
Peter Kasting248b0b02015-06-03 12:32:41 -0700245AMRWB_encinst_t* AMRWBenc_inst[2];
246int16_t AMRWB_bitrate;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000247#endif
248#ifdef CODEC_ILBC
Peter Kasting248b0b02015-06-03 12:32:41 -0700249IlbcEncoderInstance* iLBCenc_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000250#endif
251#ifdef CODEC_ISAC
Peter Kasting248b0b02015-06-03 12:32:41 -0700252ISACStruct* ISAC_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000253#endif
254#ifdef NETEQ_ISACFIX_CODEC
Peter Kasting248b0b02015-06-03 12:32:41 -0700255ISACFIX_MainStruct* ISAC_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000256#endif
257#ifdef CODEC_ISAC_SWB
Peter Kasting248b0b02015-06-03 12:32:41 -0700258ISACStruct* ISACSWB_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000259#endif
260#ifdef CODEC_GSMFR
Peter Kasting248b0b02015-06-03 12:32:41 -0700261GSMFR_encinst_t* GSMFRenc_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000262#endif
263#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
Peter Kasting248b0b02015-06-03 12:32:41 -0700264 defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
ossu97ba30e2016-04-25 07:55:58 -0700265webrtc::ComfortNoiseEncoder *CNG_encoder[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000266#endif
minyuecb23c0d2015-12-11 01:58:26 -0800267#ifdef CODEC_OPUS
268OpusEncInst* opus_inst[2];
269#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000270
Peter Kasting248b0b02015-06-03 12:32:41 -0700271int main(int argc, char* argv[]) {
Peter Kastingdce40cf2015-08-24 14:52:23 -0700272 size_t packet_size;
273 int fs;
Peter Kasting248b0b02015-06-03 12:32:41 -0700274 webrtc::NetEqDecoder usedCodec;
275 int payloadType;
276 int bitrate = 0;
277 int useVAD, vad;
278 int useRed = 0;
Peter Kastingdce40cf2015-08-24 14:52:23 -0700279 size_t len, enc_len;
Peter Kasting248b0b02015-06-03 12:32:41 -0700280 int16_t org_data[4000];
minyuecb23c0d2015-12-11 01:58:26 -0800281 unsigned char rtp_data[kRtpDataSize];
Peter Kasting248b0b02015-06-03 12:32:41 -0700282 int16_t seqNo = 0xFFF;
283 uint32_t ssrc = 1235412312;
284 uint32_t timestamp = 0xAC1245;
285 uint16_t length, plen;
286 uint32_t offset;
287 double sendtime = 0;
288 int red_PT[2] = {0};
289 uint32_t red_TS[2] = {0};
290 uint16_t red_len[2] = {0};
Peter Kastingdce40cf2015-08-24 14:52:23 -0700291 size_t RTPheaderLen = 12;
minyuecb23c0d2015-12-11 01:58:26 -0800292 uint8_t red_data[kRtpDataSize];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000293#ifdef INSERT_OLD_PACKETS
Peter Kasting248b0b02015-06-03 12:32:41 -0700294 uint16_t old_length, old_plen;
Peter Kastingdce40cf2015-08-24 14:52:23 -0700295 size_t old_enc_len;
Peter Kasting248b0b02015-06-03 12:32:41 -0700296 int first_old_packet = 1;
minyuecb23c0d2015-12-11 01:58:26 -0800297 unsigned char old_rtp_data[kRtpDataSize];
Peter Kastingdce40cf2015-08-24 14:52:23 -0700298 size_t packet_age = 0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000299#endif
300#ifdef INSERT_DTMF_PACKETS
Peter Kasting248b0b02015-06-03 12:32:41 -0700301 int NTone = 1;
302 int DTMFfirst = 1;
303 uint32_t DTMFtimestamp;
304 bool dtmfSent = false;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000305#endif
Peter Kasting248b0b02015-06-03 12:32:41 -0700306 bool usingStereo = false;
Peter Kastingdce40cf2015-08-24 14:52:23 -0700307 size_t stereoMode = 0;
308 size_t numChannels = 1;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000309
Peter Kasting248b0b02015-06-03 12:32:41 -0700310 /* check number of parameters */
311 if ((argc != 6) && (argc != 7)) {
312 /* print help text and exit */
313 printf("Application to encode speech into an RTP stream.\n");
Peter Kasting2a100872015-06-09 17:26:40 -0700314 printf("The program reads a PCM file and encodes is using the specified "
315 "codec.\n");
aleloi82667732016-08-02 01:45:50 -0700316 printf(
317 "The coded speech is packetized in RTP packets and written to the "
318 "output file.\n");
Peter Kasting2a100872015-06-09 17:26:40 -0700319 printf("The format of the RTP stream file is simlilar to that of "
320 "rtpplay,\n");
Peter Kasting248b0b02015-06-03 12:32:41 -0700321 printf("but with the receive time euqal to 0 for all packets.\n");
322 printf("Usage:\n\n");
323 printf("%s PCMfile RTPfile frameLen codec useVAD bitrate\n", argv[0]);
324 printf("where:\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000325
Peter Kasting248b0b02015-06-03 12:32:41 -0700326 printf("PCMfile : PCM speech input file\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000327
Peter Kasting248b0b02015-06-03 12:32:41 -0700328 printf("RTPfile : RTP stream output file\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000329
Peter Kasting2a100872015-06-09 17:26:40 -0700330 printf("frameLen : 80...960... Number of samples per packet (limit "
331 "depends on codec)\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000332
Peter Kasting248b0b02015-06-03 12:32:41 -0700333 printf("codecName\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000334#ifdef CODEC_PCM16B
Peter Kasting248b0b02015-06-03 12:32:41 -0700335 printf(" : pcm16b 16 bit PCM (8kHz)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000336#endif
337#ifdef CODEC_PCM16B_WB
Peter Kasting248b0b02015-06-03 12:32:41 -0700338 printf(" : pcm16b_wb 16 bit PCM (16kHz)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000339#endif
340#ifdef CODEC_PCM16B_32KHZ
Peter Kasting248b0b02015-06-03 12:32:41 -0700341 printf(" : pcm16b_swb32 16 bit PCM (32kHz)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000342#endif
343#ifdef CODEC_PCM16B_48KHZ
Peter Kasting248b0b02015-06-03 12:32:41 -0700344 printf(" : pcm16b_swb48 16 bit PCM (48kHz)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000345#endif
346#ifdef CODEC_G711
Peter Kasting248b0b02015-06-03 12:32:41 -0700347 printf(" : pcma g711 A-law (8kHz)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000348#endif
349#ifdef CODEC_G711
Peter Kasting248b0b02015-06-03 12:32:41 -0700350 printf(" : pcmu g711 u-law (8kHz)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000351#endif
352#ifdef CODEC_G729
Peter Kasting2a100872015-06-09 17:26:40 -0700353 printf(" : g729 G729 (8kHz and 8kbps) CELP (One-Three "
354 "frame(s)/packet)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000355#endif
356#ifdef CODEC_G729_1
Peter Kasting2a100872015-06-09 17:26:40 -0700357 printf(" : g729.1 G729.1 (16kHz) variable rate (8--32 "
358 "kbps)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000359#endif
360#ifdef CODEC_G722_1_16
Peter Kasting2a100872015-06-09 17:26:40 -0700361 printf(" : g722.1_16 G722.1 coder (16kHz) (g722.1 with "
362 "16kbps)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000363#endif
364#ifdef CODEC_G722_1_24
Peter Kasting2a100872015-06-09 17:26:40 -0700365 printf(" : g722.1_24 G722.1 coder (16kHz) (the 24kbps "
366 "version)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000367#endif
368#ifdef CODEC_G722_1_32
Peter Kasting2a100872015-06-09 17:26:40 -0700369 printf(" : g722.1_32 G722.1 coder (16kHz) (the 32kbps "
370 "version)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000371#endif
372#ifdef CODEC_G722_1C_24
Peter Kasting2a100872015-06-09 17:26:40 -0700373 printf(" : g722.1C_24 G722.1 C coder (32kHz) (the 24kbps "
374 "version)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000375#endif
376#ifdef CODEC_G722_1C_32
Peter Kasting2a100872015-06-09 17:26:40 -0700377 printf(" : g722.1C_32 G722.1 C coder (32kHz) (the 32kbps "
378 "version)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000379#endif
380#ifdef CODEC_G722_1C_48
Peter Kasting2a100872015-06-09 17:26:40 -0700381 printf(" : g722.1C_48 G722.1 C coder (32kHz) (the 48kbps "
382 "version)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000383#endif
384
385#ifdef CODEC_G726
Peter Kasting248b0b02015-06-03 12:32:41 -0700386 printf(" : g726_16 G726 coder (8kHz) 16kbps\n");
387 printf(" : g726_24 G726 coder (8kHz) 24kbps\n");
388 printf(" : g726_32 G726 coder (8kHz) 32kbps\n");
389 printf(" : g726_40 G726 coder (8kHz) 40kbps\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000390#endif
391#ifdef CODEC_AMR
Peter Kasting2a100872015-06-09 17:26:40 -0700392 printf(" : AMRXk Adaptive Multi Rate CELP codec "
393 "(8kHz)\n");
394 printf(" X = 4.75, 5.15, 5.9, 6.7, 7.4, 7.95, "
395 "10.2 or 12.2\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000396#endif
397#ifdef CODEC_AMRWB
Peter Kasting2a100872015-06-09 17:26:40 -0700398 printf(" : AMRwbXk Adaptive Multi Rate Wideband CELP "
399 "codec (16kHz)\n");
400 printf(" X = 7, 9, 12, 14, 16, 18, 20, 23 or "
401 "24\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000402#endif
403#ifdef CODEC_ILBC
Peter Kasting248b0b02015-06-03 12:32:41 -0700404 printf(" : ilbc iLBC codec (8kHz and 13.8kbps)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000405#endif
406#ifdef CODEC_ISAC
Peter Kasting2a100872015-06-09 17:26:40 -0700407 printf(" : isac iSAC (16kHz and 32.0 kbps). To set "
408 "rate specify a rate parameter as last parameter\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000409#endif
410#ifdef CODEC_ISAC_SWB
Peter Kasting2a100872015-06-09 17:26:40 -0700411 printf(" : isacswb iSAC SWB (32kHz and 32.0-52.0 kbps). "
412 "To set rate specify a rate parameter as last parameter\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000413#endif
414#ifdef CODEC_GSMFR
Peter Kasting248b0b02015-06-03 12:32:41 -0700415 printf(" : gsmfr GSM FR codec (8kHz and 13kbps)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000416#endif
417#ifdef CODEC_G722
Peter Kasting2a100872015-06-09 17:26:40 -0700418 printf(" : g722 g722 coder (16kHz) (the 64kbps "
419 "version)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000420#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000421#ifdef CODEC_RED
422#ifdef CODEC_G711
Peter Kasting2a100872015-06-09 17:26:40 -0700423 printf(" : red_pcm Redundancy RTP packet with 2*G711A "
424 "frames\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000425#endif
426#ifdef CODEC_ISAC
Peter Kasting2a100872015-06-09 17:26:40 -0700427 printf(" : red_isac Redundancy RTP packet with 2*iSAC "
428 "frames\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000429#endif
minyuecb23c0d2015-12-11 01:58:26 -0800430#endif // CODEC_RED
431#ifdef CODEC_OPUS
432 printf(" : opus Opus codec with FEC (48kHz, 32kbps, FEC"
433 " on and tuned for 5%% packet losses)\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000434#endif
Peter Kasting248b0b02015-06-03 12:32:41 -0700435 printf("\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000436
437#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
Peter Kasting248b0b02015-06-03 12:32:41 -0700438 defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
439 printf("useVAD : 0 Voice Activity Detection is switched off\n");
440 printf(" : 1 Voice Activity Detection is switched on\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000441#else
Peter Kasting2a100872015-06-09 17:26:40 -0700442 printf("useVAD : 0 Voice Activity Detection switched off (on not "
443 "supported)\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000444#endif
Peter Kasting2a100872015-06-09 17:26:40 -0700445 printf("bitrate : Codec bitrate in bps (only applies to vbr "
446 "codecs)\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000447
Peter Kasting248b0b02015-06-03 12:32:41 -0700448 return (0);
449 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000450
Peter Kasting248b0b02015-06-03 12:32:41 -0700451 FILE* in_file = fopen(argv[1], "rb");
452 CHECK_NOT_NULL(in_file);
453 printf("Input file: %s\n", argv[1]);
454 FILE* out_file = fopen(argv[2], "wb");
455 CHECK_NOT_NULL(out_file);
456 printf("Output file: %s\n\n", argv[2]);
Peter Kastingdce40cf2015-08-24 14:52:23 -0700457 int packet_size_int = atoi(argv[3]);
458 if (packet_size_int <= 0) {
459 printf("Packet size %d must be positive", packet_size_int);
Peter Kastingf045e4d2015-06-10 21:15:38 -0700460 return -1;
461 }
Peter Kastingdce40cf2015-08-24 14:52:23 -0700462 printf("Packet size: %d\n", packet_size_int);
463 packet_size = static_cast<size_t>(packet_size_int);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000464
Peter Kasting248b0b02015-06-03 12:32:41 -0700465 // check for stereo
466 if (argv[4][strlen(argv[4]) - 1] == '*') {
467 // use stereo
468 usingStereo = true;
469 numChannels = 2;
470 argv[4][strlen(argv[4]) - 1] = '\0';
471 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000472
Peter Kasting248b0b02015-06-03 12:32:41 -0700473 NetEQTest_GetCodec_and_PT(argv[4], &usedCodec, &payloadType, packet_size, &fs,
474 &bitrate, &useRed);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000475
Peter Kasting248b0b02015-06-03 12:32:41 -0700476 if (useRed) {
477 RTPheaderLen = 12 + 4 + 1; /* standard RTP = 12; 4 bytes per redundant
478 payload, except last one which is 1 byte */
479 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000480
Peter Kasting248b0b02015-06-03 12:32:41 -0700481 useVAD = atoi(argv[5]);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000482#if !(defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
Peter Kasting248b0b02015-06-03 12:32:41 -0700483 defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
484 if (useVAD != 0) {
485 printf("Error: this simulation does not support VAD/DTX/CNG\n");
486 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000487#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000488
Peter Kasting248b0b02015-06-03 12:32:41 -0700489 // check stereo type
490 if (usingStereo) {
491 switch (usedCodec) {
492 // sample based codecs
kwibergee1879c2015-10-29 06:20:28 -0700493 case webrtc::NetEqDecoder::kDecoderPCMu:
494 case webrtc::NetEqDecoder::kDecoderPCMa:
495 case webrtc::NetEqDecoder::kDecoderG722: {
Peter Kasting248b0b02015-06-03 12:32:41 -0700496 // 1 octet per sample
497 stereoMode = STEREO_MODE_SAMPLE_1;
498 break;
499 }
kwibergee1879c2015-10-29 06:20:28 -0700500 case webrtc::NetEqDecoder::kDecoderPCM16B:
501 case webrtc::NetEqDecoder::kDecoderPCM16Bwb:
502 case webrtc::NetEqDecoder::kDecoderPCM16Bswb32kHz:
503 case webrtc::NetEqDecoder::kDecoderPCM16Bswb48kHz: {
Peter Kasting248b0b02015-06-03 12:32:41 -0700504 // 2 octets per sample
505 stereoMode = STEREO_MODE_SAMPLE_2;
506 break;
507 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000508
Peter Kasting248b0b02015-06-03 12:32:41 -0700509 // fixed-rate frame codecs (with internal VAD)
510 default: {
511 printf("Cannot use codec %s as stereo codec\n", argv[4]);
512 exit(0);
513 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000514 }
Peter Kasting248b0b02015-06-03 12:32:41 -0700515 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000516
kwibergee1879c2015-10-29 06:20:28 -0700517 if ((usedCodec == webrtc::NetEqDecoder::kDecoderISAC) ||
518 (usedCodec == webrtc::NetEqDecoder::kDecoderISACswb)) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700519 if (argc != 7) {
kwibergee1879c2015-10-29 06:20:28 -0700520 if (usedCodec == webrtc::NetEqDecoder::kDecoderISAC) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700521 bitrate = 32000;
Peter Kasting2a100872015-06-09 17:26:40 -0700522 printf("Running iSAC at default bitrate of 32000 bps (to specify "
523 "explicitly add the bps as last parameter)\n");
Peter Kasting248b0b02015-06-03 12:32:41 -0700524 } else // (usedCodec==webrtc::kDecoderISACswb)
525 {
526 bitrate = 56000;
Peter Kasting2a100872015-06-09 17:26:40 -0700527 printf("Running iSAC at default bitrate of 56000 bps (to specify "
528 "explicitly add the bps as last parameter)\n");
Peter Kasting248b0b02015-06-03 12:32:41 -0700529 }
530 } else {
531 bitrate = atoi(argv[6]);
kwibergee1879c2015-10-29 06:20:28 -0700532 if (usedCodec == webrtc::NetEqDecoder::kDecoderISAC) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700533 if ((bitrate < 10000) || (bitrate > 32000)) {
Peter Kasting2a100872015-06-09 17:26:40 -0700534 printf("Error: iSAC bitrate must be between 10000 and 32000 bps (%i "
535 "is invalid)\n", bitrate);
Peter Kasting248b0b02015-06-03 12:32:41 -0700536 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000537 }
Peter Kasting248b0b02015-06-03 12:32:41 -0700538 printf("Running iSAC at bitrate of %i bps\n", bitrate);
539 } else // (usedCodec==webrtc::kDecoderISACswb)
540 {
541 if ((bitrate < 32000) || (bitrate > 56000)) {
Peter Kasting2a100872015-06-09 17:26:40 -0700542 printf("Error: iSAC SWB bitrate must be between 32000 and 56000 bps "
543 "(%i is invalid)\n", bitrate);
Peter Kasting248b0b02015-06-03 12:32:41 -0700544 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000545 }
Peter Kasting248b0b02015-06-03 12:32:41 -0700546 }
547 }
548 } else {
549 if (argc == 7) {
Peter Kasting2a100872015-06-09 17:26:40 -0700550 printf("Error: Bitrate parameter can only be specified for iSAC, G.723, "
551 "and G.729.1\n");
Peter Kasting248b0b02015-06-03 12:32:41 -0700552 exit(0);
553 }
554 }
555
556 if (useRed) {
557 printf("Redundancy engaged. ");
558 }
kwibergee1879c2015-10-29 06:20:28 -0700559 printf("Used codec: %i\n", static_cast<int>(usedCodec));
Peter Kasting248b0b02015-06-03 12:32:41 -0700560 printf("Payload type: %i\n", payloadType);
561
562 NetEQTest_init_coders(usedCodec, packet_size, bitrate, fs, useVAD,
563 numChannels);
564
565 /* write file header */
566 // fprintf(out_file, "#!RTPencode%s\n", "1.0");
567 fprintf(out_file, "#!rtpplay%s \n",
568 "1.0"); // this is the string that rtpplay needs
569 uint32_t dummy_variable = 0; // should be converted to network endian format,
570 // but does not matter when 0
571 if (fwrite(&dummy_variable, 4, 1, out_file) != 1) {
572 return -1;
573 }
574 if (fwrite(&dummy_variable, 4, 1, out_file) != 1) {
575 return -1;
576 }
577 if (fwrite(&dummy_variable, 4, 1, out_file) != 1) {
578 return -1;
579 }
580 if (fwrite(&dummy_variable, 2, 1, out_file) != 1) {
581 return -1;
582 }
583 if (fwrite(&dummy_variable, 2, 1, out_file) != 1) {
584 return -1;
585 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000586
587#ifdef TIMESTAMP_WRAPAROUND
Peter Kasting248b0b02015-06-03 12:32:41 -0700588 timestamp = 0xFFFFFFFF - fs * 10; /* should give wrap-around in 10 seconds */
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000589#endif
590#if defined(RANDOM_DATA) | defined(RANDOM_PAYLOAD_DATA)
Peter Kasting248b0b02015-06-03 12:32:41 -0700591 srand(RANDOM_SEED);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000592#endif
593
Peter Kasting248b0b02015-06-03 12:32:41 -0700594 /* if redundancy is used, the first redundant payload is zero length */
595 red_len[0] = 0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000596
Peter Kasting248b0b02015-06-03 12:32:41 -0700597 /* read first frame */
598 len = fread(org_data, 2, packet_size * numChannels, in_file) / numChannels;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000599
Peter Kasting248b0b02015-06-03 12:32:41 -0700600 /* de-interleave if stereo */
601 if (usingStereo) {
602 stereoDeInterleave(org_data, len * numChannels);
603 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000604
Peter Kasting248b0b02015-06-03 12:32:41 -0700605 while (len == packet_size) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000606#ifdef INSERT_DTMF_PACKETS
Peter Kasting248b0b02015-06-03 12:32:41 -0700607 dtmfSent = false;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000608
Peter Kasting248b0b02015-06-03 12:32:41 -0700609 if (sendtime >= NTone * DTMF_PACKET_INTERVAL) {
610 if (sendtime < NTone * DTMF_PACKET_INTERVAL + DTMF_DURATION) {
611 // tone has not ended
612 if (DTMFfirst == 1) {
613 DTMFtimestamp = timestamp; // save this timestamp
614 DTMFfirst = 0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000615 }
Peter Kasting248b0b02015-06-03 12:32:41 -0700616 makeRTPheader(rtp_data, NETEQ_CODEC_AVT_PT, seqNo, DTMFtimestamp, ssrc);
617 enc_len = makeDTMFpayload(
618 &rtp_data[12], NTone % 12, 0, 4,
619 (int)(sendtime - NTone * DTMF_PACKET_INTERVAL) * (fs / 1000) + len);
620 } else {
621 // tone has ended
622 makeRTPheader(rtp_data, NETEQ_CODEC_AVT_PT, seqNo, DTMFtimestamp, ssrc);
623 enc_len = makeDTMFpayload(&rtp_data[12], NTone % 12, 1, 4,
624 DTMF_DURATION * (fs / 1000));
625 NTone++;
626 DTMFfirst = 1;
627 }
628
629 /* write RTP packet to file */
Peter Kastingb7e50542015-06-11 12:55:50 -0700630 length = htons(static_cast<unsigned short>(12 + enc_len + 8));
631 plen = htons(static_cast<unsigned short>(12 + enc_len));
Peter Kasting248b0b02015-06-03 12:32:41 -0700632 offset = (uint32_t)sendtime; //(timestamp/(fs/1000));
633 offset = htonl(offset);
634 if (fwrite(&length, 2, 1, out_file) != 1) {
635 return -1;
636 }
637 if (fwrite(&plen, 2, 1, out_file) != 1) {
638 return -1;
639 }
640 if (fwrite(&offset, 4, 1, out_file) != 1) {
641 return -1;
642 }
643 if (fwrite(rtp_data, 12 + enc_len, 1, out_file) != 1) {
644 return -1;
645 }
646
647 dtmfSent = true;
648 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000649#endif
650
651#ifdef NO_DTMF_OVERDUB
Peter Kasting248b0b02015-06-03 12:32:41 -0700652 /* If DTMF is sent, we should not send any speech packets during the same
653 * time */
654 if (dtmfSent) {
655 enc_len = 0;
656 } else {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000657#endif
Peter Kasting248b0b02015-06-03 12:32:41 -0700658 /* encode frame */
659 enc_len =
660 NetEQTest_encode(usedCodec, org_data, packet_size, &rtp_data[12], fs,
661 &vad, useVAD, bitrate, numChannels);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000662
Peter Kasting248b0b02015-06-03 12:32:41 -0700663 if (usingStereo && stereoMode != STEREO_MODE_FRAME && vad == 1) {
664 // interleave the encoded payload for sample-based codecs (not for CNG)
665 stereoInterleave(&rtp_data[12], enc_len, stereoMode);
666 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000667#ifdef NO_DTMF_OVERDUB
Peter Kasting248b0b02015-06-03 12:32:41 -0700668 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000669#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000670
Peter Kasting248b0b02015-06-03 12:32:41 -0700671 if (enc_len > 0 &&
672 (sendtime <= STOPSENDTIME || sendtime > RESTARTSENDTIME)) {
673 if (useRed) {
674 if (red_len[0] > 0) {
675 memmove(&rtp_data[RTPheaderLen + red_len[0]], &rtp_data[12], enc_len);
676 memcpy(&rtp_data[RTPheaderLen], red_data, red_len[0]);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000677
Peter Kastingb7e50542015-06-11 12:55:50 -0700678 red_len[1] = static_cast<uint16_t>(enc_len);
Peter Kasting248b0b02015-06-03 12:32:41 -0700679 red_TS[1] = timestamp;
680 if (vad)
681 red_PT[1] = payloadType;
682 else
683 red_PT[1] = NETEQ_CODEC_CN_PT;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000684
Peter Kasting248b0b02015-06-03 12:32:41 -0700685 makeRedundantHeader(rtp_data, red_PT, 2, red_TS, red_len, seqNo++,
686 ssrc);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000687
Peter Kasting248b0b02015-06-03 12:32:41 -0700688 enc_len += red_len[0] + RTPheaderLen - 12;
689 } else { // do not use redundancy payload for this packet, i.e., only
690 // last payload
691 memmove(&rtp_data[RTPheaderLen - 4], &rtp_data[12], enc_len);
692 // memcpy(&rtp_data[RTPheaderLen], red_data, red_len[0]);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000693
Peter Kastingb7e50542015-06-11 12:55:50 -0700694 red_len[1] = static_cast<uint16_t>(enc_len);
Peter Kasting248b0b02015-06-03 12:32:41 -0700695 red_TS[1] = timestamp;
696 if (vad)
697 red_PT[1] = payloadType;
698 else
699 red_PT[1] = NETEQ_CODEC_CN_PT;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000700
Peter Kasting248b0b02015-06-03 12:32:41 -0700701 makeRedundantHeader(rtp_data, red_PT, 2, red_TS, red_len, seqNo++,
702 ssrc);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000703
Peter Kasting248b0b02015-06-03 12:32:41 -0700704 enc_len += red_len[0] + RTPheaderLen - 4 -
705 12; // 4 is length of redundancy header (not used)
706 }
707 } else {
708 /* make RTP header */
709 if (vad) // regular speech data
710 makeRTPheader(rtp_data, payloadType, seqNo++, timestamp, ssrc);
711 else // CNG data
712 makeRTPheader(rtp_data, NETEQ_CODEC_CN_PT, seqNo++, timestamp, ssrc);
713 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000714#ifdef MULTIPLE_SAME_TIMESTAMP
Peter Kasting248b0b02015-06-03 12:32:41 -0700715 int mult_pack = 0;
716 do {
717#endif // MULTIPLE_SAME_TIMESTAMP
718 /* write RTP packet to file */
Peter Kastingb7e50542015-06-11 12:55:50 -0700719 length = htons(static_cast<unsigned short>(12 + enc_len + 8));
720 plen = htons(static_cast<unsigned short>(12 + enc_len));
Peter Kasting248b0b02015-06-03 12:32:41 -0700721 offset = (uint32_t)sendtime;
722 //(timestamp/(fs/1000));
723 offset = htonl(offset);
724 if (fwrite(&length, 2, 1, out_file) != 1) {
725 return -1;
726 }
727 if (fwrite(&plen, 2, 1, out_file) != 1) {
728 return -1;
729 }
730 if (fwrite(&offset, 4, 1, out_file) != 1) {
731 return -1;
732 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000733#ifdef RANDOM_DATA
Peter Kastingdce40cf2015-08-24 14:52:23 -0700734 for (size_t k = 0; k < 12 + enc_len; k++) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700735 rtp_data[k] = rand() + rand();
736 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000737#endif
738#ifdef RANDOM_PAYLOAD_DATA
Peter Kastingdce40cf2015-08-24 14:52:23 -0700739 for (size_t k = 12; k < 12 + enc_len; k++) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700740 rtp_data[k] = rand() + rand();
741 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000742#endif
Peter Kasting248b0b02015-06-03 12:32:41 -0700743 if (fwrite(rtp_data, 12 + enc_len, 1, out_file) != 1) {
744 return -1;
745 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000746#ifdef MULTIPLE_SAME_TIMESTAMP
Peter Kasting248b0b02015-06-03 12:32:41 -0700747 } while ((seqNo % REPEAT_PACKET_DISTANCE == 0) &&
748 (mult_pack++ < REPEAT_PACKET_COUNT));
749#endif // MULTIPLE_SAME_TIMESTAMP
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000750
751#ifdef INSERT_OLD_PACKETS
Peter Kasting248b0b02015-06-03 12:32:41 -0700752 if (packet_age >= OLD_PACKET * fs) {
753 if (!first_old_packet) {
754 // send the old packet
755 if (fwrite(&old_length, 2, 1, out_file) != 1) {
756 return -1;
757 }
758 if (fwrite(&old_plen, 2, 1, out_file) != 1) {
759 return -1;
760 }
761 if (fwrite(&offset, 4, 1, out_file) != 1) {
762 return -1;
763 }
764 if (fwrite(old_rtp_data, 12 + old_enc_len, 1, out_file) != 1) {
765 return -1;
766 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000767 }
Peter Kasting248b0b02015-06-03 12:32:41 -0700768 // store current packet as old
769 old_length = length;
770 old_plen = plen;
771 memcpy(old_rtp_data, rtp_data, 12 + enc_len);
772 old_enc_len = enc_len;
773 first_old_packet = 0;
774 packet_age = 0;
775 }
776 packet_age += packet_size;
777#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000778
Peter Kasting248b0b02015-06-03 12:32:41 -0700779 if (useRed) {
780/* move data to redundancy store */
781#ifdef CODEC_ISAC
kwibergee1879c2015-10-29 06:20:28 -0700782 if (usedCodec == webrtc::NetEqDecoder::kDecoderISAC) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700783 assert(!usingStereo); // Cannot handle stereo yet
784 red_len[0] = WebRtcIsac_GetRedPayload(ISAC_inst[0], red_data);
785 } else {
786#endif
787 memcpy(red_data, &rtp_data[RTPheaderLen + red_len[0]], enc_len);
788 red_len[0] = red_len[1];
789#ifdef CODEC_ISAC
790 }
791#endif
792 red_TS[0] = red_TS[1];
793 red_PT[0] = red_PT[1];
794 }
795 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000796
Peter Kasting248b0b02015-06-03 12:32:41 -0700797 /* read next frame */
798 len = fread(org_data, 2, packet_size * numChannels, in_file) / numChannels;
799 /* de-interleave if stereo */
800 if (usingStereo) {
801 stereoDeInterleave(org_data, len * numChannels);
802 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000803
Peter Kasting248b0b02015-06-03 12:32:41 -0700804 if (payloadType == NETEQ_CODEC_G722_PT)
805 timestamp += len >> 1;
806 else
807 timestamp += len;
808
809 sendtime += (double)len / (fs / 1000);
810 }
811
812 NetEQTest_free_coders(usedCodec, numChannels);
813 fclose(in_file);
814 fclose(out_file);
815 printf("Done!\n");
816
817 return (0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000818}
819
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000820/****************/
821/* Subfunctions */
822/****************/
823
pkasting@chromium.orgd3245462015-02-23 21:28:22 +0000824void NetEQTest_GetCodec_and_PT(char* name,
825 webrtc::NetEqDecoder* codec,
826 int* PT,
Peter Kastingdce40cf2015-08-24 14:52:23 -0700827 size_t frameLen,
pkasting@chromium.orgd3245462015-02-23 21:28:22 +0000828 int* fs,
829 int* bitrate,
830 int* useRed) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700831 *bitrate = 0; /* Default bitrate setting */
832 *useRed = 0; /* Default no redundancy */
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000833
Peter Kasting248b0b02015-06-03 12:32:41 -0700834 if (!strcmp(name, "pcmu")) {
kwibergee1879c2015-10-29 06:20:28 -0700835 *codec = webrtc::NetEqDecoder::kDecoderPCMu;
Peter Kasting248b0b02015-06-03 12:32:41 -0700836 *PT = NETEQ_CODEC_PCMU_PT;
837 *fs = 8000;
838 } else if (!strcmp(name, "pcma")) {
kwibergee1879c2015-10-29 06:20:28 -0700839 *codec = webrtc::NetEqDecoder::kDecoderPCMa;
Peter Kasting248b0b02015-06-03 12:32:41 -0700840 *PT = NETEQ_CODEC_PCMA_PT;
841 *fs = 8000;
842 } else if (!strcmp(name, "pcm16b")) {
kwibergee1879c2015-10-29 06:20:28 -0700843 *codec = webrtc::NetEqDecoder::kDecoderPCM16B;
Peter Kasting248b0b02015-06-03 12:32:41 -0700844 *PT = NETEQ_CODEC_PCM16B_PT;
845 *fs = 8000;
846 } else if (!strcmp(name, "pcm16b_wb")) {
kwibergee1879c2015-10-29 06:20:28 -0700847 *codec = webrtc::NetEqDecoder::kDecoderPCM16Bwb;
Peter Kasting248b0b02015-06-03 12:32:41 -0700848 *PT = NETEQ_CODEC_PCM16B_WB_PT;
849 *fs = 16000;
850 } else if (!strcmp(name, "pcm16b_swb32")) {
kwibergee1879c2015-10-29 06:20:28 -0700851 *codec = webrtc::NetEqDecoder::kDecoderPCM16Bswb32kHz;
Peter Kasting248b0b02015-06-03 12:32:41 -0700852 *PT = NETEQ_CODEC_PCM16B_SWB32KHZ_PT;
853 *fs = 32000;
854 } else if (!strcmp(name, "pcm16b_swb48")) {
kwibergee1879c2015-10-29 06:20:28 -0700855 *codec = webrtc::NetEqDecoder::kDecoderPCM16Bswb48kHz;
Peter Kasting248b0b02015-06-03 12:32:41 -0700856 *PT = NETEQ_CODEC_PCM16B_SWB48KHZ_PT;
857 *fs = 48000;
858 } else if (!strcmp(name, "g722")) {
kwibergee1879c2015-10-29 06:20:28 -0700859 *codec = webrtc::NetEqDecoder::kDecoderG722;
Peter Kasting248b0b02015-06-03 12:32:41 -0700860 *PT = NETEQ_CODEC_G722_PT;
861 *fs = 16000;
862 } else if ((!strcmp(name, "ilbc")) &&
863 ((frameLen % 240 == 0) || (frameLen % 160 == 0))) {
864 *fs = 8000;
kwibergee1879c2015-10-29 06:20:28 -0700865 *codec = webrtc::NetEqDecoder::kDecoderILBC;
Peter Kasting248b0b02015-06-03 12:32:41 -0700866 *PT = NETEQ_CODEC_ILBC_PT;
867 } else if (!strcmp(name, "isac")) {
868 *fs = 16000;
kwibergee1879c2015-10-29 06:20:28 -0700869 *codec = webrtc::NetEqDecoder::kDecoderISAC;
Peter Kasting248b0b02015-06-03 12:32:41 -0700870 *PT = NETEQ_CODEC_ISAC_PT;
871 } else if (!strcmp(name, "isacswb")) {
872 *fs = 32000;
kwibergee1879c2015-10-29 06:20:28 -0700873 *codec = webrtc::NetEqDecoder::kDecoderISACswb;
Peter Kasting248b0b02015-06-03 12:32:41 -0700874 *PT = NETEQ_CODEC_ISACSWB_PT;
875 } else if (!strcmp(name, "red_pcm")) {
kwibergee1879c2015-10-29 06:20:28 -0700876 *codec = webrtc::NetEqDecoder::kDecoderPCMa;
Peter Kasting248b0b02015-06-03 12:32:41 -0700877 *PT = NETEQ_CODEC_PCMA_PT; /* this will be the PT for the sub-headers */
878 *fs = 8000;
879 *useRed = 1;
880 } else if (!strcmp(name, "red_isac")) {
kwibergee1879c2015-10-29 06:20:28 -0700881 *codec = webrtc::NetEqDecoder::kDecoderISAC;
Peter Kasting248b0b02015-06-03 12:32:41 -0700882 *PT = NETEQ_CODEC_ISAC_PT; /* this will be the PT for the sub-headers */
883 *fs = 16000;
884 *useRed = 1;
minyuecb23c0d2015-12-11 01:58:26 -0800885 } else if (!strcmp(name, "opus")) {
886 *codec = webrtc::NetEqDecoder::kDecoderOpus;
887 *PT = NETEQ_CODEC_OPUS_PT; /* this will be the PT for the sub-headers */
888 *fs = 48000;
Peter Kasting248b0b02015-06-03 12:32:41 -0700889 } else {
890 printf("Error: Not a supported codec (%s)\n", name);
891 exit(0);
892 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000893}
894
Peter Kasting248b0b02015-06-03 12:32:41 -0700895int NetEQTest_init_coders(webrtc::NetEqDecoder coder,
Peter Kastingdce40cf2015-08-24 14:52:23 -0700896 size_t enc_frameSize,
Peter Kasting248b0b02015-06-03 12:32:41 -0700897 int bitrate,
898 int sampfreq,
899 int vad,
Peter Kastingdce40cf2015-08-24 14:52:23 -0700900 size_t numChannels) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700901 int ok = 0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000902
Peter Kastingdce40cf2015-08-24 14:52:23 -0700903 for (size_t k = 0; k < numChannels; k++) {
Peter Kasting248b0b02015-06-03 12:32:41 -0700904 VAD_inst[k] = WebRtcVad_Create();
905 if (!VAD_inst[k]) {
906 printf("Error: Couldn't allocate memory for VAD instance\n");
907 exit(0);
908 }
909 ok = WebRtcVad_Init(VAD_inst[k]);
910 if (ok == -1) {
911 printf("Error: Initialization of VAD struct failed\n");
912 exit(0);
913 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000914
915#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
Peter Kasting248b0b02015-06-03 12:32:41 -0700916 defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
Peter Kasting248b0b02015-06-03 12:32:41 -0700917 if (sampfreq <= 16000) {
ossu97ba30e2016-04-25 07:55:58 -0700918 CNG_encoder[k] = new webrtc::ComfortNoiseEncoder(sampfreq, 200, 5);
Peter Kasting248b0b02015-06-03 12:32:41 -0700919 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000920#endif
921
Peter Kasting248b0b02015-06-03 12:32:41 -0700922 switch (coder) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000923#ifdef CODEC_PCM16B
kwibergee1879c2015-10-29 06:20:28 -0700924 case webrtc::NetEqDecoder::kDecoderPCM16B:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000925#endif
926#ifdef CODEC_PCM16B_WB
kwibergee1879c2015-10-29 06:20:28 -0700927 case webrtc::NetEqDecoder::kDecoderPCM16Bwb:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000928#endif
929#ifdef CODEC_PCM16B_32KHZ
kwibergee1879c2015-10-29 06:20:28 -0700930 case webrtc::NetEqDecoder::kDecoderPCM16Bswb32kHz:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000931#endif
932#ifdef CODEC_PCM16B_48KHZ
kwibergee1879c2015-10-29 06:20:28 -0700933 case webrtc::NetEqDecoder::kDecoderPCM16Bswb48kHz:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000934#endif
935#ifdef CODEC_G711
kwibergee1879c2015-10-29 06:20:28 -0700936 case webrtc::NetEqDecoder::kDecoderPCMu:
937 case webrtc::NetEqDecoder::kDecoderPCMa:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000938#endif
939 // do nothing
940 break;
941#ifdef CODEC_G729
Peter Kasting248b0b02015-06-03 12:32:41 -0700942 case webrtc::kDecoderG729:
943 if (sampfreq == 8000) {
944 if ((enc_frameSize == 80) || (enc_frameSize == 160) ||
945 (enc_frameSize == 240) || (enc_frameSize == 320) ||
946 (enc_frameSize == 400) || (enc_frameSize == 480)) {
947 ok = WebRtcG729_CreateEnc(&G729enc_inst[k]);
948 if (ok != 0) {
Peter Kasting2a100872015-06-09 17:26:40 -0700949 printf("Error: Couldn't allocate memory for G729 encoding "
950 "instance\n");
Peter Kasting248b0b02015-06-03 12:32:41 -0700951 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000952 }
Peter Kasting248b0b02015-06-03 12:32:41 -0700953 } else {
Peter Kasting2a100872015-06-09 17:26:40 -0700954 printf("\nError: g729 only supports 10, 20, 30, 40, 50 or 60 "
955 "ms!!\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000956 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -0700957 }
958 WebRtcG729_EncoderInit(G729enc_inst[k], vad);
959 if ((vad == 1) && (enc_frameSize != 80)) {
Peter Kasting2a100872015-06-09 17:26:40 -0700960 printf("\nError - This simulation only supports VAD for G729 at "
Peter Kastingdce40cf2015-08-24 14:52:23 -0700961 "10ms packets (not %" PRIuS "ms)\n", (enc_frameSize >> 3));
Peter Kasting248b0b02015-06-03 12:32:41 -0700962 }
963 } else {
964 printf("\nError - g729 is only developed for 8kHz \n");
965 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000966 }
967 break;
968#endif
969#ifdef CODEC_G729_1
Peter Kasting248b0b02015-06-03 12:32:41 -0700970 case webrtc::kDecoderG729_1:
971 if (sampfreq == 16000) {
972 if ((enc_frameSize == 320) || (enc_frameSize == 640) ||
973 (enc_frameSize == 960)) {
974 ok = WebRtcG7291_Create(&G729_1_inst[k]);
975 if (ok != 0) {
Peter Kasting2a100872015-06-09 17:26:40 -0700976 printf("Error: Couldn't allocate memory for G.729.1 codec "
977 "instance\n");
Peter Kasting248b0b02015-06-03 12:32:41 -0700978 exit(0);
979 }
980 } else {
981 printf("\nError: G.729.1 only supports 20, 40 or 60 ms!!\n\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000982 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -0700983 }
984 if (!(((bitrate >= 12000) && (bitrate <= 32000) &&
985 (bitrate % 2000 == 0)) ||
986 (bitrate == 8000))) {
987 /* must be 8, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, or 32 kbps */
Peter Kasting2a100872015-06-09 17:26:40 -0700988 printf("\nError: G.729.1 bitrate must be 8000 or 12000--32000 in "
989 "steps of 2000 bps\n");
Peter Kasting248b0b02015-06-03 12:32:41 -0700990 exit(0);
991 }
992 WebRtcG7291_EncoderInit(G729_1_inst[k], bitrate, 0 /* flag8kHz*/,
993 0 /*flagG729mode*/);
994 } else {
995 printf("\nError - G.729.1 input is always 16 kHz \n");
996 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000997 }
998 break;
999#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001000
1001#ifdef CODEC_G722_1_16
Peter Kasting248b0b02015-06-03 12:32:41 -07001002 case webrtc::kDecoderG722_1_16:
1003 if (sampfreq == 16000) {
1004 ok = WebRtcG7221_CreateEnc16(&G722_1_16enc_inst[k]);
1005 if (ok != 0) {
1006 printf("Error: Couldn't allocate memory for G.722.1 instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001007 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001008 }
1009 if (enc_frameSize == 320) {
1010 } else {
1011 printf("\nError: G722.1 only supports 20 ms!!\n\n");
1012 exit(0);
1013 }
1014 WebRtcG7221_EncoderInit16((G722_1_16_encinst_t*)G722_1_16enc_inst[k]);
1015 } else {
1016 printf("\nError - G722.1 is only developed for 16kHz \n");
1017 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001018 }
1019 break;
1020#endif
1021#ifdef CODEC_G722_1_24
Peter Kasting248b0b02015-06-03 12:32:41 -07001022 case webrtc::kDecoderG722_1_24:
1023 if (sampfreq == 16000) {
1024 ok = WebRtcG7221_CreateEnc24(&G722_1_24enc_inst[k]);
1025 if (ok != 0) {
1026 printf("Error: Couldn't allocate memory for G.722.1 instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001027 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001028 }
1029 if (enc_frameSize == 320) {
1030 } else {
1031 printf("\nError: G722.1 only supports 20 ms!!\n\n");
1032 exit(0);
1033 }
1034 WebRtcG7221_EncoderInit24((G722_1_24_encinst_t*)G722_1_24enc_inst[k]);
1035 } else {
1036 printf("\nError - G722.1 is only developed for 16kHz \n");
1037 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001038 }
1039 break;
1040#endif
1041#ifdef CODEC_G722_1_32
Peter Kasting248b0b02015-06-03 12:32:41 -07001042 case webrtc::kDecoderG722_1_32:
1043 if (sampfreq == 16000) {
1044 ok = WebRtcG7221_CreateEnc32(&G722_1_32enc_inst[k]);
1045 if (ok != 0) {
1046 printf("Error: Couldn't allocate memory for G.722.1 instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001047 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001048 }
1049 if (enc_frameSize == 320) {
1050 } else {
1051 printf("\nError: G722.1 only supports 20 ms!!\n\n");
1052 exit(0);
1053 }
1054 WebRtcG7221_EncoderInit32((G722_1_32_encinst_t*)G722_1_32enc_inst[k]);
1055 } else {
1056 printf("\nError - G722.1 is only developed for 16kHz \n");
1057 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001058 }
1059 break;
1060#endif
1061#ifdef CODEC_G722_1C_24
Peter Kasting248b0b02015-06-03 12:32:41 -07001062 case webrtc::kDecoderG722_1C_24:
1063 if (sampfreq == 32000) {
1064 ok = WebRtcG7221C_CreateEnc24(&G722_1C_24enc_inst[k]);
1065 if (ok != 0) {
1066 printf("Error: Couldn't allocate memory for G.722.1C instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001067 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001068 }
1069 if (enc_frameSize == 640) {
1070 } else {
1071 printf("\nError: G722.1 C only supports 20 ms!!\n\n");
1072 exit(0);
1073 }
1074 WebRtcG7221C_EncoderInit24(
1075 (G722_1C_24_encinst_t*)G722_1C_24enc_inst[k]);
1076 } else {
1077 printf("\nError - G722.1 C is only developed for 32kHz \n");
1078 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001079 }
1080 break;
1081#endif
1082#ifdef CODEC_G722_1C_32
Peter Kasting248b0b02015-06-03 12:32:41 -07001083 case webrtc::kDecoderG722_1C_32:
1084 if (sampfreq == 32000) {
1085 ok = WebRtcG7221C_CreateEnc32(&G722_1C_32enc_inst[k]);
1086 if (ok != 0) {
1087 printf("Error: Couldn't allocate memory for G.722.1C instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001088 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001089 }
1090 if (enc_frameSize == 640) {
1091 } else {
1092 printf("\nError: G722.1 C only supports 20 ms!!\n\n");
1093 exit(0);
1094 }
1095 WebRtcG7221C_EncoderInit32(
1096 (G722_1C_32_encinst_t*)G722_1C_32enc_inst[k]);
1097 } else {
1098 printf("\nError - G722.1 C is only developed for 32kHz \n");
1099 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001100 }
1101 break;
1102#endif
1103#ifdef CODEC_G722_1C_48
Peter Kasting248b0b02015-06-03 12:32:41 -07001104 case webrtc::kDecoderG722_1C_48:
1105 if (sampfreq == 32000) {
1106 ok = WebRtcG7221C_CreateEnc48(&G722_1C_48enc_inst[k]);
1107 if (ok != 0) {
1108 printf("Error: Couldn't allocate memory for G.722.1C instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001109 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001110 }
1111 if (enc_frameSize == 640) {
1112 } else {
1113 printf("\nError: G722.1 C only supports 20 ms!!\n\n");
1114 exit(0);
1115 }
1116 WebRtcG7221C_EncoderInit48(
1117 (G722_1C_48_encinst_t*)G722_1C_48enc_inst[k]);
1118 } else {
1119 printf("\nError - G722.1 C is only developed for 32kHz \n");
1120 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001121 }
1122 break;
1123#endif
1124#ifdef CODEC_G722
kwibergee1879c2015-10-29 06:20:28 -07001125 case webrtc::NetEqDecoder::kDecoderG722:
Peter Kasting248b0b02015-06-03 12:32:41 -07001126 if (sampfreq == 16000) {
1127 if (enc_frameSize % 2 == 0) {
1128 } else {
1129 printf(
1130 "\nError - g722 frames must have an even number of "
1131 "enc_frameSize\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001132 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001133 }
1134 WebRtcG722_CreateEncoder(&g722EncState[k]);
1135 WebRtcG722_EncoderInit(g722EncState[k]);
1136 } else {
1137 printf("\nError - g722 is only developed for 16kHz \n");
1138 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001139 }
1140 break;
1141#endif
1142#ifdef CODEC_AMR
Peter Kasting248b0b02015-06-03 12:32:41 -07001143 case webrtc::kDecoderAMR:
1144 if (sampfreq == 8000) {
1145 ok = WebRtcAmr_CreateEnc(&AMRenc_inst[k]);
1146 if (ok != 0) {
1147 printf(
1148 "Error: Couldn't allocate memory for AMR encoding instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001149 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001150 }
1151 if ((enc_frameSize == 160) || (enc_frameSize == 320) ||
1152 (enc_frameSize == 480)) {
1153 } else {
1154 printf("\nError - AMR must have a multiple of 160 enc_frameSize\n");
1155 exit(0);
1156 }
1157 WebRtcAmr_EncoderInit(AMRenc_inst[k], vad);
1158 WebRtcAmr_EncodeBitmode(AMRenc_inst[k], AMRBandwidthEfficient);
1159 AMR_bitrate = bitrate;
1160 } else {
1161 printf("\nError - AMR is only developed for 8kHz \n");
1162 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001163 }
1164 break;
1165#endif
1166#ifdef CODEC_AMRWB
Peter Kasting248b0b02015-06-03 12:32:41 -07001167 case webrtc::kDecoderAMRWB:
1168 if (sampfreq == 16000) {
1169 ok = WebRtcAmrWb_CreateEnc(&AMRWBenc_inst[k]);
1170 if (ok != 0) {
Peter Kasting2a100872015-06-09 17:26:40 -07001171 printf("Error: Couldn't allocate memory for AMRWB encoding "
1172 "instance\n");
Peter Kasting248b0b02015-06-03 12:32:41 -07001173 exit(0);
1174 }
Peter Kastingdce40cf2015-08-24 14:52:23 -07001175 if (((enc_frameSize / 320) > 3) || ((enc_frameSize % 320) != 0)) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001176 printf("\nError - AMRwb must have frameSize of 20, 40 or 60ms\n");
1177 exit(0);
1178 }
1179 WebRtcAmrWb_EncoderInit(AMRWBenc_inst[k], vad);
1180 if (bitrate == 7000) {
1181 AMRWB_bitrate = AMRWB_MODE_7k;
1182 } else if (bitrate == 9000) {
1183 AMRWB_bitrate = AMRWB_MODE_9k;
1184 } else if (bitrate == 12000) {
1185 AMRWB_bitrate = AMRWB_MODE_12k;
1186 } else if (bitrate == 14000) {
1187 AMRWB_bitrate = AMRWB_MODE_14k;
1188 } else if (bitrate == 16000) {
1189 AMRWB_bitrate = AMRWB_MODE_16k;
1190 } else if (bitrate == 18000) {
1191 AMRWB_bitrate = AMRWB_MODE_18k;
1192 } else if (bitrate == 20000) {
1193 AMRWB_bitrate = AMRWB_MODE_20k;
1194 } else if (bitrate == 23000) {
1195 AMRWB_bitrate = AMRWB_MODE_23k;
1196 } else if (bitrate == 24000) {
1197 AMRWB_bitrate = AMRWB_MODE_24k;
1198 }
1199 WebRtcAmrWb_EncodeBitmode(AMRWBenc_inst[k], AMRBandwidthEfficient);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001200
1201 } else {
Peter Kasting248b0b02015-06-03 12:32:41 -07001202 printf("\nError - AMRwb is only developed for 16kHz \n");
1203 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001204 }
1205 break;
1206#endif
1207#ifdef CODEC_ILBC
kwibergee1879c2015-10-29 06:20:28 -07001208 case webrtc::NetEqDecoder::kDecoderILBC:
Peter Kasting248b0b02015-06-03 12:32:41 -07001209 if (sampfreq == 8000) {
1210 ok = WebRtcIlbcfix_EncoderCreate(&iLBCenc_inst[k]);
1211 if (ok != 0) {
Peter Kasting2a100872015-06-09 17:26:40 -07001212 printf("Error: Couldn't allocate memory for iLBC encoding "
1213 "instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001214 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001215 }
1216 if ((enc_frameSize == 160) || (enc_frameSize == 240) ||
1217 (enc_frameSize == 320) || (enc_frameSize == 480)) {
1218 } else {
Peter Kasting2a100872015-06-09 17:26:40 -07001219 printf("\nError - iLBC only supports 160, 240, 320 and 480 "
1220 "enc_frameSize (20, 30, 40 and 60 ms)\n");
Peter Kasting248b0b02015-06-03 12:32:41 -07001221 exit(0);
1222 }
1223 if ((enc_frameSize == 160) || (enc_frameSize == 320)) {
1224 /* 20 ms version */
1225 WebRtcIlbcfix_EncoderInit(iLBCenc_inst[k], 20);
1226 } else {
1227 /* 30 ms version */
1228 WebRtcIlbcfix_EncoderInit(iLBCenc_inst[k], 30);
1229 }
1230 } else {
1231 printf("\nError - iLBC is only developed for 8kHz \n");
1232 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001233 }
1234 break;
1235#endif
1236#ifdef CODEC_ISAC
kwibergee1879c2015-10-29 06:20:28 -07001237 case webrtc::NetEqDecoder::kDecoderISAC:
Peter Kasting248b0b02015-06-03 12:32:41 -07001238 if (sampfreq == 16000) {
1239 ok = WebRtcIsac_Create(&ISAC_inst[k]);
1240 if (ok != 0) {
1241 printf("Error: Couldn't allocate memory for iSAC instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001242 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001243 }
1244 if ((enc_frameSize == 480) || (enc_frameSize == 960)) {
1245 } else {
1246 printf("\nError - iSAC only supports frameSize (30 and 60 ms)\n");
1247 exit(0);
1248 }
1249 WebRtcIsac_EncoderInit(ISAC_inst[k], 1);
1250 if ((bitrate < 10000) || (bitrate > 32000)) {
Peter Kasting2a100872015-06-09 17:26:40 -07001251 printf("\nError - iSAC bitrate has to be between 10000 and 32000 "
1252 "bps (not %i)\n",
Peter Kasting248b0b02015-06-03 12:32:41 -07001253 bitrate);
1254 exit(0);
1255 }
Peter Kastingdce40cf2015-08-24 14:52:23 -07001256 WebRtcIsac_Control(ISAC_inst[k], bitrate,
1257 static_cast<int>(enc_frameSize >> 4));
Peter Kasting248b0b02015-06-03 12:32:41 -07001258 } else {
Peter Kasting2a100872015-06-09 17:26:40 -07001259 printf("\nError - iSAC only supports 480 or 960 enc_frameSize (30 or "
1260 "60 ms)\n");
Peter Kasting248b0b02015-06-03 12:32:41 -07001261 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001262 }
1263 break;
1264#endif
1265#ifdef NETEQ_ISACFIX_CODEC
Peter Kasting248b0b02015-06-03 12:32:41 -07001266 case webrtc::kDecoderISAC:
1267 if (sampfreq == 16000) {
1268 ok = WebRtcIsacfix_Create(&ISAC_inst[k]);
1269 if (ok != 0) {
1270 printf("Error: Couldn't allocate memory for iSAC instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001271 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001272 }
1273 if ((enc_frameSize == 480) || (enc_frameSize == 960)) {
1274 } else {
1275 printf("\nError - iSAC only supports frameSize (30 and 60 ms)\n");
1276 exit(0);
1277 }
1278 WebRtcIsacfix_EncoderInit(ISAC_inst[k], 1);
1279 if ((bitrate < 10000) || (bitrate > 32000)) {
Peter Kasting2a100872015-06-09 17:26:40 -07001280 printf("\nError - iSAC bitrate has to be between 10000 and 32000 "
1281 "bps (not %i)\n", bitrate);
Peter Kasting248b0b02015-06-03 12:32:41 -07001282 exit(0);
1283 }
1284 WebRtcIsacfix_Control(ISAC_inst[k], bitrate, enc_frameSize >> 4);
1285 } else {
Peter Kasting2a100872015-06-09 17:26:40 -07001286 printf("\nError - iSAC only supports 480 or 960 enc_frameSize (30 or "
1287 "60 ms)\n");
Peter Kasting248b0b02015-06-03 12:32:41 -07001288 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001289 }
1290 break;
1291#endif
1292#ifdef CODEC_ISAC_SWB
kwibergee1879c2015-10-29 06:20:28 -07001293 case webrtc::NetEqDecoder::kDecoderISACswb:
Peter Kasting248b0b02015-06-03 12:32:41 -07001294 if (sampfreq == 32000) {
1295 ok = WebRtcIsac_Create(&ISACSWB_inst[k]);
1296 if (ok != 0) {
1297 printf("Error: Couldn't allocate memory for iSAC SWB instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001298 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001299 }
1300 if (enc_frameSize == 960) {
1301 } else {
1302 printf("\nError - iSAC SWB only supports frameSize 30 ms\n");
1303 exit(0);
1304 }
1305 ok = WebRtcIsac_SetEncSampRate(ISACSWB_inst[k], 32000);
1306 if (ok != 0) {
1307 printf("Error: Couldn't set sample rate for iSAC SWB instance\n");
1308 exit(0);
1309 }
1310 WebRtcIsac_EncoderInit(ISACSWB_inst[k], 1);
1311 if ((bitrate < 32000) || (bitrate > 56000)) {
Peter Kasting2a100872015-06-09 17:26:40 -07001312 printf("\nError - iSAC SWB bitrate has to be between 32000 and "
1313 "56000 bps (not %i)\n", bitrate);
Peter Kasting248b0b02015-06-03 12:32:41 -07001314 exit(0);
1315 }
Peter Kastingdce40cf2015-08-24 14:52:23 -07001316 WebRtcIsac_Control(ISACSWB_inst[k], bitrate,
1317 static_cast<int>(enc_frameSize >> 5));
Peter Kasting248b0b02015-06-03 12:32:41 -07001318 } else {
Peter Kasting2a100872015-06-09 17:26:40 -07001319 printf("\nError - iSAC SWB only supports 960 enc_frameSize (30 "
1320 "ms)\n");
Peter Kasting248b0b02015-06-03 12:32:41 -07001321 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001322 }
1323 break;
1324#endif
1325#ifdef CODEC_GSMFR
Peter Kasting248b0b02015-06-03 12:32:41 -07001326 case webrtc::kDecoderGSMFR:
1327 if (sampfreq == 8000) {
1328 ok = WebRtcGSMFR_CreateEnc(&GSMFRenc_inst[k]);
1329 if (ok != 0) {
Peter Kasting2a100872015-06-09 17:26:40 -07001330 printf("Error: Couldn't allocate memory for GSM FR encoding "
1331 "instance\n");
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001332 exit(0);
Peter Kasting248b0b02015-06-03 12:32:41 -07001333 }
1334 if ((enc_frameSize == 160) || (enc_frameSize == 320) ||
1335 (enc_frameSize == 480)) {
1336 } else {
Peter Kasting2a100872015-06-09 17:26:40 -07001337 printf("\nError - GSM FR must have a multiple of 160 "
1338 "enc_frameSize\n");
Peter Kasting248b0b02015-06-03 12:32:41 -07001339 exit(0);
1340 }
1341 WebRtcGSMFR_EncoderInit(GSMFRenc_inst[k], 0);
1342 } else {
1343 printf("\nError - GSM FR is only developed for 8kHz \n");
1344 exit(0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001345 }
1346 break;
1347#endif
minyuecb23c0d2015-12-11 01:58:26 -08001348#ifdef CODEC_OPUS
1349 case webrtc::NetEqDecoder::kDecoderOpus:
1350 ok = WebRtcOpus_EncoderCreate(&opus_inst[k], 1, 0);
1351 if (ok != 0) {
1352 printf("Error: Couldn't allocate memory for Opus encoding "
1353 "instance\n");
1354 exit(0);
1355 }
1356 WebRtcOpus_EnableFec(opus_inst[k]);
1357 WebRtcOpus_SetPacketLossRate(opus_inst[k], 5);
1358 break;
1359#endif
Peter Kasting248b0b02015-06-03 12:32:41 -07001360 default:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001361 printf("Error: unknown codec in call to NetEQTest_init_coders.\n");
1362 exit(0);
1363 break;
Peter Kasting248b0b02015-06-03 12:32:41 -07001364 }
Peter Kasting248b0b02015-06-03 12:32:41 -07001365 if (ok != 0) {
1366 return (ok);
1367 }
1368 } // end for
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001369
Peter Kasting248b0b02015-06-03 12:32:41 -07001370 return (0);
1371}
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001372
Peter Kastingdce40cf2015-08-24 14:52:23 -07001373int NetEQTest_free_coders(webrtc::NetEqDecoder coder, size_t numChannels) {
1374 for (size_t k = 0; k < numChannels; k++) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001375 WebRtcVad_Free(VAD_inst[k]);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001376#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
Peter Kasting248b0b02015-06-03 12:32:41 -07001377 defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
ossu97ba30e2016-04-25 07:55:58 -07001378 delete CNG_encoder[k];
1379 CNG_encoder[k] = nullptr;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001380#endif
1381
Peter Kasting248b0b02015-06-03 12:32:41 -07001382 switch (coder) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001383#ifdef CODEC_PCM16B
kwibergee1879c2015-10-29 06:20:28 -07001384 case webrtc::NetEqDecoder::kDecoderPCM16B:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001385#endif
1386#ifdef CODEC_PCM16B_WB
kwibergee1879c2015-10-29 06:20:28 -07001387 case webrtc::NetEqDecoder::kDecoderPCM16Bwb:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001388#endif
1389#ifdef CODEC_PCM16B_32KHZ
kwibergee1879c2015-10-29 06:20:28 -07001390 case webrtc::NetEqDecoder::kDecoderPCM16Bswb32kHz:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001391#endif
1392#ifdef CODEC_PCM16B_48KHZ
kwibergee1879c2015-10-29 06:20:28 -07001393 case webrtc::NetEqDecoder::kDecoderPCM16Bswb48kHz:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001394#endif
1395#ifdef CODEC_G711
kwibergee1879c2015-10-29 06:20:28 -07001396 case webrtc::NetEqDecoder::kDecoderPCMu:
1397 case webrtc::NetEqDecoder::kDecoderPCMa:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001398#endif
Peter Kasting248b0b02015-06-03 12:32:41 -07001399 // do nothing
1400 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001401#ifdef CODEC_G729
kwibergee1879c2015-10-29 06:20:28 -07001402 case webrtc::NetEqDecoder::kDecoderG729:
Peter Kasting248b0b02015-06-03 12:32:41 -07001403 WebRtcG729_FreeEnc(G729enc_inst[k]);
1404 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001405#endif
1406#ifdef CODEC_G729_1
kwibergee1879c2015-10-29 06:20:28 -07001407 case webrtc::NetEqDecoder::kDecoderG729_1:
Peter Kasting248b0b02015-06-03 12:32:41 -07001408 WebRtcG7291_Free(G729_1_inst[k]);
1409 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001410#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001411
1412#ifdef CODEC_G722_1_16
kwibergee1879c2015-10-29 06:20:28 -07001413 case webrtc::NetEqDecoder::kDecoderG722_1_16:
Peter Kasting248b0b02015-06-03 12:32:41 -07001414 WebRtcG7221_FreeEnc16(G722_1_16enc_inst[k]);
1415 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001416#endif
1417#ifdef CODEC_G722_1_24
kwibergee1879c2015-10-29 06:20:28 -07001418 case webrtc::NetEqDecoder::kDecoderG722_1_24:
Peter Kasting248b0b02015-06-03 12:32:41 -07001419 WebRtcG7221_FreeEnc24(G722_1_24enc_inst[k]);
1420 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001421#endif
1422#ifdef CODEC_G722_1_32
kwibergee1879c2015-10-29 06:20:28 -07001423 case webrtc::NetEqDecoder::kDecoderG722_1_32:
Peter Kasting248b0b02015-06-03 12:32:41 -07001424 WebRtcG7221_FreeEnc32(G722_1_32enc_inst[k]);
1425 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001426#endif
1427#ifdef CODEC_G722_1C_24
kwibergee1879c2015-10-29 06:20:28 -07001428 case webrtc::NetEqDecoder::kDecoderG722_1C_24:
Peter Kasting248b0b02015-06-03 12:32:41 -07001429 WebRtcG7221C_FreeEnc24(G722_1C_24enc_inst[k]);
1430 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001431#endif
1432#ifdef CODEC_G722_1C_32
kwibergee1879c2015-10-29 06:20:28 -07001433 case webrtc::NetEqDecoder::kDecoderG722_1C_32:
Peter Kasting248b0b02015-06-03 12:32:41 -07001434 WebRtcG7221C_FreeEnc32(G722_1C_32enc_inst[k]);
1435 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001436#endif
1437#ifdef CODEC_G722_1C_48
kwibergee1879c2015-10-29 06:20:28 -07001438 case webrtc::NetEqDecoder::kDecoderG722_1C_48:
Peter Kasting248b0b02015-06-03 12:32:41 -07001439 WebRtcG7221C_FreeEnc48(G722_1C_48enc_inst[k]);
1440 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001441#endif
1442#ifdef CODEC_G722
kwibergee1879c2015-10-29 06:20:28 -07001443 case webrtc::NetEqDecoder::kDecoderG722:
Peter Kasting248b0b02015-06-03 12:32:41 -07001444 WebRtcG722_FreeEncoder(g722EncState[k]);
1445 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001446#endif
1447#ifdef CODEC_AMR
kwibergee1879c2015-10-29 06:20:28 -07001448 case webrtc::NetEqDecoder::kDecoderAMR:
Peter Kasting248b0b02015-06-03 12:32:41 -07001449 WebRtcAmr_FreeEnc(AMRenc_inst[k]);
1450 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001451#endif
1452#ifdef CODEC_AMRWB
kwibergee1879c2015-10-29 06:20:28 -07001453 case webrtc::NetEqDecoder::kDecoderAMRWB:
Peter Kasting248b0b02015-06-03 12:32:41 -07001454 WebRtcAmrWb_FreeEnc(AMRWBenc_inst[k]);
1455 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001456#endif
1457#ifdef CODEC_ILBC
kwibergee1879c2015-10-29 06:20:28 -07001458 case webrtc::NetEqDecoder::kDecoderILBC:
Peter Kasting248b0b02015-06-03 12:32:41 -07001459 WebRtcIlbcfix_EncoderFree(iLBCenc_inst[k]);
1460 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001461#endif
1462#ifdef CODEC_ISAC
kwibergee1879c2015-10-29 06:20:28 -07001463 case webrtc::NetEqDecoder::kDecoderISAC:
Peter Kasting248b0b02015-06-03 12:32:41 -07001464 WebRtcIsac_Free(ISAC_inst[k]);
1465 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001466#endif
1467#ifdef NETEQ_ISACFIX_CODEC
kwibergee1879c2015-10-29 06:20:28 -07001468 case webrtc::NetEqDecoder::kDecoderISAC:
Peter Kasting248b0b02015-06-03 12:32:41 -07001469 WebRtcIsacfix_Free(ISAC_inst[k]);
1470 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001471#endif
1472#ifdef CODEC_ISAC_SWB
kwibergee1879c2015-10-29 06:20:28 -07001473 case webrtc::NetEqDecoder::kDecoderISACswb:
Peter Kasting248b0b02015-06-03 12:32:41 -07001474 WebRtcIsac_Free(ISACSWB_inst[k]);
1475 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001476#endif
1477#ifdef CODEC_GSMFR
kwibergee1879c2015-10-29 06:20:28 -07001478 case webrtc::NetEqDecoder::kDecoderGSMFR:
Peter Kasting248b0b02015-06-03 12:32:41 -07001479 WebRtcGSMFR_FreeEnc(GSMFRenc_inst[k]);
1480 break;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001481#endif
minyuecb23c0d2015-12-11 01:58:26 -08001482#ifdef CODEC_OPUS
1483 case webrtc::NetEqDecoder::kDecoderOpus:
1484 WebRtcOpus_EncoderFree(opus_inst[k]);
1485 break;
1486#endif
Peter Kasting248b0b02015-06-03 12:32:41 -07001487 default:
1488 printf("Error: unknown codec in call to NetEQTest_init_coders.\n");
1489 exit(0);
1490 break;
1491 }
1492 }
1493
1494 return (0);
1495}
1496
kwibergee1879c2015-10-29 06:20:28 -07001497size_t NetEQTest_encode(webrtc::NetEqDecoder coder,
Peter Kastingdce40cf2015-08-24 14:52:23 -07001498 int16_t* indata,
1499 size_t frameLen,
1500 unsigned char* encoded,
1501 int sampleRate,
1502 int* vad,
1503 int useVAD,
1504 int bitrate,
1505 size_t numChannels) {
1506 size_t cdlen = 0;
Peter Kasting248b0b02015-06-03 12:32:41 -07001507 int16_t* tempdata;
ossu97ba30e2016-04-25 07:55:58 -07001508 static bool first_cng = true;
Peter Kastingdce40cf2015-08-24 14:52:23 -07001509 size_t tempLen;
Peter Kasting248b0b02015-06-03 12:32:41 -07001510 *vad = 1;
1511
1512 // check VAD first
1513 if (useVAD) {
1514 *vad = 0;
1515
ossu97ba30e2016-04-25 07:55:58 -07001516 const size_t sampleRate_10 = static_cast<size_t>(10 * sampleRate / 1000);
1517 const size_t sampleRate_20 = static_cast<size_t>(20 * sampleRate / 1000);
1518 const size_t sampleRate_30 = static_cast<size_t>(30 * sampleRate / 1000);
Peter Kastingdce40cf2015-08-24 14:52:23 -07001519 for (size_t k = 0; k < numChannels; k++) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001520 tempLen = frameLen;
1521 tempdata = &indata[k * frameLen];
1522 int localVad = 0;
1523 /* Partition the signal and test each chunk for VAD.
Peter Kastingdce40cf2015-08-24 14:52:23 -07001524 All chunks must be VAD=0 to produce a total VAD=0. */
pkastingb297c5a2015-07-22 15:17:22 -07001525 while (tempLen >= sampleRate_10) {
1526 if ((tempLen % sampleRate_30) == 0) { // tempLen is multiple of 30ms
Peter Kasting248b0b02015-06-03 12:32:41 -07001527 localVad |= WebRtcVad_Process(VAD_inst[k], sampleRate, tempdata,
pkastingb297c5a2015-07-22 15:17:22 -07001528 sampleRate_30);
1529 tempdata += sampleRate_30;
1530 tempLen -= sampleRate_30;
1531 } else if (tempLen >= sampleRate_20) { // tempLen >= 20ms
Peter Kasting248b0b02015-06-03 12:32:41 -07001532 localVad |= WebRtcVad_Process(VAD_inst[k], sampleRate, tempdata,
pkastingb297c5a2015-07-22 15:17:22 -07001533 sampleRate_20);
1534 tempdata += sampleRate_20;
1535 tempLen -= sampleRate_20;
Peter Kasting248b0b02015-06-03 12:32:41 -07001536 } else { // use 10ms
1537 localVad |= WebRtcVad_Process(VAD_inst[k], sampleRate, tempdata,
pkastingb297c5a2015-07-22 15:17:22 -07001538 sampleRate_10);
1539 tempdata += sampleRate_10;
1540 tempLen -= sampleRate_10;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001541 }
Peter Kasting248b0b02015-06-03 12:32:41 -07001542 }
1543
1544 // aggregate all VAD decisions over all channels
1545 *vad |= localVad;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001546 }
1547
Peter Kasting248b0b02015-06-03 12:32:41 -07001548 if (!*vad) {
1549 // all channels are silent
ossu97ba30e2016-04-25 07:55:58 -07001550 rtc::Buffer workaround;
Peter Kasting248b0b02015-06-03 12:32:41 -07001551 cdlen = 0;
Peter Kastingdce40cf2015-08-24 14:52:23 -07001552 for (size_t k = 0; k < numChannels; k++) {
ossu97ba30e2016-04-25 07:55:58 -07001553 workaround.Clear();
1554 tempLen = CNG_encoder[k]->Encode(
1555 rtc::ArrayView<const int16_t>(
1556 &indata[k * frameLen],
1557 (frameLen <= 640 ? frameLen : 640) /* max 640 */),
1558 first_cng,
1559 &workaround);
1560 memcpy(encoded, workaround.data(), tempLen);
Peter Kasting248b0b02015-06-03 12:32:41 -07001561 encoded += tempLen;
1562 cdlen += tempLen;
1563 }
1564 *vad = 0;
ossu97ba30e2016-04-25 07:55:58 -07001565 first_cng = false;
Peter Kasting248b0b02015-06-03 12:32:41 -07001566 return (cdlen);
1567 }
1568 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001569
Peter Kasting248b0b02015-06-03 12:32:41 -07001570 // loop over all channels
Peter Kastingdce40cf2015-08-24 14:52:23 -07001571 size_t totalLen = 0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001572
Peter Kastingdce40cf2015-08-24 14:52:23 -07001573 for (size_t k = 0; k < numChannels; k++) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001574 /* Encode with the selected coder type */
kwibergee1879c2015-10-29 06:20:28 -07001575 if (coder == webrtc::NetEqDecoder::kDecoderPCMu) { /*g711 u-law */
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001576#ifdef CODEC_G711
Peter Kasting248b0b02015-06-03 12:32:41 -07001577 cdlen = WebRtcG711_EncodeU(indata, frameLen, encoded);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001578#endif
kwibergee1879c2015-10-29 06:20:28 -07001579 } else if (coder == webrtc::NetEqDecoder::kDecoderPCMa) { /*g711 A-law */
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001580#ifdef CODEC_G711
Peter Kasting248b0b02015-06-03 12:32:41 -07001581 cdlen = WebRtcG711_EncodeA(indata, frameLen, encoded);
1582 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001583#endif
1584#ifdef CODEC_PCM16B
kwibergee1879c2015-10-29 06:20:28 -07001585 else if ((coder == webrtc::NetEqDecoder::kDecoderPCM16B) ||
1586 (coder == webrtc::NetEqDecoder::kDecoderPCM16Bwb) ||
1587 (coder == webrtc::NetEqDecoder::kDecoderPCM16Bswb32kHz) ||
1588 (coder == webrtc::NetEqDecoder::
Peter Kasting248b0b02015-06-03 12:32:41 -07001589 kDecoderPCM16Bswb48kHz)) { /*pcm16b (8kHz, 16kHz,
kwibergee1879c2015-10-29 06:20:28 -07001590 32kHz or 48kHz) */
Peter Kasting248b0b02015-06-03 12:32:41 -07001591 cdlen = WebRtcPcm16b_Encode(indata, frameLen, encoded);
1592 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001593#endif
1594#ifdef CODEC_G722
kwibergee1879c2015-10-29 06:20:28 -07001595 else if (coder == webrtc::NetEqDecoder::kDecoderG722) { /*g722 */
Peter Kasting248b0b02015-06-03 12:32:41 -07001596 cdlen = WebRtcG722_Encode(g722EncState[k], indata, frameLen, encoded);
1597 assert(cdlen == frameLen >> 1);
1598 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001599#endif
1600#ifdef CODEC_ILBC
kwibergee1879c2015-10-29 06:20:28 -07001601 else if (coder == webrtc::NetEqDecoder::kDecoderILBC) { /*iLBC */
Peter Kastingdce40cf2015-08-24 14:52:23 -07001602 cdlen = static_cast<size_t>(std::max(
1603 WebRtcIlbcfix_Encode(iLBCenc_inst[k], indata, frameLen, encoded), 0));
Peter Kasting248b0b02015-06-03 12:32:41 -07001604 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001605#endif
Peter Kasting248b0b02015-06-03 12:32:41 -07001606#if (defined(CODEC_ISAC) || \
1607 defined(NETEQ_ISACFIX_CODEC)) // TODO(hlundin): remove all
1608 // NETEQ_ISACFIX_CODEC
kwibergee1879c2015-10-29 06:20:28 -07001609 else if (coder == webrtc::NetEqDecoder::kDecoderISAC) { /*iSAC */
Peter Kasting248b0b02015-06-03 12:32:41 -07001610 int noOfCalls = 0;
Peter Kastingdce40cf2015-08-24 14:52:23 -07001611 int res = 0;
1612 while (res <= 0) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001613#ifdef CODEC_ISAC /* floating point */
Peter Kastingdce40cf2015-08-24 14:52:23 -07001614 res =
Peter Kasting248b0b02015-06-03 12:32:41 -07001615 WebRtcIsac_Encode(ISAC_inst[k], &indata[noOfCalls * 160], encoded);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001616#else /* fixed point */
Peter Kastingdce40cf2015-08-24 14:52:23 -07001617 res = WebRtcIsacfix_Encode(ISAC_inst[k], &indata[noOfCalls * 160],
1618 encoded);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001619#endif
Peter Kasting248b0b02015-06-03 12:32:41 -07001620 noOfCalls++;
1621 }
Peter Kastingdce40cf2015-08-24 14:52:23 -07001622 cdlen = static_cast<size_t>(res);
Peter Kasting248b0b02015-06-03 12:32:41 -07001623 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001624#endif
1625#ifdef CODEC_ISAC_SWB
kwibergee1879c2015-10-29 06:20:28 -07001626 else if (coder == webrtc::NetEqDecoder::kDecoderISACswb) { /* iSAC SWB */
Peter Kasting248b0b02015-06-03 12:32:41 -07001627 int noOfCalls = 0;
Peter Kastingdce40cf2015-08-24 14:52:23 -07001628 int res = 0;
1629 while (res <= 0) {
1630 res = WebRtcIsac_Encode(ISACSWB_inst[k], &indata[noOfCalls * 320],
1631 encoded);
Peter Kasting248b0b02015-06-03 12:32:41 -07001632 noOfCalls++;
1633 }
Peter Kastingdce40cf2015-08-24 14:52:23 -07001634 cdlen = static_cast<size_t>(res);
Peter Kasting248b0b02015-06-03 12:32:41 -07001635 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001636#endif
minyuecb23c0d2015-12-11 01:58:26 -08001637#ifdef CODEC_OPUS
1638 cdlen = WebRtcOpus_Encode(opus_inst[k], indata, frameLen, kRtpDataSize - 12,
1639 encoded);
kwibergaf476c72016-11-28 15:21:39 -08001640 RTC_CHECK_GT(cdlen, 0);
minyuecb23c0d2015-12-11 01:58:26 -08001641#endif
Peter Kasting248b0b02015-06-03 12:32:41 -07001642 indata += frameLen;
1643 encoded += cdlen;
1644 totalLen += cdlen;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001645
Peter Kasting248b0b02015-06-03 12:32:41 -07001646 } // end for
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001647
ossu97ba30e2016-04-25 07:55:58 -07001648 first_cng = true;
Peter Kasting248b0b02015-06-03 12:32:41 -07001649 return (totalLen);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001650}
1651
pkasting@chromium.orgd3245462015-02-23 21:28:22 +00001652void makeRTPheader(unsigned char* rtp_data,
1653 int payloadType,
1654 int seqNo,
1655 uint32_t timestamp,
1656 uint32_t ssrc) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001657 rtp_data[0] = 0x80;
1658 rtp_data[1] = payloadType & 0xFF;
1659 rtp_data[2] = (seqNo >> 8) & 0xFF;
1660 rtp_data[3] = seqNo & 0xFF;
1661 rtp_data[4] = timestamp >> 24;
1662 rtp_data[5] = (timestamp >> 16) & 0xFF;
1663 rtp_data[6] = (timestamp >> 8) & 0xFF;
1664 rtp_data[7] = timestamp & 0xFF;
1665 rtp_data[8] = ssrc >> 24;
1666 rtp_data[9] = (ssrc >> 16) & 0xFF;
1667 rtp_data[10] = (ssrc >> 8) & 0xFF;
1668 rtp_data[11] = ssrc & 0xFF;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001669}
1670
pkasting@chromium.orgd3245462015-02-23 21:28:22 +00001671int makeRedundantHeader(unsigned char* rtp_data,
1672 int* payloadType,
1673 int numPayloads,
1674 uint32_t* timestamp,
1675 uint16_t* blockLen,
1676 int seqNo,
Peter Kasting248b0b02015-06-03 12:32:41 -07001677 uint32_t ssrc) {
1678 int i;
1679 unsigned char* rtpPointer;
1680 uint16_t offset;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001681
Peter Kasting248b0b02015-06-03 12:32:41 -07001682 /* first create "standard" RTP header */
1683 makeRTPheader(rtp_data, NETEQ_CODEC_RED_PT, seqNo, timestamp[numPayloads - 1],
1684 ssrc);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001685
Peter Kasting248b0b02015-06-03 12:32:41 -07001686 rtpPointer = &rtp_data[12];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001687
Peter Kasting248b0b02015-06-03 12:32:41 -07001688 /* add one sub-header for each redundant payload (not the primary) */
1689 for (i = 0; i < numPayloads - 1; i++) {
1690 if (blockLen[i] > 0) {
1691 offset = static_cast<uint16_t>(timestamp[numPayloads - 1] - timestamp[i]);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001692
Peter Kasting248b0b02015-06-03 12:32:41 -07001693 // Byte |0| |1 2 | 3 |
1694 // Bit |0|1234567|01234567012345|6701234567|
1695 // |F|payload| timestamp | block |
1696 // | | type | offset | length |
1697 rtpPointer[0] = (payloadType[i] & 0x7F) | 0x80;
1698 rtpPointer[1] = (offset >> 6) & 0xFF;
1699 rtpPointer[2] = ((offset & 0x3F) << 2) | ((blockLen[i] >> 8) & 0x03);
1700 rtpPointer[3] = blockLen[i] & 0xFF;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001701
Peter Kasting248b0b02015-06-03 12:32:41 -07001702 rtpPointer += 4;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001703 }
Peter Kasting248b0b02015-06-03 12:32:41 -07001704 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001705
Peter Kasting248b0b02015-06-03 12:32:41 -07001706 // Bit |0|1234567|
1707 // |0|payload|
1708 // | | type |
1709 rtpPointer[0] = payloadType[numPayloads - 1] & 0x7F;
1710 ++rtpPointer;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001711
Peter Kasting248b0b02015-06-03 12:32:41 -07001712 return rtpPointer - rtp_data; // length of header in bytes
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001713}
1714
Peter Kastingdce40cf2015-08-24 14:52:23 -07001715size_t makeDTMFpayload(unsigned char* payload_data,
1716 int Event,
1717 int End,
1718 int Volume,
1719 int Duration) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001720 unsigned char E, R, V;
1721 R = 0;
1722 V = (unsigned char)Volume;
1723 if (End == 0) {
1724 E = 0x00;
1725 } else {
1726 E = 0x80;
1727 }
1728 payload_data[0] = (unsigned char)Event;
1729 payload_data[1] = (unsigned char)(E | R | V);
1730 // Duration equals 8 times time_ms, default is 8000 Hz.
1731 payload_data[2] = (unsigned char)((Duration >> 8) & 0xFF);
1732 payload_data[3] = (unsigned char)(Duration & 0xFF);
1733 return (4);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001734}
1735
Peter Kastingdce40cf2015-08-24 14:52:23 -07001736void stereoDeInterleave(int16_t* audioSamples, size_t numSamples) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001737 int16_t* tempVec;
1738 int16_t* readPtr, *writeL, *writeR;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001739
Peter Kastingdce40cf2015-08-24 14:52:23 -07001740 if (numSamples == 0)
Peter Kasting248b0b02015-06-03 12:32:41 -07001741 return;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001742
Peter Kasting248b0b02015-06-03 12:32:41 -07001743 tempVec = (int16_t*)malloc(sizeof(int16_t) * numSamples);
1744 if (tempVec == NULL) {
1745 printf("Error allocating memory\n");
1746 exit(0);
1747 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001748
Peter Kasting248b0b02015-06-03 12:32:41 -07001749 memcpy(tempVec, audioSamples, numSamples * sizeof(int16_t));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001750
Peter Kasting248b0b02015-06-03 12:32:41 -07001751 writeL = audioSamples;
1752 writeR = &audioSamples[numSamples / 2];
1753 readPtr = tempVec;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001754
Peter Kastingdce40cf2015-08-24 14:52:23 -07001755 for (size_t k = 0; k < numSamples; k += 2) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001756 *writeL = *readPtr;
1757 readPtr++;
1758 *writeR = *readPtr;
1759 readPtr++;
1760 writeL++;
1761 writeR++;
1762 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001763
Peter Kasting248b0b02015-06-03 12:32:41 -07001764 free(tempVec);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001765}
1766
Peter Kastingdce40cf2015-08-24 14:52:23 -07001767void stereoInterleave(unsigned char* data, size_t dataLen, size_t stride) {
Peter Kasting248b0b02015-06-03 12:32:41 -07001768 unsigned char* ptrL, *ptrR;
1769 unsigned char temp[10];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001770
Peter Kasting248b0b02015-06-03 12:32:41 -07001771 if (stride > 10) {
1772 exit(0);
1773 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001774
Peter Kasting248b0b02015-06-03 12:32:41 -07001775 if (dataLen % 1 != 0) {
1776 // must be even number of samples
1777 printf("Error: cannot interleave odd sample number\n");
1778 exit(0);
1779 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001780
Peter Kasting248b0b02015-06-03 12:32:41 -07001781 ptrL = data + stride;
1782 ptrR = &data[dataLen / 2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001783
Peter Kasting248b0b02015-06-03 12:32:41 -07001784 while (ptrL < ptrR) {
1785 // copy from right pointer to temp
1786 memcpy(temp, ptrR, stride);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001787
Peter Kasting248b0b02015-06-03 12:32:41 -07001788 // shift data between pointers
1789 memmove(ptrL + stride, ptrL, ptrR - ptrL);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001790
Peter Kasting248b0b02015-06-03 12:32:41 -07001791 // copy from temp to left pointer
1792 memcpy(ptrL, temp, stride);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001793
Peter Kasting248b0b02015-06-03 12:32:41 -07001794 // advance pointers
1795 ptrL += stride * 2;
1796 ptrR += stride;
1797 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001798}