summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKieran Bingham <kieran.bingham@ideasonboard.com>2022-04-06 13:35:54 +0100
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2022-04-06 15:44:39 +0300
commiteea1c9c6319c63933cc47a7694b14729b4841928 (patch)
tree1ebc1fded4a4f219a6635e7db01751850e9f93e2
parent04faa8477abdaf1dafad3fdbe9dc58326e9126d2 (diff)
test: v4l2_videodevice: Verify the Dequeue Watchdog
Add a test that captures 5 frames, with a short (5ms) watchdog. The default framerate of the VIMC pipeline should ensure that we never meet this watchdog, and the timeout should activate. Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r--test/v4l2_videodevice/dequeue_watchdog.cpp96
-rw-r--r--test/v4l2_videodevice/meson.build1
2 files changed, 97 insertions, 0 deletions
diff --git a/test/v4l2_videodevice/dequeue_watchdog.cpp b/test/v4l2_videodevice/dequeue_watchdog.cpp
new file mode 100644
index 00000000..0cb4de6f
--- /dev/null
+++ b/test/v4l2_videodevice/dequeue_watchdog.cpp
@@ -0,0 +1,96 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2022, Ideas on Board Oy.
+ *
+ * libcamera V4L2 dequeue watchdog test
+ */
+
+#include <iostream>
+
+#include <libcamera/base/event_dispatcher.h>
+#include <libcamera/base/thread.h>
+#include <libcamera/base/timer.h>
+
+#include <libcamera/framebuffer.h>
+
+#include "v4l2_videodevice_test.h"
+
+using namespace libcamera;
+using namespace std::chrono_literals;
+
+class DequeueWatchdogTest : public V4L2VideoDeviceTest
+{
+public:
+ DequeueWatchdogTest()
+ : V4L2VideoDeviceTest("vimc", "Raw Capture 0"), frames_(0), barks_(0) {}
+
+protected:
+ int run()
+ {
+ constexpr unsigned int bufferCount = 8;
+
+ EventDispatcher *dispatcher = Thread::current()->eventDispatcher();
+ Timer timeout;
+
+ int ret = capture_->allocateBuffers(bufferCount, &buffers_);
+ if (ret < 0)
+ return TestFail;
+
+ capture_->dequeueTimeout.connect(this, &DequeueWatchdogTest::barkCounter);
+ capture_->setDequeueTimeout(5ms);
+
+ capture_->bufferReady.connect(this, &DequeueWatchdogTest::receiveBuffer);
+
+ for (const std::unique_ptr<FrameBuffer> &buffer : buffers_) {
+ if (capture_->queueBuffer(buffer.get())) {
+ std::cout << "Failed to queue buffer" << std::endl;
+ return TestFail;
+ }
+ }
+
+ capture_->streamOn();
+
+ timeout.start(5s);
+ while (timeout.isRunning()) {
+ dispatcher->processEvents();
+ if (frames_ > 5)
+ break;
+ }
+
+ std::cout << "Processed " << frames_ << " frames_ and heard "
+ << barks_ << " barks_" << std::endl;
+
+ if (!barks_) {
+ std::cout << "Failed to hear any barks_." << std::endl;
+ return TestFail;
+ }
+
+ capture_->streamOff();
+
+ return TestPass;
+ }
+
+private:
+ void receiveBuffer(FrameBuffer *buffer)
+ {
+ if (buffer->metadata().status == FrameMetadata::FrameCancelled)
+ return;
+
+ std::cout << "Buffer received" << std::endl;
+ frames_++;
+
+ /* Requeue the buffer for further use. */
+ capture_->queueBuffer(buffer);
+ }
+
+ void barkCounter()
+ {
+ std::cout << "Watchdog is barking" << std::endl;
+ barks_++;
+ }
+
+ unsigned int frames_;
+ unsigned int barks_;
+};
+
+TEST_REGISTER(DequeueWatchdogTest)
diff --git a/test/v4l2_videodevice/meson.build b/test/v4l2_videodevice/meson.build
index 643f82ed..7a26f53d 100644
--- a/test/v4l2_videodevice/meson.build
+++ b/test/v4l2_videodevice/meson.build
@@ -6,6 +6,7 @@ v4l2_videodevice_tests = [
['double_open', 'double_open.cpp'],
['controls', 'controls.cpp'],
['formats', 'formats.cpp'],
+ ['dequeue_watchdog', 'dequeue_watchdog.cpp'],
['request_buffers', 'request_buffers.cpp'],
['buffer_cache', 'buffer_cache.cpp'],
['stream_on_off', 'stream_on_off.cpp'],