[{"id":35638,"web_url":"https://patchwork.libcamera.org/comment/35638/","msgid":"<175653204032.3397211.1972583878851257684@neptunite.rasen.tech>","date":"2025-08-30T05:34:00","subject":"Re: [RFC PATCH v1 2/2] libcamera: pipeline: Construct `DeviceMatch`\n\tonce","submitter":{"id":17,"url":"https://patchwork.libcamera.org/api/people/17/","name":"Paul Elder","email":"paul.elder@ideasonboard.com"},"content":"Quoting Barnabás Pőcze (2025-08-15 22:52:53)\n> Most `DeviceMatch` objects are constructed from static data and used\n> once, then thrown away. Instead of doing that, give them static lifetime\n> and reuse them on subsequent invocations.\n> \n> Tests using `DeviceMatch` are also converted if possible.\n> \n> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n\nReviewed-by: Paul Elder <paul.elder@ideasonboard.com>\n\n> ---\n>  src/libcamera/pipeline/imx8-isi/imx8-isi.cpp |  9 ++--\n>  src/libcamera/pipeline/ipu3/ipu3.cpp         | 49 ++++++++++----------\n>  src/libcamera/pipeline/mali-c55/mali-c55.cpp | 13 +++---\n>  src/libcamera/pipeline/rkisp1/rkisp1.cpp     | 20 ++++----\n>  src/libcamera/pipeline/rpi/pisp/pisp.cpp     | 30 ++++++------\n>  src/libcamera/pipeline/rpi/vc4/vc4.cpp       |  4 +-\n>  src/libcamera/pipeline/uvcvideo/uvcvideo.cpp |  2 +-\n>  src/libcamera/pipeline/vimc/vimc.cpp         | 22 ++++-----\n>  test/camera-sensor.cpp                       |  2 +-\n>  test/delayed_controls.cpp                    |  5 +-\n>  test/libtest/buffer_source.cpp               |  7 +--\n>  test/media_device/media_device_test.cpp      |  2 +-\n>  test/v4l2_subdevice/v4l2_subdevice_test.cpp  |  2 +-\n>  test/v4l2_videodevice/v4l2_m2mdevice.cpp     |  7 +--\n>  14 files changed, 93 insertions(+), 81 deletions(-)\n> \n> diff --git a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp\n> index 72e055e40..d93c9c2ff 100644\n> --- a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp\n> +++ b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp\n> @@ -952,10 +952,11 @@ int PipelineHandlerISI::queueRequestDevice(Camera *camera, Request *request)\n>  \n>  bool PipelineHandlerISI::match(DeviceEnumerator *enumerator)\n>  {\n> -       DeviceMatch dm(\"mxc-isi\");\n> -       dm.add(\"crossbar\");\n> -       dm.add(\"mxc_isi.0\");\n> -       dm.add(\"mxc_isi.0.capture\");\n> +       static const DeviceMatch dm(\"mxc-isi\", {\n> +               \"crossbar\",\n> +               \"mxc_isi.0\",\n> +               \"mxc_isi.0.capture\",\n> +       });\n>  \n>         isiDev_ = acquireMediaDevice(enumerator, dm);\n>         if (!isiDev_)\n> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> index ad20810e6..49554a705 100644\n> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> @@ -845,31 +845,32 @@ int PipelineHandlerIPU3::queueRequestDevice(Camera *camera, Request *request)\n>  \n>  bool PipelineHandlerIPU3::match(DeviceEnumerator *enumerator)\n>  {\n> -       int ret;\n> +       static const DeviceMatch cio2_dm(\"ipu3-cio2\", {\n> +               \"ipu3-csi2 0\",\n> +               \"ipu3-cio2 0\",\n> +               \"ipu3-csi2 1\",\n> +               \"ipu3-cio2 1\",\n> +               \"ipu3-csi2 2\",\n> +               \"ipu3-cio2 2\",\n> +               \"ipu3-csi2 3\",\n> +               \"ipu3-cio2 3\",\n> +       });\n> +       static const DeviceMatch imgu_dm(\"ipu3-imgu\", {\n> +               \"ipu3-imgu 0\",\n> +               \"ipu3-imgu 0 input\",\n> +               \"ipu3-imgu 0 parameters\",\n> +               \"ipu3-imgu 0 output\",\n> +               \"ipu3-imgu 0 viewfinder\",\n> +               \"ipu3-imgu 0 3a stat\",\n> +               \"ipu3-imgu 1\",\n> +               \"ipu3-imgu 1 input\",\n> +               \"ipu3-imgu 1 parameters\",\n> +               \"ipu3-imgu 1 output\",\n> +               \"ipu3-imgu 1 viewfinder\",\n> +               \"ipu3-imgu 1 3a stat\",\n> +       });\n>  \n> -       DeviceMatch cio2_dm(\"ipu3-cio2\");\n> -       cio2_dm.add(\"ipu3-csi2 0\");\n> -       cio2_dm.add(\"ipu3-cio2 0\");\n> -       cio2_dm.add(\"ipu3-csi2 1\");\n> -       cio2_dm.add(\"ipu3-cio2 1\");\n> -       cio2_dm.add(\"ipu3-csi2 2\");\n> -       cio2_dm.add(\"ipu3-cio2 2\");\n> -       cio2_dm.add(\"ipu3-csi2 3\");\n> -       cio2_dm.add(\"ipu3-cio2 3\");\n> -\n> -       DeviceMatch imgu_dm(\"ipu3-imgu\");\n> -       imgu_dm.add(\"ipu3-imgu 0\");\n> -       imgu_dm.add(\"ipu3-imgu 0 input\");\n> -       imgu_dm.add(\"ipu3-imgu 0 parameters\");\n> -       imgu_dm.add(\"ipu3-imgu 0 output\");\n> -       imgu_dm.add(\"ipu3-imgu 0 viewfinder\");\n> -       imgu_dm.add(\"ipu3-imgu 0 3a stat\");\n> -       imgu_dm.add(\"ipu3-imgu 1\");\n> -       imgu_dm.add(\"ipu3-imgu 1 input\");\n> -       imgu_dm.add(\"ipu3-imgu 1 parameters\");\n> -       imgu_dm.add(\"ipu3-imgu 1 output\");\n> -       imgu_dm.add(\"ipu3-imgu 1 viewfinder\");\n> -       imgu_dm.add(\"ipu3-imgu 1 3a stat\");\n> +       int ret;\n>  \n>         cio2MediaDev_ = acquireMediaDevice(enumerator, cio2_dm);\n>         if (!cio2MediaDev_)\n> diff --git a/src/libcamera/pipeline/mali-c55/mali-c55.cpp b/src/libcamera/pipeline/mali-c55/mali-c55.cpp\n> index 76341ed3f..1d2d48d6d 100644\n> --- a/src/libcamera/pipeline/mali-c55/mali-c55.cpp\n> +++ b/src/libcamera/pipeline/mali-c55/mali-c55.cpp\n> @@ -1630,12 +1630,13 @@ bool PipelineHandlerMaliC55::match(DeviceEnumerator *enumerator)\n>          * The TPG and the downscale pipe are both optional blocks and may not\n>          * be fitted.\n>          */\n> -       DeviceMatch dm(\"mali-c55\");\n> -       dm.add(\"mali-c55 isp\");\n> -       dm.add(\"mali-c55 resizer fr\");\n> -       dm.add(\"mali-c55 fr\");\n> -       dm.add(\"mali-c55 3a stats\");\n> -       dm.add(\"mali-c55 3a params\");\n> +       static const DeviceMatch dm(\"mali-c55\", {\n> +               \"mali-c55 isp\",\n> +               \"mali-c55 resizer fr\",\n> +               \"mali-c55 fr\",\n> +               \"mali-c55 3a stats\",\n> +               \"mali-c55 3a params\",\n> +       });\n>  \n>         media_ = acquireMediaDevice(enumerator, dm);\n>         if (!media_)\n> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> index 81370f4cd..2dc396ed9 100644\n> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> @@ -1362,12 +1362,13 @@ int PipelineHandlerRkISP1::createCamera(MediaEntity *sensor)\n>  \n>  bool PipelineHandlerRkISP1::match(DeviceEnumerator *enumerator)\n>  {\n> -       DeviceMatch dm(\"rkisp1\");\n> -       dm.add(\"rkisp1_isp\");\n> -       dm.add(\"rkisp1_resizer_mainpath\");\n> -       dm.add(\"rkisp1_mainpath\");\n> -       dm.add(\"rkisp1_stats\");\n> -       dm.add(\"rkisp1_params\");\n> +       static const DeviceMatch dm(\"rkisp1\", {\n> +               \"rkisp1_isp\",\n> +               \"rkisp1_resizer_mainpath\",\n> +               \"rkisp1_mainpath\",\n> +               \"rkisp1_stats\",\n> +               \"rkisp1_params\",\n> +       });\n>  \n>         media_ = acquireMediaDevice(enumerator, dm);\n>         if (!media_)\n> @@ -1409,9 +1410,10 @@ bool PipelineHandlerRkISP1::match(DeviceEnumerator *enumerator)\n>         param_->bufferReady.connect(this, &PipelineHandlerRkISP1::paramBufferReady);\n>  \n>         /* If dewarper is present, create its instance. */\n> -       DeviceMatch dwp(\"dw100\");\n> -       dwp.add(\"dw100-source\");\n> -       dwp.add(\"dw100-sink\");\n> +       static const DeviceMatch dwp(\"dw100\", {\n> +               \"dw100-source\",\n> +               \"dw100-sink\",\n> +       });\n>  \n>         std::shared_ptr<MediaDevice> dwpMediaDevice = enumerator->search(dwp);\n>         if (dwpMediaDevice) {\n> diff --git a/src/libcamera/pipeline/rpi/pisp/pisp.cpp b/src/libcamera/pipeline/rpi/pisp/pisp.cpp\n> index 082724c5a..6f244c639 100644\n> --- a/src/libcamera/pipeline/rpi/pisp/pisp.cpp\n> +++ b/src/libcamera/pipeline/rpi/pisp/pisp.cpp\n> @@ -880,10 +880,12 @@ bool PipelineHandlerPiSP::match(DeviceEnumerator *enumerator)\n>          * device nodes due to a sensor subdevice failure.\n>          */\n>         for (unsigned int i = 0; i < numCfeDevices; i++) {\n> -               DeviceMatch cfe(\"rp1-cfe\");\n> -               cfe.add(\"rp1-cfe-fe-image0\");\n> -               cfe.add(\"rp1-cfe-fe-stats\");\n> -               cfe.add(\"rp1-cfe-fe-config\");\n> +               static const DeviceMatch cfe(\"rp1-cfe\", {\n> +                       \"rp1-cfe-fe-image0\",\n> +                       \"rp1-cfe-fe-stats\",\n> +                       \"rp1-cfe-fe-config\",\n> +               });\n> +\n>                 MediaDevice *cfeDevice = acquireMediaDevice(enumerator, cfe);\n>  \n>                 if (!cfeDevice) {\n> @@ -891,15 +893,17 @@ bool PipelineHandlerPiSP::match(DeviceEnumerator *enumerator)\n>                         break;\n>                 }\n>  \n> -               DeviceMatch isp(\"pispbe\");\n> -               isp.add(\"pispbe-input\");\n> -               isp.add(\"pispbe-config\");\n> -               isp.add(\"pispbe-output0\");\n> -               isp.add(\"pispbe-output1\");\n> -               isp.add(\"pispbe-tdn_output\");\n> -               isp.add(\"pispbe-tdn_input\");\n> -               isp.add(\"pispbe-stitch_output\");\n> -               isp.add(\"pispbe-stitch_input\");\n> +               static const DeviceMatch isp(\"pispbe\", {\n> +                       \"pispbe-input\",\n> +                       \"pispbe-config\",\n> +                       \"pispbe-output0\",\n> +                       \"pispbe-output1\",\n> +                       \"pispbe-tdn_output\",\n> +                       \"pispbe-tdn_input\",\n> +                       \"pispbe-stitch_output\",\n> +                       \"pispbe-stitch_input\",\n> +               });\n> +\n>                 MediaDevice *ispDevice = acquireMediaDevice(enumerator, isp);\n>  \n>                 if (!ispDevice) {\n> diff --git a/src/libcamera/pipeline/rpi/vc4/vc4.cpp b/src/libcamera/pipeline/rpi/vc4/vc4.cpp\n> index 99d43bd0a..7d9e141b3 100644\n> --- a/src/libcamera/pipeline/rpi/vc4/vc4.cpp\n> +++ b/src/libcamera/pipeline/rpi/vc4/vc4.cpp\n> @@ -172,7 +172,7 @@ bool PipelineHandlerVc4::match(DeviceEnumerator *enumerator)\n>          * device nodes due to a sensor subdevice failure.\n>          */\n>         for (unsigned int i = 0; i < numUnicamDevices; i++) {\n> -               DeviceMatch unicam(\"unicam\");\n> +               static const DeviceMatch unicam(\"unicam\");\n>                 MediaDevice *unicamDevice = acquireMediaDevice(enumerator, unicam);\n>  \n>                 if (!unicamDevice) {\n> @@ -180,7 +180,7 @@ bool PipelineHandlerVc4::match(DeviceEnumerator *enumerator)\n>                         continue;\n>                 }\n>  \n> -               DeviceMatch isp(\"bcm2835-isp\");\n> +               static const DeviceMatch isp(\"bcm2835-isp\");\n>                 MediaDevice *ispDevice = acquireMediaDevice(enumerator, isp);\n>  \n>                 if (!ispDevice) {\n> diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> index 4b5816dfd..fffbbcd2b 100644\n> --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> @@ -466,8 +466,8 @@ int PipelineHandlerUVC::queueRequestDevice(Camera *camera, Request *request)\n>  \n>  bool PipelineHandlerUVC::match(DeviceEnumerator *enumerator)\n>  {\n> +       static const DeviceMatch dm(\"uvcvideo\");\n>         MediaDevice *media;\n> -       DeviceMatch dm(\"uvcvideo\");\n>  \n>         media = acquireMediaDevice(enumerator, dm);\n>         if (!media)\n> diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp\n> index 07273bd2b..b28a23a13 100644\n> --- a/src/libcamera/pipeline/vimc/vimc.cpp\n> +++ b/src/libcamera/pipeline/vimc/vimc.cpp\n> @@ -464,17 +464,17 @@ int PipelineHandlerVimc::queueRequestDevice(Camera *camera, Request *request)\n>  \n>  bool PipelineHandlerVimc::match(DeviceEnumerator *enumerator)\n>  {\n> -       DeviceMatch dm(\"vimc\");\n> -\n> -       dm.add(\"Raw Capture 0\");\n> -       dm.add(\"Raw Capture 1\");\n> -       dm.add(\"RGB/YUV Capture\");\n> -       dm.add(\"Sensor A\");\n> -       dm.add(\"Sensor B\");\n> -       dm.add(\"Debayer A\");\n> -       dm.add(\"Debayer B\");\n> -       dm.add(\"RGB/YUV Input\");\n> -       dm.add(\"Scaler\");\n> +       static const DeviceMatch dm(\"vimc\", {\n> +               \"Raw Capture 0\",\n> +               \"Raw Capture 1\",\n> +               \"RGB/YUV Capture\",\n> +               \"Sensor A\",\n> +               \"Sensor B\",\n> +               \"Debayer A\",\n> +               \"Debayer B\",\n> +               \"RGB/YUV Input\",\n> +               \"Scaler\",\n> +       });\n>  \n>         MediaDevice *media = acquireMediaDevice(enumerator, dm);\n>         if (!media)\n> diff --git a/test/camera-sensor.cpp b/test/camera-sensor.cpp\n> index c30a2212e..77d6cf741 100644\n> --- a/test/camera-sensor.cpp\n> +++ b/test/camera-sensor.cpp\n> @@ -39,7 +39,7 @@ protected:\n>                         return TestFail;\n>                 }\n>  \n> -               DeviceMatch dm(\"vimc\");\n> +               static const DeviceMatch dm(\"vimc\");\n>                 media_ = enumerator_->search(dm);\n>                 if (!media_) {\n>                         cerr << \"Unable to find \\'vimc\\' media device node\" << endl;\n> diff --git a/test/delayed_controls.cpp b/test/delayed_controls.cpp\n> index 7bd30e7ae..4c6d7e226 100644\n> --- a/test/delayed_controls.cpp\n> +++ b/test/delayed_controls.cpp\n> @@ -38,8 +38,9 @@ protected:\n>                         return TestFail;\n>                 }\n>  \n> -               DeviceMatch dm(\"vivid\");\n> -               dm.add(\"vivid-000-vid-cap\");\n> +               static const DeviceMatch dm(\"vivid\", {\n> +                       \"vivid-000-vid-cap\",\n> +               });\n>  \n>                 media_ = enumerator_->search(dm);\n>                 if (!media_) {\n> diff --git a/test/libtest/buffer_source.cpp b/test/libtest/buffer_source.cpp\n> index dde11f365..52bae498d 100644\n> --- a/test/libtest/buffer_source.cpp\n> +++ b/test/libtest/buffer_source.cpp\n> @@ -29,7 +29,7 @@ BufferSource::~BufferSource()\n>  int BufferSource::allocate(const StreamConfiguration &config)\n>  {\n>         /* Locate and open the video device. */\n> -       std::string videoDeviceName = \"vivid-000-vid-out\";\n> +       static const std::string videoDeviceName = \"vivid-000-vid-out\";\n>  \n>         std::unique_ptr<DeviceEnumerator> enumerator =\n>                 DeviceEnumerator::create();\n> @@ -43,8 +43,9 @@ int BufferSource::allocate(const StreamConfiguration &config)\n>                 return TestFail;\n>         }\n>  \n> -       DeviceMatch dm(\"vivid\");\n> -       dm.add(videoDeviceName);\n> +       static const DeviceMatch dm(\"vivid\", {\n> +               videoDeviceName,\n> +       });\n>  \n>         media_ = enumerator->search(dm);\n>         if (!media_) {\n> diff --git a/test/media_device/media_device_test.cpp b/test/media_device/media_device_test.cpp\n> index 3e41d0f04..286580450 100644\n> --- a/test/media_device/media_device_test.cpp\n> +++ b/test/media_device/media_device_test.cpp\n> @@ -25,7 +25,7 @@ int MediaDeviceTest::init()\n>                 return TestFail;\n>         }\n>  \n> -       DeviceMatch dm(\"vimc\");\n> +       static const DeviceMatch dm(\"vimc\");\n>         media_ = enumerator_->search(dm);\n>         if (!media_) {\n>                 cerr << \"No VIMC media device found: skip test\" << endl;\n> diff --git a/test/v4l2_subdevice/v4l2_subdevice_test.cpp b/test/v4l2_subdevice/v4l2_subdevice_test.cpp\n> index c349c9e31..109965b4d 100644\n> --- a/test/v4l2_subdevice/v4l2_subdevice_test.cpp\n> +++ b/test/v4l2_subdevice/v4l2_subdevice_test.cpp\n> @@ -39,7 +39,7 @@ int V4L2SubdeviceTest::init()\n>                 return TestFail;\n>         }\n>  \n> -       DeviceMatch dm(\"vimc\");\n> +       static const DeviceMatch dm(\"vimc\");\n>         media_ = enumerator_->search(dm);\n>         if (!media_) {\n>                 cerr << \"Unable to find \\'vimc\\' media device node\" << endl;\n> diff --git a/test/v4l2_videodevice/v4l2_m2mdevice.cpp b/test/v4l2_videodevice/v4l2_m2mdevice.cpp\n> index c45f581a8..36a3e3201 100644\n> --- a/test/v4l2_videodevice/v4l2_m2mdevice.cpp\n> +++ b/test/v4l2_videodevice/v4l2_m2mdevice.cpp\n> @@ -65,9 +65,10 @@ protected:\n>                         return TestFail;\n>                 }\n>  \n> -               DeviceMatch dm(\"vim2m\");\n> -               dm.add(\"vim2m-source\");\n> -               dm.add(\"vim2m-sink\");\n> +               static const DeviceMatch dm(\"vim2m\", {\n> +                       \"vim2m-source\",\n> +                       \"vim2m-sink\",\n> +               });\n>  \n>                 media_ = enumerator_->search(dm);\n>                 if (!media_) {\n> -- \n> 2.50.1\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 3E550BD87C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSat, 30 Aug 2025 05:34:09 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 7B61969321;\n\tSat, 30 Aug 2025 07:34:08 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 996D0613AD\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat, 30 Aug 2025 07:34:06 +0200 (CEST)","from neptunite.rasen.tech (unknown\n\t[IPv6:2404:7a81:160:2100:675b:5305:1ae:ae0d])\n\tby perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id 5FE6818B9; \n\tSat, 30 Aug 2025 07:33:00 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"K0hpob5X\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1756531980;\n\tbh=/FTP/7jJKKk3IxmFDleNeGBoG8uhD5sOVIFVZT8C3w8=;\n\th=In-Reply-To:References:Subject:From:To:Date:From;\n\tb=K0hpob5XBd+4HAO5KondQpdcklD55WboVQ2xZItHCh9q1oH9yoxloWEfQuqhQXVkz\n\tbBYUU41Y4vJqCSFhh8qYh0Bvlw0xTByMw/UQIyGpao2NtDH3Cp6Qjhwop+/HVB7Ife\n\tOIy88SZ7a9rlugP8DL/okdEhTRzliCJWHE2R+rFo=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20250815135253.2231076-2-barnabas.pocze@ideasonboard.com>","References":"<20250815135253.2231076-1-barnabas.pocze@ideasonboard.com>\n\t<20250815135253.2231076-2-barnabas.pocze@ideasonboard.com>","Subject":"Re: [RFC PATCH v1 2/2] libcamera: pipeline: Construct `DeviceMatch`\n\tonce","From":"Paul Elder <paul.elder@ideasonboard.com>","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Sat, 30 Aug 2025 14:34:00 +0900","Message-ID":"<175653204032.3397211.1972583878851257684@neptunite.rasen.tech>","User-Agent":"alot/0.0.0","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]