[libcamera-devel] [PATCH 06/10] android: camera_buffer: Implement libcamera::Extensible
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Tue Mar 2 00:44:34 CET 2021
Hi Jacopo,
Thank you for the patch.
On Mon, Mar 01, 2021 at 04:01:07PM +0100, Jacopo Mondi wrote:
> In order to prepare to support more memory backends, make the
> CameraBuffer class implement the PIMPL (pointer-to-implementation)
> pattern by inheriting from the libcamera::Extensible 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 | 14 ++++-
> src/android/mm/generic_camera_buffer.cpp | 74 +++++++++++++++++++++++-
> 2 files changed, 86 insertions(+), 2 deletions(-)
>
> diff --git a/src/android/camera_buffer.h b/src/android/camera_buffer.h
> index 0590cd84652b..ca4f4527c690 100644
> --- a/src/android/camera_buffer.h
> +++ b/src/android/camera_buffer.h
> @@ -9,13 +9,25 @@
>
> #include <hardware/camera3.h>
>
> +#include <libcamera/class.h>
> #include <libcamera/internal/buffer.h>
> +#include <libcamera/span.h>
>
> -class CameraBuffer : public libcamera::MappedBuffer
> +class CameraBuffer final : public libcamera::Extensible,
> + public libcamera::MappedBuffer
> {
> + LIBCAMERA_DECLARE_PRIVATE(CameraBuffer)
> +
> public:
> CameraBuffer(buffer_handle_t camera3Buffer, int flags);
> ~CameraBuffer();
> +
> + bool isValid() const;
> +
> + unsigned int numPlanes() const;
> +
> + libcamera::Span<const uint8_t> plane(unsigned int plane) const;
> + libcamera::Span<uint8_t> plane(unsigned int plane);
> };
>
> #endif /* __ANDROID_CAMERA_BUFFER_H__ */
> diff --git a/src/android/mm/generic_camera_buffer.cpp b/src/android/mm/generic_camera_buffer.cpp
> index d1407f9cddf4..eedf16b76542 100644
> --- a/src/android/mm/generic_camera_buffer.cpp
> +++ b/src/android/mm/generic_camera_buffer.cpp
> @@ -13,7 +13,25 @@ using namespace libcamera;
>
> LOG_DECLARE_CATEGORY(HAL)
>
> -CameraBuffer::CameraBuffer(buffer_handle_t camera3Buffer, int flags)
> +class CameraBuffer::Private : public Extensible::Private,
> + public libcamera::MappedBuffer
> +{
> + LIBCAMERA_DECLARE_PUBLIC(CameraBuffer)
> +
> +public:
> + Private(CameraBuffer *cameraBuffer,
> + buffer_handle_t camera3Buffer, int flags);
> + ~Private();
> +
> + unsigned int numPlanes() const;
> +
> + Span<const uint8_t> plane(unsigned int plane) const;
> + Span<uint8_t> plane(unsigned int plane);
> +};
> +
> +CameraBuffer::Private::Private(CameraBuffer *cameraBuffer,
> + buffer_handle_t camera3Buffer, int flags)
> + : Extensible::Private(cameraBuffer)
> {
> maps_.reserve(camera3Buffer->numFds);
> error_ = 0;
> @@ -42,6 +60,60 @@ CameraBuffer::CameraBuffer(buffer_handle_t camera3Buffer, int flags)
> }
> }
>
> +CameraBuffer::Private::~Private()
> +{
> +}
> +
> +unsigned int CameraBuffer::Private::numPlanes() const
> +{
> + return maps_.size();
> +}
> +
> +Span<const uint8_t> CameraBuffer::Private::plane(unsigned int plane) const
> +{
> + if (plane >= maps_.size())
> + return {};
> +
> + return maps_[plane];
> +}
> +
> +Span<uint8_t> CameraBuffer::Private::plane(unsigned int plane)
> +{
> + if (plane >= maps_.size())
> + return {};
> +
> + return maps_[plane];
> +}
> +
> +CameraBuffer::CameraBuffer(buffer_handle_t camera3Buffer, int flags)
> + : Extensible(new Private(this, camera3Buffer, flags))
> +{
> +}
> +
> CameraBuffer::~CameraBuffer()
> {
> }
> +
> +bool CameraBuffer::isValid() const
> +{
> + const Private *const d = LIBCAMERA_D_PTR();
> + return d->isValid();
> +}
> +
> +unsigned int CameraBuffer::numPlanes() const
> +{
> + const Private *const d = LIBCAMERA_D_PTR();
> + return d->numPlanes();
> +}
> +
> +Span<const uint8_t> CameraBuffer::plane(unsigned int plane) const
> +{
> + const Private *const d = LIBCAMERA_D_PTR();
> + return d->plane(plane);
How about implementing this as
return const_cast<Private *>(d)->plane(plane);
to avoid two plane() function in the private class ? You could then drop
the const version of Private::plane() (it would be possible to do it the
other way around, but conceptually, keeping the non-const version is
better I think as we return a pointer to non-const memory).
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> +}
> +
> +Span<uint8_t> CameraBuffer::plane(unsigned int plane)
> +{
> + Private *const d = LIBCAMERA_D_PTR();
> + return d->plane(plane);
> +}
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list