| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 // TODO(hlundin): Reformat file to meet style guide. | 11 // TODO(hlundin): Reformat file to meet style guide. |
| 12 | 12 |
| 13 /* header includes */ | 13 /* header includes */ |
| 14 #include <stdio.h> | 14 #include <stdio.h> |
| 15 #include <stdlib.h> | 15 #include <stdlib.h> |
| 16 #include <string.h> | 16 #include <string.h> |
| 17 #ifdef WIN32 | 17 #ifdef WIN32 |
| 18 #include <winsock2.h> | 18 #include <winsock2.h> |
| 19 #endif | 19 #endif |
| 20 #ifdef WEBRTC_LINUX | 20 #ifdef WEBRTC_LINUX |
| 21 #include <netinet/in.h> | 21 #include <netinet/in.h> |
| 22 #endif | 22 #endif |
| 23 | 23 |
| 24 #include <assert.h> | 24 #include <assert.h> |
| 25 | 25 |
| 26 #include <algorithm> | 26 #include <algorithm> |
| 27 | 27 |
| 28 #include "webrtc/base/checks.h" |
| 28 #include "webrtc/typedefs.h" | 29 #include "webrtc/typedefs.h" |
| 30 |
| 29 // needed for NetEqDecoder | 31 // needed for NetEqDecoder |
| 30 #include "webrtc/modules/audio_coding/neteq/audio_decoder_impl.h" | 32 #include "webrtc/modules/audio_coding/neteq/audio_decoder_impl.h" |
| 31 #include "webrtc/modules/audio_coding/neteq/include/neteq.h" | 33 #include "webrtc/modules/audio_coding/neteq/include/neteq.h" |
| 32 | 34 |
| 33 /************************/ | 35 /************************/ |
| 34 /* Define payload types */ | 36 /* Define payload types */ |
| 35 /************************/ | 37 /************************/ |
| 36 | 38 |
| 37 #include "PayloadTypes.h" | 39 #include "PayloadTypes.h" |
| 38 | 40 |
| 41 namespace { |
| 42 const size_t kRtpDataSize = 8000; |
| 43 } |
| 44 |
| 39 /*********************/ | 45 /*********************/ |
| 40 /* Misc. definitions */ | 46 /* Misc. definitions */ |
| 41 /*********************/ | 47 /*********************/ |
| 42 | 48 |
| 43 #define STOPSENDTIME 3000 | 49 #define STOPSENDTIME 3000 |
| 44 #define RESTARTSENDTIME 0 // 162500 | 50 #define RESTARTSENDTIME 0 // 162500 |
| 45 #define FIRSTLINELEN 40 | 51 #define FIRSTLINELEN 40 |
| 46 #define CHECK_NOT_NULL(a) \ | 52 #define CHECK_NOT_NULL(a) \ |
| 47 if ((a) == 0) { \ | 53 if ((a) == 0) { \ |
| 48 printf("\n %s \n line: %d \nerror at %s\n", __FILE__, __LINE__, #a); \ | 54 printf("\n %s \n line: %d \nerror at %s\n", __FILE__, __LINE__, #a); \ |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 #include "GSMFRInterface.h" | 192 #include "GSMFRInterface.h" |
| 187 #include "GSMFRCreation.h" | 193 #include "GSMFRCreation.h" |
| 188 #endif | 194 #endif |
| 189 #if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \ | 195 #if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \ |
| 190 defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48)) | 196 defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48)) |
| 191 #include "webrtc/modules/audio_coding/codecs/cng/webrtc_cng.h" | 197 #include "webrtc/modules/audio_coding/codecs/cng/webrtc_cng.h" |
| 192 #endif | 198 #endif |
| 193 #if ((defined CODEC_SPEEX_8) || (defined CODEC_SPEEX_16)) | 199 #if ((defined CODEC_SPEEX_8) || (defined CODEC_SPEEX_16)) |
| 194 #include "SpeexInterface.h" | 200 #include "SpeexInterface.h" |
| 195 #endif | 201 #endif |
| 202 #ifdef CODEC_OPUS |
| 203 #include "webrtc/modules/audio_coding/codecs/opus/opus_interface.h" |
| 204 #endif |
| 196 | 205 |
| 197 /***********************************/ | 206 /***********************************/ |
| 198 /* Global codec instance variables */ | 207 /* Global codec instance variables */ |
| 199 /***********************************/ | 208 /***********************************/ |
| 200 | 209 |
| 201 WebRtcVadInst* VAD_inst[2]; | 210 WebRtcVadInst* VAD_inst[2]; |
| 202 | 211 |
| 203 #ifdef CODEC_G722 | 212 #ifdef CODEC_G722 |
| 204 G722EncInst* g722EncState[2]; | 213 G722EncInst* g722EncState[2]; |
| 205 #endif | 214 #endif |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 257 #if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \ | 266 #if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \ |
| 258 defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48)) | 267 defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48)) |
| 259 CNG_enc_inst* CNGenc_inst[2]; | 268 CNG_enc_inst* CNGenc_inst[2]; |
| 260 #endif | 269 #endif |
| 261 #ifdef CODEC_SPEEX_8 | 270 #ifdef CODEC_SPEEX_8 |
| 262 SPEEX_encinst_t* SPEEX8enc_inst[2]; | 271 SPEEX_encinst_t* SPEEX8enc_inst[2]; |
| 263 #endif | 272 #endif |
| 264 #ifdef CODEC_SPEEX_16 | 273 #ifdef CODEC_SPEEX_16 |
| 265 SPEEX_encinst_t* SPEEX16enc_inst[2]; | 274 SPEEX_encinst_t* SPEEX16enc_inst[2]; |
| 266 #endif | 275 #endif |
| 276 #ifdef CODEC_OPUS |
| 277 OpusEncInst* opus_inst[2]; |
| 278 #endif |
| 267 | 279 |
| 268 int main(int argc, char* argv[]) { | 280 int main(int argc, char* argv[]) { |
| 269 size_t packet_size; | 281 size_t packet_size; |
| 270 int fs; | 282 int fs; |
| 271 webrtc::NetEqDecoder usedCodec; | 283 webrtc::NetEqDecoder usedCodec; |
| 272 int payloadType; | 284 int payloadType; |
| 273 int bitrate = 0; | 285 int bitrate = 0; |
| 274 int useVAD, vad; | 286 int useVAD, vad; |
| 275 int useRed = 0; | 287 int useRed = 0; |
| 276 size_t len, enc_len; | 288 size_t len, enc_len; |
| 277 int16_t org_data[4000]; | 289 int16_t org_data[4000]; |
| 278 unsigned char rtp_data[8000]; | 290 unsigned char rtp_data[kRtpDataSize]; |
| 279 int16_t seqNo = 0xFFF; | 291 int16_t seqNo = 0xFFF; |
| 280 uint32_t ssrc = 1235412312; | 292 uint32_t ssrc = 1235412312; |
| 281 uint32_t timestamp = 0xAC1245; | 293 uint32_t timestamp = 0xAC1245; |
| 282 uint16_t length, plen; | 294 uint16_t length, plen; |
| 283 uint32_t offset; | 295 uint32_t offset; |
| 284 double sendtime = 0; | 296 double sendtime = 0; |
| 285 int red_PT[2] = {0}; | 297 int red_PT[2] = {0}; |
| 286 uint32_t red_TS[2] = {0}; | 298 uint32_t red_TS[2] = {0}; |
| 287 uint16_t red_len[2] = {0}; | 299 uint16_t red_len[2] = {0}; |
| 288 size_t RTPheaderLen = 12; | 300 size_t RTPheaderLen = 12; |
| 289 uint8_t red_data[8000]; | 301 uint8_t red_data[kRtpDataSize]; |
| 290 #ifdef INSERT_OLD_PACKETS | 302 #ifdef INSERT_OLD_PACKETS |
| 291 uint16_t old_length, old_plen; | 303 uint16_t old_length, old_plen; |
| 292 size_t old_enc_len; | 304 size_t old_enc_len; |
| 293 int first_old_packet = 1; | 305 int first_old_packet = 1; |
| 294 unsigned char old_rtp_data[8000]; | 306 unsigned char old_rtp_data[kRtpDataSize]; |
| 295 size_t packet_age = 0; | 307 size_t packet_age = 0; |
| 296 #endif | 308 #endif |
| 297 #ifdef INSERT_DTMF_PACKETS | 309 #ifdef INSERT_DTMF_PACKETS |
| 298 int NTone = 1; | 310 int NTone = 1; |
| 299 int DTMFfirst = 1; | 311 int DTMFfirst = 1; |
| 300 uint32_t DTMFtimestamp; | 312 uint32_t DTMFtimestamp; |
| 301 bool dtmfSent = false; | 313 bool dtmfSent = false; |
| 302 #endif | 314 #endif |
| 303 bool usingStereo = false; | 315 bool usingStereo = false; |
| 304 size_t stereoMode = 0; | 316 size_t stereoMode = 0; |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 422 #endif | 434 #endif |
| 423 #ifdef CODEC_RED | 435 #ifdef CODEC_RED |
| 424 #ifdef CODEC_G711 | 436 #ifdef CODEC_G711 |
| 425 printf(" : red_pcm Redundancy RTP packet with 2*G711A " | 437 printf(" : red_pcm Redundancy RTP packet with 2*G711A " |
| 426 "frames\n"); | 438 "frames\n"); |
| 427 #endif | 439 #endif |
| 428 #ifdef CODEC_ISAC | 440 #ifdef CODEC_ISAC |
| 429 printf(" : red_isac Redundancy RTP packet with 2*iSAC " | 441 printf(" : red_isac Redundancy RTP packet with 2*iSAC " |
| 430 "frames\n"); | 442 "frames\n"); |
| 431 #endif | 443 #endif |
| 444 #endif // CODEC_RED |
| 445 #ifdef CODEC_OPUS |
| 446 printf(" : opus Opus codec with FEC (48kHz, 32kbps, FEC" |
| 447 " on and tuned for 5%% packet losses)\n"); |
| 432 #endif | 448 #endif |
| 433 printf("\n"); | 449 printf("\n"); |
| 434 | 450 |
| 435 #if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \ | 451 #if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \ |
| 436 defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48)) | 452 defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48)) |
| 437 printf("useVAD : 0 Voice Activity Detection is switched off\n"); | 453 printf("useVAD : 0 Voice Activity Detection is switched off\n"); |
| 438 printf(" : 1 Voice Activity Detection is switched on\n\n"); | 454 printf(" : 1 Voice Activity Detection is switched on\n\n"); |
| 439 #else | 455 #else |
| 440 printf("useVAD : 0 Voice Activity Detection switched off (on not " | 456 printf("useVAD : 0 Voice Activity Detection switched off (on not " |
| 441 "supported)\n\n"); | 457 "supported)\n\n"); |
| (...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 873 } else if (!strcmp(name, "red_pcm")) { | 889 } else if (!strcmp(name, "red_pcm")) { |
| 874 *codec = webrtc::NetEqDecoder::kDecoderPCMa; | 890 *codec = webrtc::NetEqDecoder::kDecoderPCMa; |
| 875 *PT = NETEQ_CODEC_PCMA_PT; /* this will be the PT for the sub-headers */ | 891 *PT = NETEQ_CODEC_PCMA_PT; /* this will be the PT for the sub-headers */ |
| 876 *fs = 8000; | 892 *fs = 8000; |
| 877 *useRed = 1; | 893 *useRed = 1; |
| 878 } else if (!strcmp(name, "red_isac")) { | 894 } else if (!strcmp(name, "red_isac")) { |
| 879 *codec = webrtc::NetEqDecoder::kDecoderISAC; | 895 *codec = webrtc::NetEqDecoder::kDecoderISAC; |
| 880 *PT = NETEQ_CODEC_ISAC_PT; /* this will be the PT for the sub-headers */ | 896 *PT = NETEQ_CODEC_ISAC_PT; /* this will be the PT for the sub-headers */ |
| 881 *fs = 16000; | 897 *fs = 16000; |
| 882 *useRed = 1; | 898 *useRed = 1; |
| 899 } else if (!strcmp(name, "opus")) { |
| 900 *codec = webrtc::NetEqDecoder::kDecoderOpus; |
| 901 *PT = NETEQ_CODEC_OPUS_PT; /* this will be the PT for the sub-headers */ |
| 902 *fs = 48000; |
| 883 } else { | 903 } else { |
| 884 printf("Error: Not a supported codec (%s)\n", name); | 904 printf("Error: Not a supported codec (%s)\n", name); |
| 885 exit(0); | 905 exit(0); |
| 886 } | 906 } |
| 887 } | 907 } |
| 888 | 908 |
| 889 int NetEQTest_init_coders(webrtc::NetEqDecoder coder, | 909 int NetEQTest_init_coders(webrtc::NetEqDecoder coder, |
| 890 size_t enc_frameSize, | 910 size_t enc_frameSize, |
| 891 int bitrate, | 911 int bitrate, |
| 892 int sampfreq, | 912 int sampfreq, |
| (...skipping 511 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1404 "enc_frameSize\n"); | 1424 "enc_frameSize\n"); |
| 1405 exit(0); | 1425 exit(0); |
| 1406 } | 1426 } |
| 1407 WebRtcGSMFR_EncoderInit(GSMFRenc_inst[k], 0); | 1427 WebRtcGSMFR_EncoderInit(GSMFRenc_inst[k], 0); |
| 1408 } else { | 1428 } else { |
| 1409 printf("\nError - GSM FR is only developed for 8kHz \n"); | 1429 printf("\nError - GSM FR is only developed for 8kHz \n"); |
| 1410 exit(0); | 1430 exit(0); |
| 1411 } | 1431 } |
| 1412 break; | 1432 break; |
| 1413 #endif | 1433 #endif |
| 1434 #ifdef CODEC_OPUS |
| 1435 case webrtc::NetEqDecoder::kDecoderOpus: |
| 1436 ok = WebRtcOpus_EncoderCreate(&opus_inst[k], 1, 0); |
| 1437 if (ok != 0) { |
| 1438 printf("Error: Couldn't allocate memory for Opus encoding " |
| 1439 "instance\n"); |
| 1440 exit(0); |
| 1441 } |
| 1442 WebRtcOpus_EnableFec(opus_inst[k]); |
| 1443 WebRtcOpus_SetPacketLossRate(opus_inst[k], 5); |
| 1444 break; |
| 1445 #endif |
| 1414 default: | 1446 default: |
| 1415 printf("Error: unknown codec in call to NetEQTest_init_coders.\n"); | 1447 printf("Error: unknown codec in call to NetEQTest_init_coders.\n"); |
| 1416 exit(0); | 1448 exit(0); |
| 1417 break; | 1449 break; |
| 1418 } | 1450 } |
| 1419 | |
| 1420 if (ok != 0) { | 1451 if (ok != 0) { |
| 1421 return (ok); | 1452 return (ok); |
| 1422 } | 1453 } |
| 1423 } // end for | 1454 } // end for |
| 1424 | 1455 |
| 1425 return (0); | 1456 return (0); |
| 1426 } | 1457 } |
| 1427 | 1458 |
| 1428 int NetEQTest_free_coders(webrtc::NetEqDecoder coder, size_t numChannels) { | 1459 int NetEQTest_free_coders(webrtc::NetEqDecoder coder, size_t numChannels) { |
| 1429 for (size_t k = 0; k < numChannels; k++) { | 1460 for (size_t k = 0; k < numChannels; k++) { |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1536 #ifdef CODEC_ISAC_SWB | 1567 #ifdef CODEC_ISAC_SWB |
| 1537 case webrtc::NetEqDecoder::kDecoderISACswb: | 1568 case webrtc::NetEqDecoder::kDecoderISACswb: |
| 1538 WebRtcIsac_Free(ISACSWB_inst[k]); | 1569 WebRtcIsac_Free(ISACSWB_inst[k]); |
| 1539 break; | 1570 break; |
| 1540 #endif | 1571 #endif |
| 1541 #ifdef CODEC_GSMFR | 1572 #ifdef CODEC_GSMFR |
| 1542 case webrtc::NetEqDecoder::kDecoderGSMFR: | 1573 case webrtc::NetEqDecoder::kDecoderGSMFR: |
| 1543 WebRtcGSMFR_FreeEnc(GSMFRenc_inst[k]); | 1574 WebRtcGSMFR_FreeEnc(GSMFRenc_inst[k]); |
| 1544 break; | 1575 break; |
| 1545 #endif | 1576 #endif |
| 1577 #ifdef CODEC_OPUS |
| 1578 case webrtc::NetEqDecoder::kDecoderOpus: |
| 1579 WebRtcOpus_EncoderFree(opus_inst[k]); |
| 1580 break; |
| 1581 #endif |
| 1546 default: | 1582 default: |
| 1547 printf("Error: unknown codec in call to NetEQTest_init_coders.\n"); | 1583 printf("Error: unknown codec in call to NetEQTest_init_coders.\n"); |
| 1548 exit(0); | 1584 exit(0); |
| 1549 break; | 1585 break; |
| 1550 } | 1586 } |
| 1551 } | 1587 } |
| 1552 | 1588 |
| 1553 return (0); | 1589 return (0); |
| 1554 } | 1590 } |
| 1555 | 1591 |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1680 int noOfCalls = 0; | 1716 int noOfCalls = 0; |
| 1681 int res = 0; | 1717 int res = 0; |
| 1682 while (res <= 0) { | 1718 while (res <= 0) { |
| 1683 res = WebRtcIsac_Encode(ISACSWB_inst[k], &indata[noOfCalls * 320], | 1719 res = WebRtcIsac_Encode(ISACSWB_inst[k], &indata[noOfCalls * 320], |
| 1684 encoded); | 1720 encoded); |
| 1685 noOfCalls++; | 1721 noOfCalls++; |
| 1686 } | 1722 } |
| 1687 cdlen = static_cast<size_t>(res); | 1723 cdlen = static_cast<size_t>(res); |
| 1688 } | 1724 } |
| 1689 #endif | 1725 #endif |
| 1726 #ifdef CODEC_OPUS |
| 1727 cdlen = WebRtcOpus_Encode(opus_inst[k], indata, frameLen, kRtpDataSize - 12, |
| 1728 encoded); |
| 1729 RTC_CHECK_GT(cdlen, 0u); |
| 1730 #endif |
| 1690 indata += frameLen; | 1731 indata += frameLen; |
| 1691 encoded += cdlen; | 1732 encoded += cdlen; |
| 1692 totalLen += cdlen; | 1733 totalLen += cdlen; |
| 1693 | 1734 |
| 1694 } // end for | 1735 } // end for |
| 1695 | 1736 |
| 1696 first_cng = 1; | 1737 first_cng = 1; |
| 1697 return (totalLen); | 1738 return (totalLen); |
| 1698 } | 1739 } |
| 1699 | 1740 |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1837 memmove(ptrL + stride, ptrL, ptrR - ptrL); | 1878 memmove(ptrL + stride, ptrL, ptrR - ptrL); |
| 1838 | 1879 |
| 1839 // copy from temp to left pointer | 1880 // copy from temp to left pointer |
| 1840 memcpy(ptrL, temp, stride); | 1881 memcpy(ptrL, temp, stride); |
| 1841 | 1882 |
| 1842 // advance pointers | 1883 // advance pointers |
| 1843 ptrL += stride * 2; | 1884 ptrL += stride * 2; |
| 1844 ptrR += stride; | 1885 ptrR += stride; |
| 1845 } | 1886 } |
| 1846 } | 1887 } |
| OLD | NEW |