From patchwork Mon Oct 25 20:38:30 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Umang Jain X-Patchwork-Id: 14298 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 91B24BF415 for ; Mon, 25 Oct 2021 20:38:53 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 30E9E6487B; Mon, 25 Oct 2021 22:38:53 +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="SqAIO8KI"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 409B260125 for ; Mon, 25 Oct 2021 22:38:51 +0200 (CEST) Received: from perceval.ideasonboard.com (unknown [103.251.226.211]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id E9C34E0A; Mon, 25 Oct 2021 22:38:49 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1635194331; bh=fo3QLtg0GBlyoGCezLj8ctOiprKx3MPFknrzCVPWKVM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=SqAIO8KIi5agCTE2HTz1Y1TwdBCUcOy8gZUfCfi1O5BFHn/5WGLiLD/cs2uj7ZouI OnUmHriI3xN9aR3RJBkqqtuku+3J8xvKyf/0W26BPPftecQIB7pAy20bU52mPQ8RZe /hG9sFHhSmkY+TzRxiXVDKBFrAHdJ3G7qq2toEpY= From: Umang Jain To: libcamera-devel@lists.libcamera.org Date: Tue, 26 Oct 2021 02:08:30 +0530 Message-Id: <20211025203833.122460-5-umang.jain@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20211025203833.122460-1-umang.jain@ideasonboard.com> References: <20211025203833.122460-1-umang.jain@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v7 4/7] android: post_processor: Consolidate contextual information 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" Save and provide the context for post-processor of a camera stream via Camera3RequestDescriptor::StreamBuffer. We extend the structure to include source and destination buffers for the post processor, along with CameraStream::Type::Internal buffer pointer (if any). In addition to that, a back pointer to Camera3RequestDescriptor is convienient to get access to overall descriptor (status, metadata settings etc.) Also, migrate CameraStream::process() and PostProcessor::process() signature to use Camera3RequestDescriptor::StreamBuffer only. This will be helpful when we move to async post-processing in subsequent commits. Signed-off-by: Umang Jain Reviewed-by: Laurent Pinchart Reviewed-by: Hirokazu Honda --- src/android/camera_device.cpp | 13 ++++++++----- src/android/camera_request.cpp | 5 ++++- src/android/camera_request.h | 5 +++++ src/android/camera_stream.cpp | 23 +++++++++++------------ src/android/camera_stream.h | 4 +--- src/android/jpeg/post_processor_jpeg.cpp | 12 +++++++----- src/android/jpeg/post_processor_jpeg.h | 4 +--- src/android/post_processor.h | 7 ++----- src/android/yuv/post_processor_yuv.cpp | 7 ++++--- src/android/yuv/post_processor_yuv.h | 4 +--- 10 files changed, 44 insertions(+), 40 deletions(-) diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp index bf9a2e69..9155728a 100644 --- a/src/android/camera_device.cpp +++ b/src/android/camera_device.cpp @@ -953,6 +953,7 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques * once it has been processed. */ frameBuffer = cameraStream->getBuffer(); + buffer.internalBuffer = frameBuffer; LOG(HAL, Debug) << ss.str() << " (internal)"; break; } @@ -1133,14 +1134,16 @@ void CameraDevice::requestComplete(Request *request) continue; } - int ret = stream->process(*src, buffer, descriptor); + buffer.srcBuffer = src; + + int ret = stream->process(&buffer); /* - * Return the FrameBuffer to the CameraStream now that we're - * done processing it. + * If the framebuffer is internal to CameraStream return it back + * now that we're done processing it. */ - if (stream->type() == CameraStream::Type::Internal) - stream->putBuffer(src); + if (buffer.internalBuffer) + stream->putBuffer(buffer.internalBuffer); if (ret) { buffer.status = Camera3RequestDescriptor::Status::Error; diff --git a/src/android/camera_request.cpp b/src/android/camera_request.cpp index 16cf266f..5bac1b8f 100644 --- a/src/android/camera_request.cpp +++ b/src/android/camera_request.cpp @@ -9,6 +9,8 @@ #include +#include "camera_buffer.h" + using namespace libcamera; /* @@ -36,7 +38,8 @@ Camera3RequestDescriptor::Camera3RequestDescriptor( static_cast(buffer.stream->priv); buffers_.push_back({ stream, buffer.buffer, nullptr, - buffer.acquire_fence, Status::Success }); + buffer.acquire_fence, Status::Success, + nullptr, nullptr, nullptr, this }); } /* Clone the controls associated with the camera3 request. */ diff --git a/src/android/camera_request.h b/src/android/camera_request.h index 4d80ef32..c7fda00d 100644 --- a/src/android/camera_request.h +++ b/src/android/camera_request.h @@ -21,6 +21,7 @@ #include "camera_worker.h" class CameraStream; +class CameraBuffer; class Camera3RequestDescriptor { @@ -36,6 +37,10 @@ public: std::unique_ptr frameBuffer; int fence; Status status; + libcamera::FrameBuffer *internalBuffer; + const libcamera::FrameBuffer *srcBuffer; + std::unique_ptr dstBuffer; + Camera3RequestDescriptor *request; }; Camera3RequestDescriptor(libcamera::Camera *camera, diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp index 5d991fe5..282b19b0 100644 --- a/src/android/camera_stream.cpp +++ b/src/android/camera_stream.cpp @@ -146,23 +146,21 @@ int CameraStream::waitFence(int fence) return -errno; } -int CameraStream::process(const FrameBuffer &source, - Camera3RequestDescriptor::StreamBuffer &dest, - Camera3RequestDescriptor *request) +int CameraStream::process(Camera3RequestDescriptor::StreamBuffer *streamBuffer) { ASSERT(type_ != Type::Direct); /* Handle waiting on fences on the destination buffer. */ - if (dest.fence != -1) { - int ret = waitFence(dest.fence); + if (streamBuffer->fence != -1) { + int ret = waitFence(streamBuffer->fence); if (ret < 0) { LOG(HAL, Error) << "Failed waiting for fence: " - << dest.fence << ": " << strerror(-ret); + << streamBuffer->fence << ": " << strerror(-ret); return ret; } - ::close(dest.fence); - dest.fence = -1; + ::close(streamBuffer->fence); + streamBuffer->fence = -1; } /* @@ -170,14 +168,15 @@ int CameraStream::process(const FrameBuffer &source, * separate thread. */ const StreamConfiguration &output = configuration(); - CameraBuffer destBuffer(*dest.camera3Buffer, output.pixelFormat, - output.size, PROT_READ | PROT_WRITE); - if (!destBuffer.isValid()) { + streamBuffer->dstBuffer = std::make_unique( + *streamBuffer->camera3Buffer, output.pixelFormat, output.size, + PROT_READ | PROT_WRITE); + if (!streamBuffer->dstBuffer->isValid()) { LOG(HAL, Error) << "Failed to create destination buffer"; return -EINVAL; } - return postProcessor_->process(source, &destBuffer, request); + return postProcessor_->process(streamBuffer); } FrameBuffer *CameraStream::getBuffer() diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h index f242336e..e74a9a3b 100644 --- a/src/android/camera_stream.h +++ b/src/android/camera_stream.h @@ -121,9 +121,7 @@ public: libcamera::Stream *stream() const; int configure(); - int process(const libcamera::FrameBuffer &source, - Camera3RequestDescriptor::StreamBuffer &dest, - Camera3RequestDescriptor *request); + int process(Camera3RequestDescriptor::StreamBuffer *streamBuffer); libcamera::FrameBuffer *getBuffer(); void putBuffer(libcamera::FrameBuffer *buffer); diff --git a/src/android/jpeg/post_processor_jpeg.cpp b/src/android/jpeg/post_processor_jpeg.cpp index 49483836..240e29f6 100644 --- a/src/android/jpeg/post_processor_jpeg.cpp +++ b/src/android/jpeg/post_processor_jpeg.cpp @@ -98,15 +98,17 @@ void PostProcessorJpeg::generateThumbnail(const FrameBuffer &source, } } -int PostProcessorJpeg::process(const FrameBuffer &source, - CameraBuffer *destination, - Camera3RequestDescriptor *request) +int PostProcessorJpeg::process(Camera3RequestDescriptor::StreamBuffer *streamBuffer) { ASSERT(encoder_); + + const FrameBuffer &source = *streamBuffer->srcBuffer; + CameraBuffer *destination = streamBuffer->dstBuffer.get(); + ASSERT(destination->numPlanes() == 1); - const CameraMetadata &requestMetadata = request->settings_; - CameraMetadata *resultMetadata = request->resultMetadata_.get(); + const CameraMetadata &requestMetadata = streamBuffer->request->settings_; + CameraMetadata *resultMetadata = streamBuffer->request->resultMetadata_.get(); camera_metadata_ro_entry_t entry; int ret; diff --git a/src/android/jpeg/post_processor_jpeg.h b/src/android/jpeg/post_processor_jpeg.h index 0184d77e..92385548 100644 --- a/src/android/jpeg/post_processor_jpeg.h +++ b/src/android/jpeg/post_processor_jpeg.h @@ -22,9 +22,7 @@ public: int configure(const libcamera::StreamConfiguration &incfg, const libcamera::StreamConfiguration &outcfg) override; - int process(const libcamera::FrameBuffer &source, - CameraBuffer *destination, - Camera3RequestDescriptor *request) override; + int process(Camera3RequestDescriptor::StreamBuffer *streamBuffer) override; private: void generateThumbnail(const libcamera::FrameBuffer &source, diff --git a/src/android/post_processor.h b/src/android/post_processor.h index 27eaef88..128161c8 100644 --- a/src/android/post_processor.h +++ b/src/android/post_processor.h @@ -11,8 +11,7 @@ #include #include "camera_buffer.h" - -class Camera3RequestDescriptor; +#include "camera_request.h" class PostProcessor { @@ -21,9 +20,7 @@ public: virtual int configure(const libcamera::StreamConfiguration &inCfg, const libcamera::StreamConfiguration &outCfg) = 0; - virtual int process(const libcamera::FrameBuffer &source, - CameraBuffer *destination, - Camera3RequestDescriptor *request) = 0; + virtual int process(Camera3RequestDescriptor::StreamBuffer *streamBuffer) = 0; }; #endif /* __ANDROID_POST_PROCESSOR_H__ */ diff --git a/src/android/yuv/post_processor_yuv.cpp b/src/android/yuv/post_processor_yuv.cpp index 8110a1f1..70385ab3 100644 --- a/src/android/yuv/post_processor_yuv.cpp +++ b/src/android/yuv/post_processor_yuv.cpp @@ -49,10 +49,11 @@ int PostProcessorYuv::configure(const StreamConfiguration &inCfg, return 0; } -int PostProcessorYuv::process(const FrameBuffer &source, - CameraBuffer *destination, - [[maybe_unused]] Camera3RequestDescriptor *request) +int PostProcessorYuv::process(Camera3RequestDescriptor::StreamBuffer *streamBuffer) { + const FrameBuffer &source = *streamBuffer->srcBuffer; + CameraBuffer *destination = streamBuffer->dstBuffer.get(); + if (!isValidBuffers(source, *destination)) return -EINVAL; diff --git a/src/android/yuv/post_processor_yuv.h b/src/android/yuv/post_processor_yuv.h index a4e0ff5d..5954e11b 100644 --- a/src/android/yuv/post_processor_yuv.h +++ b/src/android/yuv/post_processor_yuv.h @@ -18,9 +18,7 @@ public: int configure(const libcamera::StreamConfiguration &incfg, const libcamera::StreamConfiguration &outcfg) override; - int process(const libcamera::FrameBuffer &source, - CameraBuffer *destination, - Camera3RequestDescriptor *request) override; + int process(Camera3RequestDescriptor::StreamBuffer *streamBuffer) override; private: bool isValidBuffers(const libcamera::FrameBuffer &source,