From 64c17f73a08fd121c233e655d6ded9790c03dda5 Mon Sep 17 00:00:00 2001 From: Jacopo Mondi Date: Wed, 17 Feb 2021 16:04:34 +0100 Subject: 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 Signed-off-by: Jacopo Mondi --- src/android/mm/generic_camera_buffer.cpp | 47 ++++++++++++++++++++++++++++++++ src/android/mm/meson.build | 6 ++++ 2 files changed, 53 insertions(+) create mode 100644 src/android/mm/generic_camera_buffer.cpp create mode 100644 src/android/mm/meson.build (limited to 'src/android/mm') 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(address), + static_cast(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 -- cgit v1.2.1