From patchwork Wed Feb 13 17:14:51 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kieran Bingham X-Patchwork-Id: 579 Return-Path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id D257F610B6 for ; Wed, 13 Feb 2019 18:14:57 +0100 (CET) Received: from localhost.localdomain (cpc89242-aztw30-2-0-cust488.18-1.cable.virginm.net [86.31.129.233]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 5D4745B6; Wed, 13 Feb 2019 18:14:57 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1550078097; bh=l8MbF2Ys9LogWotJpBSBJCl1Ro3djByisYylRCYDqv0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=JON5taaf/wmOsfF8BYgPQFJ4dPRaW6MNCBQXC6d1qf7TvVjJFxH7d2LsDcMgJs1k2 PuVDwnMDgsJ8VcxXz2webvoqi4ZtTf3yQAVsuifXAEALItigM45EFV15plwOpk8foD Onp8O1ydNJiXWAsHOGohOqVsVwrW+z1WEhSuIS9o= From: Kieran Bingham To: LibCamera Devel Date: Wed, 13 Feb 2019 17:14:51 +0000 Message-Id: <20190213171453.13852-2-kieran.bingham@ideasonboard.com> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20190213171453.13852-1-kieran.bingham@ideasonboard.com> References: <20190213171453.13852-1-kieran.bingham@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 1/3] test: v4l2_device: Rename dev_ to capture_ 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: Wed, 13 Feb 2019 17:14:58 -0000 Change the variable name globally throughout the tests. Repair the V4L2DeviceTest constructor style, as checkstyle complained. Signed-off-by: Kieran Bingham Reviewed-by: Laurent Pinchart --- test/v4l2_device/capture_async.cpp | 12 ++++++------ test/v4l2_device/double_open.cpp | 4 ++-- test/v4l2_device/request_buffers.cpp | 2 +- test/v4l2_device/stream_on_off.cpp | 6 +++--- test/v4l2_device/v4l2_device_test.cpp | 8 ++++---- test/v4l2_device/v4l2_device_test.h | 7 +++++-- 6 files changed, 21 insertions(+), 18 deletions(-) diff --git a/test/v4l2_device/capture_async.cpp b/test/v4l2_device/capture_async.cpp index 511368d6b53d..2a41b11e95e7 100644 --- a/test/v4l2_device/capture_async.cpp +++ b/test/v4l2_device/capture_async.cpp @@ -26,7 +26,7 @@ public: frames++; /* Requeue the buffer for further use. */ - dev_->queueBuffer(buffer); + capture_->queueBuffer(buffer); } protected: @@ -40,19 +40,19 @@ protected: pool_.createBuffers(bufferCount); - ret = dev_->exportBuffers(&pool_); + ret = capture_->exportBuffers(&pool_); if (ret) return TestFail; - dev_->bufferReady.connect(this, &CaptureAsyncTest::receiveBuffer); + capture_->bufferReady.connect(this, &CaptureAsyncTest::receiveBuffer); /* Queue all the buffers to the device. */ for (Buffer &b : pool_.buffers()) { - if (dev_->queueBuffer(&b)) + if (capture_->queueBuffer(&b)) return TestFail; } - ret = dev_->streamOn(); + ret = capture_->streamOn(); if (ret) return TestFail; @@ -75,7 +75,7 @@ protected: std::cout << "Processed " << frames << " frames" << std::endl; - ret = dev_->streamOff(); + ret = capture_->streamOff(); if (ret) return TestFail; diff --git a/test/v4l2_device/double_open.cpp b/test/v4l2_device/double_open.cpp index ca2b201454a4..7ec80a60f57e 100644 --- a/test/v4l2_device/double_open.cpp +++ b/test/v4l2_device/double_open.cpp @@ -22,10 +22,10 @@ protected: * Expect failure: The device has already been opened by the * V4L2DeviceTest base class */ - ret = dev_->open(); + ret = capture_->open(); if (!ret) { std::cout << "Double open erroneously succeeded" << std::endl; - dev_->close(); + capture_->close(); return TestFail; } diff --git a/test/v4l2_device/request_buffers.cpp b/test/v4l2_device/request_buffers.cpp index 26d7d9528982..938d4f85d5a1 100644 --- a/test/v4l2_device/request_buffers.cpp +++ b/test/v4l2_device/request_buffers.cpp @@ -21,7 +21,7 @@ protected: pool_.createBuffers(bufferCount); - int ret = dev_->exportBuffers(&pool_); + int ret = capture_->exportBuffers(&pool_); if (ret) return TestFail; diff --git a/test/v4l2_device/stream_on_off.cpp b/test/v4l2_device/stream_on_off.cpp index 861d8d695813..ea1b3f5bd5a4 100644 --- a/test/v4l2_device/stream_on_off.cpp +++ b/test/v4l2_device/stream_on_off.cpp @@ -16,15 +16,15 @@ protected: pool_.createBuffers(bufferCount); - int ret = dev_->exportBuffers(&pool_); + int ret = capture_->exportBuffers(&pool_); if (ret) return TestFail; - ret = dev_->streamOn(); + ret = capture_->streamOn(); if (ret) return TestFail; - ret = dev_->streamOff(); + ret = capture_->streamOff(); if (ret) return TestFail; diff --git a/test/v4l2_device/v4l2_device_test.cpp b/test/v4l2_device/v4l2_device_test.cpp index a2a7ba82612d..2bdf8cfe983a 100644 --- a/test/v4l2_device/v4l2_device_test.cpp +++ b/test/v4l2_device/v4l2_device_test.cpp @@ -52,16 +52,16 @@ int V4L2DeviceTest::init() if (!entity) return TestSkip; - dev_ = new V4L2Device(entity); - if (!dev_) + capture_ = new V4L2Device(entity); + if (!capture_) return TestFail; - return dev_->open(); + return capture_->open(); } void V4L2DeviceTest::cleanup() { media_->release(); - delete dev_; + delete capture_; }; diff --git a/test/v4l2_device/v4l2_device_test.h b/test/v4l2_device/v4l2_device_test.h index 43539655f85b..c476d3c05e79 100644 --- a/test/v4l2_device/v4l2_device_test.h +++ b/test/v4l2_device/v4l2_device_test.h @@ -22,7 +22,10 @@ using namespace libcamera; class V4L2DeviceTest : public Test { public: - V4L2DeviceTest() : dev_(nullptr){}; + V4L2DeviceTest() + : capture_(nullptr) + { + } protected: int init(); @@ -30,7 +33,7 @@ protected: std::unique_ptr enumerator_; std::shared_ptr media_; - V4L2Device *dev_; + V4L2Device *capture_; BufferPool pool_; }; From patchwork Wed Feb 13 17:14:52 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kieran Bingham X-Patchwork-Id: 580 Return-Path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 1D764610B6 for ; Wed, 13 Feb 2019 18:14:58 +0100 (CET) Received: from localhost.localdomain (cpc89242-aztw30-2-0-cust488.18-1.cable.virginm.net [86.31.129.233]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id A6ADA9A5; Wed, 13 Feb 2019 18:14:57 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1550078097; bh=18IbC9OS1RlWJ0xdfXU5Yu33UXrAai8Z1rMO0LVlN1s=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=S35uEVCauFfFoTtCRaH8bJXhHtpO+qQDbuGBqk/THxcgUKsc37kqFq6HoXBmPWmt9 HLq/xGejmRz8gIfUpmYXjtYMSQxnrM42xxacEhF3w78i4Zr/hyEjYjRznXzD/plyuB pi/IErpYQtYJA9UXl5IEvfdmpKewP8crV0C0s2+A= From: Kieran Bingham To: LibCamera Devel Date: Wed, 13 Feb 2019 17:14:52 +0000 Message-Id: <20190213171453.13852-3-kieran.bingham@ideasonboard.com> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20190213171453.13852-1-kieran.bingham@ideasonboard.com> References: <20190213171453.13852-1-kieran.bingham@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 2/3] test: v4l2_device: release capture device resources 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: Wed, 13 Feb 2019 17:14:58 -0000 Ensure that the cleanup operation releases the device and resources. Signed-off-by: Kieran Bingham Reviewed-by: Laurent Pinchart --- test/v4l2_device/v4l2_device_test.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/v4l2_device/v4l2_device_test.cpp b/test/v4l2_device/v4l2_device_test.cpp index 2bdf8cfe983a..4225291bbb6e 100644 --- a/test/v4l2_device/v4l2_device_test.cpp +++ b/test/v4l2_device/v4l2_device_test.cpp @@ -63,5 +63,9 @@ void V4L2DeviceTest::cleanup() { media_->release(); + capture_->streamOff(); + capture_->releaseBuffers(); + capture_->close(); + delete capture_; }; From patchwork Wed Feb 13 17:14:53 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kieran Bingham X-Patchwork-Id: 581 Return-Path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 6707C610BB for ; Wed, 13 Feb 2019 18:14:58 +0100 (CET) Received: from localhost.localdomain (cpc89242-aztw30-2-0-cust488.18-1.cable.virginm.net [86.31.129.233]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 0806E9B0; Wed, 13 Feb 2019 18:14:57 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1550078098; bh=gmHHXnyno4nEJWCzxm3k5mpDrMgxpkZmOlaQrUbzRVM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=K4YPGF5TGOxU/t7mJAA2/IwtExjjwsiws3zJdCptISpJNBnsIREuQ2UVzX+zMh9iF jbpVN8h29cQpzQiaqbHdYU+GFEOEJUq3QKZdKZ3+6RXr9VIlQH9sWqjjn7taa1bKIB KP80aKs5fMYEs1JXw/TH1+RYJgThDtSYE6I6sOtY= From: Kieran Bingham To: LibCamera Devel Date: Wed, 13 Feb 2019 17:14:53 +0000 Message-Id: <20190213171453.13852-4-kieran.bingham@ideasonboard.com> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20190213171453.13852-1-kieran.bingham@ideasonboard.com> References: <20190213171453.13852-1-kieran.bingham@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 3/3] test: v4l2_device: Provide buffer sharing 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: Wed, 13 Feb 2019 17:14:58 -0000 Obtain two V4L2Devices and use one to obtain a BufferPool. Propagate the formats from the first to the second device and then commence sending buffers between the two devices in a ping-pong fashion. Signed-off-by: Kieran Bingham Reviewed-by: Laurent Pinchart --- test/v4l2_device/buffer_sharing.cpp | 187 ++++++++++++++++++++++++++++ test/v4l2_device/meson.build | 1 + 2 files changed, 188 insertions(+) create mode 100644 test/v4l2_device/buffer_sharing.cpp diff --git a/test/v4l2_device/buffer_sharing.cpp b/test/v4l2_device/buffer_sharing.cpp new file mode 100644 index 000000000000..78173a03f2a2 --- /dev/null +++ b/test/v4l2_device/buffer_sharing.cpp @@ -0,0 +1,187 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2019, Google Inc. + * + * libcamera V4L2 API tests + * + * Validate the function of exporting buffers from a V4L2Device and + * the ability to import them to another V4L2Device instance. + * Ensure that the Buffers can successfully be queued and dequeued + * between both devices. + */ + +#include + +#include +#include +#include +#include + +#include "v4l2_device_test.h" + +class BufferSharingTest : public V4L2DeviceTest +{ +public: + BufferSharingTest() + : output_(nullptr), framesCaptured_(0), framesOutput_(0) + { + } + +private: + const unsigned int bufferCount = 4; + + V4L2Device *output_; + + unsigned int framesCaptured_; + unsigned int framesOutput_; + +protected: + int init() + { + int ret = V4L2DeviceTest::init(); + if (ret) + return ret; + + /* media_ already represents VIVID */ + MediaEntity *entity = media_->getEntityByName("vivid-000-vid-out"); + if (!entity) + return TestSkip; + + output_ = new V4L2Device(entity); + if (!output_) { + std::cout << "Failed to create output device" << std::endl; + return TestFail; + } + + ret = output_->open(); + if (ret) { + std::cout << "Failed to open output device" << std::endl; + return TestFail; + } + + V4L2DeviceFormat format = {}; + + ret = capture_->getFormat(&format); + if (ret) { + std::cout << "Failed to get capture format" << std::endl; + return TestFail; + } + + ret = output_->setFormat(&format); + if (ret) { + std::cout << "Failed to set output format" << std::endl; + return TestFail; + } + + pool_.createBuffers(bufferCount); + + ret = capture_->exportBuffers(&pool_); + if (ret) { + std::cout << "Failed to export buffers" << std::endl; + return TestFail; + } + + ret = output_->importBuffers(&pool_); + if (ret) { + std::cout << "Failed to import buffers" << std::endl; + return TestFail; + } + + return 0; + } + + void captureBufferReady(Buffer *buffer) + { + std::cout << "Received capture buffer: " << buffer->index() + << " sequence " << buffer->sequence() << std::endl; + + output_->queueBuffer(buffer); + framesCaptured_++; + } + + void outputBufferReady(Buffer *buffer) + { + std::cout << "Received output buffer: " << buffer->index() + << " sequence " << buffer->sequence() << std::endl; + + capture_->queueBuffer(buffer); + framesOutput_++; + } + + int run() + { + EventDispatcher *dispatcher = CameraManager::instance()->eventDispatcher(); + Timer timeout; + int ret; + + capture_->bufferReady.connect(this, &BufferSharingTest::captureBufferReady); + output_->bufferReady.connect(this, &BufferSharingTest::outputBufferReady); + + /* Queue all the buffers to the capture device. */ + for (Buffer &buffer : pool_.buffers()) { + if (capture_->queueBuffer(&buffer)) + return TestFail; + } + + ret = capture_->streamOn(); + if (ret) { + std::cout << "Failed to streamOn capture device" << std::endl; + return TestFail; + } + + ret = output_->streamOn(); + if (ret) { + std::cout << "Failed to streamOn output device" << std::endl; + return TestFail; + } + + timeout.start(10000); + while (timeout.isRunning()) { + dispatcher->processEvents(); + if (framesCaptured_ > 30 && framesOutput_ > 30) + break; + } + + if ((framesCaptured_ < 1) || (framesOutput_ < 1)) { + std::cout << "Failed to process any frames within timeout." << std::endl; + return TestFail; + } + + if ((framesCaptured_ < 30) || (framesOutput_ < 30)) { + std::cout << "Failed to process 30 frames within timeout." << std::endl; + return TestFail; + } + + ret = capture_->streamOff(); + if (ret) { + std::cout << "Failed to streamOff capture." << std::endl; + return TestFail; + } + + ret = output_->streamOff(); + if (ret) { + std::cout << "Failed to streamOff output." << std::endl; + return TestFail; + } + + return TestPass; + } + + void cleanup() + { + std::cout + << "Captured " << framesCaptured_ << " frames and " + << "output " << framesOutput_ << " frames" + << std::endl; + + output_->streamOff(); + output_->releaseBuffers(); + output_->close(); + + delete output_; + + V4L2DeviceTest::cleanup(); + } +}; + +TEST_REGISTER(BufferSharingTest); diff --git a/test/v4l2_device/meson.build b/test/v4l2_device/meson.build index ec2c7f9f11ff..9f7a7545ac9b 100644 --- a/test/v4l2_device/meson.build +++ b/test/v4l2_device/meson.build @@ -5,6 +5,7 @@ v4l2_device_tests = [ [ 'request_buffers', 'request_buffers.cpp' ], [ 'stream_on_off', 'stream_on_off.cpp' ], [ 'capture_async', 'capture_async.cpp' ], + [ 'buffer_sharing', 'buffer_sharing.cpp' ], ] foreach t : v4l2_device_tests