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 */