From patchwork Tue Mar 2 14:18:44 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 11458 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 61217BD80C for ; Tue, 2 Mar 2021 14:18:40 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 38D4C68AA9; Tue, 2 Mar 2021 15:18:40 +0100 (CET) Received: from relay12.mail.gandi.net (relay12.mail.gandi.net [217.70.178.232]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 8E98068A7E for ; Tue, 2 Mar 2021 15:18:39 +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 192DE20000E; Tue, 2 Mar 2021 14:18:37 +0000 (UTC) From: Jacopo Mondi To: libcamera-devel@lists.libcamera.org Date: Tue, 2 Mar 2021 15:18:44 +0100 Message-Id: <20210302141844.126634-12-jacopo@jmondi.org> X-Mailer: git-send-email 2.30.0 In-Reply-To: <20210302141844.126634-1-jacopo@jmondi.org> References: <20210302141844.126634-1-jacopo@jmondi.org> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v4 11/11] android: Introduce Chromium OS buffer manager 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" Introduce the CameraBuffer backend for the Chromium OS operating system and the associated meson option. The Chromium OS CameraBuffer implementation uses the cros::CameraBufferManager class to perform mapping of 1 plane and multiplane buffers and to retrieve size information. Reviewed-by: Laurent Pinchart Signed-off-by: Jacopo Mondi --- meson_options.txt | 2 +- src/android/mm/cros_camera_buffer.cpp | 128 ++++++++++++++++++++++++++ src/android/mm/meson.build | 3 + 3 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 src/android/mm/cros_camera_buffer.cpp diff --git a/meson_options.txt b/meson_options.txt index d840543b01f5..f6b6c65c5c85 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -7,7 +7,7 @@ option('android', option('android_platform', type : 'combo', - choices : ['generic'], + choices : ['cros', 'generic'], value : 'generic', description : 'Select the Android platform to compile for') diff --git a/src/android/mm/cros_camera_buffer.cpp b/src/android/mm/cros_camera_buffer.cpp new file mode 100644 index 000000000000..7df4f47c3509 --- /dev/null +++ b/src/android/mm/cros_camera_buffer.cpp @@ -0,0 +1,128 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2021, Google Inc. + * + * cros_camera_buffer.cpp - Chromium OS buffer backend using CameraBufferManager + */ + +#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::Private : public Extensible::Private +{ + LIBCAMERA_DECLARE_PUBLIC(CameraBuffer) + +public: + Private(CameraBuffer *cameraBuffer, + buffer_handle_t camera3Buffer, int flags); + ~Private(); + + bool isValid() const { return valid_; } + + unsigned int numPlanes() const; + + Span plane(unsigned int plane); + + size_t jpegBufferSize(size_t maxJpegBufferSize) const; + +private: + cros::CameraBufferManager *bufferManager_; + buffer_handle_t handle_; + unsigned int numPlanes_; + bool valid_; + union { + void *addr; + android_ycbcr ycbcr; + } mem; + + const uint8_t *planeAddr(unsigned int plane) const; + uint8_t *planeAddr(unsigned int plane); +}; + +CameraBuffer::Private::Private(CameraBuffer *cameraBuffer, + buffer_handle_t camera3Buffer, int flags) + : Extensible::Private(cameraBuffer), 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::Private::~Private() +{ + bufferManager_->Unlock(handle_); + bufferManager_->Deregister(handle_); +} + +unsigned int CameraBuffer::Private::numPlanes() const +{ + return bufferManager_->GetNumPlanes(handle_); +} + +Span CameraBuffer::Private::plane(unsigned int plane) +{ + 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), + bufferManager_->GetPlaneSize(handle_, plane) }; +} + +size_t CameraBuffer::Private::jpegBufferSize(size_t maxJpegBufferSize) const +{ + return bufferManager_->GetPlaneSize(handle_, 0); +} + +PUBLIC_CAMERA_BUFFER_IMPLEMENTATION diff --git a/src/android/mm/meson.build b/src/android/mm/meson.build index 97f83f2a7380..eeb5cc2e6a31 100644 --- a/src/android/mm/meson.build +++ b/src/android/mm/meson.build @@ -3,4 +3,7 @@ platform = get_option('android_platform') if platform == 'generic' android_hal_sources += files(['generic_camera_buffer.cpp']) +elif platform == 'cros' + android_hal_sources += files(['cros_camera_buffer.cpp']) + android_deps += [dependency('libcros_camera')] endif