From patchwork Thu Feb 7 21:21:17 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kieran Bingham X-Patchwork-Id: 546 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 8130E610B2 for ; Thu, 7 Feb 2019 22:21:30 +0100 (CET) Received: from localhost.localdomain (unknown [149.254.234.206]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 72FDB567; Thu, 7 Feb 2019 22:21:29 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1549574490; bh=uM0dtpORdwrd7i/94nuuDpNb15N8o0D51ie8gmna0pg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=oTBKr4f4A/gckaIgSUPxKjDThoxkeUv0sflqOjdgmZgava+cn13o4wfpfdXvJX6jI 7Avnoo7cFXp0YV0j4pmTnAgOqT/33zyPGFnrY0m7vLJSp2/tFZZ6IBwXRVFNMNJrw6 kjMeqUMYy1HU5sTNqYY5456SEEMubVDdv8USlwPY= From: Kieran Bingham To: LibCamera Devel Date: Thu, 7 Feb 2019 21:21:17 +0000 Message-Id: <20190207212119.30299-4-kieran.bingham@ideasonboard.com> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20190207212119.30299-1-kieran.bingham@ideasonboard.com> References: <20190207212119.30299-1-kieran.bingham@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 3/5] 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: Thu, 07 Feb 2019 21:21:30 -0000 Obtain two V4L2Devices and use one to obtain a BufferPool. Propogate 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 --- test/v4l2_device/buffer_sharing.cpp | 178 ++++++++++++++++++++++++++++ test/v4l2_device/meson.build | 1 + 2 files changed, 179 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..0e96f7b894bd --- /dev/null +++ b/test/v4l2_device/buffer_sharing.cpp @@ -0,0 +1,178 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2019, Google Inc. + * + * libcamera V4L2 API tests + */ + +#include + +#include +#include +#include +#include + +#include "v4l2_device_test.h" + +#include "log.h" + +LOG_DEFINE_CATEGORY(Test) + +class BufferSharingTest : public V4L2DeviceTest +{ +public: + BufferSharingTest() + : output_(nullptr), framesCapture(0), framesOutput(0){}; + +private: + const unsigned int bufferCount = 4; + + V4L2Device *output_; + std::shared_ptr secondMedia_; + + unsigned int framesCapture; + unsigned int framesOutput; + +protected: + int init() + { + int ret = V4L2DeviceTest::init(); + if (ret) + return ret; + + DeviceMatch uvcvideo("uvcvideo"); + uvcvideo.add("Logitech BRIO"); + + secondMedia_ = std::move(enumerator_->search(uvcvideo)); + if (!secondMedia_) { + LOG(Test, Info) << "No Brio found"; + return TestSkip; + } + + secondMedia_->acquire(); + + MediaEntity *entity = secondMedia_->defaultEntity(); + if (!entity) + return TestFail; + + output_ = new V4L2Device(entity); + if (!output_) + return TestFail; + + ret = output_->open(); + if (ret) + return TestFail; + + V4L2DeviceFormat format; + + ret = dev_->getFormat(&format); + if (ret) { + return TestFail; + } + + LOG(Test, Info) << "Successfully obtained format from source"; + + ret = output_->setFormat(&format); + if (ret) + return TestFail; + + LOG(Test, Info) << "Successfully set format to output"; + + pool_.createBuffers(bufferCount); + + ret = dev_->exportBuffers(bufferCount, &pool_); + if (ret) + return TestFail; + + ret = output_->importBuffers(&pool_); + if (ret) { + std::cerr << "Failed to import buffers" << std::endl; + return TestFail; + } + + return 0; + } + + void receiveSourceBuffer(Buffer *buffer) + { + std::cout << "Received source buffer: " << buffer->index() + << " sequence " << buffer->sequence() << std::endl; + + output_->queueBuffer(buffer); + framesCapture++; + } + + void receiveDestinationBuffer(Buffer *buffer) + { + std::cout << "Received destination buffer: " << buffer->index() + << " sequence " << buffer->sequence() << std::endl; + + dev_->queueBuffer(buffer); + framesOutput++; + } + + int run() + { + EventDispatcher *dispatcher = CameraManager::instance()->eventDispatcher(); + Timer timeout; + int ret; + + dev_->bufferReady.connect(this, &BufferSharingTest::receiveSourceBuffer); + output_->bufferReady.connect(this, &BufferSharingTest::receiveDestinationBuffer); + + /* 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; + + ret = output_->streamOn(); + if (ret) + return TestFail; + + timeout.start(5000); + while (timeout.isRunning()) + dispatcher->processEvents(); + + if ((framesCapture < 1) || (framesOutput < 1)) { + std::cout << "Failed to process any frames within timeout." << std::endl; + return TestFail; + } + + if ((framesCapture < 30) || (framesOutput < 30)) { + std::cout << "Failed to process 30 frames within timeout." << std::endl; + return TestFail; + } + + std::cout + << "Processed " << framesCapture << " capture frames" + << " and " << framesOutput << " output frames" + << std::endl; + + ret = dev_->streamOff(); + if (ret) + return TestFail; + + ret = output_->streamOff(); + if (ret) + return TestFail; + + return TestPass; + } + + void cleanup() + { + if (secondMedia_) + secondMedia_->release(); + + 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