From patchwork Thu May 27 22:03:51 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 12454 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 3450BC3206 for ; Thu, 27 May 2021 22:03:21 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 2DC726891D; Fri, 28 May 2021 00:03:20 +0200 (CEST) Received: from relay10.mail.gandi.net (relay10.mail.gandi.net [217.70.178.230]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id A989E602AE for ; Fri, 28 May 2021 00:03:18 +0200 (CEST) Received: (Authenticated sender: jacopo@jmondi.org) by relay10.mail.gandi.net (Postfix) with ESMTPSA id 040EB240008; Thu, 27 May 2021 22:03:17 +0000 (UTC) From: Jacopo Mondi To: libcamera-devel@lists.libcamera.org Date: Fri, 28 May 2021 00:03:51 +0200 Message-Id: <20210527220359.30127-1-jacopo@jmondi.org> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v4 0/8] Implement flush() camera operation X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" To get to a successfull implementation of flush() a bit of preparatory work is required as currently Requests that fails to queue to the pipeline handler are not returned to the application. Add Request::cancel() and call it in the PipelineHandler base class when calling queueRequestDevice() fails to allow application to keep track of the queued requests. On top of that, prepare the CameraDevice to support flush with a few clean-up patches, then implement the operation. No regression detected when running CTS in LIMITED mode. Tested with cros_camera_test: # cros_camera_test --gtest_filter="Camera3FrameTest/Camera3FlushRequestsTest*" [==========] 12 tests from 1 test suite ran. (1380 ms total) [ PASSED ] 12 tests. All patches reviewed but the last! Thanks j v3->v4: - [1/8] Set stream to nullptr when the error code does not require it - [1/8] Drop a useless error message - [2/8] Take in style suggestion from Laurent - [4/8] Use enum class CameraDevice::State - [8/8] Reimplement flush assuming it only races with processCaptureRequest v2->v3: - Request::cancel(): - Add tracepoint in request.tp - Emitt Camera::bufferCompleted signal for each cancelled buffer - Do not complete the Request - PipelineHandler - Do not emit Camera::bufferCompleted as Request::cancel() does so - Do not complete the request immediately but call PipelineHandler::completeRequest() - Flush - Use CameraMutex_ in place of FlushMutex_ to wait on the flushed_ condition as suggested by Hiro. This guarantees that any access to the camera state is protected by the same mutex and code is simplified. - Assert that stop() does not get called while flushing as suggested by Hiro. v1->v2: - The majority of patches in the series have not been changed if not for collecting tags. However 8/8 which implement the actual flush() has been changed to address Hiro's comment about protecting close() and configureStreams() from being concurrently run with flush(). - 8/8: - Introduce a new flushed_ condition variable to be used by close() and configureStreams() to be unlocked when flushing has terminated. - The patches that introduce Request::cancel() has pending discussion with Hiro and Niklas. As they impact the libcamera API I'll wait for Laurent to chime-in. Jacopo Mondi (8): android: Rework request completion notification libcamera: request: Add Request::cancel() libcamera: pipeline_handler: Cancel Request on queueing failure android: camera_device: Replace running_ with CameraState android: Replace scoped_lock<> with libcamera::MutexLocker android: Guard access to the camera state android: Rename CameraDevice::mutex_ android: Implement flush() camera operation .../libcamera/internal/tracepoints/request.tp | 8 + include/libcamera/request.h | 1 + src/android/camera_device.cpp | 236 +++++++++++++----- src/android/camera_device.h | 18 +- src/android/camera_ops.cpp | 8 +- src/libcamera/pipeline_handler.cpp | 8 +- src/libcamera/request.cpp | 23 ++ 7 files changed, 228 insertions(+), 74 deletions(-) --- 2.31.1