/* * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #include "TestAllCodecs.h" #include "audio_coding_module_typedefs.h" #include "common_types.h" #include "engine_configurations.h" #include #include #include "trace.h" #include "utility.h" // Class for simulating packet handling TestPack::TestPack(): _receiverACM(NULL), _seqNo(0), _timeStampDiff(0), _lastInTimestamp(0), _totalBytes(0), _payloadSize(0) { } TestPack::~TestPack() { } void TestPack::RegisterReceiverACM(AudioCodingModule* acm) { _receiverACM = acm; return; } WebRtc_Word32 TestPack::SendData( const FrameType frameType, const WebRtc_UWord8 payloadType, const WebRtc_UWord32 timeStamp, const WebRtc_UWord8* payloadData, const WebRtc_UWord16 payloadSize, const RTPFragmentationHeader* fragmentation) { WebRtcRTPHeader rtpInfo; WebRtc_Word32 status; WebRtc_UWord16 payloadDataSize = payloadSize; rtpInfo.header.markerBit = false; rtpInfo.header.ssrc = 0; rtpInfo.header.sequenceNumber = _seqNo++; rtpInfo.header.payloadType = payloadType; rtpInfo.header.timestamp = timeStamp; if(frameType == kAudioFrameCN) { rtpInfo.type.Audio.isCNG = true; } else { rtpInfo.type.Audio.isCNG = false; } if(frameType == kFrameEmpty) { // Skip this frame return 0; } rtpInfo.type.Audio.channel = 1; memcpy(_payloadData, payloadData, payloadDataSize); status = _receiverACM->IncomingPacket((WebRtc_Word8*)_payloadData, payloadDataSize, rtpInfo); _payloadSize = payloadDataSize; _timeStampDiff = timeStamp - _lastInTimestamp; _lastInTimestamp = timeStamp; _totalBytes += payloadDataSize; return status; } WebRtc_UWord16 TestPack::GetPayloadSize() { return _payloadSize; } WebRtc_UWord32 TestPack::GetTimeStampDiff() { return _timeStampDiff; } void TestPack::ResetPayloadSize() { _payloadSize = 0; } TestAllCodecs::TestAllCodecs(int testMode): _acmA(NULL), _acmB(NULL), _channelA2B(NULL), _testCntr(0), _packSizeSamp(0), _packSizeBytes(0), _counter(0) { // testMode = 0 for silent test (auto test) _testMode = testMode; } using namespace std; TestAllCodecs::~TestAllCodecs() { if(_acmA != NULL) { AudioCodingModule::Destroy(_acmA); _acmA = NULL; } if(_acmB != NULL) { AudioCodingModule::Destroy(_acmB); _acmB = NULL; } if(_channelA2B != NULL) { delete _channelA2B; _channelA2B = NULL; } } void TestAllCodecs::Perform() { char file[] = "./modules/audio_coding/main/test/testfile32kHz.pcm"; _inFileA.Open(file, 32000, "rb"); if(_testMode == 0) { printf("Running All Codecs Test"); WEBRTC_TRACE(webrtc::kTraceStateInfo, webrtc::kTraceAudioCoding, -1, "---------- TestAllCodecs ----------"); } _acmA = AudioCodingModule::Create(0); _acmB = AudioCodingModule::Create(1); _acmA->InitializeReceiver(); _acmB->InitializeReceiver(); WebRtc_UWord8 numEncoders = _acmA->NumberOfCodecs(); CodecInst myCodecParam; for(WebRtc_UWord8 n = 0; n < numEncoders; n++) { _acmB->Codec(n, myCodecParam); _acmB->RegisterReceiveCodec(myCodecParam); } // Create and connect the channel _channelA2B = new TestPack; _acmA->RegisterTransportCallback(_channelA2B); _channelA2B->RegisterReceiverACM(_acmB); // All codecs are tested for all allowed sampling frequencies, rates and packet sizes #ifdef WEBRTC_CODEC_GSMAMR if(_testMode != 0) { printf("=======================================================================\n"); } else { printf("."); } _testCntr++; OpenOutFile(_testCntr); char codecAMR[] = "AMR"; RegisterSendCodec('A', codecAMR, 8000, 4750, 160, 2); Run(_channelA2B); RegisterSendCodec('A', codecAMR, 8000, 4750, 320, 2); Run(_channelA2B); RegisterSendCodec('A', codecAMR, 8000, 4750, 480, 3); Run(_channelA2B); RegisterSendCodec('A', codecAMR, 8000, 5150, 160, 2); Run(_channelA2B); RegisterSendCodec('A', codecAMR, 8000, 5150, 320, 2); Run(_channelA2B); RegisterSendCodec('A', codecAMR, 8000, 5150, 480, 3); Run(_channelA2B); RegisterSendCodec('A', codecAMR, 8000, 5900, 160, 1); Run(_channelA2B); RegisterSendCodec('A', codecAMR, 8000, 5900, 320, 2); Run(_channelA2B); RegisterSendCodec('A', codecAMR, 8000, 5900, 480, 2); Run(_channelA2B); RegisterSendCodec('A', codecAMR, 8000, 6700, 160, 1); Run(_channelA2B); RegisterSendCodec('A', codecAMR, 8000, 6700, 320, 2); Run(_channelA2B); RegisterSendCodec('A', codecAMR, 8000, 6700, 480, 2); Run(_channelA2B); RegisterSendCodec('A', codecAMR, 8000, 7400, 160, 1); Run(_channelA2B); RegisterSendCodec('A', codecAMR, 8000, 7400, 320, 2); Run(_channelA2B); RegisterSendCodec('A', codecAMR, 8000, 7400, 480, 3); Run(_channelA2B); RegisterSendCodec('A', codecAMR, 8000, 7950, 160, 2); Run(_channelA2B); RegisterSendCodec('A', codecAMR, 8000, 7950, 320, 2); Run(_channelA2B); RegisterSendCodec('A', codecAMR, 8000, 7950, 480, 3); Run(_channelA2B); RegisterSendCodec('A', codecAMR, 8000, 10200, 160, 1); Run(_channelA2B); RegisterSendCodec('A', codecAMR, 8000, 10200, 320, 2); Run(_channelA2B); RegisterSendCodec('A', codecAMR, 8000, 10200, 480, 3); Run(_channelA2B); RegisterSendCodec('A', codecAMR, 8000, 12200, 160, 1); Run(_channelA2B); RegisterSendCodec('A', codecAMR, 8000, 12200, 320, 2); Run(_channelA2B); RegisterSendCodec('A', codecAMR, 8000, 12200, 480, 3); Run(_channelA2B); _outFileB.Close(); #endif #ifdef WEBRTC_CODEC_GSMAMRWB if(_testMode != 0) { printf("=======================================================================\n"); } else { printf("."); } _testCntr++; char codecAMRWB[] = "AMR-WB"; OpenOutFile(_testCntr); RegisterSendCodec('A', codecAMRWB, 16000, 7000, 320, 0); Run(_channelA2B); RegisterSendCodec('A', codecAMRWB, 16000, 7000, 640, 0); Run(_channelA2B); RegisterSendCodec('A', codecAMRWB, 16000, 7000, 960, 0); Run(_channelA2B); RegisterSendCodec('A', codecAMRWB, 16000, 9000, 320, 1); Run(_channelA2B); RegisterSendCodec('A', codecAMRWB, 16000, 9000, 640, 2); Run(_channelA2B); RegisterSendCodec('A', codecAMRWB, 16000, 9000, 960, 2); Run(_channelA2B); RegisterSendCodec('A', codecAMRWB, 16000, 12000, 320, 3); Run(_channelA2B); RegisterSendCodec('A', codecAMRWB, 16000, 12000, 640, 6); Run(_channelA2B); RegisterSendCodec('A', codecAMRWB, 16000, 12000, 960, 8); Run(_channelA2B); RegisterSendCodec('A', codecAMRWB, 16000, 14000, 320, 2); Run(_channelA2B); RegisterSendCodec('A', codecAMRWB, 16000, 14000, 640, 4); Run(_channelA2B); RegisterSendCodec('A', codecAMRWB, 16000, 14000, 960, 5); Run(_channelA2B); RegisterSendCodec('A', codecAMRWB, 16000, 16000, 320, 1); Run(_channelA2B); RegisterSendCodec('A', codecAMRWB, 16000, 16000, 640, 2); Run(_channelA2B); RegisterSendCodec('A', codecAMRWB, 16000, 16000, 960, 2); Run(_channelA2B); RegisterSendCodec('A', codecAMRWB, 16000, 18000, 320, 2); Run(_channelA2B); RegisterSendCodec('A', codecAMRWB, 16000, 18000, 640, 4); Run(_channelA2B); RegisterSendCodec('A', codecAMRWB, 16000, 18000, 960, 5); Run(_channelA2B); RegisterSendCodec('A', codecAMRWB, 16000, 20000, 320, 1); Run(_channelA2B); RegisterSendCodec('A', codecAMRWB, 16000, 20000, 640, 2); Run(_channelA2B); RegisterSendCodec('A', codecAMRWB, 16000, 20000, 960, 2); Run(_channelA2B); RegisterSendCodec('A', codecAMRWB, 16000, 23000, 320, 1); Run(_channelA2B); RegisterSendCodec('A', codecAMRWB, 16000, 23000, 640, 3); Run(_channelA2B); RegisterSendCodec('A', codecAMRWB, 16000, 23000, 960, 3); Run(_channelA2B); RegisterSendCodec('A', codecAMRWB, 16000, 24000, 320, 1); Run(_channelA2B); RegisterSendCodec('A', codecAMRWB, 16000, 24000, 640, 2); Run(_channelA2B); RegisterSendCodec('A', codecAMRWB, 16000, 24000, 960, 2); Run(_channelA2B); _outFileB.Close(); #endif #ifdef WEBRTC_CODEC_G722 if(_testMode != 0) { printf("=======================================================================\n"); } else { printf("."); } _testCntr++; OpenOutFile(_testCntr); char codecG722[] = "G722"; RegisterSendCodec('A', codecG722, 16000, 64000, 160, 0); Run(_channelA2B); RegisterSendCodec('A', codecG722, 16000, 64000, 320, 0); Run(_channelA2B); RegisterSendCodec('A', codecG722, 16000, 64000, 480, 0); Run(_channelA2B); RegisterSendCodec('A', codecG722, 16000, 64000, 640, 0); Run(_channelA2B); RegisterSendCodec('A', codecG722, 16000, 64000, 800, 0); Run(_channelA2B); RegisterSendCodec('A', codecG722, 16000, 64000, 960, 0); Run(_channelA2B); _outFileB.Close(); #endif #ifdef WEBRTC_CODEC_G722_1 if(_testMode != 0) { printf("=======================================================================\n"); } else { printf("."); } _testCntr++; OpenOutFile(_testCntr); char codecG7221_1[] = "G7221"; RegisterSendCodec('A', codecG7221_1, 16000, 32000, 320, 0); Run(_channelA2B); RegisterSendCodec('A', codecG7221_1, 16000, 24000, 320, 0); Run(_channelA2B); RegisterSendCodec('A', codecG7221_1, 16000, 16000, 320, 0); Run(_channelA2B); _outFileB.Close(); #endif #ifdef WEBRTC_CODEC_G722_1C if(_testMode != 0) { printf("=======================================================================\n"); } else { printf("."); } _testCntr++; OpenOutFile(_testCntr); char codecG7221_2[] = "G7221"; RegisterSendCodec('A', codecG7221_2, 32000, 48000, 640, 0); Run(_channelA2B); RegisterSendCodec('A', codecG7221_2, 32000, 32000, 640, 0); Run(_channelA2B); RegisterSendCodec('A', codecG7221_2, 32000, 24000, 640, 0); Run(_channelA2B); _outFileB.Close(); #endif #ifdef WEBRTC_CODEC_G729 if(_testMode != 0) { printf("=======================================================================\n"); } else { printf("."); } _testCntr++; OpenOutFile(_testCntr); char codecG729[] = "G729"; RegisterSendCodec('A', codecG729, 8000, 8000, 80, 0); Run(_channelA2B); RegisterSendCodec('A', codecG729, 8000, 8000, 160, 0); Run(_channelA2B); RegisterSendCodec('A', codecG729, 8000, 8000, 240, 0); Run(_channelA2B); RegisterSendCodec('A', codecG729, 8000, 8000, 320, 0); Run(_channelA2B); RegisterSendCodec('A', codecG729, 8000, 8000, 400, 0); Run(_channelA2B); RegisterSendCodec('A', codecG729, 8000, 8000, 480, 0); Run(_channelA2B); _outFileB.Close(); #endif #ifdef WEBRTC_CODEC_G729_1 if(_testMode != 0) { printf("=======================================================================\n"); } else { printf("."); } _testCntr++; OpenOutFile(_testCntr); char codecG7291[] = "G7291"; RegisterSendCodec('A', codecG7291, 16000, 8000, 320, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 8000, 640, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 8000, 960, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 12000, 320, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 12000, 640, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 12000, 960, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 14000, 320, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 14000, 640, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 14000, 960, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 16000, 320, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 16000, 640, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 16000, 960, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 18000, 320, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 18000, 640, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 18000, 960, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 20000, 320, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 20000, 640, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 20000, 960, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 22000, 320, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 22000, 640, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 22000, 960, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 24000, 320, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 24000, 640, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 24000, 960, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 26000, 320, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 26000, 640, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 26000, 960, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 28000, 320, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 28000, 640, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 28000, 960, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 30000, 320, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 30000, 640, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 30000, 960, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 32000, 320, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 32000, 640, 1); Run(_channelA2B); RegisterSendCodec('A', codecG7291, 16000, 32000, 960, 1); Run(_channelA2B); _outFileB.Close(); #endif #ifdef WEBRTC_CODEC_GSMFR if(_testMode != 0) { printf("=======================================================================\n"); } else { printf("."); } _testCntr++; OpenOutFile(_testCntr); char codecGSM[] = "GSM"; RegisterSendCodec('A', codecGSM, 8000, 13200, 160, 0); Run(_channelA2B); RegisterSendCodec('A', codecGSM, 8000, 13200, 320, 0); Run(_channelA2B); RegisterSendCodec('A', codecGSM, 8000, 13200, 480, 0); Run(_channelA2B); _outFileB.Close(); #endif #ifdef WEBRTC_CODEC_ILBC if(_testMode != 0) { printf("=======================================================================\n"); } else { printf("."); } _testCntr++; OpenOutFile(_testCntr); char codecILBC[] = "ILBC"; RegisterSendCodec('A', codecILBC, 8000, 13300, 240, 0); Run(_channelA2B); RegisterSendCodec('A', codecILBC, 8000, 13300, 480, 0); Run(_channelA2B); RegisterSendCodec('A', codecILBC, 8000, 15200, 160, 0); Run(_channelA2B); RegisterSendCodec('A', codecILBC, 8000, 15200, 320, 0); Run(_channelA2B); _outFileB.Close(); #endif #if (defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX)) if(_testMode != 0) { printf("=======================================================================\n"); } else { printf("."); } _testCntr++; OpenOutFile(_testCntr); char codecISAC[] = "ISAC"; RegisterSendCodec('A', codecISAC, 16000, -1, 480, -1); Run(_channelA2B); RegisterSendCodec('A', codecISAC, 16000, -1, 960, -1); Run(_channelA2B); RegisterSendCodec('A', codecISAC, 16000, 15000, 480, -1); Run(_channelA2B); RegisterSendCodec('A', codecISAC, 16000, 32000, 960, -1); Run(_channelA2B); _outFileB.Close(); #endif #ifdef WEBRTC_CODEC_ISAC if(_testMode != 0) { printf("=======================================================================\n"); } else { printf("."); } _testCntr++; OpenOutFile(_testCntr); RegisterSendCodec('A', codecISAC, 32000, -1, 960, -1); Run(_channelA2B); RegisterSendCodec('A', codecISAC, 32000, 56000, 960, -1); Run(_channelA2B); RegisterSendCodec('A', codecISAC, 32000, 37000, 960, -1); Run(_channelA2B); RegisterSendCodec('A', codecISAC, 32000, 32000, 960, -1); Run(_channelA2B); _outFileB.Close(); #endif #ifdef WEBRTC_CODEC_PCM16 if(_testMode != 0) { printf("=======================================================================\n"); } else { printf("."); } _testCntr++; OpenOutFile(_testCntr); char codecL16[] = "L16"; RegisterSendCodec('A', codecL16, 8000, 128000, 80, 0); Run(_channelA2B); RegisterSendCodec('A', codecL16, 8000, 128000, 160, 0); Run(_channelA2B); RegisterSendCodec('A', codecL16, 8000, 128000, 240, 0); Run(_channelA2B); RegisterSendCodec('A', codecL16, 8000, 128000, 320, 0); Run(_channelA2B); _outFileB.Close(); if(_testMode != 0) { printf("=======================================================================\n"); } else { printf("."); } _testCntr++; OpenOutFile(_testCntr); RegisterSendCodec('A', codecL16, 16000, 256000, 160, 0); Run(_channelA2B); RegisterSendCodec('A', codecL16, 16000, 256000, 320, 0); Run(_channelA2B); RegisterSendCodec('A', codecL16, 16000, 256000, 480, 0); Run(_channelA2B); RegisterSendCodec('A', codecL16, 16000, 256000, 640, 0); Run(_channelA2B); _outFileB.Close(); if(_testMode != 0) { printf("=======================================================================\n"); } else { printf("."); } _testCntr++; OpenOutFile(_testCntr); RegisterSendCodec('A', codecL16, 32000, 512000, 320, 0); Run(_channelA2B); RegisterSendCodec('A', codecL16, 32000, 512000, 640, 0); Run(_channelA2B); _outFileB.Close(); #endif if(_testMode != 0) { printf("=======================================================================\n"); } else { printf("."); } _testCntr++; OpenOutFile(_testCntr); char codecPCMA[] = "PCMA"; RegisterSendCodec('A', codecPCMA, 8000, 64000, 80, 0); Run(_channelA2B); RegisterSendCodec('A', codecPCMA, 8000, 64000, 160, 0); Run(_channelA2B); RegisterSendCodec('A', codecPCMA, 8000, 64000, 240, 0); Run(_channelA2B); RegisterSendCodec('A', codecPCMA, 8000, 64000, 320, 0); Run(_channelA2B); RegisterSendCodec('A', codecPCMA, 8000, 64000, 400, 0); Run(_channelA2B); RegisterSendCodec('A', codecPCMA, 8000, 64000, 480, 0); if(_testMode != 0) { printf("=======================================================================\n"); } else { printf("."); } _testCntr++; Run(_channelA2B); char codecPCMU[] = "PCMU"; RegisterSendCodec('A', codecPCMU, 8000, 64000, 80, 0); Run(_channelA2B); RegisterSendCodec('A', codecPCMU, 8000, 64000, 160, 0); Run(_channelA2B); RegisterSendCodec('A', codecPCMU, 8000, 64000, 240, 0); Run(_channelA2B); RegisterSendCodec('A', codecPCMU, 8000, 64000, 320, 0); Run(_channelA2B); RegisterSendCodec('A', codecPCMU, 8000, 64000, 400, 0); Run(_channelA2B); RegisterSendCodec('A', codecPCMU, 8000, 64000, 480, 0); Run(_channelA2B); _outFileB.Close(); #ifdef WEBRTC_CODEC_SPEEX if(_testMode != 0) { printf("=======================================================================\n"); } else { printf("."); } _testCntr++; OpenOutFile(_testCntr); char codecSPEEX[] = "SPEEX"; RegisterSendCodec('A', codecSPEEX, 8000, 2400, 160, 0); Run(_channelA2B); RegisterSendCodec('A', codecSPEEX, 8000, 8000, 320, 0); Run(_channelA2B); RegisterSendCodec('A', codecSPEEX, 8000, 18200, 480, 0); Run(_channelA2B); _outFileB.Close(); if(_testMode != 0) { printf("=======================================================================\n"); } else { printf("."); } _testCntr++; OpenOutFile(_testCntr); RegisterSendCodec('A', codecSPEEX, 16000, 4000, 320, 0); Run(_channelA2B); RegisterSendCodec('A', codecSPEEX, 16000, 12800, 640, 0); Run(_channelA2B); RegisterSendCodec('A', codecSPEEX, 16000, 34200, 960, 0); Run(_channelA2B); _outFileB.Close(); #endif if(_testMode != 0) { printf("=======================================================================\n"); } else { printf("Done!\n"); } /* Print out all codecs that were not tested in the run */ if(_testMode != 0) { printf("The following codecs was not included in the test:\n"); #ifndef WEBRTC_CODEC_GSMAMR printf(" GSMAMR\n"); #endif #ifndef WEBRTC_CODEC_GSMAMRWB printf(" GSMAMR-wb\n"); #endif #ifndef WEBRTC_CODEC_G722 printf(" G.722\n"); #endif #ifndef WEBRTC_CODEC_G722_1 printf(" G.722.1\n"); #endif #ifndef WEBRTC_CODEC_G722_1C printf(" G.722.1C\n"); #endif #ifndef WEBRTC_CODEC_G729 printf(" G.729\n"); #endif #ifndef WEBRTC_CODEC_G729_1 printf(" G.729.1\n"); #endif #ifndef WEBRTC_CODEC_GSMFR printf(" GSMFR\n"); #endif #ifndef WEBRTC_CODEC_ILBC printf(" iLBC\n"); #endif #ifndef WEBRTC_CODEC_ISAC printf(" ISAC float\n"); #endif #ifndef WEBRTC_CODEC_ISACFX printf(" ISAC fix\n"); #endif #ifndef WEBRTC_CODEC_PCM16 printf(" PCM16\n"); #endif #ifndef WEBRTC_CODEC_SPEEX printf(" Speex\n"); #endif printf("\nTo complete the test, listen to the %d number of output files.\n", _testCntr); } } // Register Codec to use in the test // // Input: side - which ACM to use, 'A' or 'B' // codecName - name to use when register the codec // samplingFreqHz - sampling frequency in Herz // rate - bitrate in bytes // packSize - packet size in samples // extraByte - if extra bytes needed compared to the bitrate // used when registering, can be an internal header // set to -1 if the codec is a variable rate codec WebRtc_Word16 TestAllCodecs::RegisterSendCodec(char side, char* codecName, WebRtc_Word32 samplingFreqHz, int rate, int packSize, int extraByte) { if(_testMode != 0) { // Print out codec and settings printf("codec: %s Freq: %d Rate: %d PackSize: %d", codecName, samplingFreqHz, rate, packSize); } // Store packetsize in samples, used to validate the recieved packet _packSizeSamp = packSize; // Store the expected packet size in bytes, used to validate the recieved packet // If variable rate codec (extraByte == -1), set to -1 (65535) if (extraByte != -1) { // Add 0.875 to always round up to a whole byte _packSizeBytes = (WebRtc_UWord16)((float)(packSize*rate)/(float)(samplingFreqHz*8)+0.875)+extraByte; } else { // Packets will have a variable size _packSizeBytes = -1; } // Set pointer to the ACM where to register the codec AudioCodingModule* myACM; switch(side) { case 'A': { myACM = _acmA; break; } case 'B': { myACM = _acmB; break; } default: return -1; } if(myACM == NULL) { assert(false); return -1; } CodecInst myCodecParam; // Get all codec paramters before registering CHECK_ERROR(AudioCodingModule::Codec(codecName, myCodecParam, samplingFreqHz)); myCodecParam.rate = rate; myCodecParam.pacsize = packSize; CHECK_ERROR(myACM->RegisterSendCodec(myCodecParam)); // initialization was succesful return 0; } void TestAllCodecs::Run(TestPack* channel) { AudioFrame audioFrame; WebRtc_UWord16 SamplesIn10MsecA = _inFileA.PayloadLength10Ms(); WebRtc_UWord32 timestampA = 1; WebRtc_Word32 outFreqHzB = _outFileB.SamplingFrequency(); WebRtc_UWord16 recSize; WebRtc_UWord32 timeStampDiff; channel->ResetPayloadSize(); int errorCount = 0; // Only run 1 second for each test case while((_counter<1000)&& (!_inFileA.EndOfFile())) { // Add 10 msec to ACM _inFileA.Read10MsData(audioFrame); CHECK_ERROR(_acmA->Add10MsData(audioFrame)); // Run sender side of ACM CHECK_ERROR(_acmA->Process()); // Verify that the received packet size matches the settings recSize = channel->GetPayloadSize(); if (recSize) { if ((recSize != _packSizeBytes) && (_packSizeBytes < 65535)) { errorCount++; } // Verify that the timestamp is updated with expected length timeStampDiff = channel->GetTimeStampDiff(); if ((_counter > 10) && (timeStampDiff != _packSizeSamp)) errorCount++; } // Run received side of ACM CHECK_ERROR(_acmB->PlayoutData10Ms(outFreqHzB, audioFrame)); // Write output speech to file _outFileB.Write10MsData(audioFrame._payloadData, audioFrame._payloadDataLengthInSamples); } if (errorCount) { printf(" - test FAILED\n"); } else if(_testMode != 0) { printf(" - test PASSED\n"); } // Reset _counter if (_counter == 1000) { _counter = 0; } if (_inFileA.EndOfFile()) { _inFileA.Rewind(); } } void TestAllCodecs::OpenOutFile(WebRtc_Word16 testNumber) { char fileName[500] = "testallcodecs_out_"; char cntrStr[10]; sprintf(cntrStr, "%02d.pcm", testNumber); strcat(fileName, cntrStr); _outFileB.Open(fileName, 32000, "wb"); } void TestAllCodecs::DisplaySendReceiveCodec() { CodecInst myCodecParam; _acmA->SendCodec(myCodecParam); printf("%s -> ", myCodecParam.plname); _acmB->ReceiveCodec(myCodecParam); printf("%s\n", myCodecParam.plname); }