From patchwork Thu Aug 26 21:30:14 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Umang Jain X-Patchwork-Id: 13518 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 2F668BD87D for ; Thu, 26 Aug 2021 21:30:36 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id D8A2668943; Thu, 26 Aug 2021 23:30:35 +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="ulKAsixm"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id EB04968931 for ; Thu, 26 Aug 2021 23:30:31 +0200 (CEST) Received: from perceval.ideasonboard.com (unknown [103.251.226.246]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 11B42191F; Thu, 26 Aug 2021 23:30:30 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1630013431; bh=M42B9kLwVCcmVbGJtLD4xOGosrGKST6FW4kQbHpYZZE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ulKAsixml9dC1bF+mFTQNH9Y+cDMvkIzkJuFdxPLm7HfLlnWuYQY0YOidRJ3tqBv9 FyGI1HM8IPc5kU1wjmu51v5MuEWnWRC3L4Rg1MLKzOZ4HyEqgSN3pg1YOQqBr23RR6 rGoHf4hJiQYm9aVEe8+RvTepltGL6OxmzAEqAmCU= From: Umang Jain To: libcamera-devel@lists.libcamera.org Date: Fri, 27 Aug 2021 03:00:14 +0530 Message-Id: <20210826213016.1829504-4-umang.jain@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210826213016.1829504-1-umang.jain@ideasonboard.com> References: <20210826213016.1829504-1-umang.jain@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH 3/5] android: post_processor: Notify post processing completion status 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" When a post-processor is running asynchronously, we should be able to know whether the post-processing operation on the stream has been completed or not. Secondly, we should be able to know if it completed successfully or encountered some errors. This commit introduces a Signal<> which when connected, will notify that the post-processing has been completed. The status of PostProcessor::process() will be passed as a PostProcessor::Status argument. The populated CameraMetadata shall also be available in the signal-handler. /* * DNI: I do not like the multiple places of signal emission. * We need to use goto but first we need to make a single point * of return somehow, and restructure the error paths a bit. */ Signed-off-by: Umang Jain --- src/android/jpeg/post_processor_jpeg.cpp | 9 ++++++++- src/android/post_processor.h | 7 +++++++ src/android/yuv/post_processor_yuv.cpp | 4 ++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/android/jpeg/post_processor_jpeg.cpp b/src/android/jpeg/post_processor_jpeg.cpp index 723e8d18..9366934d 100644 --- a/src/android/jpeg/post_processor_jpeg.cpp +++ b/src/android/jpeg/post_processor_jpeg.cpp @@ -87,8 +87,11 @@ int PostProcessorJpeg::process(const FrameBuffer *source, const CameraMetadata &requestMetadata, CameraMetadata *resultMetadata) { - if (!encoder_) + if (!encoder_) { + processComplete.emit(PostProcessor::Status::Failed, + resultMetadata); return 0; + } ASSERT(destination->numPlanes() == 1); @@ -181,6 +184,8 @@ int PostProcessorJpeg::process(const FrameBuffer *source, exif.data(), quality); if (jpeg_size < 0) { LOG(JPEG, Error) << "Failed to encode stream image"; + processComplete.emit(PostProcessor::Status::Failed, + resultMetadata); return jpeg_size; } @@ -195,5 +200,7 @@ int PostProcessorJpeg::process(const FrameBuffer *source, /* Update the JPEG result Metadata. */ resultMetadata->addEntry(ANDROID_JPEG_SIZE, jpeg_size); + processComplete.emit(PostProcessor::Status::Success, resultMetadata); + return 0; } diff --git a/src/android/post_processor.h b/src/android/post_processor.h index 5b8f1ab8..73fa79e9 100644 --- a/src/android/post_processor.h +++ b/src/android/post_processor.h @@ -8,6 +8,7 @@ #define __ANDROID_POST_PROCESSOR_H__ #include +#include #include #include @@ -27,6 +28,12 @@ public: CameraBuffer *destination, const CameraMetadata &requestMetadata, CameraMetadata *resultMetadata) = 0; + + enum Status { + Success, + Failed, + }; + libcamera::Signal processComplete; }; #endif /* __ANDROID_POST_PROCESSOR_H__ */ diff --git a/src/android/yuv/post_processor_yuv.cpp b/src/android/yuv/post_processor_yuv.cpp index 4b507d33..1877e54b 100644 --- a/src/android/yuv/post_processor_yuv.cpp +++ b/src/android/yuv/post_processor_yuv.cpp @@ -60,6 +60,7 @@ int PostProcessorYuv::process(const FrameBuffer *source, const MappedFrameBuffer sourceMapped(source, MappedFrameBuffer::MapFlag::Read); if (!sourceMapped.isValid()) { LOG(YUV, Error) << "Failed to mmap camera frame buffer"; + processComplete.emit(PostProcessor::Status::Failed, metadata); return -EINVAL; } @@ -77,9 +78,12 @@ int PostProcessorYuv::process(const FrameBuffer *source, libyuv::FilterMode::kFilterBilinear); if (ret) { LOG(YUV, Error) << "Failed NV12 scaling: " << ret; + processComplete.emit(PostProcessor::Status::Failed, metadata); return -EINVAL; } + processComplete.emit(PostProcessor::Status::Success, metadata); + return 0; }