171 lines
5.4 KiB
C++
171 lines
5.4 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 "testExternalCapture.h"
|
|
#include "tick_util.h"
|
|
#include "process_thread.h"
|
|
#include "stdio.h"
|
|
|
|
namespace webrtc
|
|
{
|
|
|
|
static int testExternalCaptureResult = 0;
|
|
|
|
#ifdef NDEBUG
|
|
#if defined(WEBRTC_MAC_INTEL)
|
|
|
|
#else
|
|
#undef assert
|
|
#define assert(p) if(!(p)){printf("Error line %d\n",__LINE__);testExternalCaptureResult=-1;}
|
|
#endif
|
|
#endif
|
|
|
|
void testExternalCapture::CreateInterface()
|
|
{
|
|
_captureModule = VideoCaptureModule::Create(1, _captureInteface);
|
|
}
|
|
testExternalCapture::testExternalCapture(void)
|
|
: _captureInteface(NULL), _captureModule(NULL)
|
|
{
|
|
}
|
|
|
|
int testExternalCapture::CompareFrames(const VideoFrame& frame1,
|
|
const VideoFrame& frame2)
|
|
{
|
|
assert(frame1.Length()==frame2.Length());
|
|
assert(frame1.Width()==frame2.Width());
|
|
assert(frame1.Height()==frame2.Height());
|
|
//assert(frame1.RenderTimeMs()==frame2.RenderTimeMs());
|
|
for (unsigned int i = 0; i < frame1.Length(); ++i)
|
|
assert(*(frame1.Buffer()+i)==*(frame2.Buffer()+i));
|
|
return 0;
|
|
|
|
}
|
|
|
|
testExternalCapture::~testExternalCapture(void)
|
|
{
|
|
VideoCaptureModule::Destroy(_captureModule);
|
|
}
|
|
|
|
void testExternalCapture::OnIncomingCapturedFrame(
|
|
const WebRtc_Word32 ID,
|
|
VideoFrame& videoFrame,
|
|
webrtc::VideoCodecType codecType)
|
|
{
|
|
|
|
_resultFrame.CopyFrame(videoFrame);
|
|
_frameCount++;
|
|
}
|
|
|
|
void testExternalCapture::OnCaptureDelayChanged(const WebRtc_Word32 ID,
|
|
const WebRtc_Word32 delay)
|
|
{
|
|
}
|
|
|
|
void testExternalCapture::OnCaptureFrameRate(const WebRtc_Word32 id,
|
|
const WebRtc_UWord32 frameRate)
|
|
{
|
|
printf("OnCaptureFrameRate %d, frameRate %d\n", id, frameRate);
|
|
_reportedFrameRate = frameRate;
|
|
}
|
|
void testExternalCapture::OnNoPictureAlarm(const WebRtc_Word32 id,
|
|
const VideoCaptureAlarm alarm)
|
|
{
|
|
printf("OnNoPictureAlarm %d, alarm %d\n", id, alarm);
|
|
_captureAlarm = alarm;
|
|
}
|
|
|
|
int testExternalCapture::DoTest()
|
|
{
|
|
int height = 288;
|
|
int width = 352;
|
|
|
|
printf("Platform independent test\n");
|
|
|
|
CreateInterface();
|
|
ProcessThread* processModule = ProcessThread::CreateProcessThread();
|
|
processModule->Start();
|
|
processModule->RegisterModule(_captureModule);
|
|
|
|
_testFrame.VerifyAndAllocate(height * width * 3 / 2);
|
|
_testFrame.SetLength(height * width * 3 / 2);
|
|
_testFrame.SetHeight(height);
|
|
_testFrame.SetWidth(width);
|
|
memset(_testFrame.Buffer(), 0, 1);
|
|
assert(_captureModule->RegisterCaptureDataCallback(*this)==0);
|
|
assert(_captureModule->RegisterCaptureCallback(*this)==0);
|
|
assert(_captureModule->EnableFrameRateCallback(true)==0);
|
|
assert(_captureModule->EnableNoPictureAlarm(true)==0);
|
|
|
|
VideoCaptureCapability frameInfo;
|
|
frameInfo.width = width;
|
|
frameInfo.height = height;
|
|
frameInfo.rawType = webrtc::kVideoYV12;
|
|
|
|
assert(_captureInteface->IncomingFrame(_testFrame.Buffer(),
|
|
_testFrame.Length(),
|
|
frameInfo,0)==0);
|
|
CompareFrames(_testFrame, _resultFrame);
|
|
|
|
printf(" testing local frame rate callback and no picture alarm.\n");
|
|
|
|
WebRtc_Word64 testTime = 3;
|
|
_reportedFrameRate = 0;
|
|
_captureAlarm = Cleared;
|
|
|
|
TickTime startTime = TickTime::Now();
|
|
while ((TickTime::Now() - startTime).Milliseconds() < testTime * 1000)
|
|
{
|
|
assert(_captureInteface->IncomingFrame(_testFrame.Buffer(),
|
|
_testFrame.Length(),
|
|
frameInfo,0)==0);
|
|
SLEEP(100);
|
|
}
|
|
assert(_reportedFrameRate==10);
|
|
SLEEP(500); // Make sure the no picture alarm is triggered
|
|
assert(_captureAlarm==Raised);
|
|
|
|
testTime = 3;
|
|
startTime = TickTime::Now();
|
|
while ((TickTime::Now() - startTime).Milliseconds() < testTime * 1000)
|
|
{
|
|
assert(_captureInteface->IncomingFrame(_testFrame.Buffer(),
|
|
_testFrame.Length(),
|
|
frameInfo,0)==0);
|
|
SLEEP(33);
|
|
}
|
|
assert(_captureAlarm==Cleared);
|
|
assert(_reportedFrameRate==30);
|
|
|
|
//Test start image
|
|
printf(" testing start send image.\n");
|
|
testTime = 3;
|
|
startTime = TickTime::Now();
|
|
_frameCount = 0;
|
|
assert(_captureModule->StartSendImage(_testFrame,15)==0);
|
|
while ((TickTime::Now() - startTime).Milliseconds() < testTime * 1000)
|
|
{
|
|
SLEEP(33);
|
|
}
|
|
assert(_captureModule->StopSendImage()==0);
|
|
assert(_frameCount>=testTime*15-1 && _frameCount<=testTime*15+1);
|
|
assert(_captureAlarm==Raised);
|
|
CompareFrames(_testFrame, _resultFrame);
|
|
SLEEP(1000);
|
|
assert(_frameCount>=testTime*15-1 && _frameCount<=testTime*15+1);
|
|
|
|
processModule->Stop();
|
|
|
|
ProcessThread::DestroyProcessThread(processModule);
|
|
|
|
return testExternalCaptureResult;
|
|
}
|
|
} // namespace webrtc
|