diff options
-rw-r--r-- | src/android/camera_stream.cpp | 38 | ||||
-rw-r--r-- | src/android/camera_stream.h | 5 |
2 files changed, 28 insertions, 15 deletions
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<FrameBufferAllocator>(cameraDevice_->camera()); + allocator_ = std::make_unique<PlatformFrameBufferAllocator>(cameraDevice_); mutex_ = std::make_unique<Mutex>(); - - 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 <libcamera/camera.h> #include <libcamera/framebuffer.h> -#include <libcamera/framebuffer_allocator.h> #include <libcamera/geometry.h> #include <libcamera/pixel_format.h> @@ -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<libcamera::FrameBufferAllocator> allocator_; + std::unique_ptr<PlatformFrameBufferAllocator> allocator_; + std::vector<std::unique_ptr<libcamera::FrameBuffer>> allocatedBuffers_; std::vector<libcamera::FrameBuffer *> buffers_ LIBCAMERA_TSA_GUARDED_BY(mutex_); /* * The class has to be MoveConstructible as instances are stored in |