From patchwork Fri Aug 6 10:14:06 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Umang Jain X-Patchwork-Id: 13243 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 268CDC3238 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 1F39A68822; Fri, 6 Aug 2021 12:14:31 +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="HkDWSZFV"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 9A41660266 for ; Fri, 6 Aug 2021 12:14:29 +0200 (CEST) Received: from perceval.ideasonboard.com (unknown [103.251.226.40]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 374554FB; Fri, 6 Aug 2021 12:14:28 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1628244869; bh=LOlEihKVREYgw4BspzaqXfUVGW13itfafNyQhNRqtq4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=HkDWSZFVenok9mWRkMkh/pgyqneUXjh19C5wzuJaExZe1MqUkvOf1k3keMa7hCWla jWr7ClCSZb/lAHHm0FzJzg8Ir/htKkwmAFV4sR4pGs0YMBwd2THVPyV6fcnfH/9VXB gYpnHRf/SRtA6TWUPsiqL8P7+97sDYc9h8Yy545Y= From: Umang Jain To: libcamera-devel@lists.libcamera.org Date: Fri, 6 Aug 2021 15:44:06 +0530 Message-Id: <20210806101409.324645-2-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 1/4] ipa: vimc: Add configure() 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" From: Laurent Pinchart As part of an effort to make the vimc IPA usable for testing, extend it with a configure function. The configuration is currently ignored by the IPA. Signed-off-by: Laurent Pinchart Reviewed-by: Paul Elder Reviewed-by: Umang Jain Signed-off-by: Umang Jain --- include/libcamera/ipa/vimc.mojom | 5 +++++ src/ipa/vimc/vimc.cpp | 13 +++++++++++++ src/libcamera/pipeline/vimc/vimc.cpp | 16 ++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/include/libcamera/ipa/vimc.mojom b/include/libcamera/ipa/vimc.mojom index 86bc318a..ee66353d 100644 --- a/include/libcamera/ipa/vimc.mojom +++ b/include/libcamera/ipa/vimc.mojom @@ -19,6 +19,11 @@ enum IPAOperationCode { interface IPAVimcInterface { init(libcamera.IPASettings settings) => (int32 ret); + + configure(libcamera.IPACameraSensorInfo sensorInfo, + map streamConfig, + map entityControls) => (int32 ret); + start() => (int32 ret); stop(); }; diff --git a/src/ipa/vimc/vimc.cpp b/src/ipa/vimc/vimc.cpp index 0c0ee006..fb134084 100644 --- a/src/ipa/vimc/vimc.cpp +++ b/src/ipa/vimc/vimc.cpp @@ -34,6 +34,10 @@ public: int start() override; void stop() override; + int configure(const IPACameraSensorInfo &sensorInfo, + const std::map &streamConfig, + const std::map &entityControls) override; + private: void initTrace(); void trace(enum ipa::vimc::IPAOperationCode operation); @@ -86,6 +90,15 @@ void IPAVimc::stop() LOG(IPAVimc, Debug) << "stop vimc IPA!"; } +int IPAVimc::configure([[maybe_unused]] const IPACameraSensorInfo &sensorInfo, + [[maybe_unused]] const std::map &streamConfig, + [[maybe_unused]] const std::map &entityControls) +{ + LOG(IPAVimc, Debug) << "configure()"; + + return 0; +} + void IPAVimc::initTrace() { struct stat fifoStat; diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp index 12f7517f..b7dd6595 100644 --- a/src/libcamera/pipeline/vimc/vimc.cpp +++ b/src/libcamera/pipeline/vimc/vimc.cpp @@ -295,6 +295,22 @@ int PipelineHandlerVimc::configure(Camera *camera, CameraConfiguration *config) cfg.setStream(&data->stream_); + if (data->ipa_) { + /* Inform IPA of stream configuration and sensor controls. */ + std::map streamConfig; + streamConfig.emplace(std::piecewise_construct, + std::forward_as_tuple(0), + std::forward_as_tuple(cfg.pixelFormat, cfg.size)); + + std::map entityControls; + entityControls.emplace(0, data->sensor_->controls()); + + IPACameraSensorInfo sensorInfo; + data->sensor_->sensorInfo(&sensorInfo); + + data->ipa_->configure(sensorInfo, streamConfig, entityControls); + } + return 0; } From patchwork Fri Aug 6 10:14:07 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Umang Jain X-Patchwork-Id: 13245 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 69871C3239 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 7A7916881B; Fri, 6 Aug 2021 12:14:33 +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="sZN8/z2w"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 7FD4860266 for ; Fri, 6 Aug 2021 12:14:32 +0200 (CEST) Received: from perceval.ideasonboard.com (unknown [103.251.226.40]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 55D3F4FB; Fri, 6 Aug 2021 12:14:31 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1628244872; bh=5u1cOL82emyi+LHxG+VQn5VpjZKhwzSK2TY8pTTSc6s=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=sZN8/z2wLXm7sSTTznKVH2i1N4jEGe+0gx0lNiCCmTfgx4QTma2HdRw9QtYMwtO35 LinhWi01rau02ufVm3AbIcpzk8sXnRbXQ+7bwDilD+TmEtvYUON7yZ0zb7ZYhW6PlR N2dIk1DSrDrMDov6Edacm/l49guKlLX1sasrdtbI= From: Umang Jain To: libcamera-devel@lists.libcamera.org Date: Fri, 6 Aug 2021 15:44:07 +0530 Message-Id: <20210806101409.324645-3-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 2/4] ipa: vimc: Rename IPA trace enums 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" To avoid the conflict of naming with IPAOperations in future, rename trace enum to IPATrace*. This commit does not introduce any functional changes. Signed-off-by: Umang Jain --- include/libcamera/ipa/vimc.mojom | 10 +++++----- src/ipa/vimc/vimc.cpp | 10 +++++----- test/ipa/ipa_interface_test.cpp | 18 +++++++++--------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/include/libcamera/ipa/vimc.mojom b/include/libcamera/ipa/vimc.mojom index ee66353d..99b6412b 100644 --- a/include/libcamera/ipa/vimc.mojom +++ b/include/libcamera/ipa/vimc.mojom @@ -10,11 +10,11 @@ import "include/libcamera/ipa/core.mojom"; const string VimcIPAFIFOPath = "/tmp/libcamera_ipa_vimc_fifo"; -enum IPAOperationCode { - IPAOperationNone, - IPAOperationInit, - IPAOperationStart, - IPAOperationStop, +enum IPATraceCode { + IPATraceNone, + IPATraceInit, + IPATraceStart, + IPATraceStop, }; interface IPAVimcInterface { diff --git a/src/ipa/vimc/vimc.cpp b/src/ipa/vimc/vimc.cpp index fb134084..54d9086a 100644 --- a/src/ipa/vimc/vimc.cpp +++ b/src/ipa/vimc/vimc.cpp @@ -40,7 +40,7 @@ public: private: void initTrace(); - void trace(enum ipa::vimc::IPAOperationCode operation); + void trace(enum ipa::vimc::IPATraceCode operation); int fd_; }; @@ -59,7 +59,7 @@ IPAVimc::~IPAVimc() int IPAVimc::init(const IPASettings &settings) { - trace(ipa::vimc::IPAOperationInit); + trace(ipa::vimc::IPATraceInit); LOG(IPAVimc, Debug) << "initializing vimc IPA with configuration file " @@ -76,7 +76,7 @@ int IPAVimc::init(const IPASettings &settings) int IPAVimc::start() { - trace(ipa::vimc::IPAOperationStart); + trace(ipa::vimc::IPATraceStart); LOG(IPAVimc, Debug) << "start vimc IPA!"; @@ -85,7 +85,7 @@ int IPAVimc::start() void IPAVimc::stop() { - trace(ipa::vimc::IPAOperationStop); + trace(ipa::vimc::IPATraceStop); LOG(IPAVimc, Debug) << "stop vimc IPA!"; } @@ -117,7 +117,7 @@ void IPAVimc::initTrace() fd_ = ret; } -void IPAVimc::trace(enum ipa::vimc::IPAOperationCode operation) +void IPAVimc::trace(enum ipa::vimc::IPATraceCode operation) { if (fd_ < 0) return; diff --git a/test/ipa/ipa_interface_test.cpp b/test/ipa/ipa_interface_test.cpp index ee9f2651..2f30b26a 100644 --- a/test/ipa/ipa_interface_test.cpp +++ b/test/ipa/ipa_interface_test.cpp @@ -34,7 +34,7 @@ class IPAInterfaceTest : public Test, public Object { public: IPAInterfaceTest() - : trace_(ipa::vimc::IPAOperationNone), notifier_(nullptr), fd_(-1) + : trace_(ipa::vimc::IPATraceNone), notifier_(nullptr), fd_(-1) { } @@ -112,10 +112,10 @@ protected: } timer.start(1000); - while (timer.isRunning() && trace_ != ipa::vimc::IPAOperationInit) + while (timer.isRunning() && trace_ != ipa::vimc::IPATraceInit) dispatcher->processEvents(); - if (trace_ != ipa::vimc::IPAOperationInit) { + if (trace_ != ipa::vimc::IPATraceInit) { cerr << "Failed to test IPA initialization sequence" << endl; return TestFail; @@ -124,10 +124,10 @@ protected: /* Test start of IPA module. */ ipa_->start(); timer.start(1000); - while (timer.isRunning() && trace_ != ipa::vimc::IPAOperationStart) + while (timer.isRunning() && trace_ != ipa::vimc::IPATraceStart) dispatcher->processEvents(); - if (trace_ != ipa::vimc::IPAOperationStart) { + if (trace_ != ipa::vimc::IPATraceStart) { cerr << "Failed to test IPA start sequence" << endl; return TestFail; } @@ -135,10 +135,10 @@ protected: /* Test stop of IPA module. */ ipa_->stop(); timer.start(1000); - while (timer.isRunning() && trace_ != ipa::vimc::IPAOperationStop) + while (timer.isRunning() && trace_ != ipa::vimc::IPATraceStop) dispatcher->processEvents(); - if (trace_ != ipa::vimc::IPAOperationStop) { + if (trace_ != ipa::vimc::IPATraceStop) { cerr << "Failed to test IPA stop sequence" << endl; return TestFail; } @@ -161,7 +161,7 @@ private: cerr << "Failed to read from IPA test FIFO at '" << ipa::vimc::VimcIPAFIFOPath << "': " << strerror(ret) << endl; - trace_ = ipa::vimc::IPAOperationNone; + trace_ = ipa::vimc::IPATraceNone; } } @@ -170,7 +170,7 @@ private: std::shared_ptr pipe_; std::unique_ptr ipa_; std::unique_ptr ipaManager_; - enum ipa::vimc::IPAOperationCode trace_; + enum ipa::vimc::IPATraceCode trace_; EventNotifier *notifier_; int fd_; }; 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(); } From patchwork Fri Aug 6 10:14:09 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Umang Jain X-Patchwork-Id: 13247 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 9C9BAC323B 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 2EC7A6884F; Fri, 6 Aug 2021 12:14:38 +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="Inl9iKrK"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id C409868811 for ; Fri, 6 Aug 2021 12:14:36 +0200 (CEST) Received: from perceval.ideasonboard.com (unknown [103.251.226.40]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 9A25EDFA; Fri, 6 Aug 2021 12:14:35 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1628244876; bh=1Jfde0KjsGzWfgxecrTZKjNvFdbRyw3tqfwXITxibjg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Inl9iKrK0zm2LQGz/6Sm6qOI/p5nVn8tW5FDA2+w8J+MbYoK3avsWReqz0Yqh9zMY XuYibJd5oR3zr4ZfMAh2wP+D3pS5Jttn7MPtaOsjVwsn8/vSJ88ID/X+UnQsTfGgCY kBt9AOgyhI8sFnPH/hbzcKiRYx9UTlwRimbumYns= From: Umang Jain To: libcamera-devel@lists.libcamera.org Date: Fri, 6 Aug 2021 15:44:09 +0530 Message-Id: <20210806101409.324645-5-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 4/4] ipa: vimc: Send and retrieve FrameBuffers from IPA 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" Plumb through actions and events in the VIMC mojo interface. Events are send from pipeline handler to IPA and actions can be emitted from IPA and handled in the pipeline handler. The plumbing ensures that, we can send/retrieve FrameBuffers from the vimc IPA. Signed-off-by: Umang Jain --- include/libcamera/ipa/vimc.mojom | 23 ++++++++++++++- src/ipa/vimc/vimc.cpp | 42 +++++++++++++++++++++++++++- src/libcamera/pipeline/vimc/vimc.cpp | 27 ++++++++++++++++++ 3 files changed, 90 insertions(+), 2 deletions(-) diff --git a/include/libcamera/ipa/vimc.mojom b/include/libcamera/ipa/vimc.mojom index 8452461d..85a87227 100644 --- a/include/libcamera/ipa/vimc.mojom +++ b/include/libcamera/ipa/vimc.mojom @@ -17,6 +17,25 @@ enum IPATraceCode { IPATraceStop, }; +enum VimcOperations { + ActionParamFilled = 1, + EventFillParams = 2, + EventProcessControls = 3, +}; + +struct VimcEvent { + VimcOperations op; + uint32 frame; + int64 frameTimestamp; + uint32 bufferId; + libcamera.ControlList controls; +}; + +struct VimcAction { + VimcOperations op; + libcamera.ControlList controls; +}; + interface IPAVimcInterface { init(libcamera.IPASettings settings) => (int32 ret); @@ -29,8 +48,10 @@ interface IPAVimcInterface { mapBuffers(array buffers); unmapBuffers(array ids); + + [async] processEvent(VimcEvent ev); }; interface IPAVimcEventInterface { - dummyEvent(uint32 val); + queueFrameAction(uint32 frame, VimcAction action); }; diff --git a/src/ipa/vimc/vimc.cpp b/src/ipa/vimc/vimc.cpp index 2b00687f..784d7993 100644 --- a/src/ipa/vimc/vimc.cpp +++ b/src/ipa/vimc/vimc.cpp @@ -25,6 +25,8 @@ namespace libcamera { LOG_DEFINE_CATEGORY(IPAVimc) +namespace ipa::vimc { + class IPAVimc : public ipa::vimc::IPAVimcInterface { public: @@ -43,7 +45,11 @@ public: void mapBuffers(const std::vector &buffers) override; void unmapBuffers(const std::vector &ids) override; + void processEvent(const VimcEvent &event) override; + private: + void processControls(unsigned int frame, const ControlList &controls); + void initTrace(); void trace(enum ipa::vimc::IPATraceCode operation); @@ -125,6 +131,38 @@ void IPAVimc::unmapBuffers(const std::vector &ids) } } +void IPAVimc::processControls([[maybe_unused]] unsigned int frame, + [[maybe_unused]] const ControlList &controls) +{ + /* \todo Start processing for 'frame' based on 'controls'. */ +} + +void IPAVimc::processEvent(const VimcEvent &event) +{ + switch (event.op) { + case EventFillParams: { + auto it = buffers_.find(event.bufferId); + if (it == buffers_.end()) { + LOG(IPAVimc, Error) << "Could not find param buffer!"; + return; + } + + /* \todo Fill parameters with actual parameter buffer */ + VimcAction op; + op.op = ActionParamFilled; + queueFrameAction.emit(event.frame, op); + break; + } + case EventProcessControls: { + processControls(event.frame, event.controls); + break; + } + default: + LOG(IPAVimc, Error) << "Unknown event " << event.op; + break; + } +} + void IPAVimc::initTrace() { struct stat fifoStat; @@ -156,6 +194,8 @@ void IPAVimc::trace(enum ipa::vimc::IPATraceCode operation) } } +} /* namespace ipa::vimc */ + /* * External IPA module interface */ @@ -170,7 +210,7 @@ const struct IPAModuleInfo ipaModuleInfo = { IPAInterface *ipaCreate() { - return new IPAVimc(); + return new ipa::vimc::IPAVimc(); } } diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp index fa21128d..4b7a542d 100644 --- a/src/libcamera/pipeline/vimc/vimc.cpp +++ b/src/libcamera/pipeline/vimc/vimc.cpp @@ -51,6 +51,8 @@ public: int init(); void bufferReady(FrameBuffer *buffer); + void queueFrameAction(unsigned int id, + const ipa::vimc::VimcAction &action); MediaDevice *media_; std::unique_ptr sensor_; @@ -438,6 +440,12 @@ int PipelineHandlerVimc::queueRequestDevice(Camera *camera, Request *request) if (ret < 0) return ret; + ipa::vimc::VimcEvent ev; + ev.op = ipa::vimc::EventProcessControls; + ev.frame = request->sequence(); + ev.controls = request->controls(); + data->ipa_->processEvent(ev); + return 0; } @@ -471,6 +479,8 @@ bool PipelineHandlerVimc::match(DeviceEnumerator *enumerator) return false; } + data->ipa_->queueFrameAction.connect(data.get(), &VimcCameraData::queueFrameAction); + std::string conf = data->ipa_->configurationFile("vimc.conf"); data->ipa_->init(IPASettings{ conf, data->sensor_->model() }); @@ -569,6 +579,23 @@ void VimcCameraData::bufferReady(FrameBuffer *buffer) pipe_->completeBuffer(request, buffer); pipe_->completeRequest(request); + + ipa::vimc::VimcEvent ev; + ev.op = ipa::vimc::EventFillParams; + ev.frame = request->sequence(); + ev.bufferId = buffer->cookie(); + ipa_->processEvent(ev); +} + +void VimcCameraData::queueFrameAction([[maybe_unused]] unsigned int id, + const ipa::vimc::VimcAction &action) +{ + switch (action.op) { + case ipa::vimc::ActionParamFilled: + break; + default: + LOG(VIMC, Error) << "unknown action: " << action.op; + } } REGISTER_PIPELINE_HANDLER(PipelineHandlerVimc)