From patchwork Fri Aug 13 14:44:34 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Umang Jain X-Patchwork-Id: 13348 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 3935EC3240 for ; Fri, 13 Aug 2021 14:44:53 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id E9FE46888D; Fri, 13 Aug 2021 16:44:52 +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="k3I70VA0"; 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 3A2826888E for ; Fri, 13 Aug 2021 16:44:51 +0200 (CEST) Received: from perceval.ideasonboard.com (unknown [103.251.226.198]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 0EEAA8F; Fri, 13 Aug 2021 16:44:49 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1628865891; bh=HLQ7GbNZwUuE9gOFwPCWTUWmAoK0N0HMMjiD9s1i3Po=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=k3I70VA0PtX2eRHUVshvpJNS9cjnNYze4LDzSMuZzwFLB81IdUqAjkZPdS0zi24um D2o5k1tLtlqVtLq9qElCXgxuJHPs5n91EXrjxN53ampYFVpOb8gUwp40C7viYyJ1mN kzlsag295XzlSERwZIWmQZHXUdawE8oosaSptCzI= From: Umang Jain To: libcamera-devel@lists.libcamera.org Date: Fri, 13 Aug 2021 20:14:34 +0530 Message-Id: <20210813144437.138005-2-umang.jain@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210813144437.138005-1-umang.jain@ideasonboard.com> References: <20210813144437.138005-1-umang.jain@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 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..0535c740 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 Fri Aug 13 14:44:35 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Umang Jain X-Patchwork-Id: 13349 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 92956C3240 for ; Fri, 13 Aug 2021 14:44:54 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 4780968894; Fri, 13 Aug 2021 16:44:54 +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="vWc2ehVA"; 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 524A16888E for ; Fri, 13 Aug 2021 16:44:53 +0200 (CEST) Received: from perceval.ideasonboard.com (unknown [103.251.226.198]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 4DBE98F; Fri, 13 Aug 2021 16:44:52 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1628865893; bh=COa/xVRCb6EE1//4yL1JTNYhp9JCqMFcyyhVF66h1zI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=vWc2ehVAJGb0JIOeHRa5MbkuatjwMCccD6GvhhsjAK2pnOqxrvNACYumjFvx+PuRq WsKsatz7Ez7rLxwpZE4A7nLhB6lSJzSApRyVyIQduNgCsM0ek/um39dVNdBkoHETsN EsQRuya+ZWM9afLh6eIGvm1L745SU6zFxibiyXMw= From: Umang Jain To: libcamera-devel@lists.libcamera.org Date: Fri, 13 Aug 2021 20:14:35 +0530 Message-Id: <20210813144437.138005-3-umang.jain@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210813144437.138005-1-umang.jain@ideasonboard.com> References: <20210813144437.138005-1-umang.jain@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 2/4] pipeline: vimc: Allocate fake 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 generate statistics or consume parameters buffers. Thus, create simple (single plane) dmabuf-backed FrameBuffers, which can act as fake 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 --- src/libcamera/pipeline/vimc/vimc.cpp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp index 4c92729d..edf8c58e 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 fake IPA buffers"; + /* \todo fail hard or continue? */ + } + /* Initialise the supported controls. */ const ControlInfoMap &controls = sensor_->controls(); ControlInfoMap::Map ctrls; @@ -548,6 +556,25 @@ void VimcCameraData::bufferReady(FrameBuffer *buffer) pipe_->completeRequest(request); } +int VimcCameraData::allocateMockIPABuffers() +{ + unsigned int bufCount = 2; + + V4L2DeviceFormat format; + format.fourcc = video_->toV4L2PixelFormat(formats::BGR888); + format.size = Size(160, 120); + + int ret = video_->tryFormat(&format); + if (ret < 0) + return ret; + + ret = video_->setFormat(&format); + if (ret < 0) + return ret; + + return video_->exportBuffers(bufCount, &mockIPABufs_); +} + REGISTER_PIPELINE_HANDLER(PipelineHandlerVimc) } /* namespace libcamera */ From patchwork Fri Aug 13 14:44:36 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Umang Jain X-Patchwork-Id: 13350 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 D7535C3240 for ; Fri, 13 Aug 2021 14:44:56 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 9AE5E688A5; Fri, 13 Aug 2021 16:44:56 +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="oclIokAM"; 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 6241E687FA for ; Fri, 13 Aug 2021 16:44:55 +0200 (CEST) Received: from perceval.ideasonboard.com (unknown [103.251.226.198]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 5B1598F; Fri, 13 Aug 2021 16:44:54 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1628865895; bh=8y/DyMenMBrLhvsGAGEO/13PmCyL+mKFt+zQf8b8Vpg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=oclIokAMqZj3VYYSemO8vVW1XbgBFtDY7cj98FxkfJicmYD+m9nbLVuedt3vOG6Qv zTayPAUCkQLGQITqRtujKYEemrohkMDZ0cyP036bp2RJMVZ/chH5HgKz8kGE1X0iC6 6u8enzFncNrbrMr3y2qZUwuV7mCWOc3FNc4cbcIo= From: Umang Jain To: libcamera-devel@lists.libcamera.org Date: Fri, 13 Aug 2021 20:14:36 +0530 Message-Id: <20210813144437.138005-4-umang.jain@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210813144437.138005-1-umang.jain@ideasonboard.com> References: <20210813144437.138005-1-umang.jain@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 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 --- include/libcamera/ipa/vimc.mojom | 3 +++ src/ipa/vimc/vimc.cpp | 26 ++++++++++++++++++++++++++ src/libcamera/pipeline/vimc/vimc.cpp | 16 ++++++++++++++++ 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 0535c740..082b2db7 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,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, 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 edf8c58e..c44a6242 100644 --- a/src/libcamera/pipeline/vimc/vimc.cpp +++ b/src/libcamera/pipeline/vimc/vimc.cpp @@ -63,6 +63,7 @@ public: std::unique_ptr ipa_; std::vector> mockIPABufs_; + std::vector ipaBuffers_; }; class VimcCameraConfiguration : public CameraConfiguration @@ -334,6 +335,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; + for (unsigned int i = 0; i < data->mockIPABufs_.size(); i++) { + std::unique_ptr &buffer = data->mockIPABufs_[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(); @@ -354,7 +364,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 13 14:44:37 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Umang Jain X-Patchwork-Id: 13351 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 6BAE6C3240 for ; Fri, 13 Aug 2021 14:44:59 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 344976888D; Fri, 13 Aug 2021 16:44:59 +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="dDkoloQW"; 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 D4BC06888D for ; Fri, 13 Aug 2021 16:44:57 +0200 (CEST) Received: from perceval.ideasonboard.com (unknown [103.251.226.198]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id CCA968F; Fri, 13 Aug 2021 16:44:56 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1628865897; bh=h93wOdQqb83xbnfiGOUpIJXSro7G9RPZqHAPvKk9Sdg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=dDkoloQWGVG/ZjO8dy+0hXNxoLBGssfXQT/J6Yuk6zVrp3HWsb5qAdZEHymoxSc4R SqohTwfUYiabEOYjgdhAVxxFsqfmMWh16obxqCd2U4U4MJUDmVZ4k5jQhFhBDtq3mZ g4hV/4PohXYKZyE8EKJT1V1JNiK9GIYR0B1pYr3M= From: Umang Jain To: libcamera-devel@lists.libcamera.org Date: Fri, 13 Aug 2021 20:14:37 +0530 Message-Id: <20210813144437.138005-5-umang.jain@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210813144437.138005-1-umang.jain@ideasonboard.com> References: <20210813144437.138005-1-umang.jain@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 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. Since VIMC is a virtual test driver and does not have actual IPA buffers (parameters and statistics), we can only pass them as is, to and from the IPA. The buffers used here are mock FrameBuffers which are dmabuf backed(in other words, mmap()able through MappedFramebuffer inside the IPA). This commits shows: - Passing and filling the parameter buffer from the pipeline handler to the IPA. - 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 --- include/libcamera/ipa/vimc.mojom | 14 +++++++++++++- src/ipa/vimc/vimc.cpp | 19 +++++++++++++++++++ src/libcamera/pipeline/vimc/vimc.cpp | 11 +++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/include/libcamera/ipa/vimc.mojom b/include/libcamera/ipa/vimc.mojom index 8cb240d3..85a2d8e4 100644 --- a/include/libcamera/ipa/vimc.mojom +++ b/include/libcamera/ipa/vimc.mojom @@ -29,8 +29,20 @@ interface IPAVimcInterface { mapBuffers(array buffers); unmapBuffers(array ids); + + /* + * VIMC being a virtual test driver does not have actual parameters + * and statistics buffers. However, VIMC pipeline creates mock IPA + * buffers and map it to IPA. + * + * Since, we are not working with actual IPA buffers here, + * following are mostly stub functions, introduced to leverage IPA + * IPC tests. + */ + [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 082b2db7..be189181 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); @@ -125,6 +128,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 c44a6242..bfd545c8 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_; @@ -433,6 +434,8 @@ int PipelineHandlerVimc::queueRequestDevice(Camera *camera, Request *request) if (ret < 0) return ret; + data->ipa_->processControls(request->sequence(), request->controls()); + return 0; } @@ -466,6 +469,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() }); @@ -570,6 +575,8 @@ void VimcCameraData::bufferReady(FrameBuffer *buffer) pipe_->completeBuffer(request, buffer); pipe_->completeRequest(request); + + ipa_->fillParams(request->sequence(), mockIPABufs_[0]->cookie()); } int VimcCameraData::allocateMockIPABuffers() @@ -591,6 +598,10 @@ int VimcCameraData::allocateMockIPABuffers() return video_->exportBuffers(bufCount, &mockIPABufs_); } +void VimcCameraData::paramsFilled([[maybe_unused]] unsigned int id) +{ +} + REGISTER_PIPELINE_HANDLER(PipelineHandlerVimc) } /* namespace libcamera */