From patchwork Fri Aug 6 10:14:08 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Umang Jain X-Patchwork-Id: 13246 X-Patchwork-Delegate: umang.jain@ideasonboard.com 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 6AB56C323A for ; Fri, 6 Aug 2021 10:14:51 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id D1EF668826; Fri, 6 Aug 2021 12:14:35 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="Ffk9HvGS"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 85DC360266 for ; Fri, 6 Aug 2021 12:14:34 +0200 (CEST) Received: from perceval.ideasonboard.com (unknown [103.251.226.40]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 870B84FB; Fri, 6 Aug 2021 12:14:33 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1628244874; bh=t9tLZf42sBKWVBp70IKnG24J8T093wLPKnhI8PXi1NM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Ffk9HvGSGT/5zc4oj0K1DN/A0Jt4DLv7581LV+fJwuTSl2E+KLpWdyZcPR8Ircglu 4fSyk9c4l6uu7jB9R0yV+LL33jNZbKtlaa5VAH1lejTKyvNyaTHvdb8G0Iigjg5fQ8 4sw7UdcrWUsQQ2e9qEO5FTec0azQ3FnL5WbzD4RI= From: Umang Jain To: libcamera-devel@lists.libcamera.org Date: Fri, 6 Aug 2021 15:44:08 +0530 Message-Id: <20210806101409.324645-4-umang.jain@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210806101409.324645-1-umang.jain@ideasonboard.com> References: <20210806101409.324645-1-umang.jain@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 3/4] ipa: vimc: Map and unmap buffers 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" Since VIMC is a virtual test driver, the support for IPA buffers(parameter and statistics) is missing. We could create our own and pass it around, but created buffers needs to be backed by dmabuf file-descriptors ideally. This might prove cubersome given that we use vimc for test purposes. Hence, pass actual frame data buffers into the IPA instead, which would result in exercising these code paths for now. Introduce plumbing support for mapping and un-mapping of these buffers into the IPA. Signed-off-by: Umang Jain --- include/libcamera/ipa/vimc.mojom | 3 +++ src/ipa/vimc/vimc.cpp | 26 ++++++++++++++++++++++++++ src/libcamera/pipeline/vimc/vimc.cpp | 25 ++++++++++++++++++++++++- 3 files changed, 53 insertions(+), 1 deletion(-) diff --git a/include/libcamera/ipa/vimc.mojom b/include/libcamera/ipa/vimc.mojom index 99b6412b..8452461d 100644 --- a/include/libcamera/ipa/vimc.mojom +++ b/include/libcamera/ipa/vimc.mojom @@ -26,6 +26,9 @@ interface IPAVimcInterface { start() => (int32 ret); stop(); + + mapBuffers(array buffers); + unmapBuffers(array ids); }; interface IPAVimcEventInterface { diff --git a/src/ipa/vimc/vimc.cpp b/src/ipa/vimc/vimc.cpp index 54d9086a..2b00687f 100644 --- a/src/ipa/vimc/vimc.cpp +++ b/src/ipa/vimc/vimc.cpp @@ -19,6 +19,8 @@ #include #include +#include "libcamera/internal/framebuffer.h" + namespace libcamera { LOG_DEFINE_CATEGORY(IPAVimc) @@ -38,11 +40,15 @@ public: const std::map &streamConfig, const std::map &entityControls) override; + void mapBuffers(const std::vector &buffers) override; + void unmapBuffers(const std::vector &ids) override; + private: void initTrace(); void trace(enum ipa::vimc::IPATraceCode operation); int fd_; + std::map buffers_; }; IPAVimc::IPAVimc() @@ -99,6 +105,26 @@ int IPAVimc::configure([[maybe_unused]] const IPACameraSensorInfo &sensorInfo, return 0; } +void IPAVimc::mapBuffers(const std::vector &buffers) +{ + for (const IPABuffer &buffer : buffers) { + const FrameBuffer fb(buffer.planes); + buffers_.emplace(buffer.id, + MappedFrameBuffer(&fb, PROT_READ)); + } +} + +void IPAVimc::unmapBuffers(const std::vector &ids) +{ + for (unsigned int id : ids) { + auto it = buffers_.find(id); + if (it == buffers_.end()) + continue; + + buffers_.erase(it); + } +} + void IPAVimc::initTrace() { struct stat fifoStat; diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp index b7dd6595..fa21128d 100644 --- a/src/libcamera/pipeline/vimc/vimc.cpp +++ b/src/libcamera/pipeline/vimc/vimc.cpp @@ -45,7 +45,7 @@ class VimcCameraData : public CameraData { public: VimcCameraData(PipelineHandler *pipe, MediaDevice *media) - : CameraData(pipe), media_(media) + : CameraData(pipe), media_(media), buffers_(nullptr) { } @@ -61,6 +61,9 @@ public: Stream stream_; std::unique_ptr ipa_; + + std::vector> *buffers_; + std::vector ipaBuffers_; }; class VimcCameraConfiguration : public CameraConfiguration @@ -319,6 +322,7 @@ int PipelineHandlerVimc::exportFrameBuffers(Camera *camera, Stream *stream, { VimcCameraData *data = cameraData(camera); unsigned int count = stream->configuration().bufferCount; + data->buffers_ = buffers; return data->video_->exportBuffers(count, buffers); } @@ -332,6 +336,19 @@ int PipelineHandlerVimc::start(Camera *camera, [[maybe_unused]] const ControlLis if (ret < 0) return ret; + /* + * We don't have actual parameters/statistics buffers in VIMC. + * Hence, map frame buffers to exercise IPA IPC code paths for now. + */ + ASSERT(data->buffers_ != nullptr); + unsigned int ipaBufferId = 1; + for (unsigned int i = 0; i< count; i++) { + std::unique_ptr &buffer = data->buffers_->at(i); + buffer->setCookie(ipaBufferId++); + data->ipaBuffers_.emplace_back(buffer->cookie(), buffer->planes()); + } + data->ipa_->mapBuffers(data->ipaBuffers_); + ret = data->ipa_->start(); if (ret) { data->video_->releaseBuffers(); @@ -352,7 +369,13 @@ void PipelineHandlerVimc::stop(Camera *camera) { VimcCameraData *data = cameraData(camera); data->video_->streamOff(); + + std::vector ids; + for (IPABuffer &ipabuf : data->ipaBuffers_) + ids.push_back(ipabuf.id); + data->ipa_->unmapBuffers(ids); data->ipa_->stop(); + data->video_->releaseBuffers(); }