From patchwork Tue Oct 19 11:47:53 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Umang Jain X-Patchwork-Id: 14177 X-Patchwork-Delegate: umang.jain@ideasonboard.com 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 8C068C324C for ; Tue, 19 Oct 2021 11:48:18 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 44D4368F5B; Tue, 19 Oct 2021 13:48:18 +0200 (CEST) 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="WGnhijJl"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 02ECD68F5B for ; Tue, 19 Oct 2021 13:48:17 +0200 (CEST) Received: from perceval.ideasonboard.com (unknown [103.251.226.98]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 8C62512A; Tue, 19 Oct 2021 13:48:15 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1634644096; bh=Vp6FzJ/7bMKJw0R1OjL1B4UrtnKEU8LtDGCwe5lZ70o=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WGnhijJlwu50d8RI4Qih3NeXD24eYMMtOVXGIuOHClrSWY6FO+hWivR5i+6t5tWv5 SufaBmiV9V3V6V/6X8pA99iviYTVz/vTd4q7YTMTYacD8CMOO+ifo0ou3T5f8Vd9KR sjqg31rJnUTn9BW7pBxAwSDp2F8EHzq/b68DXCms= From: Umang Jain To: libcamera-devel@lists.libcamera.org Date: Tue, 19 Oct 2021 17:17:53 +0530 Message-Id: <20211019114802.665980-4-umang.jain@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20211019114802.665980-1-umang.jain@ideasonboard.com> References: <20211019114802.665980-1-umang.jain@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 03/12] android: camera_device: Build capture_result dynamically 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" From: Laurent Pinchart The camera3_capture_result_t is only needed to convey capture results to the camera service through the process_capture_result() callback. There's no need to store it in the Camera3RequestDescriptor. Build it dynamically in CameraDevice::sendCaptureResults() instead. This requires storing the result metadata created in CameraDevice::requestComplete() in the Camera3RequestDescriptor. A side effect of this change is that the request metadata lifetime will match the Camera3RequestDescriptor instead of being destroyed at the end of requestComplete(). This will be needed to support asynchronous post-processing, where the request completion will be signaled to the camera service asynchronously from requestComplete(). Signed-off-by: Laurent Pinchart Signed-off-by: Umang Jain Reviewed-by: Hirokazu Honda Reviewed-by: Jacopo Mondi --- src/android/camera_device.cpp | 50 ++++++++++++++++++----------------- src/android/camera_request.h | 2 +- 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp index 3689940d..38132cbd 100644 --- a/src/android/camera_device.cpp +++ b/src/android/camera_device.cpp @@ -801,19 +801,11 @@ void CameraDevice::abortRequest(Camera3RequestDescriptor *descriptor) const { notifyError(descriptor->frameNumber_, nullptr, CAMERA3_MSG_ERROR_REQUEST); - camera3_capture_result_t &result = descriptor->captureResult_; - result.num_output_buffers = descriptor->buffers_.size(); - result.frame_number = descriptor->frameNumber_; - result.partial_result = 0; - - std::vector resultBuffers(result.num_output_buffers); - for (auto [i, buffer] : utils::enumerate(resultBuffers)) { - buffer = descriptor->buffers_[i]; - buffer.release_fence = descriptor->buffers_[i].acquire_fence; + for (auto &buffer : descriptor->buffers_) { + buffer.release_fence = buffer.acquire_fence; buffer.acquire_fence = -1; buffer.status = CAMERA3_BUFFER_STATUS_ERROR; } - result.output_buffers = resultBuffers.data(); descriptor->status_ = Camera3RequestDescriptor::Status::Error; } @@ -1062,9 +1054,6 @@ void CameraDevice::requestComplete(Request *request) * The buffer status is set to OK and later changed to ERROR if * post-processing/compression fails. */ - camera3_capture_result_t &captureResult = descriptor->captureResult_; - captureResult.frame_number = descriptor->frameNumber_; - captureResult.num_output_buffers = descriptor->buffers_.size(); for (camera3_stream_buffer_t &buffer : descriptor->buffers_) { CameraStream *cameraStream = static_cast(buffer.stream->priv); @@ -1085,8 +1074,6 @@ void CameraDevice::requestComplete(Request *request) buffer.release_fence = -1; buffer.status = CAMERA3_BUFFER_STATUS_OK; } - captureResult.output_buffers = descriptor->buffers_.data(); - captureResult.partial_result = 1; /* * If the Request has failed, abort the request by notifying the error @@ -1100,7 +1087,6 @@ void CameraDevice::requestComplete(Request *request) notifyError(descriptor->frameNumber_, nullptr, CAMERA3_MSG_ERROR_REQUEST); - captureResult.partial_result = 0; for (camera3_stream_buffer_t &buffer : descriptor->buffers_) { /* * Signal to the framework it has to handle fences that @@ -1137,12 +1123,17 @@ void CameraDevice::requestComplete(Request *request) * Notify if the metadata generation has failed, but continue processing * buffers and return an empty metadata pack. */ - std::unique_ptr resultMetadata = getResultMetadata(*descriptor); - if (!resultMetadata) { + descriptor->resultMetadata_ = getResultMetadata(*descriptor); + if (!descriptor->resultMetadata_) { notifyError(descriptor->frameNumber_, nullptr, CAMERA3_MSG_ERROR_RESULT); - /* The camera framework expects an empty metadata pack on error. */ - resultMetadata = std::make_unique(0, 0); + /* + * The camera framework expects an empty metadata pack on error. + * + * \todo Check that the post-processor code handles this situation + * correctly. + */ + descriptor->resultMetadata_ = std::make_unique(0, 0); } /* Handle post-processing. */ @@ -1164,7 +1155,7 @@ void CameraDevice::requestComplete(Request *request) int ret = cameraStream->process(*src, buffer, descriptor->settings_, - resultMetadata.get()); + descriptor->resultMetadata_.get()); /* * Return the FrameBuffer to the CameraStream now that we're * done processing it. @@ -1179,7 +1170,6 @@ void CameraDevice::requestComplete(Request *request) } } - captureResult.result = resultMetadata->get(); descriptor->status_ = Camera3RequestDescriptor::Status::Success; sendCaptureResults(); } @@ -1197,8 +1187,20 @@ void CameraDevice::sendCaptureResults() * impact on performance which should be measured. */ lock.unlock(); - callbacks_->process_capture_result(callbacks_, - &descriptor->captureResult_); + + camera3_capture_result_t captureResult = {}; + + captureResult.frame_number = descriptor->frameNumber_; + if (descriptor->resultMetadata_) + captureResult.result = descriptor->resultMetadata_->get(); + captureResult.num_output_buffers = descriptor->buffers_.size(); + captureResult.output_buffers = descriptor->buffers_.data(); + + if (descriptor->status_ == Camera3RequestDescriptor::Status::Success) + captureResult.partial_result = 1; + + callbacks_->process_capture_result(callbacks_, &captureResult); + lock.lock(); } } diff --git a/src/android/camera_request.h b/src/android/camera_request.h index 79dfdb58..db13f624 100644 --- a/src/android/camera_request.h +++ b/src/android/camera_request.h @@ -40,8 +40,8 @@ public: std::vector> frameBuffers_; CameraMetadata settings_; std::unique_ptr request_; + std::unique_ptr resultMetadata_; - camera3_capture_result_t captureResult_ = {}; Status status_ = Status::Pending; private: