test: Extract BufferSource class out of camera tests to libtest

The BufferSource class can be used by other tests other then the camera
buffer importer test, move it to libtest. The only changes to
BufferSource is for it to be allowed to be split in a header and source
file.

This change makes it necessary for libtest to have access to internal
libcamera headers. As the internal headers already are accessible to all
test cases this does not increase the exposure of libcamera internals to
the test cases.

Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Niklas Söderlund 2020-02-24 20:12:45 +01:00
parent 42a00cb617
commit 257df552a4
4 changed files with 138 additions and 98 deletions

View file

@ -0,0 +1,98 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Copyright (C) 2020, Google Inc.
*
* A provider of external buffers, suitable for use in tests.
*/
#include "buffer_source.h"
#include <iostream>
#include "device_enumerator.h"
#include "test.h"
BufferSource::BufferSource()
: video_(nullptr)
{
}
BufferSource::~BufferSource()
{
if (video_) {
video_->releaseBuffers();
video_->close();
}
delete video_;
video_ = nullptr;
if (media_)
media_->release();
}
int BufferSource::allocate(const StreamConfiguration &config)
{
/* Locate and open the video device. */
std::string videoDeviceName = "vivid-000-vid-out";
std::unique_ptr<DeviceEnumerator> enumerator =
DeviceEnumerator::create();
if (!enumerator) {
std::cout << "Failed to create device enumerator" << std::endl;
return TestFail;
}
if (enumerator->enumerate()) {
std::cout << "Failed to enumerate media devices" << std::endl;
return TestFail;
}
DeviceMatch dm("vivid");
dm.add(videoDeviceName);
media_ = enumerator->search(dm);
if (!media_) {
std::cout << "No vivid output device available" << std::endl;
return TestSkip;
}
video_ = V4L2VideoDevice::fromEntityName(media_.get(), videoDeviceName);
if (!video_) {
std::cout << "Failed to get video device from entity "
<< videoDeviceName << std::endl;
return TestFail;
}
if (video_->open()) {
std::cout << "Unable to open " << videoDeviceName << std::endl;
return TestFail;
}
/* Configure the format. */
V4L2DeviceFormat format;
if (video_->getFormat(&format)) {
std::cout << "Failed to get format on output device" << std::endl;
return TestFail;
}
format.size = config.size;
format.fourcc = V4L2VideoDevice::toV4L2Fourcc(config.pixelFormat, false);
if (video_->setFormat(&format)) {
std::cout << "Failed to set format on output device" << std::endl;
return TestFail;
}
if (video_->exportBuffers(config.bufferCount, &buffers_) < 0) {
std::cout << "Failed to export buffers" << std::endl;
return TestFail;
}
return TestPass;
}
const std::vector<std::unique_ptr<FrameBuffer>> &BufferSource::buffers()
{
return buffers_;
}

View file

@ -0,0 +1,32 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Copyright (C) 2020, Google Inc.
*
* buffer_source.h - libcamera camera test helper to create FrameBuffers
*/
#ifndef __LIBCAMERA_BUFFER_SOURCE_TEST_H__
#define __LIBCAMERA_BUFFER_SOURCE_TEST_H__
#include <libcamera/libcamera.h>
#include "media_device.h"
#include "v4l2_videodevice.h"
using namespace libcamera;
class BufferSource
{
public:
BufferSource();
~BufferSource();
int allocate(const StreamConfiguration &config);
const std::vector<std::unique_ptr<FrameBuffer>> &buffers();
private:
std::shared_ptr<MediaDevice> media_;
V4L2VideoDevice *video_;
std::vector<std::unique_ptr<FrameBuffer>> buffers_;
};
#endif /* __LIBCAMERA_BUFFER_SOURCE_TEST_H__ */

View file

@ -1,14 +1,11 @@
libtest_sources = files([
'buffer_source.cpp',
'camera_test.cpp',
'test.cpp',
])
libtest = static_library('libtest', libtest_sources,
dependencies : libcamera_dep)
libtest_includes = include_directories('.')
test_libraries = [libtest]
test_includes_public = [
libtest_includes,
@ -18,3 +15,9 @@ test_includes_internal = [
test_includes_public,
libcamera_internal_includes,
]
libtest = static_library('libtest', libtest_sources,
dependencies : libcamera_dep,
include_directories : test_includes_internal)
test_libraries = [libtest]