diff options
-rw-r--r-- | src/android/camera_buffer.h | 14 | ||||
-rw-r--r-- | src/android/mm/generic_camera_buffer.cpp | 65 |
2 files changed, 77 insertions, 2 deletions
diff --git a/src/android/camera_buffer.h b/src/android/camera_buffer.h index 0590cd84..ca4f4527 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 d1407f9c..0fb6b0a9 100644 --- a/src/android/mm/generic_camera_buffer.cpp +++ b/src/android/mm/generic_camera_buffer.cpp @@ -13,7 +13,24 @@ 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<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 +59,52 @@ CameraBuffer::CameraBuffer(buffer_handle_t camera3Buffer, int flags) } } +CameraBuffer::Private::~Private() +{ +} + +unsigned int CameraBuffer::Private::numPlanes() const +{ + return maps_.size(); +} + +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 const_cast<Private *>(d)->plane(plane); +} + +Span<uint8_t> CameraBuffer::plane(unsigned int plane) +{ + Private *const d = LIBCAMERA_D_PTR(); + return d->plane(plane); +} |