From patchwork Mon Mar 11 02:22:31 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Niklas_S=C3=B6derlund?= X-Patchwork-Id: 713 Return-Path: Received: from bin-mail-out-05.binero.net (bin-mail-out-05.binero.net [195.74.38.228]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id EE2CC610B6 for ; Mon, 11 Mar 2019 03:23:09 +0100 (CET) X-Halon-ID: 9ab61213-43a4-11e9-985a-005056917f90 Authorized-sender: niklas@soderlund.pp.se Received: from bismarck.berto.se (unknown [89.233.230.99]) by bin-vsp-out-02.atm.binero.net (Halon) with ESMTPA id 9ab61213-43a4-11e9-985a-005056917f90; Mon, 11 Mar 2019 03:23:06 +0100 (CET) From: =?utf-8?q?Niklas_S=C3=B6derlund?= To: libcamera-devel@lists.libcamera.org Date: Mon, 11 Mar 2019 03:22:31 +0100 Message-Id: <20190311022232.4759-4-niklas.soderlund@ragnatech.se> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190311022232.4759-1-niklas.soderlund@ragnatech.se> References: <20190311022232.4759-1-niklas.soderlund@ragnatech.se> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 3/4] test: camera: Add capture test X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 11 Mar 2019 02:23:10 -0000 Correctly configure the camera using the default configuration and run a capture session for 100 milliseconds, which is plenty of time, in tests over 600 requests completed using the vimc pipeline. The test passes if at least the number of buffers used in the capture times two number of requests completes to prove we cycle through all buffers. Signed-off-by: Niklas Söderlund Reviewed-by: Laurent Pinchart --- test/camera/capture.cpp | 136 ++++++++++++++++++++++++++++++++++++++++ test/camera/meson.build | 1 + 2 files changed, 137 insertions(+) create mode 100644 test/camera/capture.cpp diff --git a/test/camera/capture.cpp b/test/camera/capture.cpp new file mode 100644 index 0000000000000000..44adcf3639393d3f --- /dev/null +++ b/test/camera/capture.cpp @@ -0,0 +1,136 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2019, Google Inc. + * + * libcamera Camera API tests + */ + +#include + +#include "camera_test.h" + +using namespace std; + +namespace { + +class Capture : public CameraTest +{ +protected: + unsigned int completeBuffersCount_; + unsigned int completeRequestsCount_; + + void bufferComplete(Request *request, Buffer *buffer) + { + if (buffer->status() != Buffer::BufferSuccess) + return; + + completeBuffersCount_++; + } + + void requestComplete(Request *request, const std::map &buffers) + { + if (request->status() != Request::RequestComplete) + return; + + completeRequestsCount_++; + + /* Reuse the buffers for a new request. */ + request = camera_->createRequest(); + request->setBuffers(buffers); + camera_->queueRequest(request); + } + + int run() + { + Stream *stream = *camera_->streams().begin(); + std::set streams = { stream }; + std::map conf = + camera_->streamConfiguration(streams); + StreamConfiguration *sconf = &conf.begin()->second; + + if (!configurationValid(streams, conf)) { + cout << "Reading default configuration" << endl; + return TestFail; + } + + if (camera_->acquire()) { + cout << "Acquiring the camera" << endl; + return TestFail; + } + + if (camera_->configureStreams(conf)) { + cout << "Setting default configuration" << endl; + return TestFail; + } + + if (camera_->allocateBuffers()) { + cout << "Allocating buffers" << endl; + return TestFail; + } + + BufferPool &pool = stream->bufferPool(); + std::vector requests; + for (Buffer &buffer : pool.buffers()) { + Request *request = camera_->createRequest(); + if (!request) { + cout << "Creating requests" << endl; + return TestFail; + } + + std::map map = { { stream, &buffer } }; + if (request->setBuffers(map)) { + cout << "Associating buffers with requests" << endl; + return TestFail; + } + + requests.push_back(request); + } + + completeRequestsCount_ = 0; + completeBuffersCount_ = 0; + + camera_->bufferCompleted.connect(this, &Capture::bufferComplete); + camera_->requestCompleted.connect(this, &Capture::requestComplete); + + if (camera_->start()) { + cout << "Starting camera" << endl; + return TestFail; + } + + for (Request *request : requests) { + if (camera_->queueRequest(request)) { + cout << "Queueing requests" << endl; + return TestFail; + } + } + + EventDispatcher *dispatcher = CameraManager::instance()->eventDispatcher(); + + Timer timer; + timer.start(100); + while (timer.isRunning()) + dispatcher->processEvents(); + + if (completeRequestsCount_ <= sconf->bufferCount * 2 || + completeRequestsCount_ != completeBuffersCount_) { + cout << "Capture failed" << endl; + return TestFail; + } + + if (camera_->stop()) { + cout << "Stopping camera" << endl; + return TestFail; + } + + if (camera_->freeBuffers()) { + cout << "Freeing buffers" << endl; + return TestFail; + } + + return TestPass; + } +}; + +} /* namespace */ + +TEST_REGISTER(Capture); diff --git a/test/camera/meson.build b/test/camera/meson.build index ed4837190ff6c52c..a1fd20326e97538b 100644 --- a/test/camera/meson.build +++ b/test/camera/meson.build @@ -3,6 +3,7 @@ camera_tests = [ [ 'configuration_default', 'configuration_default.cpp' ], [ 'configuration_set', 'configuration_set.cpp' ], + [ 'capture', 'capture.cpp' ], ] foreach t : camera_tests