mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-13 23:39:44 +03:00
The capture_async test was written to run for a fixed 5 second duration. Modify the test such that it runs until it has captured 30 frames, or a 10 second time out occurs. Running the capture_async test on an ARM64 platform using VIVID captures 30 frames in 6.15 seconds. There may be scope to optimise this speed by changing the format on the capture device. Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
89 lines
1.7 KiB
C++
89 lines
1.7 KiB
C++
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
/*
|
|
* Copyright (C) 2019, Google Inc.
|
|
*
|
|
* libcamera V4L2 API tests
|
|
*/
|
|
|
|
#include <libcamera/buffer.h>
|
|
#include <libcamera/camera_manager.h>
|
|
#include <libcamera/event_dispatcher.h>
|
|
#include <libcamera/timer.h>
|
|
|
|
#include <iostream>
|
|
|
|
#include "v4l2_device_test.h"
|
|
|
|
class CaptureAsyncTest : public V4L2DeviceTest
|
|
{
|
|
public:
|
|
CaptureAsyncTest()
|
|
: frames(0){};
|
|
|
|
void receiveBuffer(Buffer *buffer)
|
|
{
|
|
std::cout << "Received buffer " << buffer->index() << std::endl;
|
|
frames++;
|
|
|
|
/* Requeue the buffer for further use. */
|
|
dev_->queueBuffer(buffer);
|
|
}
|
|
|
|
protected:
|
|
int run()
|
|
{
|
|
const unsigned int bufferCount = 8;
|
|
|
|
EventDispatcher *dispatcher = CameraManager::instance()->eventDispatcher();
|
|
Timer timeout;
|
|
int ret;
|
|
|
|
createBuffers(bufferCount);
|
|
|
|
ret = dev_->exportBuffers(bufferCount, &pool_);
|
|
if (ret)
|
|
return TestFail;
|
|
|
|
dev_->bufferReady.connect(this, &CaptureAsyncTest::receiveBuffer);
|
|
|
|
/* Queue all the buffers to the device. */
|
|
for (Buffer &b : pool_.buffers()) {
|
|
if (dev_->queueBuffer(&b))
|
|
return TestFail;
|
|
}
|
|
|
|
ret = dev_->streamOn();
|
|
if (ret)
|
|
return TestFail;
|
|
|
|
timeout.start(10000);
|
|
while (timeout.isRunning()) {
|
|
dispatcher->processEvents();
|
|
if (frames > 30)
|
|
break;
|
|
}
|
|
|
|
if (frames < 1) {
|
|
std::cout << "Failed to capture any frames within timeout." << std::endl;
|
|
return TestFail;
|
|
}
|
|
|
|
if (frames < 30) {
|
|
std::cout << "Failed to capture 30 frames within timeout." << std::endl;
|
|
return TestFail;
|
|
}
|
|
|
|
std::cout << "Processed " << frames << " frames" << std::endl;
|
|
|
|
ret = dev_->streamOff();
|
|
if (ret)
|
|
return TestFail;
|
|
|
|
return TestPass;
|
|
}
|
|
|
|
private:
|
|
unsigned int frames;
|
|
};
|
|
|
|
TEST_REGISTER(CaptureAsyncTest);
|