[libcamera-devel] [PATCH 07/12] android: camera_buffer: Implement PIMPL pattern
Jacopo Mondi
jacopo at jmondi.org
Fri Feb 26 14:29:27 CET 2021
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 <jacopo at jmondi.org>
---
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);
}
--
2.30.0
More information about the libcamera-devel
mailing list