webrtc/modules/audio_coding/main/test/EncodeToFileTest.cpp

189 lines
4.5 KiB
C++

/*
* 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 <Winsock2.h>
#else
# include <arpa/inet.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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);
}