Message ID | 20220329112929.465434-3-naush@raspberrypi.com |
---|---|
State | Accepted |
Headers | show |
Series |
|
Related | show |
Hi Naush, Thank you for the patch. On Tue, Mar 29, 2022 at 12:29:29PM +0100, Naushir Patuck via libcamera-devel wrote: > From: Kieran Bingham <kieran.bingham@ideasonboard.com> > > 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> > --- > test/v4l2_videodevice/dequeue_watchdog.cpp | 96 ++++++++++++++++++++++ > test/v4l2_videodevice/meson.build | 1 + > 2 files changed, 97 insertions(+) > create mode 100644 test/v4l2_videodevice/dequeue_watchdog.cpp > > diff --git a/test/v4l2_videodevice/dequeue_watchdog.cpp b/test/v4l2_videodevice/dequeue_watchdog.cpp > new file mode 100644 > index 000000000000..0cb4de6f81a0 > --- /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 643f82edce5e..7a26f53d106a 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'],
diff --git a/test/v4l2_videodevice/dequeue_watchdog.cpp b/test/v4l2_videodevice/dequeue_watchdog.cpp new file mode 100644 index 000000000000..0cb4de6f81a0 --- /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 643f82edce5e..7a26f53d106a 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'],