From patchwork Fri Feb 26 13:29:27 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 11400 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 8CDEABD1F1 for ; Fri, 26 Feb 2021 13:29:22 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id D556168A8E; Fri, 26 Feb 2021 14:29:21 +0100 (CET) Received: from relay12.mail.gandi.net (relay12.mail.gandi.net [217.70.178.232]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 0E9A668A71 for ; Fri, 26 Feb 2021 14:29:16 +0100 (CET) Received: from uno.LocalDomain (93-61-96-190.ip145.fastwebnet.it [93.61.96.190]) (Authenticated sender: jacopo@jmondi.org) by relay12.mail.gandi.net (Postfix) with ESMTPSA id C67E2200005 for ; Fri, 26 Feb 2021 13:29:15 +0000 (UTC) From: Jacopo Mondi To: libcamera-devel@lists.libcamera.org Date: Fri, 26 Feb 2021 14:29:27 +0100 Message-Id: <20210226132932.165484-8-jacopo@jmondi.org> X-Mailer: git-send-email 2.30.0 In-Reply-To: <20210226132932.165484-1-jacopo@jmondi.org> References: <20210226132932.165484-1-jacopo@jmondi.org> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 07/12] android: camera_buffer: Implement PIMPL pattern 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" In order to prepare to support more memory backends, make the CameraBuffer class implement the PIMPL (pointer-to-implementation) pattern. Define the CameraBuffer class interface whose actual implementation is delegated to an inner CameraBufferImpl class. Temporary maintain libcamera::MappedBuffer as the CameraBuffer base class to maintain compatibility of the CameraStream::process() interface that requires a MappedBuffer * as second argument and will be converted to use a CameraBuffer in the next patch. Signed-off-by: Jacopo Mondi --- src/android/camera_buffer.h | 12 ++++ src/android/mm/android_generic_buffer.cpp | 80 ++++++++++++++++++++++- 2 files changed, 91 insertions(+), 1 deletion(-) diff --git a/src/android/camera_buffer.h b/src/android/camera_buffer.h index 0590cd84652b..2a91e6a3c9c1 100644 --- a/src/android/camera_buffer.h +++ b/src/android/camera_buffer.h @@ -16,6 +16,18 @@ class CameraBuffer : public libcamera::MappedBuffer public: CameraBuffer(buffer_handle_t camera3Buffer, int flags); ~CameraBuffer(); + + bool isValid() const; + + unsigned int numPlanes() const; + ssize_t planeSize(unsigned int plane) const; + + const uint8_t *plane(unsigned int plane) const; + uint8_t *plane(unsigned int plane); + +private: + class CameraBufferImpl; + CameraBufferImpl *impl_; }; #endif /* __ANDROID_CAMERA_BUFFER_H__ */ diff --git a/src/android/mm/android_generic_buffer.cpp b/src/android/mm/android_generic_buffer.cpp index 807304a9e42d..10a43a61bd4d 100644 --- a/src/android/mm/android_generic_buffer.cpp +++ b/src/android/mm/android_generic_buffer.cpp @@ -13,7 +13,21 @@ using namespace libcamera; LOG_DECLARE_CATEGORY(HAL) -CameraBuffer::CameraBuffer(buffer_handle_t camera3Buffer, int flags) +class CameraBuffer::CameraBufferImpl : public libcamera::MappedBuffer +{ +public: + CameraBufferImpl(buffer_handle_t camera3Buffer, int flags); + ~CameraBufferImpl(); + + unsigned int numPlanes() const; + ssize_t planeSize(unsigned int plane) const; + + const uint8_t *plane(unsigned int plane) const; + uint8_t *plane(unsigned int plane); +}; + +CameraBuffer::CameraBufferImpl::CameraBufferImpl(buffer_handle_t camera3Buffer, + int flags) { maps_.reserve(camera3Buffer->numFds); error_ = 0; @@ -42,6 +56,70 @@ CameraBuffer::CameraBuffer(buffer_handle_t camera3Buffer, int flags) } } +CameraBuffer::CameraBufferImpl::~CameraBufferImpl() +{ +} + +unsigned int CameraBuffer::CameraBufferImpl::numPlanes() const +{ + return maps_.size(); +} + +ssize_t CameraBuffer::CameraBufferImpl::planeSize(unsigned int plane) const +{ + if (plane >= maps_.size()) + return -EINVAL; + + return maps_[plane].size(); +} + +const uint8_t *CameraBuffer::CameraBufferImpl::plane(unsigned int plane) const +{ + if (plane >= maps_.size()) + return nullptr; + + return maps_[plane].data(); +} + +uint8_t *CameraBuffer::CameraBufferImpl::plane(unsigned int plane) +{ + if (plane >= maps_.size()) + return nullptr; + + return maps_[plane].data(); +} + +CameraBuffer::CameraBuffer(buffer_handle_t camera3Buffer, int flags) + : impl_(new CameraBuffer::CameraBufferImpl(camera3Buffer, flags)) +{ +} + CameraBuffer::~CameraBuffer() { + delete impl_; +} + +bool CameraBuffer::isValid() const +{ + return impl_->isValid(); +} + +unsigned int CameraBuffer::numPlanes() const +{ + return impl_->numPlanes(); +} + +ssize_t CameraBuffer::planeSize(unsigned int plane) const +{ + return impl_->planeSize(plane); +} + +const uint8_t *CameraBuffer::plane(unsigned int plane) const +{ + return impl_->plane(plane); +} + +uint8_t *CameraBuffer::plane(unsigned int plane) +{ + return impl_->plane(plane); }