[libcamera-devel] [PATCH 02/12] android: Introduce CameraBuffer interface
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Sun Feb 28 19:20:34 CET 2021
Hi Jacopo,
Thank you for the patch.
On Fri, Feb 26, 2021 at 02:29:22PM +0100, Jacopo Mondi wrote:
> In order to provide support for different memory backends,
> move the MappedCamera3Buffer class definition outside of the
> CameraDevice class to its own file.
>
> 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.
>
> The MappedCamera3Buffer interface will be renamed in CameraBuffer
> in the next patch to match the name of the file and not in this patch
> to ease review.
The next patch is fairly small, I'd squash it with this one. Splitting
the two makes 02/12 a bit weird, as you mention introducing CameraBuffer
in the subject while this patch doesn't create such a class.
If you really want to keep the two separate, I'd rename
MappedCamera3Buffer to CameraBuffer first.
With this handled,
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> ---
> src/android/camera_buffer.h | 21 ++++++++++
> src/android/camera_device.cpp | 30 --------------
> src/android/camera_device.h | 7 +---
> src/android/meson.build | 2 +
> src/android/mm/android_generic_buffer.cpp | 48 +++++++++++++++++++++++
> src/android/mm/meson.build | 6 +++
> 6 files changed, 78 insertions(+), 36 deletions(-)
> create mode 100644 src/android/camera_buffer.h
> create mode 100644 src/android/mm/android_generic_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..a1fb97a3c6db
> --- /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 MappedCamera3Buffer : public libcamera::MappedBuffer
> +{
> +public:
> + MappedCamera3Buffer(const buffer_handle_t camera3buffer, int flags);
> + ~MappedCamera3Buffer();
> +};
> +
> +#endif /* __ANDROID_CAMERA_BUFFER_H__ */
> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> index 16cb8c6d2b84..a7a5b7986aa4 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
> *
> 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 a13ce63b1d58..fd41c74f78ef 100644
> --- a/src/android/meson.build
> +++ b/src/android/meson.build
> @@ -57,6 +57,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/android_generic_buffer.cpp b/src/android/mm/android_generic_buffer.cpp
> new file mode 100644
> index 000000000000..2504d9276e9e
> --- /dev/null
> +++ b/src/android/mm/android_generic_buffer.cpp
> @@ -0,0 +1,48 @@
> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> +/*
> + * Copyright (C) 2021, Google Inc.
> + *
> + * android_generic_buffer.cpp - Generic Android frame buffer backend
> + */
> +
> +#include "../camera_buffer.h"
> +
> +#include "libcamera/internal/log.h"
> +
> +using namespace libcamera;
> +
> +LOG_DECLARE_CATEGORY(HAL)
> +
> +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));
> + }
> +}
> +
> +MappedCamera3Buffer::~MappedCamera3Buffer()
> +{
> +}
> diff --git a/src/android/mm/meson.build b/src/android/mm/meson.build
> new file mode 100644
> index 000000000000..39be8fec8567
> --- /dev/null
> +++ b/src/android/mm/meson.build
> @@ -0,0 +1,6 @@
> +# SPDX-License-Identifier: CC0-1.0
> +
> +memory_backend = get_option('android_memory_backend')
> +if memory_backend == 'android_generic'
> + android_hal_sources += files(['android_generic_buffer.cpp'])
> +endif
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list