From patchwork Fri Feb 26 13:29:31 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 11404 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 1097EBD80C for ; Fri, 26 Feb 2021 13:29:24 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id C788F68A93; Fri, 26 Feb 2021 14:29:23 +0100 (CET) Received: from relay12.mail.gandi.net (relay12.mail.gandi.net [217.70.178.232]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id BB67D68A69 for ; Fri, 26 Feb 2021 14:29:17 +0100 (CET) Received: from uno.LocalDomain (93-61-96-190.ip145.fastwebnet.it [93.61.96.190]) (Authenticated sender: jacopo@jmondi.org) by relay12.mail.gandi.net (Postfix) with ESMTPSA id 7FF19200005 for ; Fri, 26 Feb 2021 13:29:17 +0000 (UTC) From: Jacopo Mondi To: libcamera-devel@lists.libcamera.org Date: Fri, 26 Feb 2021 14:29:31 +0100 Message-Id: <20210226132932.165484-12-jacopo@jmondi.org> X-Mailer: git-send-email 2.30.0 In-Reply-To: <20210226132932.165484-1-jacopo@jmondi.org> References: <20210226132932.165484-1-jacopo@jmondi.org> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 11/12] android: Introduce cros_cbm_buffer 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: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Introduce the CameraBuffer backend for the ChromeOS operating system. The cros_cbm CameraBuffer implementation uses the ChromeOS CameraBufferManager class to perform mapping of 1 plane and multiplane buffers. Signed-off-by: Jacopo Mondi --- src/android/mm/cros_cbm.cpp | 167 ++++++++++++++++++++++++++++++++++++ src/android/mm/meson.build | 3 + 2 files changed, 170 insertions(+) create mode 100644 src/android/mm/cros_cbm.cpp diff --git a/src/android/mm/cros_cbm.cpp b/src/android/mm/cros_cbm.cpp new file mode 100644 index 000000000000..6c931c99d2d0 --- /dev/null +++ b/src/android/mm/cros_cbm.cpp @@ -0,0 +1,167 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2021, Google Inc. + * + * cros_cbm.cpp - ChromiumOS libcbm frame buffer backend + */ + +#include "../camera_buffer.h" + +#include "libcamera/internal/log.h" + +#include "cros-camera/camera_buffer_manager.h" + +using namespace libcamera; + +LOG_DECLARE_CATEGORY(HAL) + +class CameraBuffer::CameraBufferImpl : public libcamera::MappedBuffer +{ +public: + CameraBufferImpl(buffer_handle_t camera3Buffer, int flags); + ~CameraBufferImpl(); + + bool isValid() const { return valid_; } + + unsigned int numPlanes() const; + ssize_t planeSize(unsigned int plane) const; + + const uint8_t *plane(unsigned int plane) const; + uint8_t *plane(unsigned int plane); + +private: + cros::CameraBufferManager *bufferManager_; + buffer_handle_t handle_; + unsigned int numPlanes_; + bool valid_; + union { + void *addr; + android_ycbcr ycbcr; + } mem; +}; + +CameraBuffer::CameraBufferImpl::CameraBufferImpl(buffer_handle_t camera3Buffer, + int flags) + : handle_(camera3Buffer), numPlanes_(0), valid_(false) +{ + bufferManager_ = cros::CameraBufferManager::GetInstance(); + + bufferManager_->Register(camera3Buffer); + + numPlanes_ = bufferManager_->GetNumPlanes(camera3Buffer); + switch (numPlanes_) { + case 1: { + int ret = bufferManager_->Lock(handle_, 0, 0, 0, 0, 0, &mem.addr); + if (ret) { + LOG(HAL, Error) << "Single plane buffer mapping failed"; + return; + } + break; + } + case 2: { + case 3: + int ret = bufferManager_->LockYCbCr(handle_, 0, 0, 0, 0, 0, + &mem.ycbcr); + if (ret) { + LOG(HAL, Error) << "YCbCr buffer mapping failed"; + return; + } + break; + } + default: + LOG(HAL, Error) << "Invalid number of planes: " << numPlanes_; + return; + } + + valid_ = true; +} + +CameraBuffer::CameraBufferImpl::~CameraBufferImpl() +{ + bufferManager_->Unlock(handle_); + bufferManager_->Deregister(handle_); +} + +unsigned int CameraBuffer::CameraBufferImpl::numPlanes() const +{ + return bufferManager_->GetNumPlanes(handle_); +} + +ssize_t CameraBuffer::CameraBufferImpl::planeSize(unsigned int plane) const +{ + if (plane >= numPlanes()) + return -EINVAL; + + return bufferManager_->GetPlaneSize(handle_, plane); +} + +const uint8_t *CameraBuffer::CameraBufferImpl::plane(unsigned int plane) const +{ + if (plane >= numPlanes()) + return nullptr; + + return const_cast(this->plane(plane)); +} + +uint8_t *CameraBuffer::CameraBufferImpl::plane(unsigned int plane) +{ + if (plane >= numPlanes()) + return nullptr; + + void *addr; + switch (numPlanes()) { + case 1: + addr = mem.addr; + break; + default: + switch (plane) { + case 1: + addr = mem.ycbcr.y; + break; + case 2: + addr = mem.ycbcr.cb; + break; + case 3: + addr = mem.ycbcr.cr; + break; + } + } + + return static_cast(addr); +} + +CameraBuffer::CameraBuffer(buffer_handle_t camera3Buffer, int flags) + : impl_(new CameraBuffer::CameraBufferImpl(camera3Buffer, flags)) +{ +} + +CameraBuffer::~CameraBuffer() +{ + delete impl_; +} + +bool CameraBuffer::isValid() const +{ + return impl_->isValid(); +} + +unsigned int CameraBuffer::numPlanes() const +{ + return impl_->numPlanes(); +} + +ssize_t CameraBuffer::planeSize(unsigned int plane) const +{ + return impl_->planeSize(plane); +} + +const uint8_t *CameraBuffer::plane(unsigned int plane) const +{ + return impl_->plane(plane); +} + +uint8_t *CameraBuffer::plane(unsigned int plane) +{ + return impl_->plane(plane); +} + diff --git a/src/android/mm/meson.build b/src/android/mm/meson.build index 39be8fec8567..a801c54ff4f4 100644 --- a/src/android/mm/meson.build +++ b/src/android/mm/meson.build @@ -3,4 +3,7 @@ memory_backend = get_option('android_memory_backend') if memory_backend == 'android_generic' android_hal_sources += files(['android_generic_buffer.cpp']) +elif memory_backend == 'cros_cbm' + android_hal_sources += files(['cros_cbm.cpp']) + android_deps += [ dependency('libcros_camera') ] endif