libcamera/test/v4l2_device/capture_async.cpp
Kieran Bingham 03fcc154eb libcamera: v4l2_device: Simplify exportBuffers()
exportBuffers() can only operate on an existing BufferPool allocation. The
pool identifies its size through its .count() method.

Passing a count in to the exportBuffers() call is redundant and can be
incorrect if the value is not the same as the BufferPool size.

Simplify the function and remove the unnecessary argument, correcting all uses
throughout the code base.

While we're here, remove the createBuffers() helper from the V4L2DeviceTest
which only served to obfuscate which pool the buffers were being allocated for.

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2019-02-13 15:50:09 +00:00

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;
pool_.createBuffers(bufferCount);
ret = dev_->exportBuffers(&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);