[RFC,v1,2/2] libcamera: pipeline: Construct `DeviceMatch` once
diff mbox series

Message ID 20250815135253.2231076-2-barnabas.pocze@ideasonboard.com
State New
Headers show
Series
  • [RFC,v1,1/2] libcamera: device_enumerator: Take list of entity names in ctor
Related show

Commit Message

Barnabás Pőcze Aug. 15, 2025, 1:52 p.m. UTC
Most `DeviceMatch` objects are constructed from static data and used
once, then thrown away. Instead of doing that, give them static lifetime
and reuse them on subsequent invocations.

Tests using `DeviceMatch` are also converted if possible.

Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
---
 src/libcamera/pipeline/imx8-isi/imx8-isi.cpp |  9 ++--
 src/libcamera/pipeline/ipu3/ipu3.cpp         | 49 ++++++++++----------
 src/libcamera/pipeline/mali-c55/mali-c55.cpp | 13 +++---
 src/libcamera/pipeline/rkisp1/rkisp1.cpp     | 20 ++++----
 src/libcamera/pipeline/rpi/pisp/pisp.cpp     | 30 ++++++------
 src/libcamera/pipeline/rpi/vc4/vc4.cpp       |  4 +-
 src/libcamera/pipeline/uvcvideo/uvcvideo.cpp |  2 +-
 src/libcamera/pipeline/vimc/vimc.cpp         | 22 ++++-----
 test/camera-sensor.cpp                       |  2 +-
 test/delayed_controls.cpp                    |  5 +-
 test/libtest/buffer_source.cpp               |  7 +--
 test/media_device/media_device_test.cpp      |  2 +-
 test/v4l2_subdevice/v4l2_subdevice_test.cpp  |  2 +-
 test/v4l2_videodevice/v4l2_m2mdevice.cpp     |  7 +--
 14 files changed, 93 insertions(+), 81 deletions(-)

Patch
diff mbox series

diff --git a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp
index 72e055e40..d93c9c2ff 100644
--- a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp
+++ b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp
@@ -952,10 +952,11 @@  int PipelineHandlerISI::queueRequestDevice(Camera *camera, Request *request)
 
 bool PipelineHandlerISI::match(DeviceEnumerator *enumerator)
 {
-	DeviceMatch dm("mxc-isi");
-	dm.add("crossbar");
-	dm.add("mxc_isi.0");
-	dm.add("mxc_isi.0.capture");
+	static const DeviceMatch dm("mxc-isi", {
+		"crossbar",
+		"mxc_isi.0",
+		"mxc_isi.0.capture",
+	});
 
 	isiDev_ = acquireMediaDevice(enumerator, dm);
 	if (!isiDev_)
diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index ad20810e6..49554a705 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -845,31 +845,32 @@  int PipelineHandlerIPU3::queueRequestDevice(Camera *camera, Request *request)
 
 bool PipelineHandlerIPU3::match(DeviceEnumerator *enumerator)
 {
-	int ret;
+	static const DeviceMatch cio2_dm("ipu3-cio2", {
+		"ipu3-csi2 0",
+		"ipu3-cio2 0",
+		"ipu3-csi2 1",
+		"ipu3-cio2 1",
+		"ipu3-csi2 2",
+		"ipu3-cio2 2",
+		"ipu3-csi2 3",
+		"ipu3-cio2 3",
+	});
+	static const DeviceMatch imgu_dm("ipu3-imgu", {
+		"ipu3-imgu 0",
+		"ipu3-imgu 0 input",
+		"ipu3-imgu 0 parameters",
+		"ipu3-imgu 0 output",
+		"ipu3-imgu 0 viewfinder",
+		"ipu3-imgu 0 3a stat",
+		"ipu3-imgu 1",
+		"ipu3-imgu 1 input",
+		"ipu3-imgu 1 parameters",
+		"ipu3-imgu 1 output",
+		"ipu3-imgu 1 viewfinder",
+		"ipu3-imgu 1 3a stat",
+	});
 
-	DeviceMatch cio2_dm("ipu3-cio2");
-	cio2_dm.add("ipu3-csi2 0");
-	cio2_dm.add("ipu3-cio2 0");
-	cio2_dm.add("ipu3-csi2 1");
-	cio2_dm.add("ipu3-cio2 1");
-	cio2_dm.add("ipu3-csi2 2");
-	cio2_dm.add("ipu3-cio2 2");
-	cio2_dm.add("ipu3-csi2 3");
-	cio2_dm.add("ipu3-cio2 3");
-
-	DeviceMatch imgu_dm("ipu3-imgu");
-	imgu_dm.add("ipu3-imgu 0");
-	imgu_dm.add("ipu3-imgu 0 input");
-	imgu_dm.add("ipu3-imgu 0 parameters");
-	imgu_dm.add("ipu3-imgu 0 output");
-	imgu_dm.add("ipu3-imgu 0 viewfinder");
-	imgu_dm.add("ipu3-imgu 0 3a stat");
-	imgu_dm.add("ipu3-imgu 1");
-	imgu_dm.add("ipu3-imgu 1 input");
-	imgu_dm.add("ipu3-imgu 1 parameters");
-	imgu_dm.add("ipu3-imgu 1 output");
-	imgu_dm.add("ipu3-imgu 1 viewfinder");
-	imgu_dm.add("ipu3-imgu 1 3a stat");
+	int ret;
 
 	cio2MediaDev_ = acquireMediaDevice(enumerator, cio2_dm);
 	if (!cio2MediaDev_)
diff --git a/src/libcamera/pipeline/mali-c55/mali-c55.cpp b/src/libcamera/pipeline/mali-c55/mali-c55.cpp
index 76341ed3f..1d2d48d6d 100644
--- a/src/libcamera/pipeline/mali-c55/mali-c55.cpp
+++ b/src/libcamera/pipeline/mali-c55/mali-c55.cpp
@@ -1630,12 +1630,13 @@  bool PipelineHandlerMaliC55::match(DeviceEnumerator *enumerator)
 	 * The TPG and the downscale pipe are both optional blocks and may not
 	 * be fitted.
 	 */
-	DeviceMatch dm("mali-c55");
-	dm.add("mali-c55 isp");
-	dm.add("mali-c55 resizer fr");
-	dm.add("mali-c55 fr");
-	dm.add("mali-c55 3a stats");
-	dm.add("mali-c55 3a params");
+	static const DeviceMatch dm("mali-c55", {
+		"mali-c55 isp",
+		"mali-c55 resizer fr",
+		"mali-c55 fr",
+		"mali-c55 3a stats",
+		"mali-c55 3a params",
+	});
 
 	media_ = acquireMediaDevice(enumerator, dm);
 	if (!media_)
diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
index 81370f4cd..2dc396ed9 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
@@ -1362,12 +1362,13 @@  int PipelineHandlerRkISP1::createCamera(MediaEntity *sensor)
 
 bool PipelineHandlerRkISP1::match(DeviceEnumerator *enumerator)
 {
-	DeviceMatch dm("rkisp1");
-	dm.add("rkisp1_isp");
-	dm.add("rkisp1_resizer_mainpath");
-	dm.add("rkisp1_mainpath");
-	dm.add("rkisp1_stats");
-	dm.add("rkisp1_params");
+	static const DeviceMatch dm("rkisp1", {
+		"rkisp1_isp",
+		"rkisp1_resizer_mainpath",
+		"rkisp1_mainpath",
+		"rkisp1_stats",
+		"rkisp1_params",
+	});
 
 	media_ = acquireMediaDevice(enumerator, dm);
 	if (!media_)
@@ -1409,9 +1410,10 @@  bool PipelineHandlerRkISP1::match(DeviceEnumerator *enumerator)
 	param_->bufferReady.connect(this, &PipelineHandlerRkISP1::paramBufferReady);
 
 	/* If dewarper is present, create its instance. */
-	DeviceMatch dwp("dw100");
-	dwp.add("dw100-source");
-	dwp.add("dw100-sink");
+	static const DeviceMatch dwp("dw100", {
+		"dw100-source",
+		"dw100-sink",
+	});
 
 	std::shared_ptr<MediaDevice> dwpMediaDevice = enumerator->search(dwp);
 	if (dwpMediaDevice) {
diff --git a/src/libcamera/pipeline/rpi/pisp/pisp.cpp b/src/libcamera/pipeline/rpi/pisp/pisp.cpp
index 082724c5a..6f244c639 100644
--- a/src/libcamera/pipeline/rpi/pisp/pisp.cpp
+++ b/src/libcamera/pipeline/rpi/pisp/pisp.cpp
@@ -880,10 +880,12 @@  bool PipelineHandlerPiSP::match(DeviceEnumerator *enumerator)
 	 * device nodes due to a sensor subdevice failure.
 	 */
 	for (unsigned int i = 0; i < numCfeDevices; i++) {
-		DeviceMatch cfe("rp1-cfe");
-		cfe.add("rp1-cfe-fe-image0");
-		cfe.add("rp1-cfe-fe-stats");
-		cfe.add("rp1-cfe-fe-config");
+		static const DeviceMatch cfe("rp1-cfe", {
+			"rp1-cfe-fe-image0",
+			"rp1-cfe-fe-stats",
+			"rp1-cfe-fe-config",
+		});
+
 		MediaDevice *cfeDevice = acquireMediaDevice(enumerator, cfe);
 
 		if (!cfeDevice) {
@@ -891,15 +893,17 @@  bool PipelineHandlerPiSP::match(DeviceEnumerator *enumerator)
 			break;
 		}
 
-		DeviceMatch isp("pispbe");
-		isp.add("pispbe-input");
-		isp.add("pispbe-config");
-		isp.add("pispbe-output0");
-		isp.add("pispbe-output1");
-		isp.add("pispbe-tdn_output");
-		isp.add("pispbe-tdn_input");
-		isp.add("pispbe-stitch_output");
-		isp.add("pispbe-stitch_input");
+		static const DeviceMatch isp("pispbe", {
+			"pispbe-input",
+			"pispbe-config",
+			"pispbe-output0",
+			"pispbe-output1",
+			"pispbe-tdn_output",
+			"pispbe-tdn_input",
+			"pispbe-stitch_output",
+			"pispbe-stitch_input",
+		});
+
 		MediaDevice *ispDevice = acquireMediaDevice(enumerator, isp);
 
 		if (!ispDevice) {
diff --git a/src/libcamera/pipeline/rpi/vc4/vc4.cpp b/src/libcamera/pipeline/rpi/vc4/vc4.cpp
index 99d43bd0a..7d9e141b3 100644
--- a/src/libcamera/pipeline/rpi/vc4/vc4.cpp
+++ b/src/libcamera/pipeline/rpi/vc4/vc4.cpp
@@ -172,7 +172,7 @@  bool PipelineHandlerVc4::match(DeviceEnumerator *enumerator)
 	 * device nodes due to a sensor subdevice failure.
 	 */
 	for (unsigned int i = 0; i < numUnicamDevices; i++) {
-		DeviceMatch unicam("unicam");
+		static const DeviceMatch unicam("unicam");
 		MediaDevice *unicamDevice = acquireMediaDevice(enumerator, unicam);
 
 		if (!unicamDevice) {
@@ -180,7 +180,7 @@  bool PipelineHandlerVc4::match(DeviceEnumerator *enumerator)
 			continue;
 		}
 
-		DeviceMatch isp("bcm2835-isp");
+		static const DeviceMatch isp("bcm2835-isp");
 		MediaDevice *ispDevice = acquireMediaDevice(enumerator, isp);
 
 		if (!ispDevice) {
diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
index 4b5816dfd..fffbbcd2b 100644
--- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
+++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
@@ -466,8 +466,8 @@  int PipelineHandlerUVC::queueRequestDevice(Camera *camera, Request *request)
 
 bool PipelineHandlerUVC::match(DeviceEnumerator *enumerator)
 {
+	static const DeviceMatch dm("uvcvideo");
 	MediaDevice *media;
-	DeviceMatch dm("uvcvideo");
 
 	media = acquireMediaDevice(enumerator, dm);
 	if (!media)
diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp
index 07273bd2b..b28a23a13 100644
--- a/src/libcamera/pipeline/vimc/vimc.cpp
+++ b/src/libcamera/pipeline/vimc/vimc.cpp
@@ -464,17 +464,17 @@  int PipelineHandlerVimc::queueRequestDevice(Camera *camera, Request *request)
 
 bool PipelineHandlerVimc::match(DeviceEnumerator *enumerator)
 {
-	DeviceMatch dm("vimc");
-
-	dm.add("Raw Capture 0");
-	dm.add("Raw Capture 1");
-	dm.add("RGB/YUV Capture");
-	dm.add("Sensor A");
-	dm.add("Sensor B");
-	dm.add("Debayer A");
-	dm.add("Debayer B");
-	dm.add("RGB/YUV Input");
-	dm.add("Scaler");
+	static const DeviceMatch dm("vimc", {
+		"Raw Capture 0",
+		"Raw Capture 1",
+		"RGB/YUV Capture",
+		"Sensor A",
+		"Sensor B",
+		"Debayer A",
+		"Debayer B",
+		"RGB/YUV Input",
+		"Scaler",
+	});
 
 	MediaDevice *media = acquireMediaDevice(enumerator, dm);
 	if (!media)
diff --git a/test/camera-sensor.cpp b/test/camera-sensor.cpp
index c30a2212e..77d6cf741 100644
--- a/test/camera-sensor.cpp
+++ b/test/camera-sensor.cpp
@@ -39,7 +39,7 @@  protected:
 			return TestFail;
 		}
 
-		DeviceMatch dm("vimc");
+		static const DeviceMatch dm("vimc");
 		media_ = enumerator_->search(dm);
 		if (!media_) {
 			cerr << "Unable to find \'vimc\' media device node" << endl;
diff --git a/test/delayed_controls.cpp b/test/delayed_controls.cpp
index 7bd30e7ae..4c6d7e226 100644
--- a/test/delayed_controls.cpp
+++ b/test/delayed_controls.cpp
@@ -38,8 +38,9 @@  protected:
 			return TestFail;
 		}
 
-		DeviceMatch dm("vivid");
-		dm.add("vivid-000-vid-cap");
+		static const DeviceMatch dm("vivid", {
+			"vivid-000-vid-cap",
+		});
 
 		media_ = enumerator_->search(dm);
 		if (!media_) {
diff --git a/test/libtest/buffer_source.cpp b/test/libtest/buffer_source.cpp
index dde11f365..52bae498d 100644
--- a/test/libtest/buffer_source.cpp
+++ b/test/libtest/buffer_source.cpp
@@ -29,7 +29,7 @@  BufferSource::~BufferSource()
 int BufferSource::allocate(const StreamConfiguration &config)
 {
 	/* Locate and open the video device. */
-	std::string videoDeviceName = "vivid-000-vid-out";
+	static const std::string videoDeviceName = "vivid-000-vid-out";
 
 	std::unique_ptr<DeviceEnumerator> enumerator =
 		DeviceEnumerator::create();
@@ -43,8 +43,9 @@  int BufferSource::allocate(const StreamConfiguration &config)
 		return TestFail;
 	}
 
-	DeviceMatch dm("vivid");
-	dm.add(videoDeviceName);
+	static const DeviceMatch dm("vivid", {
+		videoDeviceName,
+	});
 
 	media_ = enumerator->search(dm);
 	if (!media_) {
diff --git a/test/media_device/media_device_test.cpp b/test/media_device/media_device_test.cpp
index 3e41d0f04..286580450 100644
--- a/test/media_device/media_device_test.cpp
+++ b/test/media_device/media_device_test.cpp
@@ -25,7 +25,7 @@  int MediaDeviceTest::init()
 		return TestFail;
 	}
 
-	DeviceMatch dm("vimc");
+	static const DeviceMatch dm("vimc");
 	media_ = enumerator_->search(dm);
 	if (!media_) {
 		cerr << "No VIMC media device found: skip test" << endl;
diff --git a/test/v4l2_subdevice/v4l2_subdevice_test.cpp b/test/v4l2_subdevice/v4l2_subdevice_test.cpp
index c349c9e31..109965b4d 100644
--- a/test/v4l2_subdevice/v4l2_subdevice_test.cpp
+++ b/test/v4l2_subdevice/v4l2_subdevice_test.cpp
@@ -39,7 +39,7 @@  int V4L2SubdeviceTest::init()
 		return TestFail;
 	}
 
-	DeviceMatch dm("vimc");
+	static const DeviceMatch dm("vimc");
 	media_ = enumerator_->search(dm);
 	if (!media_) {
 		cerr << "Unable to find \'vimc\' media device node" << endl;
diff --git a/test/v4l2_videodevice/v4l2_m2mdevice.cpp b/test/v4l2_videodevice/v4l2_m2mdevice.cpp
index c45f581a8..36a3e3201 100644
--- a/test/v4l2_videodevice/v4l2_m2mdevice.cpp
+++ b/test/v4l2_videodevice/v4l2_m2mdevice.cpp
@@ -65,9 +65,10 @@  protected:
 			return TestFail;
 		}
 
-		DeviceMatch dm("vim2m");
-		dm.add("vim2m-source");
-		dm.add("vim2m-sink");
+		static const DeviceMatch dm("vim2m", {
+			"vim2m-source",
+			"vim2m-sink",
+		});
 
 		media_ = enumerator_->search(dm);
 		if (!media_) {