summaryrefslogtreecommitdiff
path: root/test/v4l2_videodevice/meson.build
diff options
context:
space:
mode:
authorKieran Bingham <kieran.bingham@ideasonboard.com>2020-06-27 22:18:26 +0100
committerKieran Bingham <kieran.bingham@ideasonboard.com>2020-07-06 23:58:42 +0100
commitd35cf6e4e4972948e49e6e45f3f0caaeea760a0b (patch)
treefbee6fd7f0b8960138bd8482cc46510673abab38 /test/v4l2_videodevice/meson.build
parente0c583871da9cc6d243bff26ef5ba224007fc5ed (diff)
libcamera: camera: Allow unspecified roles for generateConfiguration
Providing an empty set of roles is permitted to generate an empty configuration from the pipeline handlers. Overload the generateConfiguration() function such that not specifying a roles parameter will use an empty set, and return an empty configuration. Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Diffstat (limited to 'test/v4l2_videodevice/meson.build')
0 files changed, 0 insertions, 0 deletions
84 185 186 187 188 189 190 191
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * Copyright (C) 2020-2021, Google Inc.
 *
 * simple_capture.cpp - Simple capture helper
 */

#include <gtest/gtest.h>

#include "simple_capture.h"

using namespace libcamera;

SimpleCapture::SimpleCapture(std::shared_ptr<Camera> camera)
	: loop_(nullptr), camera_(camera),
	  allocator_(std::make_unique<FrameBufferAllocator>(camera))
{
}

SimpleCapture::~SimpleCapture()
{
	stop();
}

void SimpleCapture::configure(StreamRole role)
{
	config_ = camera_->generateConfiguration({ role });

	if (!config_) {
		std::cout << "Role not supported by camera" << std::endl;
		GTEST_SKIP();
	}

	if (config_->validate() != CameraConfiguration::Valid) {
		config_.reset();
		FAIL() << "Configuration not valid";
	}

	if (camera_->configure(config_.get())) {
		config_.reset();
		FAIL() << "Failed to configure camera";
	}
}

void SimpleCapture::start()
{
	Stream *stream = config_->at(0).stream();
	int count = allocator_->allocate(stream);

	ASSERT_GE(count, 0) << "Failed to allocate buffers";
	EXPECT_EQ(count, config_->at(0).bufferCount) << "Allocated less buffers than expected";

	camera_->requestCompleted.connect(this, &SimpleCapture::requestComplete);

	ASSERT_EQ(camera_->start(), 0) << "Failed to start camera";
}

void SimpleCapture::stop()
{
	if (!config_ || !allocator_->allocated())
		return;

	camera_->stop();

	camera_->requestCompleted.disconnect(this, &SimpleCapture::requestComplete);

	Stream *stream = config_->at(0).stream();
	allocator_->free(stream);
}

/* SimpleCaptureBalanced */

SimpleCaptureBalanced::SimpleCaptureBalanced(std::shared_ptr<Camera> camera)
	: SimpleCapture(camera)
{
}

void SimpleCaptureBalanced::capture(unsigned int numRequests)
{
	start();

	Stream *stream = config_->at(0).stream();
	const std::vector<std::unique_ptr<FrameBuffer>> &buffers = allocator_->buffers(stream);

	/* No point in testing less requests then the camera depth. */
	if (buffers.size() > numRequests) {
		std::cout << "Camera needs " + std::to_string(buffers.size())
			+ " requests, can't test only "
			+ std::to_string(numRequests) << std::endl;
		GTEST_SKIP();
	}

	queueCount_ = 0;
	captureCount_ = 0;
	captureLimit_ = numRequests;

	/* Queue the recommended number of reqeuests. */
	std::vector<std::unique_ptr<libcamera::Request>> requests;
	for (const std::unique_ptr<FrameBuffer> &buffer : buffers) {
		std::unique_ptr<Request> request = camera_->createRequest();
		ASSERT_TRUE(request) << "Can't create request";

		ASSERT_EQ(request->addBuffer(stream, buffer.get()), 0) << "Can't set buffer for request";

		ASSERT_EQ(queueRequest(request.get()), 0) << "Failed to queue request";

		requests.push_back(std::move(request));
	}

	/* Run capture session. */
	loop_ = new EventLoop();
	loop_->exec();
	stop();
	delete loop_;

	ASSERT_EQ(captureCount_, captureLimit_);
}