/* * 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 "EncodeToFileTest.h" #include "audio_coding_module.h" #include "common_types.h" #ifdef WIN32 # include #else # include #endif #include #include #include TestPacketization::TestPacketization(RTPStream *rtpStream, WebRtc_UWord16 frequency) : _frequency(frequency), _seqNo(0) { _rtpStream = rtpStream; } TestPacketization::~TestPacketization() { } WebRtc_Word32 TestPacketization::SendData( const FrameType /* frameType */, const WebRtc_UWord8 payloadType, const WebRtc_UWord32 timeStamp, const WebRtc_UWord8* payloadData, const WebRtc_UWord16 payloadSize, const RTPFragmentationHeader* /* fragmentation */) { _rtpStream->Write(payloadType, timeStamp, _seqNo++, payloadData, payloadSize, _frequency); //delete [] payloadData; return 1; } Sender::Sender() : _acm(NULL), //_payloadData(NULL), _payloadSize(0), _timeStamp(0) { } void Sender::Setup(AudioCodingModule *acm, RTPStream *rtpStream) { acm->InitializeSender(); struct CodecInst sendCodec; int noOfCodecs = acm->NumberOfCodecs(); int codecNo; if (testMode == 1) { //set the codec, input file, and parameters for the current test codecNo = codeId; //use same input file for now char fileName[] = "./modules/audio_coding/main/test/testfile32kHz.pcm"; _pcmFile.Open(fileName, 32000, "rb"); } else if (testMode == 0) { //set the codec, input file, and parameters for the current test codecNo = codeId; acm->Codec(codecNo, sendCodec); //use same input file for now char fileName[] = "./modules/audio_coding/main/test/testfile32kHz.pcm"; _pcmFile.Open(fileName, 32000, "rb"); } else { printf("List of supported codec.\n"); for(int n = 0; n < noOfCodecs; n++) { acm->Codec(n, sendCodec); printf("%d %s\n", n, sendCodec.plname); } printf("Choose your codec:"); scanf("%d", &codecNo); char fileName[] = "./modules/audio_coding/main/test/testfile32kHz.pcm"; _pcmFile.Open(fileName, 32000, "rb"); } acm->Codec(codecNo, sendCodec); acm->RegisterSendCodec(sendCodec); _packetization = new TestPacketization(rtpStream, sendCodec.plfreq); if(acm->RegisterTransportCallback(_packetization) < 0) { printf("Registering Transport Callback failed, for run: codecId: %d: --\n", codeId); } _acm = acm; } void Sender::Teardown() { _pcmFile.Close(); delete _packetization; } bool Sender::Add10MsData() { if (!_pcmFile.EndOfFile()) { _pcmFile.Read10MsData(_audioFrame); WebRtc_Word32 ok = _acm->Add10MsData(_audioFrame); if (ok != 0) { printf("Error calling Add10MsData: for run: codecId: %d\n", codeId); exit(1); } //_audioFrame._timeStamp += _pcmFile.PayloadLength10Ms(); return true; } return false; } bool Sender::Process() { WebRtc_Word32 ok = _acm->Process(); if (ok < 0) { printf("Error calling Add10MsData: for run: codecId: %d\n", codeId); exit(1); } return true; } void Sender::Run() { while (true) { if (!Add10MsData()) { break; } if (!Process()) // This could be done in a processing thread { break; } } } EncodeToFileTest::EncodeToFileTest() { } void EncodeToFileTest::Perform(int fileType, int codeId, int* codePars, int testMode) { AudioCodingModule *acm = AudioCodingModule::Create(0); RTPFile rtpFile; char fileName[] = "outFile.rtp"; rtpFile.Open(fileName, "wb+"); rtpFile.WriteHeader(); //for auto_test and logging _sender.testMode = testMode; _sender.codeId = codeId; _sender.Setup(acm, &rtpFile); struct CodecInst sendCodecInst; if(acm->SendCodec(sendCodecInst) >= 0) { _sender.Run(); } _sender.Teardown(); rtpFile.Close(); AudioCodingModule::Destroy(acm); }