summaryrefslogtreecommitdiff
path: root/src/android
diff options
context:
space:
mode:
authorHirokazu Honda <hiroh@chromium.org>2021-11-30 21:44:28 +0900
committerJacopo Mondi <jacopo@jmondi.org>2021-12-06 17:41:45 +0100
commitb53f6efb99e289375b88f50d3fb5ef216c97da02 (patch)
tree792a65f4928b5794e3d88a96cf5a383b9f075120 /src/android
parentc58662c5770e4c2b4446318295055fcbc04c1824 (diff)
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 <hiroh@chromium.org> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
Diffstat (limited to 'src/android')
-rw-r--r--src/android/camera_stream.cpp38
-rw-r--r--src/android/camera_stream.h5
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