[DNI,8/9] libcamera: rpi/pisp: Bind devices in a context
diff mbox series

Message ID 20250725-multicontext-v1-8-ea558291e101@ideasonboard.com
State New
Headers show
Series
  • libcamera: Support for multi-context operations
Related show

Commit Message

Jacopo Mondi July 25, 2025, 10:33 a.m. UTC
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 <jacopo.mondi@ideasonboard.com>
---
 src/libcamera/pipeline/rpi/pisp/pisp.cpp | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

Patch
diff mbox series

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> 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<BackEnd>
 					("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<RPi::CameraData> &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);