From patchwork Fri Jul 25 10:33:53 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 23962 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 380C5C332A for ; Fri, 25 Jul 2025 10:34:17 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 95C7C690D4; Fri, 25 Jul 2025 12:34:13 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="pkr+jGc+"; 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 BDE79690C1 for ; Fri, 25 Jul 2025 12:34:00 +0200 (CEST) Received: from [192.168.0.172] (mob-5-90-139-29.net.vodafone.it [5.90.139.29]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id C198AE9B; Fri, 25 Jul 2025 12:33:20 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1753439601; bh=cvrNmyHuY4zMvLFKpyeMUlm71YVcNgYowpc8no0CGeo=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=pkr+jGc+LP4yVpAoCjmrcYssGRB3HcNKBnCdBlLsBjPVlO5/LX4lfiO8ItEaGlTml ydPoIRvV5nJDrbDbg/UHmMxau8m/T4GxEXztFORanvL8V6LblbIjkNVmRgol63RoWk neUEqHrC+v6M/cZjpp3DG3rAUqHb8uDWoSY8nV6o= From: Jacopo Mondi Date: Fri, 25 Jul 2025 12:33:53 +0200 Subject: [PATCH DNI 8/9] libcamera: rpi/pisp: Bind devices in a context MIME-Version: 1.0 Message-Id: <20250725-multicontext-v1-8-ea558291e101@ideasonboard.com> References: <20250725-multicontext-v1-0-ea558291e101@ideasonboard.com> In-Reply-To: <20250725-multicontext-v1-0-ea558291e101@ideasonboard.com> To: libcamera-devel@lists.libcamera.org Cc: Jacopo Mondi X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2537; i=jacopo.mondi@ideasonboard.com; h=from:subject:message-id; bh=cvrNmyHuY4zMvLFKpyeMUlm71YVcNgYowpc8no0CGeo=; b=owEBbQKS/ZANAwAKAXI0Bo8WoVY8AcsmYgBog12UhuJ9z9YjRKe8uEfLSClxp9sDWlloXEQ15 dWm3sS1OgKJAjMEAAEKAB0WIQS1xD1IgJogio9YOMByNAaPFqFWPAUCaINdlAAKCRByNAaPFqFW PPkTD/9aYroHvwT8Ae25nmgtzdkNjkc5/VqshBEYV1ecygcAYbMEtwqywepBH3aV8FVhgRo+/1p mEdSObaQiw3TraoCmmQ6uWUSxfleo0oanyZ1+IDc8Qpb8GACuY/zLfbkNpzTiGWd786sAyfRgo/ zad/BScmZiYvMwkumYcz+QeELSJgbSfjPwcGJ/VUBS6A3NnQ0tUFqUE9L+jOGExMwYTfOujT6nU e+H+rbWEVfPdUjd8XyoYyc69SekjTEJL0K9H/ofPoCvnxDskAxqsFMI7bE2CbjZNfQaDB0feXN3 HuUl4jmsLkJLiSAOmGN7CT48ZMOuyovjXH+nBtsG8sUmZbbgIO2MVdz4a86oFdXQoJnNZk8QxGV s/3KH02w495CIkLu7uh+Xa+VVJCHY3gT+p3zMBAi1BfWlETw6Rq3aPQ3ESCs6Vv348lI0Dsroqn 8RvxBoPY+XLsIgW80OVHOhYAPJSwG0jj98nlPZONTyC2tIlJEke6CLFlgoMK/1RLMSPNTpb2Ptl lY7URZQu/TzD2bAjnJXyt0HNZMyTOQb/+sL0bpFrasZapTJ0iUsCJisYoa3bHfprqYsxwAJD2fK 7tdjMKDkDV/d4MACfCMyOagKPJFqS0104H+a9wkLJXsvGQxoTOGxaygA2bZUYl4BI3VdjHWFaIM TVV/tRFjQ7yU/rA== X-Developer-Key: i=jacopo.mondi@ideasonboard.com; a=openpgp; fpr=72392EDC88144A65C701EA9BA5826A2587AD026B 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" Create a MediaContext for each detected camera sensor and bind the ISP video devices to it. This allows multi-camera operations with a single, multiplexed, ISP device. Signed-off-by: Jacopo Mondi --- src/libcamera/pipeline/rpi/pisp/pisp.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/libcamera/pipeline/rpi/pisp/pisp.cpp b/src/libcamera/pipeline/rpi/pisp/pisp.cpp index 15dd950682eeff9dc1a9b4ae2f927da85c0eaac6..49a97415c67f0c7c36b3c0b8bd597c278af16838 100644 --- a/src/libcamera/pipeline/rpi/pisp/pisp.cpp +++ b/src/libcamera/pipeline/rpi/pisp/pisp.cpp @@ -740,6 +740,16 @@ public: return cfe_[Cfe::Output0].dev(); } + int bindDevice(V4L2VideoDevice *dev) + { + return mediaContext_->bindDevice(dev); + } + + int bindDevice(V4L2Subdevice *dev) + { + return mediaContext_->bindDevice(dev); + } + CameraConfiguration::Status platformValidate(RPi::RPiCameraConfiguration *rpiConfig) const override; @@ -776,6 +786,8 @@ public: unsigned int tdnInputIndex_; unsigned int stitchInputIndex_; + std::unique_ptr mediaContext_; + struct Config { /* * Number of CFE config and stats buffers to allocate and use. A @@ -935,6 +947,7 @@ bool PipelineHandlerPiSP::match(DeviceEnumerator *enumerator) ("pisp_frontend", true, pisp->pispVariant_); pisp->be_ = SharedMemObject ("pisp_backend", BackEnd::Config({}), pisp->pispVariant_); + pisp->mediaContext_ = ispDevice->createContext(); if (!pisp->fe_.fd().isValid() || !pisp->be_.fd().isValid()) { LOG(RPI, Error) << "Failed to create ISP shared objects"; @@ -1155,6 +1168,16 @@ int PipelineHandlerPiSP::platformRegister(std::unique_ptr &came return ret; } + /* Bind devices to the media device. */ + data->bindDevice(data->isp_[Isp::Input].dev()); + data->bindDevice(data->isp_[Isp::Output0].dev()); + data->bindDevice(data->isp_[Isp::Output1].dev()); + data->bindDevice(data->isp_[Isp::Config].dev()); + data->bindDevice(data->isp_[Isp::TdnInput].dev()); + data->bindDevice(data->isp_[Isp::TdnOutput].dev()); + data->bindDevice(data->isp_[Isp::StitchInput].dev()); + data->bindDevice(data->isp_[Isp::StitchOutput].dev()); + /* Write up all the IPA connections. */ data->ipa_->prepareIspComplete.connect(data, &PiSPCameraData::prepareIspComplete); data->ipa_->processStatsComplete.connect(data, &PiSPCameraData::processStatsComplete);