blob: 4e779b49b018a3c74e67eadfa22f9a005e94584f [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
11//TODO(hlundin): Reformat file to meet style guide.
12
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
26#include "webrtc/typedefs.h"
27// needed for NetEqDecoder
kwiberg@webrtc.orge04a93b2014-12-09 10:12:53 +000028#include "webrtc/modules/audio_coding/neteq/audio_decoder_impl.h"
henrik.lundin@webrtc.org9c55f0f2014-06-09 08:10:28 +000029#include "webrtc/modules/audio_coding/neteq/interface/neteq.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000030
31/************************/
32/* Define payload types */
33/************************/
34
35#include "PayloadTypes.h"
36
37
38
39/*********************/
40/* Misc. definitions */
41/*********************/
42
43#define STOPSENDTIME 3000
44#define RESTARTSENDTIME 0 //162500
45#define FIRSTLINELEN 40
46#define CHECK_NOT_NULL(a) if((a)==0){printf("\n %s \n line: %d \nerror at %s\n",__FILE__,__LINE__,#a );return(-1);}
47
48//#define MULTIPLE_SAME_TIMESTAMP
49#define REPEAT_PACKET_DISTANCE 17
50#define REPEAT_PACKET_COUNT 1 // number of extra packets to send
51
52//#define INSERT_OLD_PACKETS
53#define OLD_PACKET 5 // how many seconds too old should the packet be?
54
55//#define TIMESTAMP_WRAPAROUND
56
57//#define RANDOM_DATA
58//#define RANDOM_PAYLOAD_DATA
59#define RANDOM_SEED 10
60
61//#define INSERT_DTMF_PACKETS
62//#define NO_DTMF_OVERDUB
63#define DTMF_PACKET_INTERVAL 2000
64#define DTMF_DURATION 500
65
66#define STEREO_MODE_FRAME 0
67#define STEREO_MODE_SAMPLE_1 1 //1 octet per sample
68#define STEREO_MODE_SAMPLE_2 2 //2 octets per sample
69
70/*************************/
71/* Function declarations */
72/*************************/
73
pkasting@chromium.orgd3245462015-02-23 21:28:22 +000074void NetEQTest_GetCodec_and_PT(char* name,
75 webrtc::NetEqDecoder* codec,
76 int* PT,
77 int frameLen,
78 int* fs,
79 int* bitrate,
80 int* useRed);
81int NetEQTest_init_coders(webrtc::NetEqDecoder coder,
82 int enc_frameSize,
83 int bitrate,
84 int sampfreq,
85 int vad,
86 int numChannels);
87void defineCodecs(webrtc::NetEqDecoder* usedCodec, int* noOfCodecs);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000088int NetEQTest_free_coders(webrtc::NetEqDecoder coder, int numChannels);
pkasting@chromium.orgd3245462015-02-23 21:28:22 +000089int NetEQTest_encode(int coder,
90 int16_t* indata,
91 int frameLen,
92 unsigned char* encoded,
93 int sampleRate,
94 int* vad,
95 int useVAD,
96 int bitrate,
97 int numChannels);
98void makeRTPheader(unsigned char* rtp_data,
99 int payloadType,
100 int seqNo,
101 uint32_t timestamp,
102 uint32_t ssrc);
103int makeRedundantHeader(unsigned char* rtp_data,
104 int* payloadType,
105 int numPayloads,
106 uint32_t* timestamp,
107 uint16_t* blockLen,
108 int seqNo,
109 uint32_t ssrc);
110int makeDTMFpayload(unsigned char* payload_data,
111 int Event,
112 int End,
113 int Volume,
114 int Duration);
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000115void stereoDeInterleave(int16_t* audioSamples, int numSamples);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000116void stereoInterleave(unsigned char* data, int dataLen, int stride);
117
118/*********************/
119/* Codec definitions */
120/*********************/
121
122#include "webrtc_vad.h"
123
124#if ((defined CODEC_PCM16B)||(defined NETEQ_ARBITRARY_CODEC))
125 #include "pcm16b.h"
126#endif
127#ifdef CODEC_G711
128 #include "g711_interface.h"
129#endif
130#ifdef CODEC_G729
131 #include "G729Interface.h"
132#endif
133#ifdef CODEC_G729_1
134 #include "G729_1Interface.h"
135#endif
136#ifdef CODEC_AMR
137 #include "AMRInterface.h"
138 #include "AMRCreation.h"
139#endif
140#ifdef CODEC_AMRWB
141 #include "AMRWBInterface.h"
142 #include "AMRWBCreation.h"
143#endif
144#ifdef CODEC_ILBC
145 #include "ilbc.h"
146#endif
147#if (defined CODEC_ISAC || defined CODEC_ISAC_SWB)
148 #include "isac.h"
149#endif
150#ifdef NETEQ_ISACFIX_CODEC
151 #include "isacfix.h"
152 #ifdef CODEC_ISAC
153 #error Cannot have both ISAC and ISACfix defined. Please de-select one in the beginning of RTPencode.cpp
154 #endif
155#endif
156#ifdef CODEC_G722
157 #include "g722_interface.h"
158#endif
159#ifdef CODEC_G722_1_24
160 #include "G722_1Interface.h"
161#endif
162#ifdef CODEC_G722_1_32
163 #include "G722_1Interface.h"
164#endif
165#ifdef CODEC_G722_1_16
166 #include "G722_1Interface.h"
167#endif
168#ifdef CODEC_G722_1C_24
169 #include "G722_1Interface.h"
170#endif
171#ifdef CODEC_G722_1C_32
172 #include "G722_1Interface.h"
173#endif
174#ifdef CODEC_G722_1C_48
175 #include "G722_1Interface.h"
176#endif
177#ifdef CODEC_G726
178 #include "G726Creation.h"
179 #include "G726Interface.h"
180#endif
181#ifdef CODEC_GSMFR
182 #include "GSMFRInterface.h"
183 #include "GSMFRCreation.h"
184#endif
185#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
186 defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
187 #include "webrtc_cng.h"
188#endif
189#if ((defined CODEC_SPEEX_8)||(defined CODEC_SPEEX_16))
190 #include "SpeexInterface.h"
191#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000192
193/***********************************/
194/* Global codec instance variables */
195/***********************************/
196
197WebRtcVadInst *VAD_inst[2];
198
199#ifdef CODEC_G722
200 G722EncInst *g722EncState[2];
201#endif
202
203#ifdef CODEC_G722_1_24
204 G722_1_24_encinst_t *G722_1_24enc_inst[2];
205#endif
206#ifdef CODEC_G722_1_32
207 G722_1_32_encinst_t *G722_1_32enc_inst[2];
208#endif
209#ifdef CODEC_G722_1_16
210 G722_1_16_encinst_t *G722_1_16enc_inst[2];
211#endif
212#ifdef CODEC_G722_1C_24
213 G722_1C_24_encinst_t *G722_1C_24enc_inst[2];
214#endif
215#ifdef CODEC_G722_1C_32
216 G722_1C_32_encinst_t *G722_1C_32enc_inst[2];
217#endif
218#ifdef CODEC_G722_1C_48
219 G722_1C_48_encinst_t *G722_1C_48enc_inst[2];
220#endif
221#ifdef CODEC_G726
222 G726_encinst_t *G726enc_inst[2];
223#endif
224#ifdef CODEC_G729
225 G729_encinst_t *G729enc_inst[2];
226#endif
227#ifdef CODEC_G729_1
228 G729_1_inst_t *G729_1_inst[2];
229#endif
230#ifdef CODEC_AMR
231 AMR_encinst_t *AMRenc_inst[2];
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000232 int16_t AMR_bitrate;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000233#endif
234#ifdef CODEC_AMRWB
235 AMRWB_encinst_t *AMRWBenc_inst[2];
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000236 int16_t AMRWB_bitrate;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000237#endif
238#ifdef CODEC_ILBC
pbos@webrtc.orge728ee02014-12-17 13:43:55 +0000239 IlbcEncoderInstance *iLBCenc_inst[2];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000240#endif
241#ifdef CODEC_ISAC
242 ISACStruct *ISAC_inst[2];
243#endif
244#ifdef NETEQ_ISACFIX_CODEC
245 ISACFIX_MainStruct *ISAC_inst[2];
246#endif
247#ifdef CODEC_ISAC_SWB
248 ISACStruct *ISACSWB_inst[2];
249#endif
250#ifdef CODEC_GSMFR
251 GSMFR_encinst_t *GSMFRenc_inst[2];
252#endif
253#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
254 defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
255 CNG_enc_inst *CNGenc_inst[2];
256#endif
257#ifdef CODEC_SPEEX_8
258 SPEEX_encinst_t *SPEEX8enc_inst[2];
259#endif
260#ifdef CODEC_SPEEX_16
261 SPEEX_encinst_t *SPEEX16enc_inst[2];
262#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000263
264int main(int argc, char* argv[])
265{
pkasting@chromium.orgd3245462015-02-23 21:28:22 +0000266 int packet_size, fs;
267 webrtc::NetEqDecoder usedCodec;
268 int payloadType;
269 int bitrate = 0;
270 int useVAD, vad;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000271 int useRed=0;
pkasting@chromium.orgd3245462015-02-23 21:28:22 +0000272 int len, enc_len;
273 int16_t org_data[4000];
274 unsigned char rtp_data[8000];
275 int16_t seqNo=0xFFF;
276 uint32_t ssrc=1235412312;
277 uint32_t timestamp=0xAC1245;
278 uint16_t length, plen;
279 uint32_t offset;
280 double sendtime = 0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000281 int red_PT[2] = {0};
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000282 uint32_t red_TS[2] = {0};
283 uint16_t red_len[2] = {0};
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000284 int RTPheaderLen=12;
kwiberg@webrtc.org11729882014-10-13 10:53:42 +0000285 uint8_t red_data[8000];
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000286#ifdef INSERT_OLD_PACKETS
pkasting@chromium.orgd3245462015-02-23 21:28:22 +0000287 uint16_t old_length, old_plen;
288 int old_enc_len;
289 int first_old_packet=1;
290 unsigned char old_rtp_data[8000];
291 int packet_age=0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000292#endif
293#ifdef INSERT_DTMF_PACKETS
pkasting@chromium.orgd3245462015-02-23 21:28:22 +0000294 int NTone = 1;
295 int DTMFfirst = 1;
296 uint32_t DTMFtimestamp;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000297 bool dtmfSent = false;
298#endif
299 bool usingStereo = false;
300 int stereoMode = 0;
301 int numChannels = 1;
302
303 /* check number of parameters */
304 if ((argc != 6) && (argc != 7)) {
305 /* print help text and exit */
306 printf("Application to encode speech into an RTP stream.\n");
307 printf("The program reads a PCM file and encodes is using the specified codec.\n");
308 printf("The coded speech is packetized in RTP packest and written to the output file.\n");
309 printf("The format of the RTP stream file is simlilar to that of rtpplay,\n");
310 printf("but with the receive time euqal to 0 for all packets.\n");
311 printf("Usage:\n\n");
312 printf("%s PCMfile RTPfile frameLen codec useVAD bitrate\n", argv[0]);
313 printf("where:\n");
314
315 printf("PCMfile : PCM speech input file\n\n");
316
317 printf("RTPfile : RTP stream output file\n\n");
318
319 printf("frameLen : 80...960... Number of samples per packet (limit depends on codec)\n\n");
320
321 printf("codecName\n");
322#ifdef CODEC_PCM16B
323 printf(" : pcm16b 16 bit PCM (8kHz)\n");
324#endif
325#ifdef CODEC_PCM16B_WB
326 printf(" : pcm16b_wb 16 bit PCM (16kHz)\n");
327#endif
328#ifdef CODEC_PCM16B_32KHZ
329 printf(" : pcm16b_swb32 16 bit PCM (32kHz)\n");
330#endif
331#ifdef CODEC_PCM16B_48KHZ
332 printf(" : pcm16b_swb48 16 bit PCM (48kHz)\n");
333#endif
334#ifdef CODEC_G711
335 printf(" : pcma g711 A-law (8kHz)\n");
336#endif
337#ifdef CODEC_G711
338 printf(" : pcmu g711 u-law (8kHz)\n");
339#endif
340#ifdef CODEC_G729
341 printf(" : g729 G729 (8kHz and 8kbps) CELP (One-Three frame(s)/packet)\n");
342#endif
343#ifdef CODEC_G729_1
344 printf(" : g729.1 G729.1 (16kHz) variable rate (8--32 kbps)\n");
345#endif
346#ifdef CODEC_G722_1_16
347 printf(" : g722.1_16 G722.1 coder (16kHz) (g722.1 with 16kbps)\n");
348#endif
349#ifdef CODEC_G722_1_24
350 printf(" : g722.1_24 G722.1 coder (16kHz) (the 24kbps version)\n");
351#endif
352#ifdef CODEC_G722_1_32
353 printf(" : g722.1_32 G722.1 coder (16kHz) (the 32kbps version)\n");
354#endif
355#ifdef CODEC_G722_1C_24
356 printf(" : g722.1C_24 G722.1 C coder (32kHz) (the 24kbps version)\n");
357#endif
358#ifdef CODEC_G722_1C_32
359 printf(" : g722.1C_32 G722.1 C coder (32kHz) (the 32kbps version)\n");
360#endif
361#ifdef CODEC_G722_1C_48
362 printf(" : g722.1C_48 G722.1 C coder (32kHz) (the 48kbps)\n");
363#endif
364
365#ifdef CODEC_G726
366 printf(" : g726_16 G726 coder (8kHz) 16kbps\n");
367 printf(" : g726_24 G726 coder (8kHz) 24kbps\n");
368 printf(" : g726_32 G726 coder (8kHz) 32kbps\n");
369 printf(" : g726_40 G726 coder (8kHz) 40kbps\n");
370#endif
371#ifdef CODEC_AMR
372 printf(" : AMRXk Adaptive Multi Rate CELP codec (8kHz)\n");
373 printf(" X = 4.75, 5.15, 5.9, 6.7, 7.4, 7.95, 10.2 or 12.2\n");
374#endif
375#ifdef CODEC_AMRWB
376 printf(" : AMRwbXk Adaptive Multi Rate Wideband CELP codec (16kHz)\n");
377 printf(" X = 7, 9, 12, 14, 16, 18, 20, 23 or 24\n");
378#endif
379#ifdef CODEC_ILBC
380 printf(" : ilbc iLBC codec (8kHz and 13.8kbps)\n");
381#endif
382#ifdef CODEC_ISAC
383 printf(" : isac iSAC (16kHz and 32.0 kbps). To set rate specify a rate parameter as last parameter\n");
384#endif
385#ifdef CODEC_ISAC_SWB
386 printf(" : isacswb iSAC SWB (32kHz and 32.0-52.0 kbps). To set rate specify a rate parameter as last parameter\n");
387#endif
388#ifdef CODEC_GSMFR
389 printf(" : gsmfr GSM FR codec (8kHz and 13kbps)\n");
390#endif
391#ifdef CODEC_G722
392 printf(" : g722 g722 coder (16kHz) (the 64kbps version)\n");
393#endif
394#ifdef CODEC_SPEEX_8
395 printf(" : speex8 speex coder (8 kHz)\n");
396#endif
397#ifdef CODEC_SPEEX_16
398 printf(" : speex16 speex coder (16 kHz)\n");
399#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000400#ifdef CODEC_RED
401#ifdef CODEC_G711
402 printf(" : red_pcm Redundancy RTP packet with 2*G711A frames\n");
403#endif
404#ifdef CODEC_ISAC
405 printf(" : red_isac Redundancy RTP packet with 2*iSAC frames\n");
406#endif
407#endif
408 printf("\n");
409
410#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
411 defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
412 printf("useVAD : 0 Voice Activity Detection is switched off\n");
413 printf(" : 1 Voice Activity Detection is switched on\n\n");
414#else
415 printf("useVAD : 0 Voice Activity Detection switched off (on not supported)\n\n");
416#endif
417 printf("bitrate : Codec bitrate in bps (only applies to vbr codecs)\n\n");
418
419 return(0);
420 }
421
422 FILE* in_file=fopen(argv[1],"rb");
423 CHECK_NOT_NULL(in_file);
424 printf("Input file: %s\n",argv[1]);
425 FILE* out_file=fopen(argv[2],"wb");
426 CHECK_NOT_NULL(out_file);
427 printf("Output file: %s\n\n",argv[2]);
428 packet_size=atoi(argv[3]);
429 CHECK_NOT_NULL(packet_size);
430 printf("Packet size: %i\n",packet_size);
431
432 // check for stereo
433 if(argv[4][strlen(argv[4])-1] == '*') {
434 // use stereo
435 usingStereo = true;
436 numChannels = 2;
437 argv[4][strlen(argv[4])-1] = '\0';
438 }
439
440 NetEQTest_GetCodec_and_PT(argv[4], &usedCodec, &payloadType, packet_size, &fs, &bitrate, &useRed);
441
442 if(useRed) {
443 RTPheaderLen = 12 + 4 + 1; /* standard RTP = 12; 4 bytes per redundant payload, except last one which is 1 byte */
444 }
445
446 useVAD=atoi(argv[5]);
447#if !(defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
448 defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
449 if (useVAD!=0) {
450 printf("Error: this simulation does not support VAD/DTX/CNG\n");
451 }
452#endif
453
454 // check stereo type
455 if(usingStereo)
456 {
457 switch(usedCodec)
458 {
459 // sample based codecs
460 case webrtc::kDecoderPCMu:
461 case webrtc::kDecoderPCMa:
462 case webrtc::kDecoderG722:
463 {
464 // 1 octet per sample
465 stereoMode = STEREO_MODE_SAMPLE_1;
466 break;
467 }
468 case webrtc::kDecoderPCM16B:
469 case webrtc::kDecoderPCM16Bwb:
470 case webrtc::kDecoderPCM16Bswb32kHz:
471 case webrtc::kDecoderPCM16Bswb48kHz:
472 {
473 // 2 octets per sample
474 stereoMode = STEREO_MODE_SAMPLE_2;
475 break;
476 }
477
478 // fixed-rate frame codecs (with internal VAD)
479 default:
480 {
481 printf("Cannot use codec %s as stereo codec\n", argv[4]);
482 exit(0);
483 }
484 }
485 }
486
487 if ((usedCodec == webrtc::kDecoderISAC) || (usedCodec == webrtc::kDecoderISACswb))
488 {
489 if (argc != 7)
490 {
491 if (usedCodec == webrtc::kDecoderISAC)
492 {
493 bitrate = 32000;
494 printf(
495 "Running iSAC at default bitrate of 32000 bps (to specify explicitly add the bps as last parameter)\n");
496 }
497 else // (usedCodec==webrtc::kDecoderISACswb)
498 {
499 bitrate = 56000;
500 printf(
501 "Running iSAC at default bitrate of 56000 bps (to specify explicitly add the bps as last parameter)\n");
502 }
503 }
504 else
505 {
506 bitrate = atoi(argv[6]);
507 if (usedCodec == webrtc::kDecoderISAC)
508 {
509 if ((bitrate < 10000) || (bitrate > 32000))
510 {
511 printf(
512 "Error: iSAC bitrate must be between 10000 and 32000 bps (%i is invalid)\n",
513 bitrate);
514 exit(0);
515 }
516 printf("Running iSAC at bitrate of %i bps\n", bitrate);
517 }
518 else // (usedCodec==webrtc::kDecoderISACswb)
519 {
520 if ((bitrate < 32000) || (bitrate > 56000))
521 {
522 printf(
523 "Error: iSAC SWB bitrate must be between 32000 and 56000 bps (%i is invalid)\n",
524 bitrate);
525 exit(0);
526 }
527 }
528 }
529 }
530 else
531 {
532 if (argc == 7)
533 {
534 printf(
535 "Error: Bitrate parameter can only be specified for iSAC, G.723, and G.729.1\n");
536 exit(0);
537 }
538 }
539
540 if(useRed) {
541 printf("Redundancy engaged. ");
542 }
543 printf("Used codec: %i\n",usedCodec);
544 printf("Payload type: %i\n",payloadType);
545
546 NetEQTest_init_coders(usedCodec, packet_size, bitrate, fs, useVAD, numChannels);
547
548 /* write file header */
549 //fprintf(out_file, "#!RTPencode%s\n", "1.0");
550 fprintf(out_file, "#!rtpplay%s \n", "1.0"); // this is the string that rtpplay needs
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000551 uint32_t dummy_variable = 0; // should be converted to network endian format, but does not matter when 0
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000552 if (fwrite(&dummy_variable, 4, 1, out_file) != 1) {
553 return -1;
554 }
555 if (fwrite(&dummy_variable, 4, 1, out_file) != 1) {
556 return -1;
557 }
558 if (fwrite(&dummy_variable, 4, 1, out_file) != 1) {
559 return -1;
560 }
561 if (fwrite(&dummy_variable, 2, 1, out_file) != 1) {
562 return -1;
563 }
564 if (fwrite(&dummy_variable, 2, 1, out_file) != 1) {
565 return -1;
566 }
567
568#ifdef TIMESTAMP_WRAPAROUND
569 timestamp = 0xFFFFFFFF - fs*10; /* should give wrap-around in 10 seconds */
570#endif
571#if defined(RANDOM_DATA) | defined(RANDOM_PAYLOAD_DATA)
572 srand(RANDOM_SEED);
573#endif
574
575 /* if redundancy is used, the first redundant payload is zero length */
576 red_len[0] = 0;
577
578 /* read first frame */
579 len=fread(org_data,2,packet_size * numChannels,in_file) / numChannels;
580
581 /* de-interleave if stereo */
582 if ( usingStereo )
583 {
584 stereoDeInterleave(org_data, len * numChannels);
585 }
586
587 while (len==packet_size) {
588
589#ifdef INSERT_DTMF_PACKETS
590 dtmfSent = false;
591
592 if ( sendtime >= NTone * DTMF_PACKET_INTERVAL ) {
593 if ( sendtime < NTone * DTMF_PACKET_INTERVAL + DTMF_DURATION ) {
594 // tone has not ended
595 if (DTMFfirst==1) {
596 DTMFtimestamp = timestamp; // save this timestamp
597 DTMFfirst=0;
598 }
599 makeRTPheader(rtp_data, NETEQ_CODEC_AVT_PT, seqNo,DTMFtimestamp, ssrc);
600 enc_len = makeDTMFpayload(&rtp_data[12], NTone % 12, 0, 4, (int) (sendtime - NTone * DTMF_PACKET_INTERVAL)*(fs/1000) + len);
601 }
602 else {
603 // tone has ended
604 makeRTPheader(rtp_data, NETEQ_CODEC_AVT_PT, seqNo,DTMFtimestamp, ssrc);
605 enc_len = makeDTMFpayload(&rtp_data[12], NTone % 12, 1, 4, DTMF_DURATION*(fs/1000));
606 NTone++;
607 DTMFfirst=1;
608 }
609
610 /* write RTP packet to file */
611 length = htons(12 + enc_len + 8);
612 plen = htons(12 + enc_len);
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000613 offset = (uint32_t) sendtime; //(timestamp/(fs/1000));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000614 offset = htonl(offset);
615 if (fwrite(&length, 2, 1, out_file) != 1) {
616 return -1;
617 }
618 if (fwrite(&plen, 2, 1, out_file) != 1) {
619 return -1;
620 }
621 if (fwrite(&offset, 4, 1, out_file) != 1) {
622 return -1;
623 }
624 if (fwrite(rtp_data, 12 + enc_len, 1, out_file) != 1) {
625 return -1;
626 }
627
628 dtmfSent = true;
629 }
630#endif
631
632#ifdef NO_DTMF_OVERDUB
633 /* If DTMF is sent, we should not send any speech packets during the same time */
634 if (dtmfSent) {
635 enc_len = 0;
636 }
637 else {
638#endif
639 /* encode frame */
640 enc_len=NetEQTest_encode(usedCodec, org_data, packet_size, &rtp_data[12] ,fs,&vad, useVAD, bitrate, numChannels);
641 if (enc_len==-1) {
642 printf("Error encoding frame\n");
643 exit(0);
644 }
645
646 if ( usingStereo &&
647 stereoMode != STEREO_MODE_FRAME &&
648 vad == 1 )
649 {
650 // interleave the encoded payload for sample-based codecs (not for CNG)
651 stereoInterleave(&rtp_data[12], enc_len, stereoMode);
652 }
653#ifdef NO_DTMF_OVERDUB
654 }
655#endif
656
657 if (enc_len > 0 && (sendtime <= STOPSENDTIME || sendtime > RESTARTSENDTIME)) {
658 if(useRed) {
659 if(red_len[0] > 0) {
660 memmove(&rtp_data[RTPheaderLen+red_len[0]], &rtp_data[12], enc_len);
661 memcpy(&rtp_data[RTPheaderLen], red_data, red_len[0]);
662
663 red_len[1] = enc_len;
664 red_TS[1] = timestamp;
665 if(vad)
666 red_PT[1] = payloadType;
667 else
668 red_PT[1] = NETEQ_CODEC_CN_PT;
669
670 makeRedundantHeader(rtp_data, red_PT, 2, red_TS, red_len, seqNo++, ssrc);
671
672
673 enc_len += red_len[0] + RTPheaderLen - 12;
674 }
675 else { // do not use redundancy payload for this packet, i.e., only last payload
676 memmove(&rtp_data[RTPheaderLen-4], &rtp_data[12], enc_len);
677 //memcpy(&rtp_data[RTPheaderLen], red_data, red_len[0]);
678
679 red_len[1] = enc_len;
680 red_TS[1] = timestamp;
681 if(vad)
682 red_PT[1] = payloadType;
683 else
684 red_PT[1] = NETEQ_CODEC_CN_PT;
685
686 makeRedundantHeader(rtp_data, red_PT, 2, red_TS, red_len, seqNo++, ssrc);
687
688
689 enc_len += red_len[0] + RTPheaderLen - 4 - 12; // 4 is length of redundancy header (not used)
690 }
691 }
692 else {
693
694 /* make RTP header */
695 if (vad) // regular speech data
696 makeRTPheader(rtp_data, payloadType, seqNo++,timestamp, ssrc);
697 else // CNG data
698 makeRTPheader(rtp_data, NETEQ_CODEC_CN_PT, seqNo++,timestamp, ssrc);
699
700 }
701#ifdef MULTIPLE_SAME_TIMESTAMP
702 int mult_pack=0;
703 do {
704#endif //MULTIPLE_SAME_TIMESTAMP
705 /* write RTP packet to file */
706 length = htons(12 + enc_len + 8);
707 plen = htons(12 + enc_len);
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000708 offset = (uint32_t) sendtime;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000709 //(timestamp/(fs/1000));
710 offset = htonl(offset);
711 if (fwrite(&length, 2, 1, out_file) != 1) {
712 return -1;
713 }
714 if (fwrite(&plen, 2, 1, out_file) != 1) {
715 return -1;
716 }
717 if (fwrite(&offset, 4, 1, out_file) != 1) {
718 return -1;
719 }
720#ifdef RANDOM_DATA
721 for (int k=0; k<12+enc_len; k++) {
722 rtp_data[k] = rand() + rand();
723 }
724#endif
725#ifdef RANDOM_PAYLOAD_DATA
726 for (int k=12; k<12+enc_len; k++) {
727 rtp_data[k] = rand() + rand();
728 }
729#endif
730 if (fwrite(rtp_data, 12 + enc_len, 1, out_file) != 1) {
731 return -1;
732 }
733#ifdef MULTIPLE_SAME_TIMESTAMP
734 } while ( (seqNo%REPEAT_PACKET_DISTANCE == 0) && (mult_pack++ < REPEAT_PACKET_COUNT) );
735#endif //MULTIPLE_SAME_TIMESTAMP
736
737#ifdef INSERT_OLD_PACKETS
738 if (packet_age >= OLD_PACKET*fs) {
739 if (!first_old_packet) {
740 // send the old packet
741 if (fwrite(&old_length, 2, 1,
742 out_file) != 1) {
743 return -1;
744 }
745 if (fwrite(&old_plen, 2, 1,
746 out_file) != 1) {
747 return -1;
748 }
749 if (fwrite(&offset, 4, 1,
750 out_file) != 1) {
751 return -1;
752 }
753 if (fwrite(old_rtp_data, 12 + old_enc_len,
754 1, out_file) != 1) {
755 return -1;
756 }
757 }
758 // store current packet as old
759 old_length=length;
760 old_plen=plen;
761 memcpy(old_rtp_data,rtp_data,12+enc_len);
762 old_enc_len=enc_len;
763 first_old_packet=0;
764 packet_age=0;
765
766 }
767 packet_age += packet_size;
768#endif
769
770 if(useRed) {
771 /* move data to redundancy store */
772#ifdef CODEC_ISAC
773 if(usedCodec==webrtc::kDecoderISAC)
774 {
775 assert(!usingStereo); // Cannot handle stereo yet
kwiberg@webrtc.org11729882014-10-13 10:53:42 +0000776 red_len[0] =
777 WebRtcIsac_GetRedPayload(ISAC_inst[0], red_data);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000778 }
779 else
780 {
781#endif
782 memcpy(red_data, &rtp_data[RTPheaderLen+red_len[0]], enc_len);
783 red_len[0]=red_len[1];
784#ifdef CODEC_ISAC
785 }
786#endif
787 red_TS[0]=red_TS[1];
788 red_PT[0]=red_PT[1];
789 }
790
791 }
792
793 /* read next frame */
794 len=fread(org_data,2,packet_size * numChannels,in_file) / numChannels;
795 /* de-interleave if stereo */
796 if ( usingStereo )
797 {
798 stereoDeInterleave(org_data, len * numChannels);
799 }
800
801 if (payloadType==NETEQ_CODEC_G722_PT)
802 timestamp+=len>>1;
803 else
804 timestamp+=len;
805
806 sendtime += (double) len/(fs/1000);
807 }
808
809 NetEQTest_free_coders(usedCodec, numChannels);
810 fclose(in_file);
811 fclose(out_file);
812 printf("Done!\n");
813
814 return(0);
815}
816
817
818
819
820/****************/
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,
827 int frameLen,
828 int* fs,
829 int* bitrate,
830 int* useRed) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000831
832 *bitrate = 0; /* Default bitrate setting */
833 *useRed = 0; /* Default no redundancy */
834
835 if(!strcmp(name,"pcmu")){
836 *codec=webrtc::kDecoderPCMu;
837 *PT=NETEQ_CODEC_PCMU_PT;
838 *fs=8000;
839 }
840 else if(!strcmp(name,"pcma")){
841 *codec=webrtc::kDecoderPCMa;
842 *PT=NETEQ_CODEC_PCMA_PT;
843 *fs=8000;
844 }
845 else if(!strcmp(name,"pcm16b")){
846 *codec=webrtc::kDecoderPCM16B;
847 *PT=NETEQ_CODEC_PCM16B_PT;
848 *fs=8000;
849 }
850 else if(!strcmp(name,"pcm16b_wb")){
851 *codec=webrtc::kDecoderPCM16Bwb;
852 *PT=NETEQ_CODEC_PCM16B_WB_PT;
853 *fs=16000;
854 }
855 else if(!strcmp(name,"pcm16b_swb32")){
856 *codec=webrtc::kDecoderPCM16Bswb32kHz;
857 *PT=NETEQ_CODEC_PCM16B_SWB32KHZ_PT;
858 *fs=32000;
859 }
860 else if(!strcmp(name,"pcm16b_swb48")){
861 *codec=webrtc::kDecoderPCM16Bswb48kHz;
862 *PT=NETEQ_CODEC_PCM16B_SWB48KHZ_PT;
863 *fs=48000;
864 }
865 else if(!strcmp(name,"g722")){
866 *codec=webrtc::kDecoderG722;
867 *PT=NETEQ_CODEC_G722_PT;
868 *fs=16000;
869 }
870 else if((!strcmp(name,"ilbc"))&&((frameLen%240==0)||(frameLen%160==0))){
871 *fs=8000;
872 *codec=webrtc::kDecoderILBC;
873 *PT=NETEQ_CODEC_ILBC_PT;
874 }
875 else if(!strcmp(name,"isac")){
876 *fs=16000;
877 *codec=webrtc::kDecoderISAC;
878 *PT=NETEQ_CODEC_ISAC_PT;
879 }
880 else if(!strcmp(name,"isacswb")){
881 *fs=32000;
882 *codec=webrtc::kDecoderISACswb;
883 *PT=NETEQ_CODEC_ISACSWB_PT;
884 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000885 else if(!strcmp(name,"red_pcm")){
886 *codec=webrtc::kDecoderPCMa;
887 *PT=NETEQ_CODEC_PCMA_PT; /* this will be the PT for the sub-headers */
888 *fs=8000;
889 *useRed = 1;
890 } else if(!strcmp(name,"red_isac")){
891 *codec=webrtc::kDecoderISAC;
892 *PT=NETEQ_CODEC_ISAC_PT; /* this will be the PT for the sub-headers */
893 *fs=16000;
894 *useRed = 1;
895 } else {
896 printf("Error: Not a supported codec (%s)\n", name);
897 exit(0);
898 }
899
900}
901
902
903
904
905int NetEQTest_init_coders(webrtc::NetEqDecoder coder, int enc_frameSize, int bitrate, int sampfreq , int vad, int numChannels){
906
907 int ok=0;
908
909 for (int k = 0; k < numChannels; k++)
910 {
911 ok=WebRtcVad_Create(&VAD_inst[k]);
912 if (ok!=0) {
913 printf("Error: Couldn't allocate memory for VAD instance\n");
914 exit(0);
915 }
916 ok=WebRtcVad_Init(VAD_inst[k]);
917 if (ok==-1) {
918 printf("Error: Initialization of VAD struct failed\n");
919 exit(0);
920 }
921
922
923#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
924 defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
925 ok=WebRtcCng_CreateEnc(&CNGenc_inst[k]);
926 if (ok!=0) {
927 printf("Error: Couldn't allocate memory for CNG encoding instance\n");
928 exit(0);
929 }
930 if(sampfreq <= 16000) {
931 ok=WebRtcCng_InitEnc(CNGenc_inst[k],sampfreq, 200, 5);
932 if (ok==-1) {
933 printf("Error: Initialization of CNG struct failed. Error code %d\n",
934 WebRtcCng_GetErrorCodeEnc(CNGenc_inst[k]));
935 exit(0);
936 }
937 }
938#endif
939
940 switch (coder) {
941#ifdef CODEC_PCM16B
942 case webrtc::kDecoderPCM16B :
943#endif
944#ifdef CODEC_PCM16B_WB
945 case webrtc::kDecoderPCM16Bwb :
946#endif
947#ifdef CODEC_PCM16B_32KHZ
948 case webrtc::kDecoderPCM16Bswb32kHz :
949#endif
950#ifdef CODEC_PCM16B_48KHZ
951 case webrtc::kDecoderPCM16Bswb48kHz :
952#endif
953#ifdef CODEC_G711
954 case webrtc::kDecoderPCMu :
955 case webrtc::kDecoderPCMa :
956#endif
957 // do nothing
958 break;
959#ifdef CODEC_G729
960 case webrtc::kDecoderG729:
961 if (sampfreq==8000) {
962 if ((enc_frameSize==80)||(enc_frameSize==160)||(enc_frameSize==240)||(enc_frameSize==320)||(enc_frameSize==400)||(enc_frameSize==480)) {
963 ok=WebRtcG729_CreateEnc(&G729enc_inst[k]);
964 if (ok!=0) {
965 printf("Error: Couldn't allocate memory for G729 encoding instance\n");
966 exit(0);
967 }
968 } else {
969 printf("\nError: g729 only supports 10, 20, 30, 40, 50 or 60 ms!!\n\n");
970 exit(0);
971 }
972 WebRtcG729_EncoderInit(G729enc_inst[k], vad);
973 if ((vad==1)&&(enc_frameSize!=80)) {
974 printf("\nError - This simulation only supports VAD for G729 at 10ms packets (not %dms)\n", (enc_frameSize>>3));
975 }
976 } else {
977 printf("\nError - g729 is only developed for 8kHz \n");
978 exit(0);
979 }
980 break;
981#endif
982#ifdef CODEC_G729_1
983 case webrtc::kDecoderG729_1:
984 if (sampfreq==16000) {
985 if ((enc_frameSize==320)||(enc_frameSize==640)||(enc_frameSize==960)
986 ) {
987 ok=WebRtcG7291_Create(&G729_1_inst[k]);
988 if (ok!=0) {
989 printf("Error: Couldn't allocate memory for G.729.1 codec instance\n");
990 exit(0);
991 }
992 } else {
993 printf("\nError: G.729.1 only supports 20, 40 or 60 ms!!\n\n");
994 exit(0);
995 }
996 if (!(((bitrate >= 12000) && (bitrate <= 32000) && (bitrate%2000 == 0)) || (bitrate == 8000))) {
997 /* must be 8, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, or 32 kbps */
998 printf("\nError: G.729.1 bitrate must be 8000 or 12000--32000 in steps of 2000 bps\n");
999 exit(0);
1000 }
1001 WebRtcG7291_EncoderInit(G729_1_inst[k], bitrate, 0 /* flag8kHz*/, 0 /*flagG729mode*/);
1002 } else {
1003 printf("\nError - G.729.1 input is always 16 kHz \n");
1004 exit(0);
1005 }
1006 break;
1007#endif
1008#ifdef CODEC_SPEEX_8
1009 case webrtc::kDecoderSPEEX_8 :
1010 if (sampfreq==8000) {
1011 if ((enc_frameSize==160)||(enc_frameSize==320)||(enc_frameSize==480)) {
1012 ok=WebRtcSpeex_CreateEnc(&SPEEX8enc_inst[k], sampfreq);
1013 if (ok!=0) {
1014 printf("Error: Couldn't allocate memory for Speex encoding instance\n");
1015 exit(0);
1016 }
1017 } else {
1018 printf("\nError: Speex only supports 20, 40, and 60 ms!!\n\n");
1019 exit(0);
1020 }
1021 if ((vad==1)&&(enc_frameSize!=160)) {
1022 printf("\nError - This simulation only supports VAD for Speex at 20ms packets (not %dms)\n", (enc_frameSize>>3));
1023 vad=0;
1024 }
1025 ok=WebRtcSpeex_EncoderInit(SPEEX8enc_inst[k], 0/*vbr*/, 3 /*complexity*/, vad);
1026 if (ok!=0) exit(0);
1027 } else {
1028 printf("\nError - Speex8 called with sample frequency other than 8 kHz.\n\n");
1029 }
1030 break;
1031#endif
1032#ifdef CODEC_SPEEX_16
1033 case webrtc::kDecoderSPEEX_16 :
1034 if (sampfreq==16000) {
1035 if ((enc_frameSize==320)||(enc_frameSize==640)||(enc_frameSize==960)) {
1036 ok=WebRtcSpeex_CreateEnc(&SPEEX16enc_inst[k], sampfreq);
1037 if (ok!=0) {
1038 printf("Error: Couldn't allocate memory for Speex encoding instance\n");
1039 exit(0);
1040 }
1041 } else {
1042 printf("\nError: Speex only supports 20, 40, and 60 ms!!\n\n");
1043 exit(0);
1044 }
1045 if ((vad==1)&&(enc_frameSize!=320)) {
1046 printf("\nError - This simulation only supports VAD for Speex at 20ms packets (not %dms)\n", (enc_frameSize>>4));
1047 vad=0;
1048 }
1049 ok=WebRtcSpeex_EncoderInit(SPEEX16enc_inst[k], 0/*vbr*/, 3 /*complexity*/, vad);
1050 if (ok!=0) exit(0);
1051 } else {
1052 printf("\nError - Speex16 called with sample frequency other than 16 kHz.\n\n");
1053 }
1054 break;
1055#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001056
1057#ifdef CODEC_G722_1_16
1058 case webrtc::kDecoderG722_1_16 :
1059 if (sampfreq==16000) {
1060 ok=WebRtcG7221_CreateEnc16(&G722_1_16enc_inst[k]);
1061 if (ok!=0) {
1062 printf("Error: Couldn't allocate memory for G.722.1 instance\n");
1063 exit(0);
1064 }
1065 if (enc_frameSize==320) {
1066 } else {
1067 printf("\nError: G722.1 only supports 20 ms!!\n\n");
1068 exit(0);
1069 }
1070 WebRtcG7221_EncoderInit16((G722_1_16_encinst_t*)G722_1_16enc_inst[k]);
1071 } else {
1072 printf("\nError - G722.1 is only developed for 16kHz \n");
1073 exit(0);
1074 }
1075 break;
1076#endif
1077#ifdef CODEC_G722_1_24
1078 case webrtc::kDecoderG722_1_24 :
1079 if (sampfreq==16000) {
1080 ok=WebRtcG7221_CreateEnc24(&G722_1_24enc_inst[k]);
1081 if (ok!=0) {
1082 printf("Error: Couldn't allocate memory for G.722.1 instance\n");
1083 exit(0);
1084 }
1085 if (enc_frameSize==320) {
1086 } else {
1087 printf("\nError: G722.1 only supports 20 ms!!\n\n");
1088 exit(0);
1089 }
1090 WebRtcG7221_EncoderInit24((G722_1_24_encinst_t*)G722_1_24enc_inst[k]);
1091 } else {
1092 printf("\nError - G722.1 is only developed for 16kHz \n");
1093 exit(0);
1094 }
1095 break;
1096#endif
1097#ifdef CODEC_G722_1_32
1098 case webrtc::kDecoderG722_1_32 :
1099 if (sampfreq==16000) {
1100 ok=WebRtcG7221_CreateEnc32(&G722_1_32enc_inst[k]);
1101 if (ok!=0) {
1102 printf("Error: Couldn't allocate memory for G.722.1 instance\n");
1103 exit(0);
1104 }
1105 if (enc_frameSize==320) {
1106 } else {
1107 printf("\nError: G722.1 only supports 20 ms!!\n\n");
1108 exit(0);
1109 }
1110 WebRtcG7221_EncoderInit32((G722_1_32_encinst_t*)G722_1_32enc_inst[k]);
1111 } else {
1112 printf("\nError - G722.1 is only developed for 16kHz \n");
1113 exit(0);
1114 }
1115 break;
1116#endif
1117#ifdef CODEC_G722_1C_24
1118 case webrtc::kDecoderG722_1C_24 :
1119 if (sampfreq==32000) {
1120 ok=WebRtcG7221C_CreateEnc24(&G722_1C_24enc_inst[k]);
1121 if (ok!=0) {
1122 printf("Error: Couldn't allocate memory for G.722.1C instance\n");
1123 exit(0);
1124 }
1125 if (enc_frameSize==640) {
1126 } else {
1127 printf("\nError: G722.1 C only supports 20 ms!!\n\n");
1128 exit(0);
1129 }
1130 WebRtcG7221C_EncoderInit24((G722_1C_24_encinst_t*)G722_1C_24enc_inst[k]);
1131 } else {
1132 printf("\nError - G722.1 C is only developed for 32kHz \n");
1133 exit(0);
1134 }
1135 break;
1136#endif
1137#ifdef CODEC_G722_1C_32
1138 case webrtc::kDecoderG722_1C_32 :
1139 if (sampfreq==32000) {
1140 ok=WebRtcG7221C_CreateEnc32(&G722_1C_32enc_inst[k]);
1141 if (ok!=0) {
1142 printf("Error: Couldn't allocate memory for G.722.1C instance\n");
1143 exit(0);
1144 }
1145 if (enc_frameSize==640) {
1146 } else {
1147 printf("\nError: G722.1 C only supports 20 ms!!\n\n");
1148 exit(0);
1149 }
1150 WebRtcG7221C_EncoderInit32((G722_1C_32_encinst_t*)G722_1C_32enc_inst[k]);
1151 } else {
1152 printf("\nError - G722.1 C is only developed for 32kHz \n");
1153 exit(0);
1154 }
1155 break;
1156#endif
1157#ifdef CODEC_G722_1C_48
1158 case webrtc::kDecoderG722_1C_48 :
1159 if (sampfreq==32000) {
1160 ok=WebRtcG7221C_CreateEnc48(&G722_1C_48enc_inst[k]);
1161 if (ok!=0) {
1162 printf("Error: Couldn't allocate memory for G.722.1C instance\n");
1163 exit(0);
1164 }
1165 if (enc_frameSize==640) {
1166 } else {
1167 printf("\nError: G722.1 C only supports 20 ms!!\n\n");
1168 exit(0);
1169 }
1170 WebRtcG7221C_EncoderInit48((G722_1C_48_encinst_t*)G722_1C_48enc_inst[k]);
1171 } else {
1172 printf("\nError - G722.1 C is only developed for 32kHz \n");
1173 exit(0);
1174 }
1175 break;
1176#endif
1177#ifdef CODEC_G722
1178 case webrtc::kDecoderG722 :
1179 if (sampfreq==16000) {
1180 if (enc_frameSize%2==0) {
1181 } else {
1182 printf("\nError - g722 frames must have an even number of enc_frameSize\n");
1183 exit(0);
1184 }
1185 WebRtcG722_CreateEncoder(&g722EncState[k]);
1186 WebRtcG722_EncoderInit(g722EncState[k]);
1187 } else {
1188 printf("\nError - g722 is only developed for 16kHz \n");
1189 exit(0);
1190 }
1191 break;
1192#endif
1193#ifdef CODEC_AMR
1194 case webrtc::kDecoderAMR :
1195 if (sampfreq==8000) {
1196 ok=WebRtcAmr_CreateEnc(&AMRenc_inst[k]);
1197 if (ok!=0) {
1198 printf("Error: Couldn't allocate memory for AMR encoding instance\n");
1199 exit(0);
1200 }if ((enc_frameSize==160)||(enc_frameSize==320)||(enc_frameSize==480)) {
1201 } else {
1202 printf("\nError - AMR must have a multiple of 160 enc_frameSize\n");
1203 exit(0);
1204 }
1205 WebRtcAmr_EncoderInit(AMRenc_inst[k], vad);
1206 WebRtcAmr_EncodeBitmode(AMRenc_inst[k], AMRBandwidthEfficient);
1207 AMR_bitrate = bitrate;
1208 } else {
1209 printf("\nError - AMR is only developed for 8kHz \n");
1210 exit(0);
1211 }
1212 break;
1213#endif
1214#ifdef CODEC_AMRWB
1215 case webrtc::kDecoderAMRWB :
1216 if (sampfreq==16000) {
1217 ok=WebRtcAmrWb_CreateEnc(&AMRWBenc_inst[k]);
1218 if (ok!=0) {
1219 printf("Error: Couldn't allocate memory for AMRWB encoding instance\n");
1220 exit(0);
1221 }
1222 if (((enc_frameSize/320)<0)||((enc_frameSize/320)>3)||((enc_frameSize%320)!=0)) {
1223 printf("\nError - AMRwb must have frameSize of 20, 40 or 60ms\n");
1224 exit(0);
1225 }
1226 WebRtcAmrWb_EncoderInit(AMRWBenc_inst[k], vad);
1227 if (bitrate==7000) {
1228 AMRWB_bitrate = AMRWB_MODE_7k;
1229 } else if (bitrate==9000) {
1230 AMRWB_bitrate = AMRWB_MODE_9k;
1231 } else if (bitrate==12000) {
1232 AMRWB_bitrate = AMRWB_MODE_12k;
1233 } else if (bitrate==14000) {
1234 AMRWB_bitrate = AMRWB_MODE_14k;
1235 } else if (bitrate==16000) {
1236 AMRWB_bitrate = AMRWB_MODE_16k;
1237 } else if (bitrate==18000) {
1238 AMRWB_bitrate = AMRWB_MODE_18k;
1239 } else if (bitrate==20000) {
1240 AMRWB_bitrate = AMRWB_MODE_20k;
1241 } else if (bitrate==23000) {
1242 AMRWB_bitrate = AMRWB_MODE_23k;
1243 } else if (bitrate==24000) {
1244 AMRWB_bitrate = AMRWB_MODE_24k;
1245 }
1246 WebRtcAmrWb_EncodeBitmode(AMRWBenc_inst[k], AMRBandwidthEfficient);
1247
1248 } else {
1249 printf("\nError - AMRwb is only developed for 16kHz \n");
1250 exit(0);
1251 }
1252 break;
1253#endif
1254#ifdef CODEC_ILBC
1255 case webrtc::kDecoderILBC :
1256 if (sampfreq==8000) {
1257 ok=WebRtcIlbcfix_EncoderCreate(&iLBCenc_inst[k]);
1258 if (ok!=0) {
1259 printf("Error: Couldn't allocate memory for iLBC encoding instance\n");
1260 exit(0);
1261 }
1262 if ((enc_frameSize==160)||(enc_frameSize==240)||(enc_frameSize==320)||(enc_frameSize==480)) {
1263 } else {
1264 printf("\nError - iLBC only supports 160, 240, 320 and 480 enc_frameSize (20, 30, 40 and 60 ms)\n");
1265 exit(0);
1266 }
1267 if ((enc_frameSize==160)||(enc_frameSize==320)) {
1268 /* 20 ms version */
1269 WebRtcIlbcfix_EncoderInit(iLBCenc_inst[k], 20);
1270 } else {
1271 /* 30 ms version */
1272 WebRtcIlbcfix_EncoderInit(iLBCenc_inst[k], 30);
1273 }
1274 } else {
1275 printf("\nError - iLBC is only developed for 8kHz \n");
1276 exit(0);
1277 }
1278 break;
1279#endif
1280#ifdef CODEC_ISAC
1281 case webrtc::kDecoderISAC:
1282 if (sampfreq==16000) {
1283 ok=WebRtcIsac_Create(&ISAC_inst[k]);
1284 if (ok!=0) {
1285 printf("Error: Couldn't allocate memory for iSAC instance\n");
1286 exit(0);
1287 }if ((enc_frameSize==480)||(enc_frameSize==960)) {
1288 } else {
1289 printf("\nError - iSAC only supports frameSize (30 and 60 ms)\n");
1290 exit(0);
1291 }
1292 WebRtcIsac_EncoderInit(ISAC_inst[k],1);
1293 if ((bitrate<10000)||(bitrate>32000)) {
1294 printf("\nError - iSAC bitrate has to be between 10000 and 32000 bps (not %i)\n", bitrate);
1295 exit(0);
1296 }
1297 WebRtcIsac_Control(ISAC_inst[k], bitrate, enc_frameSize>>4);
1298 } else {
1299 printf("\nError - iSAC only supports 480 or 960 enc_frameSize (30 or 60 ms)\n");
1300 exit(0);
1301 }
1302 break;
1303#endif
1304#ifdef NETEQ_ISACFIX_CODEC
1305 case webrtc::kDecoderISAC:
1306 if (sampfreq==16000) {
1307 ok=WebRtcIsacfix_Create(&ISAC_inst[k]);
1308 if (ok!=0) {
1309 printf("Error: Couldn't allocate memory for iSAC instance\n");
1310 exit(0);
1311 }if ((enc_frameSize==480)||(enc_frameSize==960)) {
1312 } else {
1313 printf("\nError - iSAC only supports frameSize (30 and 60 ms)\n");
1314 exit(0);
1315 }
1316 WebRtcIsacfix_EncoderInit(ISAC_inst[k],1);
1317 if ((bitrate<10000)||(bitrate>32000)) {
1318 printf("\nError - iSAC bitrate has to be between 10000 and 32000 bps (not %i)\n", bitrate);
1319 exit(0);
1320 }
1321 WebRtcIsacfix_Control(ISAC_inst[k], bitrate, enc_frameSize>>4);
1322 } else {
1323 printf("\nError - iSAC only supports 480 or 960 enc_frameSize (30 or 60 ms)\n");
1324 exit(0);
1325 }
1326 break;
1327#endif
1328#ifdef CODEC_ISAC_SWB
1329 case webrtc::kDecoderISACswb:
1330 if (sampfreq==32000) {
1331 ok=WebRtcIsac_Create(&ISACSWB_inst[k]);
1332 if (ok!=0) {
1333 printf("Error: Couldn't allocate memory for iSAC SWB instance\n");
1334 exit(0);
1335 }if (enc_frameSize==960) {
1336 } else {
1337 printf("\nError - iSAC SWB only supports frameSize 30 ms\n");
1338 exit(0);
1339 }
1340 ok = WebRtcIsac_SetEncSampRate(ISACSWB_inst[k], 32000);
1341 if (ok!=0) {
1342 printf("Error: Couldn't set sample rate for iSAC SWB instance\n");
1343 exit(0);
1344 }
1345 WebRtcIsac_EncoderInit(ISACSWB_inst[k],1);
1346 if ((bitrate<32000)||(bitrate>56000)) {
1347 printf("\nError - iSAC SWB bitrate has to be between 32000 and 56000 bps (not %i)\n", bitrate);
1348 exit(0);
1349 }
1350 WebRtcIsac_Control(ISACSWB_inst[k], bitrate, enc_frameSize>>5);
1351 } else {
1352 printf("\nError - iSAC SWB only supports 960 enc_frameSize (30 ms)\n");
1353 exit(0);
1354 }
1355 break;
1356#endif
1357#ifdef CODEC_GSMFR
1358 case webrtc::kDecoderGSMFR:
1359 if (sampfreq==8000) {
1360 ok=WebRtcGSMFR_CreateEnc(&GSMFRenc_inst[k]);
1361 if (ok!=0) {
1362 printf("Error: Couldn't allocate memory for GSM FR encoding instance\n");
1363 exit(0);
1364 }
1365 if ((enc_frameSize==160)||(enc_frameSize==320)||(enc_frameSize==480)) {
1366 } else {
1367 printf("\nError - GSM FR must have a multiple of 160 enc_frameSize\n");
1368 exit(0);
1369 }
1370 WebRtcGSMFR_EncoderInit(GSMFRenc_inst[k], 0);
1371 } else {
1372 printf("\nError - GSM FR is only developed for 8kHz \n");
1373 exit(0);
1374 }
1375 break;
1376#endif
1377 default :
1378 printf("Error: unknown codec in call to NetEQTest_init_coders.\n");
1379 exit(0);
1380 break;
1381 }
1382
1383 if (ok != 0) {
1384 return(ok);
1385 }
pbos@webrtc.orgd900e8b2013-07-03 15:12:26 +00001386 } // end for
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001387
1388 return(0);
1389}
1390
1391
1392
1393
1394int NetEQTest_free_coders(webrtc::NetEqDecoder coder, int numChannels) {
1395
1396 for (int k = 0; k < numChannels; k++)
1397 {
1398 WebRtcVad_Free(VAD_inst[k]);
1399#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
1400 defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
1401 WebRtcCng_FreeEnc(CNGenc_inst[k]);
1402#endif
1403
1404 switch (coder)
1405 {
1406#ifdef CODEC_PCM16B
1407 case webrtc::kDecoderPCM16B :
1408#endif
1409#ifdef CODEC_PCM16B_WB
1410 case webrtc::kDecoderPCM16Bwb :
1411#endif
1412#ifdef CODEC_PCM16B_32KHZ
1413 case webrtc::kDecoderPCM16Bswb32kHz :
1414#endif
1415#ifdef CODEC_PCM16B_48KHZ
1416 case webrtc::kDecoderPCM16Bswb48kHz :
1417#endif
1418#ifdef CODEC_G711
1419 case webrtc::kDecoderPCMu :
1420 case webrtc::kDecoderPCMa :
1421#endif
1422 // do nothing
1423 break;
1424#ifdef CODEC_G729
1425 case webrtc::kDecoderG729:
1426 WebRtcG729_FreeEnc(G729enc_inst[k]);
1427 break;
1428#endif
1429#ifdef CODEC_G729_1
1430 case webrtc::kDecoderG729_1:
1431 WebRtcG7291_Free(G729_1_inst[k]);
1432 break;
1433#endif
1434#ifdef CODEC_SPEEX_8
1435 case webrtc::kDecoderSPEEX_8 :
1436 WebRtcSpeex_FreeEnc(SPEEX8enc_inst[k]);
1437 break;
1438#endif
1439#ifdef CODEC_SPEEX_16
1440 case webrtc::kDecoderSPEEX_16 :
1441 WebRtcSpeex_FreeEnc(SPEEX16enc_inst[k]);
1442 break;
1443#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001444
1445#ifdef CODEC_G722_1_16
1446 case webrtc::kDecoderG722_1_16 :
1447 WebRtcG7221_FreeEnc16(G722_1_16enc_inst[k]);
1448 break;
1449#endif
1450#ifdef CODEC_G722_1_24
1451 case webrtc::kDecoderG722_1_24 :
1452 WebRtcG7221_FreeEnc24(G722_1_24enc_inst[k]);
1453 break;
1454#endif
1455#ifdef CODEC_G722_1_32
1456 case webrtc::kDecoderG722_1_32 :
1457 WebRtcG7221_FreeEnc32(G722_1_32enc_inst[k]);
1458 break;
1459#endif
1460#ifdef CODEC_G722_1C_24
1461 case webrtc::kDecoderG722_1C_24 :
1462 WebRtcG7221C_FreeEnc24(G722_1C_24enc_inst[k]);
1463 break;
1464#endif
1465#ifdef CODEC_G722_1C_32
1466 case webrtc::kDecoderG722_1C_32 :
1467 WebRtcG7221C_FreeEnc32(G722_1C_32enc_inst[k]);
1468 break;
1469#endif
1470#ifdef CODEC_G722_1C_48
1471 case webrtc::kDecoderG722_1C_48 :
1472 WebRtcG7221C_FreeEnc48(G722_1C_48enc_inst[k]);
1473 break;
1474#endif
1475#ifdef CODEC_G722
1476 case webrtc::kDecoderG722 :
1477 WebRtcG722_FreeEncoder(g722EncState[k]);
1478 break;
1479#endif
1480#ifdef CODEC_AMR
1481 case webrtc::kDecoderAMR :
1482 WebRtcAmr_FreeEnc(AMRenc_inst[k]);
1483 break;
1484#endif
1485#ifdef CODEC_AMRWB
1486 case webrtc::kDecoderAMRWB :
1487 WebRtcAmrWb_FreeEnc(AMRWBenc_inst[k]);
1488 break;
1489#endif
1490#ifdef CODEC_ILBC
1491 case webrtc::kDecoderILBC :
1492 WebRtcIlbcfix_EncoderFree(iLBCenc_inst[k]);
1493 break;
1494#endif
1495#ifdef CODEC_ISAC
1496 case webrtc::kDecoderISAC:
1497 WebRtcIsac_Free(ISAC_inst[k]);
1498 break;
1499#endif
1500#ifdef NETEQ_ISACFIX_CODEC
1501 case webrtc::kDecoderISAC:
1502 WebRtcIsacfix_Free(ISAC_inst[k]);
1503 break;
1504#endif
1505#ifdef CODEC_ISAC_SWB
1506 case webrtc::kDecoderISACswb:
1507 WebRtcIsac_Free(ISACSWB_inst[k]);
1508 break;
1509#endif
1510#ifdef CODEC_GSMFR
1511 case webrtc::kDecoderGSMFR:
1512 WebRtcGSMFR_FreeEnc(GSMFRenc_inst[k]);
1513 break;
1514#endif
1515 default :
1516 printf("Error: unknown codec in call to NetEQTest_init_coders.\n");
1517 exit(0);
1518 break;
1519 }
1520 }
1521
1522 return(0);
1523}
1524
1525
1526
1527
1528
1529
pbos@webrtc.org0946a562013-04-09 00:28:06 +00001530int NetEQTest_encode(int coder, int16_t *indata, int frameLen, unsigned char * encoded,int sampleRate ,
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001531 int * vad, int useVAD, int bitrate, int numChannels){
1532
1533 short cdlen = 0;
pbos@webrtc.org0946a562013-04-09 00:28:06 +00001534 int16_t *tempdata;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001535 static int first_cng=1;
pbos@webrtc.org0946a562013-04-09 00:28:06 +00001536 int16_t tempLen;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001537
1538 *vad =1;
1539
1540 // check VAD first
1541 if(useVAD)
1542 {
1543 *vad = 0;
1544
1545 for (int k = 0; k < numChannels; k++)
1546 {
1547 tempLen = frameLen;
1548 tempdata = &indata[k*frameLen];
1549 int localVad=0;
1550 /* Partition the signal and test each chunk for VAD.
1551 All chunks must be VAD=0 to produce a total VAD=0. */
1552 while (tempLen >= 10*sampleRate/1000) {
1553 if ((tempLen % 30*sampleRate/1000) == 0) { // tempLen is multiple of 30ms
1554 localVad |= WebRtcVad_Process(VAD_inst[k] ,sampleRate, tempdata, 30*sampleRate/1000);
1555 tempdata += 30*sampleRate/1000;
1556 tempLen -= 30*sampleRate/1000;
1557 }
1558 else if (tempLen >= 20*sampleRate/1000) { // tempLen >= 20ms
1559 localVad |= WebRtcVad_Process(VAD_inst[k] ,sampleRate, tempdata, 20*sampleRate/1000);
1560 tempdata += 20*sampleRate/1000;
1561 tempLen -= 20*sampleRate/1000;
1562 }
1563 else { // use 10ms
1564 localVad |= WebRtcVad_Process(VAD_inst[k] ,sampleRate, tempdata, 10*sampleRate/1000);
1565 tempdata += 10*sampleRate/1000;
1566 tempLen -= 10*sampleRate/1000;
1567 }
1568 }
1569
1570 // aggregate all VAD decisions over all channels
1571 *vad |= localVad;
1572 }
1573
1574 if(!*vad){
1575 // all channels are silent
1576 cdlen = 0;
1577 for (int k = 0; k < numChannels; k++)
1578 {
1579 WebRtcCng_Encode(CNGenc_inst[k],&indata[k*frameLen], (frameLen <= 640 ? frameLen : 640) /* max 640 */,
1580 encoded,&tempLen,first_cng);
1581 encoded += tempLen;
1582 cdlen += tempLen;
1583 }
1584 *vad=0;
1585 first_cng=0;
1586 return(cdlen);
1587 }
1588 }
1589
1590
1591 // loop over all channels
1592 int totalLen = 0;
1593
1594 for (int k = 0; k < numChannels; k++)
1595 {
1596 /* Encode with the selected coder type */
1597 if (coder==webrtc::kDecoderPCMu) { /*g711 u-law */
1598#ifdef CODEC_G711
kwiberg@webrtc.org1c6239a2015-02-09 12:55:48 +00001599 cdlen = WebRtcG711_EncodeU(indata, frameLen, encoded);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001600#endif
1601 }
1602 else if (coder==webrtc::kDecoderPCMa) { /*g711 A-law */
1603#ifdef CODEC_G711
kwiberg@webrtc.org1c6239a2015-02-09 12:55:48 +00001604 cdlen = WebRtcG711_EncodeA(indata, frameLen, encoded);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001605 }
1606#endif
1607#ifdef CODEC_PCM16B
1608 else if ((coder==webrtc::kDecoderPCM16B)||(coder==webrtc::kDecoderPCM16Bwb)||
1609 (coder==webrtc::kDecoderPCM16Bswb32kHz)||(coder==webrtc::kDecoderPCM16Bswb48kHz)) { /*pcm16b (8kHz, 16kHz, 32kHz or 48kHz) */
kwiberg@webrtc.org648f5d62015-02-10 09:18:28 +00001610 cdlen = WebRtcPcm16b_Encode(indata, frameLen, encoded);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001611 }
1612#endif
1613#ifdef CODEC_G722
1614 else if (coder==webrtc::kDecoderG722) { /*g722 */
kwiberg@webrtc.org0cd55582014-12-02 11:45:51 +00001615 cdlen=WebRtcG722_Encode(g722EncState[k], indata, frameLen, encoded);
turaj@webrtc.org58cd3162013-10-31 15:15:55 +00001616 assert(cdlen == frameLen>>1);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001617 }
1618#endif
1619#ifdef CODEC_ILBC
1620 else if (coder==webrtc::kDecoderILBC) { /*iLBC */
kwiberg@webrtc.orgcb858ba2014-12-08 17:11:44 +00001621 cdlen = WebRtcIlbcfix_Encode(iLBCenc_inst[k], indata,
1622 frameLen, encoded);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001623 }
1624#endif
1625#if (defined(CODEC_ISAC) || defined(NETEQ_ISACFIX_CODEC)) // TODO(hlundin): remove all NETEQ_ISACFIX_CODEC
1626 else if (coder==webrtc::kDecoderISAC) { /*iSAC */
1627 int noOfCalls=0;
1628 cdlen=0;
1629 while (cdlen<=0) {
1630#ifdef CODEC_ISAC /* floating point */
kwiberg@webrtc.org7ee24a72014-09-24 10:31:02 +00001631 cdlen = WebRtcIsac_Encode(ISAC_inst[k],
1632 &indata[noOfCalls * 160],
1633 encoded);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001634#else /* fixed point */
kwiberg@webrtc.org7ee24a72014-09-24 10:31:02 +00001635 cdlen = WebRtcIsacfix_Encode(ISAC_inst[k],
1636 &indata[noOfCalls * 160],
1637 encoded);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001638#endif
1639 noOfCalls++;
1640 }
1641 }
1642#endif
1643#ifdef CODEC_ISAC_SWB
1644 else if (coder==webrtc::kDecoderISACswb) { /* iSAC SWB */
1645 int noOfCalls=0;
1646 cdlen=0;
1647 while (cdlen<=0) {
kwiberg@webrtc.org7ee24a72014-09-24 10:31:02 +00001648 cdlen = WebRtcIsac_Encode(ISACSWB_inst[k],
1649 &indata[noOfCalls * 320],
1650 encoded);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001651 noOfCalls++;
1652 }
1653 }
1654#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001655 indata += frameLen;
1656 encoded += cdlen;
1657 totalLen += cdlen;
1658
pbos@webrtc.orgd900e8b2013-07-03 15:12:26 +00001659 } // end for
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001660
1661 first_cng=1;
1662 return(totalLen);
1663}
1664
1665
1666
pkasting@chromium.orgd3245462015-02-23 21:28:22 +00001667void makeRTPheader(unsigned char* rtp_data,
1668 int payloadType,
1669 int seqNo,
1670 uint32_t timestamp,
1671 uint32_t ssrc) {
1672 rtp_data[0] = 0x80;
1673 rtp_data[1] = payloadType & 0xFF;
1674 rtp_data[2] = (seqNo >> 8) & 0xFF;
1675 rtp_data[3] = seqNo & 0xFF;
1676 rtp_data[4] = timestamp >> 24;
1677 rtp_data[5] = (timestamp >> 16) & 0xFF;
1678 rtp_data[6] = (timestamp >> 8) & 0xFF;
1679 rtp_data[7] = timestamp & 0xFF;
1680 rtp_data[8] = ssrc >> 24;
1681 rtp_data[9] = (ssrc >> 16) & 0xFF;
1682 rtp_data[10] = (ssrc >> 8) & 0xFF;
1683 rtp_data[11] = ssrc & 0xFF;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001684}
1685
1686
pkasting@chromium.orgd3245462015-02-23 21:28:22 +00001687int makeRedundantHeader(unsigned char* rtp_data,
1688 int* payloadType,
1689 int numPayloads,
1690 uint32_t* timestamp,
1691 uint16_t* blockLen,
1692 int seqNo,
1693 uint32_t ssrc)
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001694{
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001695 int i;
pkasting@chromium.orgd3245462015-02-23 21:28:22 +00001696 unsigned char* rtpPointer;
pbos@webrtc.org0946a562013-04-09 00:28:06 +00001697 uint16_t offset;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001698
1699 /* first create "standard" RTP header */
pkasting@chromium.orgd3245462015-02-23 21:28:22 +00001700 makeRTPheader(rtp_data, NETEQ_CODEC_RED_PT, seqNo, timestamp[numPayloads-1],
1701 ssrc);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001702
1703 rtpPointer = &rtp_data[12];
1704
1705 /* add one sub-header for each redundant payload (not the primary) */
pkasting@chromium.orgd3245462015-02-23 21:28:22 +00001706 for (i = 0; i < numPayloads - 1; i++) {
1707 if (blockLen[i] > 0) {
1708 offset = static_cast<uint16_t>(
1709 timestamp[numPayloads - 1] - timestamp[i]);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001710
pkasting@chromium.orgd3245462015-02-23 21:28:22 +00001711 // Byte |0| |1 2 | 3 |
1712 // Bit |0|1234567|01234567012345|6701234567|
1713 // |F|payload| timestamp | block |
1714 // | | type | offset | length |
1715 rtpPointer[0] = (payloadType[i] & 0x7F) | 0x80;
1716 rtpPointer[1] = (offset >> 6) & 0xFF;
1717 rtpPointer[2] =
1718 ((offset & 0x3F) << 2) | ((blockLen[i] >> 8) & 0x03);
1719 rtpPointer[3] = blockLen[i] & 0xFF;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001720
1721 rtpPointer += 4;
1722 }
1723 }
1724
pkasting@chromium.orgd3245462015-02-23 21:28:22 +00001725 // Bit |0|1234567|
1726 // |0|payload|
1727 // | | type |
1728 rtpPointer[0] = payloadType[numPayloads - 1] & 0x7F;
1729 ++rtpPointer;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001730
pkasting@chromium.orgd3245462015-02-23 21:28:22 +00001731 return rtpPointer - rtp_data; // length of header in bytes
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001732}
1733
1734
1735
1736int makeDTMFpayload(unsigned char* payload_data, int Event, int End, int Volume, int Duration) {
1737 unsigned char E,R,V;
1738 R=0;
1739 V=(unsigned char)Volume;
1740 if (End==0) {
1741 E = 0x00;
1742 } else {
1743 E = 0x80;
1744 }
1745 payload_data[0]=(unsigned char)Event;
1746 payload_data[1]=(unsigned char)(E|R|V);
1747 //Duration equals 8 times time_ms, default is 8000 Hz.
1748 payload_data[2]=(unsigned char)((Duration>>8)&0xFF);
1749 payload_data[3]=(unsigned char)(Duration&0xFF);
1750 return(4);
1751}
1752
pbos@webrtc.org0946a562013-04-09 00:28:06 +00001753void stereoDeInterleave(int16_t* audioSamples, int numSamples)
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001754{
1755
pbos@webrtc.org0946a562013-04-09 00:28:06 +00001756 int16_t *tempVec;
1757 int16_t *readPtr, *writeL, *writeR;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001758
1759 if (numSamples <= 0)
1760 return;
1761
pbos@webrtc.org0946a562013-04-09 00:28:06 +00001762 tempVec = (int16_t *) malloc(sizeof(int16_t) * numSamples);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001763 if (tempVec == NULL) {
1764 printf("Error allocating memory\n");
1765 exit(0);
1766 }
1767
pbos@webrtc.org0946a562013-04-09 00:28:06 +00001768 memcpy(tempVec, audioSamples, numSamples*sizeof(int16_t));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001769
1770 writeL = audioSamples;
1771 writeR = &audioSamples[numSamples/2];
1772 readPtr = tempVec;
1773
1774 for (int k = 0; k < numSamples; k += 2)
1775 {
1776 *writeL = *readPtr;
1777 readPtr++;
1778 *writeR = *readPtr;
1779 readPtr++;
1780 writeL++;
1781 writeR++;
1782 }
1783
1784 free(tempVec);
1785
1786}
1787
1788
1789void stereoInterleave(unsigned char* data, int dataLen, int stride)
1790{
1791
1792 unsigned char *ptrL, *ptrR;
1793 unsigned char temp[10];
1794
1795 if (stride > 10)
1796 {
1797 exit(0);
1798 }
1799
1800 if (dataLen%1 != 0)
1801 {
1802 // must be even number of samples
1803 printf("Error: cannot interleave odd sample number\n");
1804 exit(0);
1805 }
1806
1807 ptrL = data + stride;
1808 ptrR = &data[dataLen/2];
1809
1810 while (ptrL < ptrR) {
1811 // copy from right pointer to temp
1812 memcpy(temp, ptrR, stride);
1813
1814 // shift data between pointers
1815 memmove(ptrL + stride, ptrL, ptrR - ptrL);
1816
1817 // copy from temp to left pointer
1818 memcpy(ptrL, temp, stride);
1819
1820 // advance pointers
1821 ptrL += stride*2;
1822 ptrR += stride;
1823 }
1824
1825}