From patchwork Mon Mar 1 15:01:03 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 11420 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 9D59EBD808 for ; Mon, 1 Mar 2021 15:00:54 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 7A87E68A69; Mon, 1 Mar 2021 16:00:54 +0100 (CET) Received: from relay2-d.mail.gandi.net (relay2-d.mail.gandi.net [217.70.183.194]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 36E2460521 for ; Mon, 1 Mar 2021 16:00:52 +0100 (CET) X-Originating-IP: 93.61.96.190 Received: from uno.LocalDomain (93-61-96-190.ip145.fastwebnet.it [93.61.96.190]) (Authenticated sender: jacopo@jmondi.org) by relay2-d.mail.gandi.net (Postfix) with ESMTPSA id 9EECE4000D; Mon, 1 Mar 2021 15:00:50 +0000 (UTC) From: Jacopo Mondi To: libcamera-devel@lists.libcamera.org Date: Mon, 1 Mar 2021 16:01:03 +0100 Message-Id: <20210301150111.61791-3-jacopo@jmondi.org> X-Mailer: git-send-email 2.30.0 In-Reply-To: <20210301150111.61791-1-jacopo@jmondi.org> References: <20210301150111.61791-1-jacopo@jmondi.org> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 02/10] android: Introduce CameraBuffer interface X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Han-lin Chen , Daniel Hung-yu Wu Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" 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/camera_buffer.h | 21 +++++++++++ src/android/camera_device.cpp | 34 +---------------- src/android/camera_device.h | 7 +--- src/android/meson.build | 2 + src/android/mm/generic_camera_buffer.cpp | 47 ++++++++++++++++++++++++ src/android/mm/meson.build | 6 +++ 6 files changed, 79 insertions(+), 38 deletions(-) create mode 100644 src/android/camera_buffer.h create mode 100644 src/android/mm/generic_camera_buffer.cpp create mode 100644 src/android/mm/meson.build diff --git a/src/android/camera_buffer.h b/src/android/camera_buffer.h new file mode 100644 index 000000000000..00b061502d6e --- /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 + +#include + +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 16cb8c6d2b84..f47f28b8c7ee 100644 --- a/src/android/camera_device.cpp +++ b/src/android/camera_device.cpp @@ -257,36 +257,6 @@ void sortCamera3StreamConfigs(std::vector &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(address), - static_cast(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 9cbfcad38433..e6c192c2100b 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 9719c42b65c6..7004d32d4b23 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 000000000000..bd9152cf9a16 --- /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 000000000000..97f83f2a7380 --- /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