From patchwork Sat Aug 14 05:09: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: 13354 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 CA764BD87D for ; Sat, 14 Aug 2021 05:09:27 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 9336368893; Sat, 14 Aug 2021 07:09:27 +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="j1rS+w5I"; 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 7E1CF6888E for ; Sat, 14 Aug 2021 07:09:26 +0200 (CEST) Received: from perceval.ideasonboard.com (unknown [103.251.226.70]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 134913E5; Sat, 14 Aug 2021 07:09:24 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1628917766; bh=JoNcnvdwVEiSedGCHNAd+WzYB/IjOD32QFkFP+zwSbk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=j1rS+w5ILIokWYwow9VpItPZ5/BAekXaC+ATa19IC7Lvd+y4KCJ/CmxnjQ7eCWx2h 8ax7pZQOJ0FOPXJiKk8JHvcIKqSwa80atkjnDY44QwhXi+fGf1+InAoHw4F9ofpQNH TJ9pa8NYPg2l14+Yd42xW+oPPyPBOV+GylHCG/a0= From: Umang Jain To: libcamera-devel@lists.libcamera.org Date: Sat, 14 Aug 2021 10:39:09 +0530 Message-Id: <20210814050912.15113-2-umang.jain@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210814050912.15113-1-umang.jain@ideasonboard.com> References: <20210814050912.15113-1-umang.jain@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 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 d4b041d3..4c92729d 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 Sat Aug 14 05:09:10 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Umang Jain X-Patchwork-Id: 13355 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 39059BD87D for ; Sat, 14 Aug 2021 05:09:30 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id E4DE86888D; Sat, 14 Aug 2021 07:09:29 +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="St6910U/"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id B56BA68892 for ; Sat, 14 Aug 2021 07:09:28 +0200 (CEST) Received: from perceval.ideasonboard.com (unknown [103.251.226.70]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 845D73E5; Sat, 14 Aug 2021 07:09:27 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1628917768; bh=Tee/KMPLGPgvgC9XUtav/PFtO0gUaBitMDk58DK+Kro=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=St6910U/cvVao4gCZXChDnPeGuOnVXLFc8197KZH1/UTeG9A/3dHvGqS9O+rjYcSS Qj27tusBTVBDxc5Nx3+GxVB/iD8bIPMV0r7W2E54Ud4GESFiS4yeM3EzICMAEWa//g ZtLXY0SqH0D+n3W7PvluxKnoYCQqri04+SD8IJVA= From: Umang Jain To: libcamera-devel@lists.libcamera.org Date: Sat, 14 Aug 2021 10:39:10 +0530 Message-Id: <20210814050912.15113-3-umang.jain@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210814050912.15113-1-umang.jain@ideasonboard.com> References: <20210814050912.15113-1-umang.jain@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 2/4] pipeline: vimc: Allocate mock IPA 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" VIMC is a virtual test driver that doesn't have statistics or parameters buffers that are typically passed from a pipeline handler to its platform IPA. To increase the test coverage going forward, we can atleast mimick the typical interaction of how a pipeline handler and IPA interacts, and use it to increase the test coverage. Hence, create simple (single plane) dmabuf-backed FrameBuffers, which can act as mock IPA buffers and can be memory mapped(mmap) to VIMC IPA. To create these buffers, temporarily hijack the output video node and configure it with a V4L2DeviceFormat. Buffers then can be exported from the output video node using V4L2VideoDevice::exportBuffers(). These buffers will be mimicked as IPA buffers in subsequent commits. Signed-off-by: Umang Jain Reviewed-by: Laurent Pinchart Reviewed-by: Paul Elder --- src/libcamera/pipeline/vimc/vimc.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp index 4c92729d..2dfa1418 100644 --- a/src/libcamera/pipeline/vimc/vimc.cpp +++ b/src/libcamera/pipeline/vimc/vimc.cpp @@ -50,6 +50,7 @@ public: } int init(); + int allocateMockIPABuffers(); void bufferReady(FrameBuffer *buffer); MediaDevice *media_; @@ -61,6 +62,7 @@ public: Stream stream_; std::unique_ptr ipa_; + std::vector> mockIPABufs_; }; class VimcCameraConfiguration : public CameraConfiguration @@ -500,6 +502,12 @@ int VimcCameraData::init() if (raw_->open()) return -ENODEV; + ret = allocateMockIPABuffers(); + if (!ret) { + LOG(VIMC, Warning) << "Cannot allocate mock IPA buffers"; + return ret; + } + /* Initialise the supported controls. */ const ControlInfoMap &controls = sensor_->controls(); ControlInfoMap::Map ctrls; @@ -548,6 +556,21 @@ void VimcCameraData::bufferReady(FrameBuffer *buffer) pipe_->completeRequest(request); } +int VimcCameraData::allocateMockIPABuffers() +{ + constexpr unsigned int kBufCount = 2; + + V4L2DeviceFormat format; + format.fourcc = video_->toV4L2PixelFormat(formats::BGR888); + format.size = Size (160, 120); + + int ret = video_->setFormat(&format); + if (ret < 0) + return ret; + + return video_->exportBuffers(kBufCount, &mockIPABufs_); +} + REGISTER_PIPELINE_HANDLER(PipelineHandlerVimc) } /* namespace libcamera */ From patchwork Sat Aug 14 05:09:11 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Umang Jain X-Patchwork-Id: 13356 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 8B787BD87D for ; Sat, 14 Aug 2021 05:09:32 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 43C5A68893; Sat, 14 Aug 2021 07:09:32 +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="rfBq1epA"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id A802968891 for ; Sat, 14 Aug 2021 07:09:30 +0200 (CEST) Received: from perceval.ideasonboard.com (unknown [103.251.226.70]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id A7A623E5; Sat, 14 Aug 2021 07:09:29 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1628917770; bh=oQ1q0UJSctsG617etS52rZEGQn1xPZrsfidpYHZoOlE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=rfBq1epAbxzbFkW6ze4NTlOepOttAjx5twXesjbChHwU7woZKfxnoZ64nnSyjp158 9HDPkKVobMpRF9crB7QlsSE4u1JEDVj1zBKLVRyehVm2vapib9KchMV8AxiSx5o4QO fxSYQLTCrxbS6LGrO9zfmO1+J5nvN+CX6BLER7WE= From: Umang Jain To: libcamera-devel@lists.libcamera.org Date: Sat, 14 Aug 2021 10:39:11 +0530 Message-Id: <20210814050912.15113-4-umang.jain@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210814050912.15113-1-umang.jain@ideasonboard.com> References: <20210814050912.15113-1-umang.jain@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 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" VIMC pipeline handler have dmabuf-backed mock FrameBuffers which are specifically targetted mimicking IPA buffers (parameter and statistics). Map these mock buffers to the VIMC IPA that would enable exercising IPA IPC code paths. This will provide leverage to our test suite to test IPA IPC code paths, which are common to various platforms. Signed-off-by: Umang Jain Reviewed-by: Paul Elder Reviewed-by: Laurent Pinchart --- include/libcamera/ipa/vimc.mojom | 3 +++ src/ipa/vimc/vimc.cpp | 27 +++++++++++++++++++++++++++ src/libcamera/pipeline/vimc/vimc.cpp | 15 +++++++++++++++ 3 files changed, 45 insertions(+) diff --git a/include/libcamera/ipa/vimc.mojom b/include/libcamera/ipa/vimc.mojom index ee66353d..8cb240d3 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 fb134084..7d9d22d0 100644 --- a/src/ipa/vimc/vimc.cpp +++ b/src/ipa/vimc/vimc.cpp @@ -19,6 +19,8 @@ #include #include +#include "libcamera/internal/mapped_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::IPAOperationCode operation); int fd_; + std::map buffers_; }; IPAVimc::IPAVimc() @@ -99,6 +105,27 @@ 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(std::piecewise_construct, + std::forward_as_tuple(buffer.id), + std::forward_as_tuple(&fb, MappedFrameBuffer::MapFlag::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 2dfa1418..b08325c2 100644 --- a/src/libcamera/pipeline/vimc/vimc.cpp +++ b/src/libcamera/pipeline/vimc/vimc.cpp @@ -334,6 +334,15 @@ int PipelineHandlerVimc::start(Camera *camera, [[maybe_unused]] const ControlLis if (ret < 0) return ret; + /* Map the mock IPA buffers to VIMC IPA to exercise IPC code paths */ + unsigned int ipaBufferId = 1; + std::vector ipaBuffers; + for (auto [i, buffer] : utils::enumerate(data->mockIPABufs_)) { + buffer->setCookie(ipaBufferId++); + ipaBuffers.emplace_back(buffer->cookie(), buffer->planes()); + } + data->ipa_->mapBuffers(ipaBuffers); + ret = data->ipa_->start(); if (ret) { data->video_->releaseBuffers(); @@ -354,7 +363,13 @@ void PipelineHandlerVimc::stop(Camera *camera) { VimcCameraData *data = cameraData(camera); data->video_->streamOff(); + + std::vector ids; + for (const std::unique_ptr &buffer : data->mockIPABufs_) + ids.push_back(buffer->cookie()); + data->ipa_->unmapBuffers(ids); data->ipa_->stop(); + data->video_->releaseBuffers(); } From patchwork Sat Aug 14 05:09:12 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Umang Jain X-Patchwork-Id: 13357 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 2FDBCBD87D for ; Sat, 14 Aug 2021 05:09:34 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id D7C94688AC; Sat, 14 Aug 2021 07:09: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="G/E/jePa"; 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 869226888F for ; Sat, 14 Aug 2021 07:09:32 +0200 (CEST) Received: from perceval.ideasonboard.com (unknown [103.251.226.70]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 819703E5; Sat, 14 Aug 2021 07:09:31 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1628917772; bh=AMLZ++qxWAAmoYlo4B72a1dsoQXNL0ulAKNwTio/+xI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=G/E/jePaQed2aNCjlqT3tg5QRQus/7+cpD1eXBDrFaJMMxafppxgzlHq9wGXUfoND UvktPn+gRRcR/Bw48vMMBmbI9BepIXdI33ksmIG77uNB8dsBDuk8rEX1q7hlw8k4Qs XRLH/Ai2lvmqJKhkJAqN550aOHGWym1T//q5puFs= From: Umang Jain To: libcamera-devel@lists.libcamera.org Date: Sat, 14 Aug 2021 10:39:12 +0530 Message-Id: <20210814050912.15113-5-umang.jain@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210814050912.15113-1-umang.jain@ideasonboard.com> References: <20210814050912.15113-1-umang.jain@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 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 VIMC mojo interface to enable buffers passing. VIMC does not have parameters or statistics buffers but we can mimick the typical case of passing IPA buffers from pipeline handler to IPA using mock buffers. The mock IPA buffers are FrameBuffers which are dmabuf backed (in other words, mmap()able through MappedFramebuffer inside the IPA). This commits shows: - Passing the parameter buffer from the pipeline handler to the IPA through functions defined in mojom interface. - Passing request controls ControlList to the IPA. Any tests using VIMC will now loop in the IPA paths. Any tests running in isolated mode will help us to test IPA IPC code paths especially around (de)serialization of data passing from pipeline handlers to the IPA. Future IPA interface tests can simply extend the vimc mojom interface to achieve/test a specific use case as required. Signed-off-by: Umang Jain Reviewed-by: Paul Elder Reviewed-by: Laurent Pinchart --- include/libcamera/ipa/vimc.mojom | 11 ++++++++++- src/ipa/vimc/vimc.cpp | 19 +++++++++++++++++++ src/libcamera/pipeline/vimc/vimc.cpp | 11 +++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/include/libcamera/ipa/vimc.mojom b/include/libcamera/ipa/vimc.mojom index 8cb240d3..e3b14e38 100644 --- a/include/libcamera/ipa/vimc.mojom +++ b/include/libcamera/ipa/vimc.mojom @@ -29,8 +29,17 @@ interface IPAVimcInterface { mapBuffers(array buffers); unmapBuffers(array ids); + + /* + * The vimc driver doesn't use parameters buffers. To maximize coverage + * of unit tests that rely on the VIMC pipeline handler, we still define + * interface functions that mimick how other pipeline handlers typically + * handle parameters at runtime. + */ + [async] fillParams(uint32 frame, uint32 bufferId); + [async] processControls(uint32 frame, libcamera.ControlList controls); }; interface IPAVimcEventInterface { - dummyEvent(uint32 val); + paramsFilled(uint32 bufferId); }; diff --git a/src/ipa/vimc/vimc.cpp b/src/ipa/vimc/vimc.cpp index 7d9d22d0..8481b82b 100644 --- a/src/ipa/vimc/vimc.cpp +++ b/src/ipa/vimc/vimc.cpp @@ -43,6 +43,9 @@ public: void mapBuffers(const std::vector &buffers) override; void unmapBuffers(const std::vector &ids) override; + void fillParams(uint32_t frame, uint32_t bufferId) override; + void processControls(uint32_t frame, const ControlList &controls) override; + private: void initTrace(); void trace(enum ipa::vimc::IPAOperationCode operation); @@ -126,6 +129,22 @@ void IPAVimc::unmapBuffers(const std::vector &ids) } } +void IPAVimc::fillParams([[maybe_unused]] uint32_t frame, uint32_t bufferId) +{ + auto it = buffers_.find(bufferId); + if (it == buffers_.end()) { + LOG(IPAVimc, Error) << "Could not find parameter buffer"; + return; + } + + paramsFilled.emit(bufferId); +} + +void IPAVimc::processControls([[maybe_unused]] uint32_t frame, + [[maybe_unused]] const ControlList &controls) +{ +} + void IPAVimc::initTrace() { struct stat fifoStat; diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp index b08325c2..b9fa6227 100644 --- a/src/libcamera/pipeline/vimc/vimc.cpp +++ b/src/libcamera/pipeline/vimc/vimc.cpp @@ -52,6 +52,7 @@ public: int init(); int allocateMockIPABuffers(); void bufferReady(FrameBuffer *buffer); + void paramsFilled(unsigned int id); MediaDevice *media_; std::unique_ptr sensor_; @@ -432,6 +433,8 @@ int PipelineHandlerVimc::queueRequestDevice(Camera *camera, Request *request) if (ret < 0) return ret; + data->ipa_->processControls(request->sequence(), request->controls()); + return 0; } @@ -465,6 +468,8 @@ bool PipelineHandlerVimc::match(DeviceEnumerator *enumerator) return false; } + data->ipa_->paramsFilled.connect(data.get(), &VimcCameraData::paramsFilled); + std::string conf = data->ipa_->configurationFile("vimc.conf"); data->ipa_->init(IPASettings{ conf, data->sensor_->model() }); @@ -569,6 +574,8 @@ void VimcCameraData::bufferReady(FrameBuffer *buffer) pipe_->completeBuffer(request, buffer); pipe_->completeRequest(request); + + ipa_->fillParams(request->sequence(), mockIPABufs_[0]->cookie()); } int VimcCameraData::allocateMockIPABuffers() @@ -586,6 +593,10 @@ int VimcCameraData::allocateMockIPABuffers() return video_->exportBuffers(kBufCount, &mockIPABufs_); } +void VimcCameraData::paramsFilled([[maybe_unused]] unsigned int id) +{ +} + REGISTER_PIPELINE_HANDLER(PipelineHandlerVimc) } /* namespace libcamera */