[libcamera-devel] [PATCH v2 2/4] test: Extract BufferSource class out of camera tests to libtest
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Sat Feb 29 17:09:50 CET 2020
Hi Niklas,
Thank you for the patch.
On Mon, Feb 24, 2020 at 08:35:59PM +0100, Niklas Söderlund wrote:
> 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 do not increase the exposure of libcamera internals to
s/do/does/
> the test cases.
I think we'll need to refactor the test classes, but this can be done
later.
>
> Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
> test/camera/buffer_import.cpp | 95 +-------------------------------
> test/libtest/buffer_source.cpp | 98 ++++++++++++++++++++++++++++++++++
> test/libtest/buffer_source.h | 32 +++++++++++
> test/libtest/meson.build | 11 ++--
> 4 files changed, 138 insertions(+), 98 deletions(-)
> create mode 100644 test/libtest/buffer_source.cpp
> create mode 100644 test/libtest/buffer_source.h
>
> diff --git a/test/camera/buffer_import.cpp b/test/camera/buffer_import.cpp
> index 6997ea78c9f608c9..3f392cdc0732941f 100644
> --- a/test/camera/buffer_import.cpp
> +++ b/test/camera/buffer_import.cpp
> @@ -16,6 +16,7 @@
> #include "media_device.h"
> #include "v4l2_videodevice.h"
>
> +#include "buffer_source.h"
> #include "camera_test.h"
> #include "test.h"
>
> @@ -23,100 +24,6 @@ using namespace libcamera;
>
> namespace {
>
> -/* A provider of external buffers, suitable for import by a Camera. */
> -class BufferSource
> -{
> -public:
> - BufferSource()
> - : video_(nullptr)
> - {
> - }
> -
> - ~BufferSource()
> - {
> - if (video_) {
> - video_->releaseBuffers();
> - video_->close();
> - }
> -
> - delete video_;
> - video_ = nullptr;
> -
> - if (media_)
> - media_->release();
> - }
> -
> - int 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>> &buffers()
> - {
> - return buffers_;
> - }
> -
> -private:
> - std::shared_ptr<MediaDevice> media_;
> - V4L2VideoDevice *video_;
> - std::vector<std::unique_ptr<FrameBuffer>> buffers_;
> -};
> -
> class BufferImportTest : public CameraTest, public Test
> {
> public:
> diff --git a/test/libtest/buffer_source.cpp b/test/libtest/buffer_source.cpp
> new file mode 100644
> index 0000000000000000..066049d342a491f0
> --- /dev/null
> +++ b/test/libtest/buffer_source.cpp
> @@ -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_;
> +}
> diff --git a/test/libtest/buffer_source.h b/test/libtest/buffer_source.h
> new file mode 100644
> index 0000000000000000..2d8fc5acf6d78771
> --- /dev/null
> +++ b/test/libtest/buffer_source.h
> @@ -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__ */
> diff --git a/test/libtest/meson.build b/test/libtest/meson.build
> index 3e798ef3810e9b0d..33565e0eb3b66d6a 100644
> --- a/test/libtest/meson.build
> +++ b/test/libtest/meson.build
> @@ -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]
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list