summaryrefslogtreecommitdiff
path: root/test/libtest
diff options
context:
space:
mode:
Diffstat (limited to 'test/libtest')
-rw-r--r--test/libtest/buffer_source.cpp98
-rw-r--r--test/libtest/buffer_source.h32
-rw-r--r--test/libtest/meson.build11
3 files changed, 137 insertions, 4 deletions
diff --git a/test/libtest/buffer_source.cpp b/test/libtest/buffer_source.cpp
new file mode 100644
index 00000000..066049d3
--- /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 00000000..2d8fc5ac
--- /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 3e798ef3..33565e0e 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]