summaryrefslogtreecommitdiff
path: root/src/android
diff options
context:
space:
mode:
authorJacopo Mondi <jacopo@jmondi.org>2021-02-17 16:04:34 +0100
committerJacopo Mondi <jacopo@jmondi.org>2021-03-03 09:50:12 +0100
commit64c17f73a08fd121c233e655d6ded9790c03dda5 (patch)
treeec797bd5c44c79a362ad5f6787f56b31ebaed09a /src/android
parentad9eee2a7d91cd6113242194b8bc7be905436cb5 (diff)
android: Introduce CameraBuffer interface
In order to provide support for different memory backends, move the MappedCamera3Buffer class definition outside of the CameraDevice class to its own file and rename it in CameraBuffer. The interface defined in camera_buffer.h will be implemented by different backends that will be placed in the src/android/mm subdirectory. Provide a first implementation for the 'generic android' backend which matches the existing one. Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
Diffstat (limited to 'src/android')
-rw-r--r--src/android/camera_buffer.h21
-rw-r--r--src/android/camera_device.cpp34
-rw-r--r--src/android/camera_device.h7
-rw-r--r--src/android/meson.build2
-rw-r--r--src/android/mm/generic_camera_buffer.cpp47
-rw-r--r--src/android/mm/meson.build6
6 files changed, 79 insertions, 38 deletions
diff --git a/src/android/camera_buffer.h b/src/android/camera_buffer.h
new file mode 100644
index 00000000..00b06150
--- /dev/null
+++ b/src/android/camera_buffer.h
@@ -0,0 +1,21 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2021, Google Inc.
+ *
+ * camera_buffer.h - Frame buffer handling interface definition
+ */
+#ifndef __ANDROID_CAMERA_BUFFER_H__
+#define __ANDROID_CAMERA_BUFFER_H__
+
+#include <hardware/camera3.h>
+
+#include <libcamera/internal/buffer.h>
+
+class CameraBuffer : public libcamera::MappedBuffer
+{
+public:
+ CameraBuffer(const buffer_handle_t camera3buffer, int flags);
+ ~CameraBuffer();
+};
+
+#endif /* __ANDROID_CAMERA_BUFFER_H__ */
diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index 16cb8c6d..f47f28b8 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -257,36 +257,6 @@ void sortCamera3StreamConfigs(std::vector<Camera3StreamConfig> &unsortedConfigs,
} /* namespace */
-MappedCamera3Buffer::MappedCamera3Buffer(const buffer_handle_t camera3buffer,
- int flags)
-{
- maps_.reserve(camera3buffer->numFds);
- error_ = 0;
-
- for (int i = 0; i < camera3buffer->numFds; i++) {
- if (camera3buffer->data[i] == -1)
- continue;
-
- off_t length = lseek(camera3buffer->data[i], 0, SEEK_END);
- if (length < 0) {
- error_ = -errno;
- LOG(HAL, Error) << "Failed to query plane length";
- break;
- }
-
- void *address = mmap(nullptr, length, flags, MAP_SHARED,
- camera3buffer->data[i], 0);
- if (address == MAP_FAILED) {
- error_ = -errno;
- LOG(HAL, Error) << "Failed to mmap plane";
- break;
- }
-
- maps_.emplace_back(static_cast<uint8_t *>(address),
- static_cast<size_t>(length));
- }
-}
-
/*
* \struct Camera3RequestDescriptor
*
@@ -1892,8 +1862,8 @@ void CameraDevice::requestComplete(Request *request)
* separate thread.
*/
- MappedCamera3Buffer mapped(*descriptor->buffers_[i].buffer,
- PROT_READ | PROT_WRITE);
+ CameraBuffer mapped(*descriptor->buffers_[i].buffer,
+ PROT_READ | PROT_WRITE);
if (!mapped.isValid()) {
LOG(HAL, Error) << "Failed to mmap android blob buffer";
continue;
diff --git a/src/android/camera_device.h b/src/android/camera_device.h
index 9cbfcad3..e6c192c2 100644
--- a/src/android/camera_device.h
+++ b/src/android/camera_device.h
@@ -24,17 +24,12 @@
#include "libcamera/internal/log.h"
#include "libcamera/internal/message.h"
+#include "camera_buffer.h"
#include "camera_metadata.h"
#include "camera_stream.h"
#include "camera_worker.h"
#include "jpeg/encoder.h"
-class MappedCamera3Buffer : public libcamera::MappedBuffer
-{
-public:
- MappedCamera3Buffer(const buffer_handle_t camera3buffer, int flags);
-};
-
class CameraDevice : protected libcamera::Loggable
{
public:
diff --git a/src/android/meson.build b/src/android/meson.build
index 9719c42b..7004d32d 100644
--- a/src/android/meson.build
+++ b/src/android/meson.build
@@ -52,6 +52,8 @@ android_hal_sources = files([
'yuv/post_processor_yuv.cpp'
])
+subdir('mm')
+
android_camera_metadata_sources = files([
'metadata/camera_metadata.c',
])
diff --git a/src/android/mm/generic_camera_buffer.cpp b/src/android/mm/generic_camera_buffer.cpp
new file mode 100644
index 00000000..bd9152cf
--- /dev/null
+++ b/src/android/mm/generic_camera_buffer.cpp
@@ -0,0 +1,47 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2021, Google Inc.
+ *
+ * generic_camera_buffer.cpp - Generic Android frame buffer backend
+ */
+
+#include "../camera_buffer.h"
+
+#include "libcamera/internal/log.h"
+
+using namespace libcamera;
+
+LOG_DECLARE_CATEGORY(HAL)
+
+CameraBuffer::CameraBuffer(const buffer_handle_t camera3buffer, int flags)
+{
+ maps_.reserve(camera3buffer->numFds);
+ error_ = 0;
+
+ for (int i = 0; i < camera3buffer->numFds; i++) {
+ if (camera3buffer->data[i] == -1)
+ continue;
+
+ off_t length = lseek(camera3buffer->data[i], 0, SEEK_END);
+ if (length < 0) {
+ error_ = -errno;
+ LOG(HAL, Error) << "Failed to query plane length";
+ break;
+ }
+
+ void *address = mmap(nullptr, length, flags, MAP_SHARED,
+ camera3buffer->data[i], 0);
+ if (address == MAP_FAILED) {
+ error_ = -errno;
+ LOG(HAL, Error) << "Failed to mmap plane";
+ break;
+ }
+
+ maps_.emplace_back(static_cast<uint8_t *>(address),
+ static_cast<size_t>(length));
+ }
+}
+
+CameraBuffer::~CameraBuffer()
+{
+}
diff --git a/src/android/mm/meson.build b/src/android/mm/meson.build
new file mode 100644
index 00000000..97f83f2a
--- /dev/null
+++ b/src/android/mm/meson.build
@@ -0,0 +1,6 @@
+# SPDX-License-Identifier: CC0-1.0
+
+platform = get_option('android_platform')
+if platform == 'generic'
+ android_hal_sources += files(['generic_camera_buffer.cpp'])
+endif