Rewrote codec test to use fake camera.
Tests now fail more cleanly if the input video file is incorrect. Fixed some of the style issues in vie_autotest_codec. Rewrote the automated standard codec test to use the new fake camera. Started sketching on a new test case. Wrote a new abstraction called ViEFakeCamera which hides the details of how to thread a file capture device in the typical test case. BUG= TEST= Review URL: http://webrtc-codereview.appspot.com/242008 git-svn-id: http://webrtc.googlecode.com/svn/trunk@815 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
parent
d855c1a4e8
commit
78c767f9ba
@ -62,14 +62,17 @@ TEST_F(ViEStandardIntegrationTest, RunsBaseTestWithoutErrors) {
|
|||||||
FLAGS_i420_test_video_height);
|
FLAGS_i420_test_video_height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(ViEStandardIntegrationTest, RunsCodecTestWithoutErrors) {
|
||||||
|
tests_->ViEAutomatedCodecStandardTest(FLAGS_i420_test_video_path,
|
||||||
|
FLAGS_i420_test_video_width,
|
||||||
|
FLAGS_i420_test_video_height);
|
||||||
|
}
|
||||||
|
|
||||||
// These tests still require a physical camera:
|
// These tests still require a physical camera:
|
||||||
TEST_F(ViEStandardIntegrationTest, RunsCaptureTestWithoutErrors) {
|
TEST_F(ViEStandardIntegrationTest, RunsCaptureTestWithoutErrors) {
|
||||||
ASSERT_EQ(0, tests_->ViECaptureStandardTest());
|
ASSERT_EQ(0, tests_->ViECaptureStandardTest());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ViEStandardIntegrationTest, RunsCodecTestWithoutErrors) {
|
|
||||||
ASSERT_EQ(0, tests_->ViECodecStandardTest());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(ViEStandardIntegrationTest, RunsEncryptionTestWithoutErrors) {
|
TEST_F(ViEStandardIntegrationTest, RunsEncryptionTestWithoutErrors) {
|
||||||
ASSERT_EQ(0, tests_->ViEEncryptionStandardTest());
|
ASSERT_EQ(0, tests_->ViEEncryptionStandardTest());
|
||||||
|
@ -0,0 +1,82 @@
|
|||||||
|
/*
|
||||||
|
* 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 "vie_fake_camera.h"
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include "vie_capture.h"
|
||||||
|
#include "vie_file_capture_device.h"
|
||||||
|
#include "thread_wrapper.h"
|
||||||
|
|
||||||
|
// This callback runs the camera thread:
|
||||||
|
bool StreamVideoFileRepeatedlyIntoCaptureDevice(void* data) {
|
||||||
|
ViEFileCaptureDevice* file_capture_device =
|
||||||
|
reinterpret_cast<ViEFileCaptureDevice*>(data);
|
||||||
|
|
||||||
|
uint64_t time_slice_ms = 1500;
|
||||||
|
uint32_t max_fps = 30;
|
||||||
|
file_capture_device->ReadFileFor(time_slice_ms, max_fps);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
ViEFakeCamera::ViEFakeCamera(webrtc::ViECapture* capture_interface)
|
||||||
|
: capture_interface_(capture_interface),
|
||||||
|
camera_thread_(NULL),
|
||||||
|
file_capture_device_(NULL) {
|
||||||
|
}
|
||||||
|
|
||||||
|
ViEFakeCamera::~ViEFakeCamera() {
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ViEFakeCamera::StartCameraInNewThread(
|
||||||
|
const std::string& i420_test_video_path, int width, int height) {
|
||||||
|
|
||||||
|
assert(file_capture_device_ == NULL && camera_thread_ == NULL);
|
||||||
|
|
||||||
|
webrtc::ViEExternalCapture* externalCapture;
|
||||||
|
int result = capture_interface_->
|
||||||
|
AllocateExternalCaptureDevice(capture_id_, externalCapture);
|
||||||
|
if (result != 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
file_capture_device_ = new ViEFileCaptureDevice(externalCapture);
|
||||||
|
if (!file_capture_device_->OpenI420File(i420_test_video_path,
|
||||||
|
width,
|
||||||
|
height)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set up a thread which runs the fake camera. The capturer object is
|
||||||
|
// thread-safe.
|
||||||
|
camera_thread_ = webrtc::ThreadWrapper::CreateThread(
|
||||||
|
StreamVideoFileRepeatedlyIntoCaptureDevice, file_capture_device_);
|
||||||
|
unsigned int id;
|
||||||
|
camera_thread_->Start(id);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ViEFakeCamera::StopCamera() {
|
||||||
|
assert(file_capture_device_ != NULL && camera_thread_ != NULL);
|
||||||
|
|
||||||
|
camera_thread_->Stop();
|
||||||
|
file_capture_device_->CloseFile();
|
||||||
|
|
||||||
|
int result = capture_interface_->ReleaseCaptureDevice(capture_id_);
|
||||||
|
|
||||||
|
delete camera_thread_;
|
||||||
|
delete file_capture_device_;
|
||||||
|
camera_thread_ = NULL;
|
||||||
|
file_capture_device_ = NULL;
|
||||||
|
|
||||||
|
return result == 0;
|
||||||
|
}
|
@ -0,0 +1,50 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
#ifndef SRC_VIDEO_ENGINE_MAIN_TEST_AUTOTEST_HELPERS_VIE_FAKE_CAMERA_H_
|
||||||
|
#define SRC_VIDEO_ENGINE_MAIN_TEST_AUTOTEST_HELPERS_VIE_FAKE_CAMERA_H_
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace webrtc {
|
||||||
|
class ViECapture;
|
||||||
|
class ThreadWrapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
class ViEFileCaptureDevice;
|
||||||
|
|
||||||
|
// Registers an external capture device with the provided capture interface
|
||||||
|
// and starts running a fake camera by reading frames from a file. The frame-
|
||||||
|
// reading code runs in a separate thread which makes it possible to run tests
|
||||||
|
// while the fake camera feeds data into the system. This class is not thread-
|
||||||
|
// safe in itself (but handles its own thread in a safe manner).
|
||||||
|
class ViEFakeCamera {
|
||||||
|
public:
|
||||||
|
// The argument is the capture interface to register with.
|
||||||
|
explicit ViEFakeCamera(webrtc::ViECapture* capture_interface);
|
||||||
|
virtual ~ViEFakeCamera();
|
||||||
|
|
||||||
|
// Runs the scenario in the class comments.
|
||||||
|
bool StartCameraInNewThread(const std::string& i420_test_video_path,
|
||||||
|
int width,
|
||||||
|
int height);
|
||||||
|
// Stops the camera and cleans up everything allocated by the start method.
|
||||||
|
bool StopCamera();
|
||||||
|
|
||||||
|
int capture_id() const { return capture_id_; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
webrtc::ViECapture* capture_interface_;
|
||||||
|
|
||||||
|
int capture_id_;
|
||||||
|
webrtc::ThreadWrapper* camera_thread_;
|
||||||
|
ViEFileCaptureDevice* file_capture_device_;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // SRC_VIDEO_ENGINE_MAIN_TEST_AUTOTEST_HELPERS_VIE_FAKE_CAMERA_H_
|
@ -9,6 +9,8 @@
|
|||||||
*/
|
*/
|
||||||
#include "vie_file_capture_device.h"
|
#include "vie_file_capture_device.h"
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
#include "common_types.h"
|
#include "common_types.h"
|
||||||
#include "critical_section_wrapper.h"
|
#include "critical_section_wrapper.h"
|
||||||
#include "event_wrapper.h"
|
#include "event_wrapper.h"
|
||||||
|
@ -23,10 +23,8 @@ class EventWrapper;
|
|||||||
class ViEExternalCapture;
|
class ViEExternalCapture;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
// This class opens a i420 file and feeds it into a ExternalCapture instance,
|
||||||
* This class opens a i420 file and feeds it into a ExternalCapture instance,
|
// thereby acting as a faked capture device with deterministic input.
|
||||||
* thereby acting as a faked capture device with deterministic input.
|
|
||||||
*/
|
|
||||||
class ViEFileCaptureDevice {
|
class ViEFileCaptureDevice {
|
||||||
public:
|
public:
|
||||||
// The input sink is where to send the I420 video frames.
|
// The input sink is where to send the I420 video frames.
|
||||||
|
@ -39,6 +39,8 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
class tbInterfaces;
|
||||||
|
|
||||||
class ViEAutoTest
|
class ViEAutoTest
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -77,6 +79,10 @@ public:
|
|||||||
int ViECodecExternalCodecTest();
|
int ViECodecExternalCodecTest();
|
||||||
int ViECodecAPITest();
|
int ViECodecAPITest();
|
||||||
|
|
||||||
|
void ViEAutomatedCodecStandardTest(const std::string& pathToTestI420Video,
|
||||||
|
int width,
|
||||||
|
int height);
|
||||||
|
|
||||||
// vie_autotest_encryption.cc
|
// vie_autotest_encryption.cc
|
||||||
int ViEEncryptionStandardTest();
|
int ViEEncryptionStandardTest();
|
||||||
int ViEEncryptionExtendedTest();
|
int ViEEncryptionExtendedTest();
|
||||||
@ -126,6 +132,10 @@ private:
|
|||||||
void PrintAudioCodec(const webrtc::CodecInst audioCodec);
|
void PrintAudioCodec(const webrtc::CodecInst audioCodec);
|
||||||
void PrintVideoCodec(const webrtc::VideoCodec videoCodec);
|
void PrintVideoCodec(const webrtc::VideoCodec videoCodec);
|
||||||
|
|
||||||
|
void RunCodecTestInternal(const tbInterfaces& interfaces,
|
||||||
|
int & numberOfErrors,
|
||||||
|
int captureId);
|
||||||
|
|
||||||
void* _window1;
|
void* _window1;
|
||||||
void* _window2;
|
void* _window2;
|
||||||
|
|
||||||
|
@ -13,12 +13,12 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
|
|
||||||
#include "thread_wrapper.h"
|
|
||||||
#include "vie_autotest.h"
|
|
||||||
#include "vie_autotest_defines.h"
|
|
||||||
#include "video_capture_factory.h"
|
#include "video_capture_factory.h"
|
||||||
|
#include "vie_autotest_defines.h"
|
||||||
|
#include "vie_autotest.h"
|
||||||
|
#include "vie_fake_camera.h"
|
||||||
#include "vie_file_capture_device.h"
|
#include "vie_file_capture_device.h"
|
||||||
|
#include "thread_wrapper.h"
|
||||||
|
|
||||||
class BaseObserver : public webrtc::ViEBaseObserver {
|
class BaseObserver : public webrtc::ViEBaseObserver {
|
||||||
public:
|
public:
|
||||||
@ -238,9 +238,6 @@ void StopEverything(webrtc::ViEBase * ptrViEBase,
|
|||||||
error = ptrViECapture->DisconnectCaptureDevice(videoChannel);
|
error = ptrViECapture->DisconnectCaptureDevice(videoChannel);
|
||||||
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
||||||
__FUNCTION__, __LINE__);
|
__FUNCTION__, __LINE__);
|
||||||
error = ptrViECapture->ReleaseCaptureDevice(captureId);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ReleaseEverything(webrtc::ViECapture *ptrViECapture,
|
void ReleaseEverything(webrtc::ViECapture *ptrViECapture,
|
||||||
@ -355,6 +352,10 @@ int ViEAutoTest::ViEBaseStandardTest() {
|
|||||||
StopEverything(ptrViEBase, videoChannel, numberOfErrors, ptrViERender,
|
StopEverything(ptrViEBase, videoChannel, numberOfErrors, ptrViERender,
|
||||||
captureId, ptrViECapture, _vrm1, _vrm2);
|
captureId, ptrViECapture, _vrm1, _vrm2);
|
||||||
|
|
||||||
|
error = ptrViECapture->ReleaseCaptureDevice(captureId);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
|
||||||
vcpm->Release();
|
vcpm->Release();
|
||||||
vcpm = NULL;
|
vcpm = NULL;
|
||||||
|
|
||||||
@ -590,18 +591,6 @@ int ViEAutoTest::ViEBaseAPITest() {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// This callback gets used in the automated test case below:
|
|
||||||
bool StreamVideoFileRepeatedlyIntoCaptureDevice(void* data) {
|
|
||||||
ViEFileCaptureDevice* file_capture_device =
|
|
||||||
reinterpret_cast<ViEFileCaptureDevice*>(data);
|
|
||||||
|
|
||||||
WebRtc_UWord64 time_slice_ms = 1500;
|
|
||||||
WebRtc_UWord64 max_fps = 30;
|
|
||||||
file_capture_device->ReadFileFor(time_slice_ms, max_fps);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ViEAutoTest::ViEAutomatedBaseStandardTest(
|
void ViEAutoTest::ViEAutomatedBaseStandardTest(
|
||||||
const std::string& pathToTestI420Video, int width, int height) {
|
const std::string& pathToTestI420Video, int width, int height) {
|
||||||
int ignoredNumberOfErrors;
|
int ignoredNumberOfErrors;
|
||||||
@ -617,29 +606,15 @@ void ViEAutoTest::ViEAutomatedBaseStandardTest(
|
|||||||
InitializeChannel(ptrViEBase, videoChannel,
|
InitializeChannel(ptrViEBase, videoChannel,
|
||||||
ignoredNumberOfErrors, ptrViE);
|
ignoredNumberOfErrors, ptrViE);
|
||||||
|
|
||||||
int captureId;
|
ViEFakeCamera fakeCamera(ptrViECapture);
|
||||||
webrtc::ViEExternalCapture* externalCapture;
|
if (!fakeCamera.StartCameraInNewThread(pathToTestI420Video, width, height)) {
|
||||||
int error = ptrViECapture->AllocateExternalCaptureDevice(captureId,
|
|
||||||
externalCapture);
|
|
||||||
ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
|
|
||||||
ViEFileCaptureDevice capturer(externalCapture);
|
|
||||||
if (!capturer.OpenI420File(pathToTestI420Video, width, height)) {
|
|
||||||
// No point in continuing if we have no proper video source
|
// No point in continuing if we have no proper video source
|
||||||
ViETest::TestError(false, "ERROR: %s at line %d: "
|
ViETest::TestError(false, "ERROR: %s at line %d: "
|
||||||
"Could not open input video %s: aborting test...",
|
"Could not open input video %s: aborting test...",
|
||||||
__FUNCTION__, __LINE__, pathToTestI420Video.c_str());
|
__FUNCTION__, __LINE__, pathToTestI420Video.c_str());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
int captureId = fakeCamera.capture_id();
|
||||||
// Set up a thread which runs the fake camera. Note that the capturer is
|
|
||||||
// handed off to the other thread - it should not be touched in this
|
|
||||||
// method until the other thread is stopped!
|
|
||||||
webrtc::ThreadWrapper* thread = webrtc::ThreadWrapper::CreateThread(
|
|
||||||
StreamVideoFileRepeatedlyIntoCaptureDevice, &capturer);
|
|
||||||
unsigned int id;
|
|
||||||
thread->Start(id);
|
|
||||||
|
|
||||||
// Apparently, we need to connect external capture devices, but we should
|
// Apparently, we need to connect external capture devices, but we should
|
||||||
// not start them since the external device is not a proper device.
|
// not start them since the external device is not a proper device.
|
||||||
@ -667,13 +642,15 @@ void ViEAutoTest::ViEAutomatedBaseStandardTest(
|
|||||||
|
|
||||||
AutoTestSleep(KAutoTestSleepTimeMs);
|
AutoTestSleep(KAutoTestSleepTimeMs);
|
||||||
|
|
||||||
// Done, clean up
|
|
||||||
thread->Stop();
|
|
||||||
capturer.CloseFile();
|
|
||||||
|
|
||||||
StopEverything(ptrViEBase, videoChannel, ignoredNumberOfErrors, ptrViERender,
|
StopEverything(ptrViEBase, videoChannel, ignoredNumberOfErrors, ptrViERender,
|
||||||
captureId, ptrViECapture, _vrm1, _vrm2);
|
captureId, ptrViECapture, _vrm1, _vrm2);
|
||||||
|
|
||||||
|
// Stop sending data, clean up the camera thread and release the capture
|
||||||
|
// device. Note that this all happens after StopEverything, so this is
|
||||||
|
// tests that the system doesn't mind that the external capture device sends
|
||||||
|
// data after rendering has been stopped.
|
||||||
|
fakeCamera.StopCamera();
|
||||||
|
|
||||||
ReleaseEverything(ptrViECapture, ignoredNumberOfErrors, ptrViEBase,
|
ReleaseEverything(ptrViECapture, ignoredNumberOfErrors, ptrViEBase,
|
||||||
videoChannel, ptrViECodec, ptrViERtpRtcp, ptrViERender,
|
videoChannel, ptrViECodec, ptrViERtpRtcp, ptrViERender,
|
||||||
ptrViENetwork, ptrViE);
|
ptrViENetwork, ptrViE);
|
||||||
|
@ -12,12 +12,13 @@
|
|||||||
// vie_autotest_codec.cc
|
// vie_autotest_codec.cc
|
||||||
//
|
//
|
||||||
|
|
||||||
#include "vie_autotest_defines.h"
|
|
||||||
#include "vie_autotest.h"
|
#include "vie_autotest.h"
|
||||||
#include "engine_configurations.h"
|
|
||||||
|
|
||||||
#include "common_types.h"
|
#include "common_types.h"
|
||||||
|
#include "engine_configurations.h"
|
||||||
|
#include "vie_autotest_defines.h"
|
||||||
#include "tb_capture_device.h"
|
#include "tb_capture_device.h"
|
||||||
|
#include "vie_fake_camera.h"
|
||||||
#include "tb_I420_codec.h"
|
#include "tb_I420_codec.h"
|
||||||
#include "tb_interfaces.h"
|
#include "tb_interfaces.h"
|
||||||
#include "tb_video_channel.h"
|
#include "tb_video_channel.h"
|
||||||
@ -117,330 +118,56 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void ViEAutoTest::ViEAutomatedCodecStandardTest(
|
||||||
|
const std::string& i420_video_file,
|
||||||
|
int width,
|
||||||
|
int height) {
|
||||||
|
|
||||||
|
int ignored = 0;
|
||||||
|
|
||||||
|
tbInterfaces interfaces = tbInterfaces("ViECodecAutomatedStandardTest",
|
||||||
|
ignored);
|
||||||
|
|
||||||
|
ViEFakeCamera fake_camera(interfaces.ptrViECapture);
|
||||||
|
if (!fake_camera.StartCameraInNewThread(i420_video_file, width, height)) {
|
||||||
|
// No point in continuing if we have no proper video source
|
||||||
|
ViETest::TestError(false, "ERROR: %s at line %d: "
|
||||||
|
"Could not open input video %s: aborting test...",
|
||||||
|
__FUNCTION__, __LINE__, i420_video_file.c_str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
RunCodecTestInternal(interfaces, ignored, fake_camera.capture_id());
|
||||||
|
|
||||||
|
fake_camera.StopCamera();
|
||||||
|
}
|
||||||
|
|
||||||
int ViEAutoTest::ViECodecStandardTest()
|
int ViEAutoTest::ViECodecStandardTest()
|
||||||
{
|
{
|
||||||
ViETest::Log(" ");
|
ViETest::Log(" ");
|
||||||
ViETest::Log("========================================");
|
ViETest::Log("========================================");
|
||||||
ViETest::Log(" ViECodec Standard Test\n");
|
ViETest::Log(" ViECodec Standard Test\n");
|
||||||
|
|
||||||
//***************************************************************
|
int number_of_errors = 0;
|
||||||
// Begin create/initialize WebRTC Video Engine for testing
|
|
||||||
//***************************************************************
|
|
||||||
|
|
||||||
|
|
||||||
int error = 0;
|
|
||||||
int numberOfErrors = 0;
|
|
||||||
|
|
||||||
tbInterfaces interfaces = tbInterfaces("ViECodecStandardTest",
|
tbInterfaces interfaces = tbInterfaces("ViECodecStandardTest",
|
||||||
numberOfErrors);
|
number_of_errors);
|
||||||
|
|
||||||
tbCaptureDevice captureDevice = tbCaptureDevice(interfaces, numberOfErrors);
|
tbCaptureDevice capture_device =
|
||||||
int captureId = captureDevice.captureId;
|
tbCaptureDevice(interfaces, number_of_errors);
|
||||||
|
RunCodecTestInternal(interfaces,
|
||||||
|
number_of_errors,
|
||||||
|
capture_device.captureId);
|
||||||
|
|
||||||
webrtc::VideoEngine* ptrViE = interfaces.ptrViE;
|
if (number_of_errors > 0)
|
||||||
webrtc::ViEBase* ptrViEBase = interfaces.ptrViEBase;
|
|
||||||
webrtc::ViECapture* ptrViECapture = interfaces.ptrViECapture;
|
|
||||||
webrtc::ViERender* ptrViERender = interfaces.ptrViERender;
|
|
||||||
webrtc::ViECodec* ptrViECodec = interfaces.ptrViECodec;
|
|
||||||
webrtc::ViERTP_RTCP* ptrViERtpRtcp = interfaces.ptrViERtpRtcp;
|
|
||||||
webrtc::ViENetwork* ptrViENetwork = interfaces.ptrViENetwork;
|
|
||||||
|
|
||||||
int videoChannel = -1;
|
|
||||||
error = ptrViEBase->CreateChannel(videoChannel);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
|
|
||||||
error = ptrViECapture->ConnectCaptureDevice(captureId, videoChannel);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
|
|
||||||
error = ptrViERtpRtcp->SetRTCPStatus(videoChannel,
|
|
||||||
webrtc::kRtcpCompound_RFC4585);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
|
|
||||||
error = ptrViERtpRtcp->SetKeyFrameRequestMethod(
|
|
||||||
videoChannel, webrtc::kViEKeyFrameRequestPliRtcp);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
|
|
||||||
error = ptrViERtpRtcp->SetTMMBRStatus(videoChannel, true);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
|
|
||||||
error = ptrViERender->AddRenderer(captureId, _window1, 0, 0.0, 0.0, 1.0,
|
|
||||||
1.0);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
|
|
||||||
error = ptrViERender->AddRenderer(videoChannel, _window2, 1, 0.0, 0.0, 1.0,
|
|
||||||
1.0);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
|
|
||||||
error = ptrViERender->StartRender(captureId);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
|
|
||||||
error = ptrViERender->StartRender(videoChannel);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
|
|
||||||
//***************************************************************
|
|
||||||
// Engine ready. Begin testing class
|
|
||||||
//***************************************************************
|
|
||||||
|
|
||||||
|
|
||||||
webrtc::VideoCodec videoCodec;
|
|
||||||
memset(&videoCodec, 0, sizeof(webrtc::VideoCodec));
|
|
||||||
for (int idx = 0; idx < ptrViECodec->NumberOfCodecs(); idx++)
|
|
||||||
{
|
|
||||||
error = ptrViECodec->GetCodec(idx, videoCodec);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
|
|
||||||
if (videoCodec.codecType != webrtc::kVideoCodecH263
|
|
||||||
&& videoCodec.codecType != webrtc::kVideoCodecI420)
|
|
||||||
{
|
|
||||||
videoCodec.width = 640;
|
|
||||||
videoCodec.height = 480;
|
|
||||||
}
|
|
||||||
if(videoCodec.codecType == webrtc::kVideoCodecI420)
|
|
||||||
{
|
|
||||||
videoCodec.width=176;
|
|
||||||
videoCodec.height=144;
|
|
||||||
}
|
|
||||||
error = ptrViECodec->SetReceiveCodec(videoChannel, videoCodec);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int idx = 0; idx < ptrViECodec->NumberOfCodecs(); idx++)
|
|
||||||
{
|
|
||||||
error = ptrViECodec->GetCodec(idx, videoCodec);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
if (videoCodec.codecType == webrtc::kVideoCodecVP8)
|
|
||||||
{
|
|
||||||
error = ptrViECodec->SetSendCodec(videoChannel, videoCodec);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0,
|
|
||||||
"ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* ipAddress = "127.0.0.1";
|
|
||||||
const unsigned short rtpPort = 6000;
|
|
||||||
error = ptrViENetwork->SetLocalReceiver(videoChannel, rtpPort);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
|
|
||||||
error = ptrViEBase->StartReceive(videoChannel);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
|
|
||||||
error = ptrViENetwork->SetSendDestination(videoChannel, ipAddress, rtpPort);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
|
|
||||||
error = ptrViEBase->StartSend(videoChannel);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Make sure all codecs runs
|
|
||||||
//
|
|
||||||
{
|
|
||||||
webrtc::ViEImageProcess* ptrViEImageProcess =
|
|
||||||
webrtc::ViEImageProcess::GetInterface(ptrViE);
|
|
||||||
ViEAutotestCodecObserever codecObserver;
|
|
||||||
error = ptrViECodec->RegisterDecoderObserver(videoChannel,
|
|
||||||
codecObserver);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0,
|
|
||||||
"ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
|
|
||||||
ViETest::Log("Loop through all codecs for %d seconds",
|
|
||||||
KAutoTestSleepTimeMs / 1000);
|
|
||||||
for (int idx = 0; idx < ptrViECodec->NumberOfCodecs() - 2; idx++)
|
|
||||||
{
|
|
||||||
error = ptrViECodec->GetCodec(idx, videoCodec);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0,
|
|
||||||
"ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
if (videoCodec.codecType != webrtc::kVideoCodecMPEG4)
|
|
||||||
{
|
|
||||||
if(videoCodec.codecType == webrtc::kVideoCodecI420)
|
|
||||||
{
|
|
||||||
// Lower resolution to sockkets keep up.
|
|
||||||
videoCodec.width=176;
|
|
||||||
videoCodec.height=144;
|
|
||||||
videoCodec.maxFramerate=15;
|
|
||||||
}
|
|
||||||
error = ptrViECodec->SetSendCodec(videoChannel, videoCodec);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0,
|
|
||||||
"ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
ViETest::Log("\t %d. %s", idx, videoCodec.plName);
|
|
||||||
|
|
||||||
ViEAutoTestEffectFilter frameCounter;
|
|
||||||
error = ptrViEImageProcess->RegisterRenderEffectFilter(
|
|
||||||
videoChannel,
|
|
||||||
frameCounter);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0,
|
|
||||||
"ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
|
|
||||||
AutoTestSleep( KAutoTestSleepTimeMs);
|
|
||||||
|
|
||||||
// Verify we've received and decoded correct payload
|
|
||||||
numberOfErrors += ViETest::TestError(
|
|
||||||
codecObserver.incomingCodec.codecType
|
|
||||||
== videoCodec.codecType, "ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
|
|
||||||
int maxNumberOfRenderedFrames = videoCodec.maxFramerate
|
|
||||||
* KAutoTestSleepTimeMs / 1000;
|
|
||||||
|
|
||||||
if(videoCodec.codecType == webrtc::kVideoCodecI420)
|
|
||||||
{
|
|
||||||
// Due to that I420 needs a huge bandwidht- rate control can set frame rate very low.
|
|
||||||
// This happen since we use the same channel as we just tested with vp8.
|
|
||||||
numberOfErrors += ViETest::TestError(frameCounter.numFrames>0,
|
|
||||||
"ERROR: %s at line %d", __FUNCTION__,
|
|
||||||
__LINE__);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifdef WEBRTC_ANDROID
|
|
||||||
// To get the autotest to pass on some slow devices
|
|
||||||
numberOfErrors += ViETest::TestError(frameCounter.numFrames
|
|
||||||
> maxNumberOfRenderedFrames/6, // Safety margin due to bitrate
|
|
||||||
"ERROR: %s at line %d", __FUNCTION__, __LINE__);
|
|
||||||
#else
|
|
||||||
numberOfErrors += ViETest::TestError(frameCounter.numFrames
|
|
||||||
> maxNumberOfRenderedFrames / 4, // Safety margin due to bitrate
|
|
||||||
"ERROR: %s at line %d", __FUNCTION__,
|
|
||||||
__LINE__);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
error = ptrViEImageProcess->DeregisterRenderEffectFilter(
|
|
||||||
videoChannel);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0,
|
|
||||||
"ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ViETest::Log("\t %d. %s not tested", idx, videoCodec.plName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ptrViEImageProcess->Release();
|
|
||||||
error = ptrViECodec->DeregisterDecoderObserver(videoChannel);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0,
|
|
||||||
"ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
ViETest::Log("Done!");
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Callbacks
|
|
||||||
//
|
|
||||||
|
|
||||||
ViEAutotestCodecObserever codecObserver;
|
|
||||||
error = ptrViECodec->RegisterEncoderObserver(videoChannel, codecObserver);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
error = ptrViECodec->RegisterDecoderObserver(videoChannel, codecObserver);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
|
|
||||||
ViETest::Log("\nTesting codec callbacks...");
|
|
||||||
|
|
||||||
for (int idx = 0; idx < ptrViECodec->NumberOfCodecs(); idx++)
|
|
||||||
{
|
|
||||||
error = ptrViECodec->GetCodec(idx, videoCodec);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
if (videoCodec.codecType == webrtc::kVideoCodecVP8)
|
|
||||||
{
|
|
||||||
error = ptrViECodec->SetSendCodec(videoChannel, videoCodec);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0,
|
|
||||||
"ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
AutoTestSleep(KAutoTestSleepTimeMs);
|
|
||||||
|
|
||||||
error = ptrViEBase->StopSend(videoChannel);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
|
|
||||||
error = ptrViECodec->DeregisterEncoderObserver(videoChannel);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
error = ptrViECodec->DeregisterDecoderObserver(videoChannel);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
|
|
||||||
numberOfErrors += ViETest::TestError(codecObserver.incomingCodecCalled > 0,
|
|
||||||
"ERROR: %s at line %d", __FUNCTION__,
|
|
||||||
__LINE__);
|
|
||||||
numberOfErrors += ViETest::TestError(codecObserver.incomingRatecalled > 0,
|
|
||||||
"ERROR: %s at line %d", __FUNCTION__,
|
|
||||||
__LINE__);
|
|
||||||
numberOfErrors += ViETest::TestError(codecObserver.outgoingRatecalled > 0,
|
|
||||||
"ERROR: %s at line %d", __FUNCTION__,
|
|
||||||
__LINE__);
|
|
||||||
|
|
||||||
//***************************************************************
|
|
||||||
// Testing finished. Tear down Video Engine
|
|
||||||
//***************************************************************
|
|
||||||
|
|
||||||
error = ptrViEBase->StopReceive(videoChannel);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
|
|
||||||
error = ptrViEBase->StopSend(videoChannel); // Already stopped
|
|
||||||
numberOfErrors += ViETest::TestError(error == -1, "ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
|
|
||||||
error = ptrViERender->StopRender(videoChannel);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
|
|
||||||
error = ptrViERender->RemoveRenderer(captureId);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
|
|
||||||
error = ptrViERender->RemoveRenderer(videoChannel);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
|
|
||||||
error = ptrViECapture->DisconnectCaptureDevice(videoChannel);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
|
|
||||||
error = ptrViEBase->DeleteChannel(videoChannel);
|
|
||||||
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (numberOfErrors > 0)
|
|
||||||
{
|
{
|
||||||
// Test failed
|
// Test failed
|
||||||
ViETest::Log(" ");
|
ViETest::Log(" ");
|
||||||
ViETest::Log(" ERROR ViECodec Standard Test FAILED!");
|
ViETest::Log(" ERROR ViECodec Standard Test FAILED!");
|
||||||
ViETest::Log(" Number of errors: %d", numberOfErrors);
|
ViETest::Log(" Number of errors: %d", number_of_errors);
|
||||||
ViETest::Log("========================================");
|
ViETest::Log("========================================");
|
||||||
ViETest::Log(" ");
|
ViETest::Log(" ");
|
||||||
return numberOfErrors;
|
return number_of_errors;
|
||||||
}
|
}
|
||||||
|
|
||||||
ViETest::Log(" ");
|
ViETest::Log(" ");
|
||||||
@ -462,7 +189,7 @@ int ViEAutoTest::ViECodecExtendedTest()
|
|||||||
|
|
||||||
numberOfErrors = ViECodecAPITest();
|
numberOfErrors = ViECodecAPITest();
|
||||||
numberOfErrors += ViECodecStandardTest();
|
numberOfErrors += ViECodecStandardTest();
|
||||||
numberOfErrors += ViECodecExternalCodecTest();
|
numberOfErrors += ViECodecExternalCodecTest();
|
||||||
|
|
||||||
tbInterfaces interfaces = tbInterfaces("ViECodecExtendedTest",
|
tbInterfaces interfaces = tbInterfaces("ViECodecExtendedTest",
|
||||||
numberOfErrors);
|
numberOfErrors);
|
||||||
@ -891,9 +618,9 @@ int ViEAutoTest::ViECodecAPITest()
|
|||||||
ViETest::Log("========================================");
|
ViETest::Log("========================================");
|
||||||
ViETest::Log(" ViECodec API Test\n");
|
ViETest::Log(" ViECodec API Test\n");
|
||||||
|
|
||||||
//***************************************************************
|
// ***************************************************************
|
||||||
// Begin create/initialize WebRTC Video Engine for testing
|
// Begin create/initialize WebRTC Video Engine for testing
|
||||||
//***************************************************************
|
// ***************************************************************
|
||||||
|
|
||||||
int error = 0;
|
int error = 0;
|
||||||
int numberOfErrors = 0;
|
int numberOfErrors = 0;
|
||||||
@ -1025,14 +752,14 @@ int ViEAutoTest::ViECodecExternalCodecTest()
|
|||||||
ViETest::Log("========================================");
|
ViETest::Log("========================================");
|
||||||
ViETest::Log(" ViEExternalCodec Test\n");
|
ViETest::Log(" ViEExternalCodec Test\n");
|
||||||
|
|
||||||
//***************************************************************
|
// ***************************************************************
|
||||||
// Begin create/initialize WebRTC Video Engine for testing
|
// Begin create/initialize WebRTC Video Engine for testing
|
||||||
//***************************************************************
|
// ***************************************************************
|
||||||
|
|
||||||
|
|
||||||
//***************************************************************
|
// ***************************************************************
|
||||||
// Engine ready. Begin testing class
|
// Engine ready. Begin testing class
|
||||||
//***************************************************************
|
// ***************************************************************
|
||||||
|
|
||||||
#ifdef WEBRTC_VIDEO_ENGINE_EXTERNAL_CODEC_API
|
#ifdef WEBRTC_VIDEO_ENGINE_EXTERNAL_CODEC_API
|
||||||
int numberOfErrors=0;
|
int numberOfErrors=0;
|
||||||
@ -1093,7 +820,8 @@ int ViEAutoTest::ViECodecExternalCodecTest()
|
|||||||
__FUNCTION__, __LINE__);
|
__FUNCTION__, __LINE__);
|
||||||
|
|
||||||
// Use new external encoder
|
// Use new external encoder
|
||||||
error = ViE.ptrViECodec->SetSendCodec(channel.videoChannel,codecStruct);
|
error = ViE.ptrViECodec->SetSendCodec(channel.videoChannel,
|
||||||
|
codecStruct);
|
||||||
numberOfErrors += ViETest::TestError(error == 0,
|
numberOfErrors += ViETest::TestError(error == 0,
|
||||||
"ERROR: %s at line %d",
|
"ERROR: %s at line %d",
|
||||||
__FUNCTION__, __LINE__);
|
__FUNCTION__, __LINE__);
|
||||||
@ -1135,7 +863,8 @@ int ViEAutoTest::ViECodecExternalCodecTest()
|
|||||||
error = ptrViEExtCodec->DeRegisterExternalSendCodec(
|
error = ptrViEExtCodec->DeRegisterExternalSendCodec(
|
||||||
channel.videoChannel,codecStruct.plType);
|
channel.videoChannel,codecStruct.plType);
|
||||||
numberOfErrors += ViETest::TestError(error == 0,
|
numberOfErrors += ViETest::TestError(error == 0,
|
||||||
"ERROR: %s at line %d", __FUNCTION__, __LINE__);
|
"ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
|
||||||
error = ptrViEExtCodec->DeRegisterExternalReceiveCodec(
|
error = ptrViEExtCodec->DeRegisterExternalReceiveCodec(
|
||||||
channel.videoChannel,codecStruct.plType);
|
channel.videoChannel,codecStruct.plType);
|
||||||
@ -1293,3 +1022,270 @@ int ViEAutoTest::ViECodecExternalCodecTest()
|
|||||||
return 0;
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ViEAutoTest::RunCodecTestInternal(const tbInterfaces& interfaces,
|
||||||
|
int & numberOfErrors,
|
||||||
|
int captureId)
|
||||||
|
{
|
||||||
|
webrtc::VideoEngine *ptrViE = interfaces.ptrViE;
|
||||||
|
webrtc::ViEBase *ptrViEBase = interfaces.ptrViEBase;
|
||||||
|
webrtc::ViECapture *ptrViECapture = interfaces.ptrViECapture;
|
||||||
|
webrtc::ViERender *ptrViERender = interfaces.ptrViERender;
|
||||||
|
webrtc::ViECodec *ptrViECodec = interfaces.ptrViECodec;
|
||||||
|
webrtc::ViERTP_RTCP *ptrViERtpRtcp = interfaces.ptrViERtpRtcp;
|
||||||
|
webrtc::ViENetwork *ptrViENetwork = interfaces.ptrViENetwork;
|
||||||
|
int videoChannel = -1;
|
||||||
|
|
||||||
|
int error = ptrViEBase->CreateChannel(videoChannel);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
error = ptrViECapture->ConnectCaptureDevice(captureId, videoChannel);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
error = ptrViERtpRtcp->SetRTCPStatus(videoChannel,
|
||||||
|
webrtc::kRtcpCompound_RFC4585);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
error = ptrViERtpRtcp->
|
||||||
|
SetKeyFrameRequestMethod(videoChannel,
|
||||||
|
webrtc::kViEKeyFrameRequestPliRtcp);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
error = ptrViERtpRtcp->SetTMMBRStatus(videoChannel, true);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
error = ptrViERender->AddRenderer(captureId, _window1, 0, 0.0, 0.0, 1.0, 1.0);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
error = ptrViERender->AddRenderer(videoChannel, _window2, 1, 0.0, 0.0,
|
||||||
|
1.0, 1.0);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
error = ptrViERender->StartRender(captureId);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
error = ptrViERender->StartRender(videoChannel);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
|
||||||
|
//***************************************************************
|
||||||
|
// Engine ready. Begin testing class
|
||||||
|
//***************************************************************
|
||||||
|
webrtc::VideoCodec videoCodec;
|
||||||
|
memset(&videoCodec, 0, sizeof (webrtc::VideoCodec));
|
||||||
|
for (int idx = 0; idx < ptrViECodec->NumberOfCodecs(); idx++)
|
||||||
|
{
|
||||||
|
error = ptrViECodec->GetCodec(idx, videoCodec);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
|
||||||
|
if (videoCodec.codecType != webrtc::kVideoCodecH263
|
||||||
|
&& videoCodec.codecType != webrtc::kVideoCodecI420)
|
||||||
|
{
|
||||||
|
videoCodec.width = 640;
|
||||||
|
videoCodec.height = 480;
|
||||||
|
}
|
||||||
|
if(videoCodec.codecType == webrtc::kVideoCodecI420)
|
||||||
|
{
|
||||||
|
videoCodec.width=176;
|
||||||
|
videoCodec.height=144;
|
||||||
|
}
|
||||||
|
error = ptrViECodec->SetReceiveCodec(videoChannel, videoCodec);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
}
|
||||||
|
for (int idx = 0; idx < ptrViECodec->NumberOfCodecs(); idx++)
|
||||||
|
{
|
||||||
|
error = ptrViECodec->GetCodec(idx, videoCodec);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
if (videoCodec.codecType == webrtc::kVideoCodecVP8)
|
||||||
|
{
|
||||||
|
error = ptrViECodec->SetSendCodec(videoChannel, videoCodec);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0,
|
||||||
|
"ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const char *ipAddress = "127.0.0.1";
|
||||||
|
const unsigned short rtpPort = 6000;
|
||||||
|
error = ptrViENetwork->SetLocalReceiver(videoChannel, rtpPort);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
error = ptrViEBase->StartReceive(videoChannel);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
error = ptrViENetwork->SetSendDestination(videoChannel, ipAddress, rtpPort);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
error = ptrViEBase->StartSend(videoChannel);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
//
|
||||||
|
// Make sure all codecs runs
|
||||||
|
//
|
||||||
|
{
|
||||||
|
webrtc::ViEImageProcess *ptrViEImageProcess =
|
||||||
|
webrtc::ViEImageProcess::GetInterface(ptrViE);
|
||||||
|
ViEAutotestCodecObserever codecObserver;
|
||||||
|
error = ptrViECodec->RegisterDecoderObserver(videoChannel, codecObserver);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0,
|
||||||
|
"ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
ViETest::Log("Loop through all codecs for %d seconds",
|
||||||
|
KAutoTestSleepTimeMs / 1000);
|
||||||
|
for (int idx = 0; idx < ptrViECodec->NumberOfCodecs() - 2; idx++)
|
||||||
|
{
|
||||||
|
error = ptrViECodec->GetCodec(idx, videoCodec);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0,
|
||||||
|
"ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
if (videoCodec.codecType != webrtc::kVideoCodecMPEG4)
|
||||||
|
{
|
||||||
|
if(videoCodec.codecType == webrtc::kVideoCodecI420)
|
||||||
|
{
|
||||||
|
// Lower resolution to sockkets keep up.
|
||||||
|
videoCodec.width=176;
|
||||||
|
videoCodec.height=144;
|
||||||
|
videoCodec.maxFramerate=15;
|
||||||
|
}
|
||||||
|
error = ptrViECodec->SetSendCodec(videoChannel, videoCodec);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0,
|
||||||
|
"ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
ViETest::Log("\t %d. %s", idx, videoCodec.plName);
|
||||||
|
|
||||||
|
ViEAutoTestEffectFilter frameCounter;
|
||||||
|
error = ptrViEImageProcess->RegisterRenderEffectFilter(
|
||||||
|
videoChannel,
|
||||||
|
frameCounter);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0,
|
||||||
|
"ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
|
||||||
|
AutoTestSleep( KAutoTestSleepTimeMs);
|
||||||
|
|
||||||
|
// Verify we've received and decoded correct payload
|
||||||
|
numberOfErrors += ViETest::TestError(
|
||||||
|
codecObserver.incomingCodec.codecType
|
||||||
|
== videoCodec.codecType, "ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
|
||||||
|
int maxNumberOfRenderedFrames = videoCodec.maxFramerate
|
||||||
|
* KAutoTestSleepTimeMs / 1000;
|
||||||
|
|
||||||
|
if(videoCodec.codecType == webrtc::kVideoCodecI420)
|
||||||
|
{
|
||||||
|
// Due to that I420 needs a huge bandwidth, rate control can set
|
||||||
|
// frame rate very low. This happen since we use the same channel
|
||||||
|
// as we just tested with vp8.
|
||||||
|
numberOfErrors += ViETest::TestError(frameCounter.numFrames>0,
|
||||||
|
"ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
#ifdef WEBRTC_ANDROID
|
||||||
|
// Special case to get the autotest to pass on some slow devices
|
||||||
|
numberOfErrors +=
|
||||||
|
ViETest::TestError(frameCounter.numFrames
|
||||||
|
> maxNumberOfRenderedFrames / 6,
|
||||||
|
"ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
#else
|
||||||
|
numberOfErrors += ViETest::TestError(frameCounter.numFrames
|
||||||
|
> maxNumberOfRenderedFrames / 4,
|
||||||
|
"ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
error = ptrViEImageProcess->DeregisterRenderEffectFilter(
|
||||||
|
videoChannel);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0,
|
||||||
|
"ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ViETest::Log("\t %d. %s not tested", idx, videoCodec.plName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ptrViEImageProcess->Release();
|
||||||
|
error = ptrViECodec->DeregisterDecoderObserver(videoChannel);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0,
|
||||||
|
"ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
ViETest::Log("Done!");
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Callbacks
|
||||||
|
//
|
||||||
|
ViEAutotestCodecObserever codecObserver;
|
||||||
|
error = ptrViECodec->RegisterEncoderObserver(videoChannel, codecObserver);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
error = ptrViECodec->RegisterDecoderObserver(videoChannel, codecObserver);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
ViETest::Log("\nTesting codec callbacks...");
|
||||||
|
for (int idx = 0; idx < ptrViECodec->NumberOfCodecs(); idx++)
|
||||||
|
{
|
||||||
|
error = ptrViECodec->GetCodec(idx, videoCodec);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
if (videoCodec.codecType == webrtc::kVideoCodecVP8)
|
||||||
|
{
|
||||||
|
error = ptrViECodec->SetSendCodec(videoChannel, videoCodec);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0,
|
||||||
|
"ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
AutoTestSleep (KAutoTestSleepTimeMs);
|
||||||
|
error = ptrViEBase->StopSend(videoChannel);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
error = ptrViECodec->DeregisterEncoderObserver(videoChannel);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
error = ptrViECodec->DeregisterDecoderObserver(videoChannel);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
numberOfErrors += ViETest::TestError(codecObserver.incomingCodecCalled > 0,
|
||||||
|
"ERROR: %s at line %d", __FUNCTION__,
|
||||||
|
__LINE__);
|
||||||
|
numberOfErrors += ViETest::TestError(codecObserver.incomingRatecalled > 0,
|
||||||
|
"ERROR: %s at line %d", __FUNCTION__,
|
||||||
|
__LINE__);
|
||||||
|
numberOfErrors += ViETest::TestError(codecObserver.outgoingRatecalled > 0,
|
||||||
|
"ERROR: %s at line %d", __FUNCTION__,
|
||||||
|
__LINE__);
|
||||||
|
//***************************************************************
|
||||||
|
// Testing finished. Tear down Video Engine
|
||||||
|
//***************************************************************
|
||||||
|
error = ptrViEBase->StopReceive(videoChannel);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
error = ptrViEBase->StopSend(videoChannel); // Already stopped
|
||||||
|
numberOfErrors += ViETest::TestError(error == -1, "ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
error = ptrViERender->StopRender(videoChannel);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
error = ptrViERender->RemoveRenderer(captureId);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
error = ptrViERender->RemoveRenderer(videoChannel);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
error = ptrViECapture->DisconnectCaptureDevice(videoChannel);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
error = ptrViEBase->DeleteChannel(videoChannel);
|
||||||
|
numberOfErrors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
|
||||||
|
__FUNCTION__, __LINE__);
|
||||||
|
}
|
||||||
|
@ -46,6 +46,7 @@
|
|||||||
# Helper classes
|
# Helper classes
|
||||||
'helpers/vie_window_creator.cc',
|
'helpers/vie_window_creator.cc',
|
||||||
'helpers/vie_file_capture_device.cc',
|
'helpers/vie_file_capture_device.cc',
|
||||||
|
'helpers/vie_fake_camera.cc',
|
||||||
|
|
||||||
# New, fully automated tests
|
# New, fully automated tests
|
||||||
'automated/vie_api_integration_test.cc',
|
'automated/vie_api_integration_test.cc',
|
||||||
|
Loading…
x
Reference in New Issue
Block a user