From b53f6efb99e289375b88f50d3fb5ef216c97da02 Mon Sep 17 00:00:00 2001 From: Hirokazu Honda Date: Tue, 30 Nov 2021 21:44:28 +0900 Subject: android: camera_stream: Use PlatformFrameBufferAllocator CameraStream originally creates FrameBuffers by FrameBufferAllocator and thus buffers are allocated in V4L2 API. This replaces the allocator in CameraStream with PlatformFrameBufferAllocator. It allocates a buffer in a platform dependent graphic buffer allocation API. Signed-off-by: Hirokazu Honda Reviewed-by: Jacopo Mondi Signed-off-by: Jacopo Mondi --- src/android/camera_stream.cpp | 38 +++++++++++++++++++++++++------------- src/android/camera_stream.h | 5 +++-- 2 files changed, 28 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp index ae659808..ee9bbe48 100644 --- a/src/android/camera_stream.cpp +++ b/src/android/camera_stream.cpp @@ -22,6 +22,7 @@ #include "camera_capabilities.h" #include "camera_device.h" #include "camera_metadata.h" +#include "frame_buffer_allocator.h" #include "post_processor.h" using namespace libcamera; @@ -59,7 +60,15 @@ CameraStream::CameraStream(CameraDevice *const cameraDevice, CameraStream::CameraStream(CameraStream &&other) = default; -CameraStream::~CameraStream() = default; +CameraStream::~CameraStream() +{ + /* + * Manually delete buffers and then the allocator to make sure buffers + * are released while the allocator is still valid. + */ + allocatedBuffers_.clear(); + allocator_.reset(); +} const StreamConfiguration &CameraStream::configuration() const { @@ -118,17 +127,8 @@ int CameraStream::configure() } if (type_ == Type::Internal) { - allocator_ = std::make_unique(cameraDevice_->camera()); + allocator_ = std::make_unique(cameraDevice_); mutex_ = std::make_unique(); - - int ret = allocator_->allocate(stream()); - if (ret < 0) - return ret; - - MutexLocker lock(*mutex_); - /* Save a pointer to the reserved frame buffers */ - for (const auto &frameBuffer : allocator_->buffers(stream())) - buffers_.push_back(frameBuffer.get()); } camera3Stream_->max_buffers = configuration().bufferCount; @@ -212,8 +212,20 @@ FrameBuffer *CameraStream::getBuffer() MutexLocker locker(*mutex_); if (buffers_.empty()) { - LOG(HAL, Error) << "Buffer underrun"; - return nullptr; + /* + * Use HAL_PIXEL_FORMAT_YCBCR_420_888 unconditionally. + * + * YCBCR_420 is the source format for both the JPEG and the YUV + * post-processors. + * + * \todo Store a reference to the format of the source stream + * instead of hardcoding. + */ + auto frameBuffer = allocator_->allocate(HAL_PIXEL_FORMAT_YCBCR_420_888, + configuration().size, + camera3Stream_->usage); + allocatedBuffers_.push_back(std::move(frameBuffer)); + buffers_.emplace_back(allocatedBuffers_.back().get()); } FrameBuffer *buffer = buffers_.back(); diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h index 7b1a2980..f9504462 100644 --- a/src/android/camera_stream.h +++ b/src/android/camera_stream.h @@ -18,7 +18,6 @@ #include #include -#include #include #include @@ -26,6 +25,7 @@ #include "post_processor.h" class CameraDevice; +class PlatformFrameBufferAllocator; class CameraStream { @@ -169,7 +169,8 @@ private: camera3_stream_t *camera3Stream_; const unsigned int index_; - std::unique_ptr allocator_; + std::unique_ptr allocator_; + std::vector> allocatedBuffers_; std::vector buffers_ LIBCAMERA_TSA_GUARDED_BY(mutex_); /* * The class has to be MoveConstructible as instances are stored in -- cgit v1.2.1