From patchwork Mon Aug 23 12:43:21 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hirokazu Honda X-Patchwork-Id: 13434 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 39009C3241 for ; Mon, 23 Aug 2021 12:43:37 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id E7C316890E; Mon, 23 Aug 2021 14:43:36 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="VdAQcMMY"; dkim-atps=neutral Received: from mail-pf1-x42f.google.com (mail-pf1-x42f.google.com [IPv6:2607:f8b0:4864:20::42f]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 6F06D6025B for ; Mon, 23 Aug 2021 14:43:35 +0200 (CEST) Received: by mail-pf1-x42f.google.com with SMTP id y190so15286762pfg.7 for ; Mon, 23 Aug 2021 05:43:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=bFCbYAuFJwWL8413qwL1JI4tS02tPRRVoLn2/nC3Hec=; b=VdAQcMMYjTxiGmQwhK6MrB0K5HslBCp69n7O1FdEcS5axywWAqzgGg0tK62QyvdBoJ KjtBCkeLU2u/aM1XuQkZf/IuAmsWOpxPQKT/te7nu1NocXuev2Re+0DlULYn1hySIkY9 kFr9lydwOjePO1l8qOn5OxT1oZE6iahx3G66E= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=bFCbYAuFJwWL8413qwL1JI4tS02tPRRVoLn2/nC3Hec=; b=BCj9B0sfAy4bKvO44R87XmhscxpKXvfsTdxOtdUlDZJyUqTRET5jPrGIOeTljmLUix oDPUbZAJmRsAj2+ywWlaJiqtNDnDMIXVmR1m9KvjNtOLHKbW0uPcxcqdmRI5AGe1PiAW n6sdThGwapFbBzU3K9gPSVFjV7ELNj3vEtKhyK9KLZPNvl0OcNjP5ysEWp/dxi20qDz7 Rx3Iz1ub77vUn5z6Gj74y+/0PYlNxnTE41n9UlWEDCqNwxGb8b5WYXa7yHUXsByqcVa7 e0AZrl2aN4vCUNi1qWy94ASDzZnfyqICUO8GuFxr8eWyHWdYx03mY5valOt+723GfXdy A3oQ== X-Gm-Message-State: AOAM532CwEkAbX3k1s1Sp7IuFSAHKJzOdStUuvn1BBlLttNq4pDXwHwR rp3oU+OSRvZeCYQpwMo+QJ+sMlS1hI2a6w== X-Google-Smtp-Source: ABdhPJyd2jwFNhySd+duRoEGJzMm9NrPh2jKYBqeUBChMgN5xLOb1xguY/4dJzZedSreghY1pN1DWg== X-Received: by 2002:aa7:8c19:0:b0:3e1:4b9e:cf89 with SMTP id c25-20020aa78c19000000b003e14b9ecf89mr34049582pfd.58.1629722613647; Mon, 23 Aug 2021 05:43:33 -0700 (PDT) Received: from hiroh2.tok.corp.google.com ([2401:fa00:8f:203:184e:5d20:8fcb:dfcd]) by smtp.gmail.com with ESMTPSA id o2sm12103107pgu.76.2021.08.23.05.43.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Aug 2021 05:43:33 -0700 (PDT) From: Hirokazu Honda To: libcamera-devel@lists.libcamera.org Date: Mon, 23 Aug 2021 21:43:21 +0900 Message-Id: <20210823124321.980847-4-hiroh@chromium.org> X-Mailer: git-send-email 2.33.0.rc2.250.ged5fa647cd-goog In-Reply-To: <20210823124321.980847-1-hiroh@chromium.org> References: <20210823124321.980847-1-hiroh@chromium.org> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH 3/3] android: camera_buffer: Add stride/offset/size function 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" This adds getter functions of stride, offset and size to CameraBuffer interface. Signed-off-by: Hirokazu Honda --- src/android/camera_buffer.h | 16 +++++ src/android/mm/cros_camera_buffer.cpp | 19 ++++++ src/android/mm/generic_camera_buffer.cpp | 78 ++++++++++++++++++------ 3 files changed, 94 insertions(+), 19 deletions(-) diff --git a/src/android/camera_buffer.h b/src/android/camera_buffer.h index 87df2570..226a8f5c 100644 --- a/src/android/camera_buffer.h +++ b/src/android/camera_buffer.h @@ -31,6 +31,10 @@ public: libcamera::Span plane(unsigned int plane) const; libcamera::Span plane(unsigned int plane); + unsigned int stride(unsigned int plane) const; + unsigned int offset(unsigned int plane) const; + unsigned int size(unsigned int plane) const; + size_t jpegBufferSize(size_t maxJpegBufferSize) const; }; @@ -62,6 +66,18 @@ Span CameraBuffer::plane(unsigned int plane) \ { \ return _d()->plane(plane); \ } \ +unsigned int CameraBuffer::stride(unsigned int plane) const \ +{ \ + return _d()->stride(plane); \ +} \ +unsigned int CameraBuffer::offset(unsigned int plane) const \ +{ \ + return _d()->offset(plane); \ +} \ +unsigned int CameraBuffer::size(unsigned int plane) const \ +{ \ + return _d()->size(plane); \ +} \ size_t CameraBuffer::jpegBufferSize(size_t maxJpegBufferSize) const \ { \ return _d()->jpegBufferSize(maxJpegBufferSize); \ diff --git a/src/android/mm/cros_camera_buffer.cpp b/src/android/mm/cros_camera_buffer.cpp index 85ef6480..4ba24f79 100644 --- a/src/android/mm/cros_camera_buffer.cpp +++ b/src/android/mm/cros_camera_buffer.cpp @@ -31,6 +31,10 @@ public: Span plane(unsigned int plane); + unsigned int stride(unsigned int plane) const; + unsigned int offset(unsigned int plane) const; + unsigned int size(unsigned int plane) const; + size_t jpegBufferSize(size_t maxJpegBufferSize) const; private: @@ -112,6 +116,21 @@ Span CameraBuffer::Private::plane(unsigned int plane) bufferManager_->GetPlaneSize(handle_, plane) }; } +unsigned int CameraBuffer::Private::stride(unsigned int plane) const +{ + return cros::CameraBufferManager::GetPlaneStride(handle_, plane); +} + +unsigned int CameraBuffer::Private::offset(unsigned int plane) const +{ + return cros::CameraBufferManager::GetPlaneOffset(handle_, plane); +} + +unsigned int CameraBuffer::Private::size(unsigned int plane) const +{ + return cros::CameraBufferManager::GetPlaneSize(handle_, plane); +} + size_t CameraBuffer::Private::jpegBufferSize([[maybe_unused]] size_t maxJpegBufferSize) const { return bufferManager_->GetPlaneSize(handle_, 0); diff --git a/src/android/mm/generic_camera_buffer.cpp b/src/android/mm/generic_camera_buffer.cpp index 6c1e4611..b296b3e3 100644 --- a/src/android/mm/generic_camera_buffer.cpp +++ b/src/android/mm/generic_camera_buffer.cpp @@ -34,15 +34,24 @@ public: Span plane(unsigned int plane); + unsigned int stride(unsigned int plane) const; + unsigned int offset(unsigned int plane) const; + unsigned int size(unsigned int plane) const; + size_t jpegBufferSize(size_t maxJpegBufferSize) const; private: + struct PlaneInfo { + unsigned int stride; + unsigned int offset; + unsigned int size; + }; + bool Map(); int fd_; int flags_; - libcamera::Size size_; - libcamera::PixelFormatInfo info_; + std::vector planeInfo_; /* \todo remove planes_ is added to MappedBuffer. */ std::vector> planes_; }; @@ -51,7 +60,7 @@ CameraBuffer::Private::Private([[maybe_unused]] CameraBuffer *cameraBuffer, buffer_handle_t camera3Buffer, libcamera::PixelFormat pixelFormat, const libcamera::Size &size, int flags) - : fd_(-1), flags_(flags), size_(size) + : fd_(-1), flags_(flags) { error_ = 0; @@ -68,13 +77,29 @@ CameraBuffer::Private::Private([[maybe_unused]] CameraBuffer *cameraBuffer, return; } - info_ = libcamera::PixelFormatInfo::info(pixelFormat); - if (!info_.isValid()) { + const auto &info = libcamera::PixelFormatInfo::info(pixelFormat); + if (!info.isValid()) { error_ = EINVAL; LOG(HAL, Error) << "Invalid pixel format: " << pixelFormat.toString(); return; } + + const unsigned int numPlanes = info.numPlanes(); + planeInfo_.resize(numPlanes); + unsigned int offset = 0; + for (unsigned int i = 0; i < numPlanes; ++i) { + const unsigned int vertSubSample = info.planes[i].verticalSubSampling; + const unsigned int stride = info.stride(size.width, i, 1u); + const unsigned int planeSize = + stride * ((size.height + vertSubSample - 1) / vertSubSample); + + planeInfo_[i].stride = stride; + planeInfo_[i].offset = offset; + planeInfo_[i].size = planeSize; + + offset += planeSize; + } } CameraBuffer::Private::~Private() @@ -83,7 +108,7 @@ CameraBuffer::Private::~Private() unsigned int CameraBuffer::Private::numPlanes() const { - return info_.numPlanes(); + return planeInfo_.size(); } Span CameraBuffer::Private::plane(unsigned int plane) @@ -97,6 +122,30 @@ Span CameraBuffer::Private::plane(unsigned int plane) return planes_[plane]; } +unsigned int CameraBuffer::Private::stride(unsigned int plane) const +{ + if (plane >= planeInfo_.size()) + return 0; + + return planeInfo_[plane].stride; +} + +unsigned int CameraBuffer::Private::offset(unsigned int plane) const +{ + if (plane >= planeInfo_.size()) + return 0; + + return planeInfo_[plane].offset; +} + +unsigned int CameraBuffer::Private::size(unsigned int plane) const +{ + if (plane >= planeInfo_.size()) + return 0; + + return planeInfo_[plane].size; +} + size_t CameraBuffer::Private::jpegBufferSize(size_t maxJpegBufferSize) const { if (maps_.empty()) { @@ -129,19 +178,10 @@ bool CameraBuffer::Private::Map() } maps_.emplace_back(static_cast(address), bufferLength); - const unsigned int numPlanes = info_.numPlanes(); - planes_.resize(numPlanes); - unsigned int offset = 0; - for (unsigned int i = 0; i < numPlanes; ++i) { - const unsigned int vertSubSample = info_.planes[i].verticalSubSampling; - const unsigned int stride = info_.stride(size_.width, i, 1u); - const unsigned int planeSize = - stride * ((size_.height + vertSubSample - 1) / vertSubSample); - - planes_[i] = libcamera::Span( - static_cast(address) + offset, planeSize); - - offset += planeSize; + planes_.reserve(planeInfo_.size()); + for (const auto &info : planeInfo_) { + planes_.emplace_back( + static_cast(address) + info.offset, info.size); } return true;