From patchwork Fri Nov 19 13:15:06 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Umang Jain X-Patchwork-Id: 14660 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 2FD89BDB13 for ; Fri, 19 Nov 2021 13:15:28 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id DBA9B60376; Fri, 19 Nov 2021 14:15:27 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="VgabFReV"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id AAF3560376 for ; Fri, 19 Nov 2021 14:15:25 +0100 (CET) Received: from perceval.ideasonboard.com (unknown [103.238.109.11]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 5CED91959; Fri, 19 Nov 2021 14:15:24 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1637327725; bh=XFGO2dcQ0y919xqo3DAU4E4FO8ntuB5pEhSEXyG5pmE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=VgabFReVyPlEPYTQnSxmvCiGP6/CEq0Pu1p7KMLouNNedkKXjhbq3DcJ75qS/m3Hs aIj9iauGKERA6rs1nEjoj/W0T/p+16J5IR3pi7YSgoIKeQUKZFH5M5NY9w1P9ectSx fIBZwKovsYDByF/lSN4xG4+E3nwWT3kIv/Gw5R5U= From: Umang Jain To: libcamera-devel@lists.libcamera.org Date: Fri, 19 Nov 2021 18:45:06 +0530 Message-Id: <20211119131506.382462-3-umang.jain@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20211119131506.382462-1-umang.jain@ideasonboard.com> References: <20211119131506.382462-1-umang.jain@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH 2/2] android: camera_request: Lifetime of a Camera3RequestDescriptor 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" This commit provides a sketch regarding Camera3RequestDescriptor which is aids tracking each capture reuquest placed by the android framework to libcamera HAL. Signed-off-by: Umang Jain Reviewed-by: Laurent Pinchart --- src/android/camera_request.cpp | 97 ++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/src/android/camera_request.cpp b/src/android/camera_request.cpp index 4e017792..824b667d 100644 --- a/src/android/camera_request.cpp +++ b/src/android/camera_request.cpp @@ -18,6 +18,9 @@ using namespace libcamera; * * A utility class that groups information about a capture request to be later * reused at request complete time to notify the framework. + * + * Also, refer to the Camera3RequestDescriptor's lifetime diagram at the end of + * this file. */ Camera3RequestDescriptor::Camera3RequestDescriptor( @@ -105,3 +108,97 @@ Camera3RequestDescriptor::StreamBuffer::StreamBuffer(StreamBuffer &&) = default; Camera3RequestDescriptor::StreamBuffer & Camera3RequestDescriptor::StreamBuffer::operator=(Camera3RequestDescriptor::StreamBuffer &&) = default; + +/******************************************************************************* + * Lifetime of a Camera3RequestDescriptor tracking a capture request placed by + * Android Framework + ******************************************************************************* + * + * + * Android Framework + * │ + * │ ┌──────────────────────────────────┐ + * │ │camera3_capture_request_t │ + * │ │ │ + * │ │Requested output streams │ + * │ │ stream1 stream2 stream3 ... │ + * │ └──────────────────────────────────┘ + * ▼ + * ┌─────────────────────────────────────────────────────────────┐ + * │ libcamera HAL │ + * ├─────────────────────────────────────────────────────────────┤ + * │ CameraDevice │ + * │ │ + * │ processCaptureRequest(camera3_capture_request_t request) │ + * │ │ + * │ - Create Camera3RequestDescriptor tracking this request │ + * │ - Streams requiring post-processing is stored as a │ + * │ map Camera3Requestdescriptor::pendingStreamsToProcess │ + * │ - Add this Camera3RequestDescriptor to descriptors' queue │ + * │ CameraDevice::descriptors_ │ + * │ │ ┌─────────────────────────┐ + * │ - Queue the capture request to libcamera core ────────────┤►│libcamera core │ + * │ │ ├─────────────────────────┤ + * │ │ │- Capture from Camera │ + * │ │ │ │ + * │ │ │- Emit │ + * │ │ │ Camera::requestComplete│ + * │ requestCompleted(Request *request) ◄───────────────────────┼─┼──── │ + * │ │ │ │ + * │ - Check request completion status │ └─────────────────────────┘ + * │ │ + * │ - If(pendingStreamsToProcess > 0) │ + * │ Queue all entries from pendingStreamsToProcess │ + * │ else │ │ + * │ completeDescriptor() │ └──────────────────────┐ + * │ │ │ + * │ ┌──────────────────────────┴───┬──────────────────┐ │ + * │ │ │ │ │ + * │ ┌──────────▼────────────┐ ┌───────────▼─────────┐ ▼ │ + * │ │CameraStream1 │ │CameraStream2 │ .... │ + * │ ├┬───┬───┬──────────────┤ ├┬───┬───┬────────────┤ │ + * │ ││ │ │ │ ││ │ │ │ │ + * │ │▼───▼───▼──────────────┤ │▼───▼───▼────────────┤ │ + * │ │PostProcessorWorker ├─ │PostProcessorWorker │ │ + * │ │ │ │ │ │ + * │ │ xxxxxxxxxxxxxxxxxxx │ │ xxxxxxxxxxxxxxxxxxx │ │ + * │ │ x PostProcessor x │ │ x PostProcessor x │ │ + * │ │ x process() x │ │ x process() x │ │ + * │ │ x x │ │ x x │ │ + * │ │ x Emit x │ │ x Emit x │ │ + * │ │ x processComplete x │ │ x processComplete x │ │ + * │ │ x x │ │ x x │ │ + * │ │ xxxxxxxxxxxxxxx│xxx │ │ xxxxxxxxxxxxxxx│xxx │ │ + * │ │ │ │ │ │ │ │ + * │ │ │ │ │ │ │ │ + * │ └────────────────┼──────┘ └────────────────┼────┘ │ + * │ │ │ │ + * │ │ │ │ + * │ │ │ │ + * │ ▼ ▼ │ + * │ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx │ + * │ x CameraDevice x x CameraDevice x │ + * │ x x x x │ + * │ x streamProcessingComplete() x x streamProcessingComplete() x │ + * │ x x x x │ + * │ x - Check and set buffer status x x - Check and set buffer status x │ + * │ x - Remove post-processing entry x x - Remove post-processing entry x │ + * │ x from pendingStreamsToProcess x x from pendingStreamsToProcess x │ + * │ x x x x │ + * │ x - If(pendingStreamsToProcess.empty()x x - If(pendingStreamsToProcess.empty()x │ + * │ x completeDescriptor x x completeDescriptor x │ + * │ x x x x │ + * │ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx │ + * │ │ + * └────────────────────────────────────────────────────────────────────────────────────┘ + * + * + * + * + * + * + * xxxxxxxxxxxxxx + * x x - PostProcessorWorker's thread + * x x + * xxxxxxxxxxxxxx + */