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>
This commit is contained in:
parent
ad9eee2a7d
commit
64c17f73a0
6 changed files with 79 additions and 38 deletions
21
src/android/camera_buffer.h
Normal file
21
src/android/camera_buffer.h
Normal file
|
@ -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__ */
|
|
@ -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,7 +1862,7 @@ void CameraDevice::requestComplete(Request *request)
|
|||
* separate thread.
|
||||
*/
|
||||
|
||||
MappedCamera3Buffer mapped(*descriptor->buffers_[i].buffer,
|
||||
CameraBuffer mapped(*descriptor->buffers_[i].buffer,
|
||||
PROT_READ | PROT_WRITE);
|
||||
if (!mapped.isValid()) {
|
||||
LOG(HAL, Error) << "Failed to mmap android blob buffer";
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -52,6 +52,8 @@ android_hal_sources = files([
|
|||
'yuv/post_processor_yuv.cpp'
|
||||
])
|
||||
|
||||
subdir('mm')
|
||||
|
||||
android_camera_metadata_sources = files([
|
||||
'metadata/camera_metadata.c',
|
||||
])
|
||||
|
|
47
src/android/mm/generic_camera_buffer.cpp
Normal file
47
src/android/mm/generic_camera_buffer.cpp
Normal file
|
@ -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()
|
||||
{
|
||||
}
|
6
src/android/mm/meson.build
Normal file
6
src/android/mm/meson.build
Normal file
|
@ -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
|
Loading…
Add table
Add a link
Reference in a new issue