summaryrefslogtreecommitdiff
path: root/src/android/mm/generic_frame_buffer_allocator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/android/mm/generic_frame_buffer_allocator.cpp')
-rw-r--r--src/android/mm/generic_frame_buffer_allocator.cpp68
1 files changed, 22 insertions, 46 deletions
diff --git a/src/android/mm/generic_frame_buffer_allocator.cpp b/src/android/mm/generic_frame_buffer_allocator.cpp
index 7ecef2c6..1f2fbe33 100644
--- a/src/android/mm/generic_frame_buffer_allocator.cpp
+++ b/src/android/mm/generic_frame_buffer_allocator.cpp
@@ -16,8 +16,11 @@
#include "libcamera/internal/framebuffer.h"
#include <hardware/camera3.h>
-#include <hardware/gralloc.h>
-#include <hardware/hardware.h>
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wextra-semi"
+#include <ui/GraphicBufferAllocator.h>
+#pragma GCC diagnostic pop
+#include <utils/Errors.h>
#include "../camera_device.h"
#include "../frame_buffer_allocator.h"
@@ -33,35 +36,26 @@ class GenericFrameBufferData : public FrameBuffer::Private
LIBCAMERA_DECLARE_PUBLIC(FrameBuffer)
public:
- GenericFrameBufferData(struct alloc_device_t *allocDevice,
- buffer_handle_t handle,
+ GenericFrameBufferData(buffer_handle_t handle,
const std::vector<FrameBuffer::Plane> &planes)
- : FrameBuffer::Private(planes), allocDevice_(allocDevice),
- handle_(handle)
+ : FrameBuffer::Private(planes), handle_(handle)
{
- ASSERT(allocDevice_);
ASSERT(handle_);
}
~GenericFrameBufferData() override
{
/*
- * allocDevice_ is used to destroy handle_. allocDevice_ is
- * owned by PlatformFrameBufferAllocator::Private.
- * GenericFrameBufferData must be destroyed before it is
- * destroyed.
- *
- * \todo Consider managing alloc_device_t with std::shared_ptr
- * if this is difficult to maintain.
- *
* \todo Thread safety against alloc_device_t is not documented.
* Is it no problem to call alloc/free in parallel?
*/
- allocDevice_->free(allocDevice_, handle_);
+ auto &allocator = android::GraphicBufferAllocator::get();
+ android::status_t status = allocator.free(handle_);
+ if (status != android::NO_ERROR)
+ LOG(HAL, Error) << "Error freeing framebuffer: " << status;
}
private:
- struct alloc_device_t *allocDevice_;
const buffer_handle_t handle_;
};
} /* namespace */
@@ -72,51 +66,33 @@ class PlatformFrameBufferAllocator::Private : public Extensible::Private
public:
Private(CameraDevice *const cameraDevice)
- : cameraDevice_(cameraDevice),
- hardwareModule_(nullptr),
- allocDevice_(nullptr)
+ : cameraDevice_(cameraDevice)
{
- hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &hardwareModule_);
- ASSERT(hardwareModule_);
}
- ~Private() override;
+ ~Private() = default;
std::unique_ptr<HALFrameBuffer>
allocate(int halPixelFormat, const libcamera::Size &size, uint32_t usage);
private:
const CameraDevice *const cameraDevice_;
- const struct hw_module_t *hardwareModule_;
- struct alloc_device_t *allocDevice_;
};
-PlatformFrameBufferAllocator::Private::~Private()
-{
- if (allocDevice_)
- gralloc_close(allocDevice_);
- dlclose(hardwareModule_->dso);
-}
-
std::unique_ptr<HALFrameBuffer>
PlatformFrameBufferAllocator::Private::allocate(int halPixelFormat,
const libcamera::Size &size,
uint32_t usage)
{
- if (!allocDevice_) {
- int ret = gralloc_open(hardwareModule_, &allocDevice_);
- if (ret) {
- LOG(HAL, Fatal) << "gralloc_open() failed: " << ret;
- return nullptr;
- }
- }
-
- int stride = 0;
+ uint32_t stride = 0;
buffer_handle_t handle = nullptr;
- int ret = allocDevice_->alloc(allocDevice_, size.width, size.height,
- halPixelFormat, usage, &handle, &stride);
- if (ret) {
- LOG(HAL, Error) << "failed buffer allocation: " << ret;
+
+ auto &allocator = android::GraphicBufferAllocator::get();
+ android::status_t status = allocator.allocate(size.width, size.height, halPixelFormat,
+ 1 /*layerCount*/, usage, &handle, &stride,
+ "libcameraHAL");
+ if (status != android::NO_ERROR) {
+ LOG(HAL, Error) << "failed buffer allocation: " << status;
return nullptr;
}
if (!handle) {
@@ -143,7 +119,7 @@ PlatformFrameBufferAllocator::Private::allocate(int halPixelFormat,
return std::make_unique<HALFrameBuffer>(
std::make_unique<GenericFrameBufferData>(
- allocDevice_, handle, planes),
+ handle, planes),
handle);
}