From patchwork Fri Aug 15 13:52:53 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= X-Patchwork-Id: 24143 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 BFD06BDCC1 for ; Fri, 15 Aug 2025 13:53:01 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id D914769251; Fri, 15 Aug 2025 15:52:59 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="jgysbbaV"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 2ED2D6924E for ; Fri, 15 Aug 2025 15:52:57 +0200 (CEST) Received: from pb-laptop.local (185.221.141.188.nat.pool.zt.hu [185.221.141.188]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 08F9B605 for ; Fri, 15 Aug 2025 15:52:01 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1755265922; bh=7jytn1H+d+rqefZLP2Q7q8ttS/bkddya3bCe7o2tIsw=; h=From:To:Subject:Date:In-Reply-To:References:From; b=jgysbbaVBZbieB/1a+p9X73audW88+epWP024otlPOAmaU7a3eBOshC1S63xVM7nK IC8WKoJxnZQ9NZ3XeUy63NSYzpGK2K+fRZ0EVV7ozVd7y4r9jO6pMgXFp8ts7W2p5q mqxC+bFhZ8sZ9Wcqm5wrucThbjZ7svJ8nHnGp384= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [RFC PATCH v1 2/2] libcamera: pipeline: Construct `DeviceMatch` once Date: Fri, 15 Aug 2025 15:52:53 +0200 Message-ID: <20250815135253.2231076-2-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250815135253.2231076-1-barnabas.pocze@ideasonboard.com> References: <20250815135253.2231076-1-barnabas.pocze@ideasonboard.com> MIME-Version: 1.0 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" 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 --- 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(-) 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 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 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_) {