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>
This commit is contained in:
committed by
Laurent Pinchart
parent
04faa8477a
commit
eea1c9c631
@@ -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)
|
||||
@@ -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'],
|
||||
|
||||
Reference in New Issue
Block a user