[{"id":38679,"web_url":"https://patchwork.libcamera.org/comment/38679/","msgid":"<f8dcf083-e97b-42bd-bcdb-92a8cbd2f8a9@oss.qualcomm.com>","date":"2026-04-30T14:28:35","subject":"Re: [RFC PATCH v2 02/14] libcamera: software_isp: Introduce\n\targuments for parameters buffers","submitter":{"id":242,"url":"https://patchwork.libcamera.org/api/people/242/","name":"Hans de Goede","email":"johannes.goede@oss.qualcomm.com"},"content":"Hi Milan,\n\nOn 16-Feb-26 9:30 PM, Milan Zamazal wrote:\n> Processing parameters in software ISP are currently passed by value.\n> This is unlike hardware pipelines, which use a ring of buffers for the\n> purpose and pass references to the buffers currently selected from the\n> ring rather than passing the whole parameters buffers.\n> \n> This is a preparatory patch to introduce a similar mechanism in software\n> ISP, in order to resolve TODO #5.  It adds a new argument paramsBufferId\n> for the future parameters buffer ids passed to the calls.  The buffer\n> ids must be passed to the following groups of methods:\n> \n> - IPASoftSimple::prepare, in order to create the parameters in the given\n>   buffer for the corresponding frame processing.\n> \n> - SoftwareIsp::saveParams, in order to signal that the parameters are\n>   set by the IPA.\n> \n> - Debayer::process, in order to get the buffer with the processing\n>   parameters.\n> \n> - SoftwareIsp::releaseIspParams, in order to signal that the selected\n>   parameters buffer from the ring is no longer needed for the given\n>   frame and can be reused.  This is a newly introduced signal.\n> \n> The type of the buffer id parameter is set to uint32_t because:\n> \n> - It can be used in mojom.\n> - It is consistent with the similar types in the hardware pipelines.\n> - It covers file descriptor number range, which will be used as buffer\n>   ids (more on this in followup patches).\n> \n> This patch doesn't do more than adding the arguments, to keep the patch\n> simple.  The buffer handling will be implemented in the followup\n> patches.\n> \n> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n> ---\n>  .../libcamera/internal/software_isp/software_isp.h  |  3 ++-\n>  include/libcamera/ipa/soft.mojom                    |  4 ++--\n>  src/ipa/simple/soft_simple.cpp                      |  9 ++++++---\n>  src/libcamera/software_isp/debayer.cpp              |  6 +++++-\n>  src/libcamera/software_isp/debayer.h                |  6 +++++-\n>  src/libcamera/software_isp/debayer_cpu.cpp          |  6 +++++-\n>  src/libcamera/software_isp/debayer_cpu.h            |  4 +++-\n>  src/libcamera/software_isp/debayer_egl.cpp          |  5 ++++-\n>  src/libcamera/software_isp/debayer_egl.h            |  4 +++-\n>  src/libcamera/software_isp/software_isp.cpp         | 13 ++++++++++---\n>  10 files changed, 45 insertions(+), 15 deletions(-)\n> \n> diff --git a/include/libcamera/internal/software_isp/software_isp.h b/include/libcamera/internal/software_isp/software_isp.h\n> index 2ec14a3c7..30b25cddf 100644\n> --- a/include/libcamera/internal/software_isp/software_isp.h\n> +++ b/include/libcamera/internal/software_isp/software_isp.h\n> @@ -88,7 +88,8 @@ public:\n>  \tSignal<const ControlList &> setSensorControls;\n>  \n>  private:\n> -\tvoid saveIspParams();\n> +\tvoid saveIspParams(uint32_t paramsBufferId);\n> +\tvoid releaseIspParams(uint32_t paramsBufferId);\n\nThis addition of release IspParams seems unnecessary ?\n\n>  \tvoid setSensorCtrls(const ControlList &sensorControls);\n>  \tvoid statsReady(uint32_t frame, uint32_t bufferId);\n>  \tvoid inputReady(FrameBuffer *input);\n> diff --git a/include/libcamera/ipa/soft.mojom b/include/libcamera/ipa/soft.mojom\n> index 77328c5fd..f37c1e747 100644\n> --- a/include/libcamera/ipa/soft.mojom\n> +++ b/include/libcamera/ipa/soft.mojom\n> @@ -25,7 +25,7 @@ interface IPASoftInterface {\n>  \t\t=> (int32 ret);\n>  \n>  \t[async] queueRequest(uint32 frame, libcamera.ControlList sensorControls);\n> -\t[async] computeParams(uint32 frame);\n> +\t[async] computeParams(uint32 frame, uint32 paramsBufferId);\n>  \t[async] processStats(uint32 frame,\n>  \t\t\t     uint32 bufferId,\n>  \t\t\t     libcamera.ControlList sensorControls);\n> @@ -33,6 +33,6 @@ interface IPASoftInterface {\n>  \n>  interface IPASoftEventInterface {\n>  \tsetSensorControls(libcamera.ControlList sensorControls);\n> -\tsetIspParams();\n> +\tsetIspParams(uint32 paramsBufferId);\n\nOther IPAs call this paramsComputed. Also the parameter typically\nis a frame number, not the paramsBufferId, since most pipeline-handlers\ntrack there active requests and there associated buffers by frame/requester\nnumber.\n\nRegards,\n\nHans\n\n\n\n>  \tmetadataReady(uint32 frame, libcamera.ControlList metadata);\n>  };\n> diff --git a/src/ipa/simple/soft_simple.cpp b/src/ipa/simple/soft_simple.cpp\n> index 6bef597c8..1e8b5334c 100644\n> --- a/src/ipa/simple/soft_simple.cpp\n> +++ b/src/ipa/simple/soft_simple.cpp\n> @@ -64,7 +64,9 @@ public:\n>  \tvoid stop() override;\n>  \n>  \tvoid queueRequest(const uint32_t frame, const ControlList &controls) override;\n> -\tvoid computeParams(const uint32_t frame) override;\n> +\tvoid computeParams(const uint32_t frame,\n> +\t\t\t   const uint32_t\n> +\t\t\t\t   paramsBufferId) override;\n>  \tvoid processStats(const uint32_t frame, const uint32_t bufferId,\n>  \t\t\t  const ControlList &sensorControls) override;\n>  \n> @@ -283,7 +285,8 @@ void IPASoftSimple::queueRequest(const uint32_t frame, const ControlList &contro\n>  \t\talgo->queueRequest(context_, frame, frameContext, controls);\n>  }\n>  \n> -void IPASoftSimple::computeParams(const uint32_t frame)\n> +void IPASoftSimple::computeParams(const uint32_t frame,\n> +\t\t\t\t  const uint32_t paramsBufferId)\n>  {\n>  \tcontext_.activeState.combinedMatrix = Matrix<float, 3, 3>::identity();\n>  \n> @@ -292,7 +295,7 @@ void IPASoftSimple::computeParams(const uint32_t frame)\n>  \t\talgo->prepare(context_, frame, frameContext, params_);\n>  \tparams_->combinedMatrix = context_.activeState.combinedMatrix;\n>  \n> -\tsetIspParams.emit();\n> +\tsetIspParams.emit(paramsBufferId);\n>  }\n>  \n>  void IPASoftSimple::processStats(const uint32_t frame,\n> diff --git a/src/libcamera/software_isp/debayer.cpp b/src/libcamera/software_isp/debayer.cpp\n> index dccdd86b4..e2e294d3e 100644\n> --- a/src/libcamera/software_isp/debayer.cpp\n> +++ b/src/libcamera/software_isp/debayer.cpp\n> @@ -105,9 +105,10 @@ Debayer::~Debayer()\n>   */\n>  \n>  /**\n> - * \\fn void Debayer::process(uint32_t frame, FrameBuffer *input, FrameBuffer *output, DebayerParams params)\n> + * \\fn void Debayer::process(uint32_t frame, const uint32_t paramsBufferId, FrameBuffer *input, FrameBuffer *output, DebayerParams params)\n>   * \\brief Process the bayer data into the requested format\n>   * \\param[in] frame The frame number\n> + * \\param[in] paramsBufferId The id of the params buffer in use\n>   * \\param[in] input The input buffer\n>   * \\param[in] output The output buffer\n>   * \\param[in] params The parameters to be used in debayering\n> @@ -176,6 +177,9 @@ Debayer::~Debayer()\n>   *\n>   * \\var Debayer::DebayerInputConfig::outputFormats\n>   * List of pixel formats supported as output for this input configuration.\n> + *\n> + * \\var Signal<uint32_t> Debayer::releaseIspParams\n> + * \\brief Signals when the processing params are no longer needed\n>   */\n>  \n>  /**\n> diff --git a/src/libcamera/software_isp/debayer.h b/src/libcamera/software_isp/debayer.h\n> index ce9350b7b..0c9627d30 100644\n> --- a/src/libcamera/software_isp/debayer.h\n> +++ b/src/libcamera/software_isp/debayer.h\n> @@ -47,7 +47,10 @@ public:\n>  \tvirtual std::tuple<unsigned int, unsigned int>\n>  \tstrideAndFrameSize(const PixelFormat &outputFormat, const Size &size) = 0;\n>  \n> -\tvirtual void process(uint32_t frame, FrameBuffer *input, FrameBuffer *output, const DebayerParams &params) = 0;\n> +\tvirtual void process(uint32_t frame,\n> +\t\t\t     const uint32_t paramsBufferId,\n> +\t\t\t     FrameBuffer *input, FrameBuffer *output,\n> +\t\t\t     const DebayerParams &params) = 0;\n>  \tvirtual int start() { return 0; }\n>  \tvirtual void stop() {}\n>  \n> @@ -59,6 +62,7 @@ public:\n>  \n>  \tSignal<FrameBuffer *> inputBufferReady;\n>  \tSignal<FrameBuffer *> outputBufferReady;\n> +\tSignal<uint32_t> releaseIspParams;\n>  \n>  \tstruct DebayerInputConfig {\n>  \t\tSize patternSize;\n> diff --git a/src/libcamera/software_isp/debayer_cpu.cpp b/src/libcamera/software_isp/debayer_cpu.cpp\n> index d09883577..5d0e780f7 100644\n> --- a/src/libcamera/software_isp/debayer_cpu.cpp\n> +++ b/src/libcamera/software_isp/debayer_cpu.cpp\n> @@ -842,7 +842,9 @@ void DebayerCpu::updateLookupTables(const DebayerParams &params)\n>  \tparams_ = params;\n>  }\n>  \n> -void DebayerCpu::process(uint32_t frame, FrameBuffer *input, FrameBuffer *output, const DebayerParams &params)\n> +void DebayerCpu::process(uint32_t frame, const uint32_t paramsBufferId,\n> +\t\t\t FrameBuffer *input, FrameBuffer *output,\n> +\t\t\t const DebayerParams &params)\n>  {\n>  \tbench_.startFrame();\n>  \n> @@ -852,6 +854,8 @@ void DebayerCpu::process(uint32_t frame, FrameBuffer *input, FrameBuffer *output\n>  \n>  \tupdateLookupTables(params);\n>  \n> +\treleaseIspParams.emit(paramsBufferId);\n> +\n>  \t/* Copy metadata from the input buffer */\n>  \tFrameMetadata &metadata = output->_d()->metadata();\n>  \tmetadata.status = input->metadata().status;\n> diff --git a/src/libcamera/software_isp/debayer_cpu.h b/src/libcamera/software_isp/debayer_cpu.h\n> index 7a6517462..13253f999 100644\n> --- a/src/libcamera/software_isp/debayer_cpu.h\n> +++ b/src/libcamera/software_isp/debayer_cpu.h\n> @@ -39,7 +39,9 @@ public:\n>  \tstd::vector<PixelFormat> formats(PixelFormat input);\n>  \tstd::tuple<unsigned int, unsigned int>\n>  \tstrideAndFrameSize(const PixelFormat &outputFormat, const Size &size);\n> -\tvoid process(uint32_t frame, FrameBuffer *input, FrameBuffer *output, const DebayerParams &params);\n> +\tvoid process(uint32_t frame,\n> +\t\t     const uint32_t paramsBufferId,\n> +\t\t     FrameBuffer *input, FrameBuffer *output, const DebayerParams &params);\n>  \tSizeRange sizes(PixelFormat inputFormat, const Size &inputSize);\n>  \tconst SharedFD &getStatsFD() { return stats_->getStatsFD(); }\n>  \n> diff --git a/src/libcamera/software_isp/debayer_egl.cpp b/src/libcamera/software_isp/debayer_egl.cpp\n> index 93f7c6946..947c05c07 100644\n> --- a/src/libcamera/software_isp/debayer_egl.cpp\n> +++ b/src/libcamera/software_isp/debayer_egl.cpp\n> @@ -533,7 +533,9 @@ int DebayerEGL::debayerGPU(MappedFrameBuffer &in, int out_fd, const DebayerParam\n>  \treturn 0;\n>  }\n>  \n> -void DebayerEGL::process(uint32_t frame, FrameBuffer *input, FrameBuffer *output, const DebayerParams &params)\n> +void DebayerEGL::process(uint32_t frame, const uint32_t paramsBufferId,\n> +\t\t\t FrameBuffer *input, FrameBuffer *output,\n> +\t\t\t const DebayerParams &params)\n>  {\n>  \tbench_.startFrame();\n>  \n> @@ -557,6 +559,7 @@ void DebayerEGL::process(uint32_t frame, FrameBuffer *input, FrameBuffer *output\n>  \t\tLOG(Debayer, Error) << \"debayerGPU failed\";\n>  \t\tgoto error;\n>  \t}\n> +\treleaseIspParams.emit(paramsBufferId);\n>  \n>  \tbench_.finishFrame();\n>  \n> diff --git a/src/libcamera/software_isp/debayer_egl.h b/src/libcamera/software_isp/debayer_egl.h\n> index 59aebcc81..7f29f53e6 100644\n> --- a/src/libcamera/software_isp/debayer_egl.h\n> +++ b/src/libcamera/software_isp/debayer_egl.h\n> @@ -50,7 +50,9 @@ public:\n>  \tstd::vector<PixelFormat> formats(PixelFormat input);\n>  \tstd::tuple<unsigned int, unsigned int> strideAndFrameSize(const PixelFormat &outputFormat, const Size &size);\n>  \n> -\tvoid process(uint32_t frame, FrameBuffer *input, FrameBuffer *output, const DebayerParams &params);\n> +\tvoid process(uint32_t frame, const uint32_t paramsBufferId,\n> +\t\t     FrameBuffer *input, FrameBuffer *output,\n> +\t\t     const DebayerParams &params);\n>  \tint start();\n>  \tvoid stop();\n>  \n> diff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp\n> index a83986b78..0447d2171 100644\n> --- a/src/libcamera/software_isp/software_isp.cpp\n> +++ b/src/libcamera/software_isp/software_isp.cpp\n> @@ -123,6 +123,7 @@ SoftwareIsp::SoftwareIsp(PipelineHandler *pipe, const CameraSensor *sensor,\n>  \n>  \tdebayer_->inputBufferReady.connect(this, &SoftwareIsp::inputReady);\n>  \tdebayer_->outputBufferReady.connect(this, &SoftwareIsp::outputReady);\n> +\tdebayer_->releaseIspParams.connect(this, &SoftwareIsp::releaseIspParams);\n>  \n>  \tipa_ = IPAManager::createIPA<ipa::soft::IPAProxySoft>(pipe, 0, 0);\n>  \tif (!ipa_) {\n> @@ -396,16 +397,22 @@ void SoftwareIsp::stop()\n>   */\n>  void SoftwareIsp::process(uint32_t frame, FrameBuffer *input, FrameBuffer *output)\n>  {\n> -\tipa_->computeParams(frame);\n> +\t/* \\todo Provide a real value */\n> +\tconstexpr uint32_t paramsBufferId = 0;\n> +\tipa_->computeParams(frame, paramsBufferId);\n>  \tdebayer_->invokeMethod(&Debayer::process,\n> -\t\t\t       ConnectionTypeQueued, frame, input, output, debayerParams_);\n> +\t\t\t       ConnectionTypeQueued, frame, paramsBufferId, input, output, debayerParams_);\n>  }\n>  \n> -void SoftwareIsp::saveIspParams()\n> +void SoftwareIsp::saveIspParams([[maybe_unused]] uint32_t paramsBufferId)\n>  {\n>  \tdebayerParams_ = *sharedParams_;\n>  }\n>  \n> +void SoftwareIsp::releaseIspParams([[maybe_unused]] uint32_t paramsBufferId)\n> +{\n> +}\n> +\n>  void SoftwareIsp::setSensorCtrls(const ControlList &sensorControls)\n>  {\n>  \tsetSensorControls.emit(sensorControls);","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 7C919BDCB5\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 30 Apr 2026 14:28:41 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id AC24862FE7;\n\tThu, 30 Apr 2026 16:28:40 +0200 (CEST)","from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com\n\t[205.220.180.131])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 982D562FC8\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 30 Apr 2026 16:28:39 +0200 (CEST)","from pps.filterd (m0279871.ppops.net [127.0.0.1])\n\tby mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id\n\t63UAN6RI914223 for <libcamera-devel@lists.libcamera.org>;\n\tThu, 30 Apr 2026 14:28:38 GMT","from mail-vk1-f199.google.com (mail-vk1-f199.google.com\n\t[209.85.221.199])\n\tby mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4duv3xb7py-1\n\t(version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT)\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 30 Apr 2026 14:28:38 +0000 (GMT)","by mail-vk1-f199.google.com with SMTP id\n\t71dfb90a1353d-5738ad13968so1963997e0c.3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 30 Apr 2026 07:28:38 -0700 (PDT)","from ?IPV6:2001:1c00:2a07:3a01:8e96:3679:b9c:de47?\n\t(2001-1c00-2a07-3a01-8e96-3679-0b9c-de47.cable.dynamic.v6.ziggo.nl.\n\t[2001:1c00:2a07:3a01:8e96:3679:b9c:de47])\n\tby smtp.gmail.com with ESMTPSA id\n\ta640c23a62f3a-bbe6a64d919sm1387566b.23.2026.04.30.07.28.35\n\t(version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);\n\tThu, 30 Apr 2026 07:28:35 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=qualcomm.com header.i=@qualcomm.com\n\theader.b=\"FRC0vV4R\"; dkim=pass (2048-bit key;\n\tunprotected) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com\n\theader.b=\"T/0kcrSL\"; dkim-atps=neutral","DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h=\n\tcontent-transfer-encoding:content-type:date:from:in-reply-to\n\t:message-id:mime-version:references:subject:to; s=qcppdkim1; bh=\n\t+8HJJARBKy8fVw8Z21v1bCiKy8F9lVmPO85BTfDS7eo=; b=FRC0vV4RQvnMRKR/\n\twmvhOAxMapoceW6v54gGN1kp+J5pKTOBhYbSpTqM4c2xb7cllUID1lDv+EgfuO2U\n\tm7JArOeo53Tn7xpzlb2qY8FhImSO4W9+WalimesNabU0wkKmy4bSyz9GpjI7fZ2y\n\tICUm5OsvCifplLfAFnKeoiC5rdMJSQh5gzkoD5lwCjk4nw9X3CjxJutkiHQGVClh\n\tpMneoQsOZrGRDvMaDdFhtFofrOnOKaOggixVqFj70y0oXu6sMQbFxq9/Ijj2qryH\n\tQs0wMEHsZr0pHJw2DeRbc2KTPFpyparTEeYEZMnG7TJEGQx1usvfbMQwUNmQK05t\n\t4q0I/Q==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=oss.qualcomm.com; s=google; t=1777559317; x=1778164117;\n\tdarn=lists.libcamera.org; \n\th=content-transfer-encoding:in-reply-to:content-language:references\n\t:to:subject:from:user-agent:mime-version:date:message-id:from:to:cc\n\t:subject:date:message-id:reply-to;\n\tbh=+8HJJARBKy8fVw8Z21v1bCiKy8F9lVmPO85BTfDS7eo=;\n\tb=T/0kcrSLD3n/vZoA8Dl9bVqu9ynsDC4TAMLNGSS6E6FGfqTiWCHD1Qy0F83iZZKYct\n\taZGBybS41WNSfmJndWv3qwm1UBRYibE5Mule0jeujgA8HB5IgI2500z4IZdYdid2cZX3\n\tnCnaRifcm0EYup3OL8Z5sbPUyJ5sFUjb7RO4NBMbDxtBI6f1X/olUsaUA7DdqpLlEG11\n\tDNT0dxCoNws7F9JTZpEGkffcN1AWHg7AKoVx2ZSF8eYxupd4UPQSdM8GSZu2q5ek/RHO\n\tCqIIKIaCJZM2WLmJ52u09GFIq+rZZXr9aeNmNA/zX41pXgrA46lVI0GIVxD1qc6TBiAg\n\tesjg=="],"X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20251104; t=1777559317; x=1778164117;\n\th=content-transfer-encoding:in-reply-to:content-language:references\n\t:to:subject:from:user-agent:mime-version:date:message-id:x-gm-gg\n\t:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;\n\tbh=+8HJJARBKy8fVw8Z21v1bCiKy8F9lVmPO85BTfDS7eo=;\n\tb=DyLnYh28IIZ2YZW24PmD3fgD3vQyjxajVf1PQw8VwVt5bsAIv4ueVqKiWwljoIAFIe\n\t0rp+CcpnY/voeyFmokVvaDDVoCaKRifPWmicjcM1nhUygFq8Fbqf0yc+2DTYzpmC7YG/\n\tKWxUs1JkVfyw+Mb/q2qCBMH6DgCaKJts/J5UcN50DOec0wCAuOzTESIkFRE/OiopvJDD\n\tjr+BfBxndI3/yP4jVh0c8t9CQ93LSFphfRrX7T9LehW5Zq+RT4yfPUa4exudLrYFKfpH\n\tfWSC/ZgjE7+t4z9EMjj7ogiDT+1b2dEdLzhV+MFUtHMHDhG3i8HvuQlGfytyNx8fnF1J\n\tPoTg==","X-Forwarded-Encrypted":"i=1;\n\tAFNElJ/3A6kmhzo4h8z9wkJviYUvIbvb04tPbqyl4drVVR0ww+98pz01alfJJmspZSFpl6azmAJMVpjTwf8NSPmbkT4=@lists.libcamera.org","X-Gm-Message-State":"AOJu0YwrLLrlH9f2yvgemTcrlixDmRfkCgzh0qFEQWWyaasmKDSD80xG\n\tRbCwHSSq8rmqwcI2c5tayn208+fW/D5pS/YPbdVZ4WyAMB7j1D7Ph/QHfIY1TYaj7FN25nYdRRB\n\t1u0k1t+F/PTF+vwWGDeSxNG5BV5ltHPRnsHvwX+o0kTIm+mSVtaZRtPHo1+7sSXcTVSpo5bvMWt\n\twK","X-Gm-Gg":"AeBDieswXjbnnO7Y4Y9/rptYojSi9ZMJFlqbgHXr8ki7u0mA654dKszuVWMUTLNEYC7\n\tWdOyIXsrvhnggvQa7B7+jolEteowthgwwpye3dtxS8xVHU2DxjoGC4nfqXul4nFsCXa13jZIPLI\n\tiSfyCt/1hczwNJu5sC3SOlUnn4sinms8tPqRpfAsXESwJijQkaUjk7WS3KRlFR69EjqNW3fY5wI\n\tmaaL3f244+bQ3TrMvSgFdP0Lmy5VkOj/v2amvmeJ0feLDLrTN+yEWb/T1TSwUfUDmbsRUQ3tzrp\n\tgAwFMTQjpqYlLY550jg3H/rw9LbOOwqkhr6kXe6icpC0hmmgfU4HfIlBDBalmyqAftvHLf7VwHA\n\tvYfrf3aEL6BJRkvRbY4kjcjIbZeU25y1npg81wzHEpYZJ0/SVqhAqxFn9adIRXh2mm1+N0ISqIo\n\tUEDO7/3xzw74v38kLRMd252F2QMxO/5HxGLHTmwpdeDMakuXH2UbjxWGEr7r7rMzDYCjjyFvgmm\n\tGuKzXuNzBUvrb9kcveo1j2GcTo=","X-Received":["by 2002:a05:6122:180c:b0:56d:8ded:796c with SMTP id\n\t71dfb90a1353d-573c95cf574mr1464941e0c.4.1777559317429; \n\tThu, 30 Apr 2026 07:28:37 -0700 (PDT)","by 2002:a05:6122:180c:b0:56d:8ded:796c with SMTP id\n\t71dfb90a1353d-573c95cf574mr1464872e0c.4.1777559316867; \n\tThu, 30 Apr 2026 07:28:36 -0700 (PDT)"],"Message-ID":"<f8dcf083-e97b-42bd-bcdb-92a8cbd2f8a9@oss.qualcomm.com>","Date":"Thu, 30 Apr 2026 16:28:35 +0200","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","From":"johannes.goede@oss.qualcomm.com","Subject":"Re: [RFC PATCH v2 02/14] libcamera: software_isp: Introduce\n\targuments for parameters buffers","To":"Milan Zamazal <mzamazal@redhat.com>, libcamera-devel@lists.libcamera.org","References":"<20260216203034.27558-1-mzamazal@redhat.com>\n\t<20260216203034.27558-3-mzamazal@redhat.com>","Content-Language":"en-US, nl","In-Reply-To":"<20260216203034.27558-3-mzamazal@redhat.com>","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"7bit","X-Proofpoint-Spam-Details-Enc":"AW1haW4tMjYwNDMwMDE0OCBTYWx0ZWRfX/CLDLrtAeg+B\n\t53ak/ODK9Viwd1376Ry6aNNjCuxpCb3/9hNOMoLOVQpX7le9iIYvnEp15YM8rr7/cvJrk15Ypoi\n\tm1WcA0BAAHQZdPzZe3H97meuw+2HT4QS+eS11ZXskZOvb8ja78BHSORmOR9DdFMQktBBobBWhE+\n\tp7yo4B/waU67bK97umFaDw3fOhOUqonsyo/ljiHzrbUXhFYw4/yvKR6RctUSDhHdLp4s7TTGiIb\n\tMi7XnPboqmpD56oQmChBQpIcSaZpwLdmFJo3rxLmL5WkcxbnmGRCETOEUfOoF10To6brwG329fT\n\tSvbkGNbX4p+UoGEFIKK+oIniW3xQo4JDR6xceqvgn2gOOFQ5M06TKQ2I5hIZCt1KHhzSK1fNtBM\n\tfT846IFQRpL4krCwdbqMEVUbPeQIGLIE3+PghY4mHph1G6VJTKR1vB8ChD+cnrm5NcED+D3cseT\n\tWm0JFKpeQFoOWhcFyXQ==","X-Authority-Analysis":"v=2.4 cv=Oc2oyBTY c=1 sm=1 tr=0 ts=69f36716 cx=c_pps\n\ta=+D9SDfe9YZWTjADjLiQY5g==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10\n\ta=A5OVakUREuEA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22\n\ta=u7WPNUs3qKkmUXheDGA7:22 a=3WHJM1ZQz_JShphwDgj5:22 a=20KFwNOVAAAA:8\n\ta=R_HhwDPnfE5ApSDlf8wA:9 a=QEXdDO2ut3YA:10 a=vmgOmaN-Xu0dpDh8OwbV:22","X-Proofpoint-GUID":"zZoVqRCM9RfqtdELVPvS-690Y93UpSAP","X-Proofpoint-ORIG-GUID":"zZoVqRCM9RfqtdELVPvS-690Y93UpSAP","X-Proofpoint-Virus-Version":"vendor=baseguard\n\tengine=ICAP:2.0.293, Aquarius:18.0.1143, Hydra:6.1.51,\n\tFMLib:17.12.100.49\n\tdefinitions=2026-04-30_04,2026-04-30_02,2025-10-01_01","X-Proofpoint-Spam-Details":"rule=outbound_notspam policy=outbound score=0\n\tclxscore=1015 spamscore=0 lowpriorityscore=0 phishscore=0\n\tsuspectscore=0\n\timpostorscore=0 bulkscore=0 malwarescore=0 priorityscore=1501\n\tadultscore=0\n\tclassifier=typeunknown authscore=0 authtc= authcc= route=outbound\n\tadjust=0\n\treason=mlx scancount=1 engine=8.22.0-2604200000\n\tdefinitions=main-2604300148","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>"}},{"id":38906,"web_url":"https://patchwork.libcamera.org/comment/38906/","msgid":"<85ik8o4tg5.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","date":"2026-05-15T14:51:22","subject":"Re: [RFC PATCH v2 02/14] libcamera: software_isp: Introduce\n\targuments for parameters buffers","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/people/177/","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"content":"Hi Hans,\n\njohannes.goede@oss.qualcomm.com writes:\n\n> Hi Milan,\n>\n> On 16-Feb-26 9:30 PM, Milan Zamazal wrote:\n>> Processing parameters in software ISP are currently passed by value.\n>> This is unlike hardware pipelines, which use a ring of buffers for the\n>> purpose and pass references to the buffers currently selected from the\n>> ring rather than passing the whole parameters buffers.\n>> \n>> This is a preparatory patch to introduce a similar mechanism in software\n>> ISP, in order to resolve TODO #5.  It adds a new argument paramsBufferId\n>> for the future parameters buffer ids passed to the calls.  The buffer\n>> ids must be passed to the following groups of methods:\n>> \n>> - IPASoftSimple::prepare, in order to create the parameters in the given\n>>   buffer for the corresponding frame processing.\n>> \n>> - SoftwareIsp::saveParams, in order to signal that the parameters are\n>>   set by the IPA.\n>> \n>> - Debayer::process, in order to get the buffer with the processing\n>>   parameters.\n>> \n>> - SoftwareIsp::releaseIspParams, in order to signal that the selected\n>>   parameters buffer from the ring is no longer needed for the given\n>>   frame and can be reused.  This is a newly introduced signal.\n>> \n>> The type of the buffer id parameter is set to uint32_t because:\n>> \n>> - It can be used in mojom.\n>> - It is consistent with the similar types in the hardware pipelines.\n>> - It covers file descriptor number range, which will be used as buffer\n>>   ids (more on this in followup patches).\n>> \n>> This patch doesn't do more than adding the arguments, to keep the patch\n>> simple.  The buffer handling will be implemented in the followup\n>> patches.\n>> \n>> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n>> ---\n>>  .../libcamera/internal/software_isp/software_isp.h  |  3 ++-\n>>  include/libcamera/ipa/soft.mojom                    |  4 ++--\n>>  src/ipa/simple/soft_simple.cpp                      |  9 ++++++---\n>>  src/libcamera/software_isp/debayer.cpp              |  6 +++++-\n>>  src/libcamera/software_isp/debayer.h                |  6 +++++-\n>>  src/libcamera/software_isp/debayer_cpu.cpp          |  6 +++++-\n>>  src/libcamera/software_isp/debayer_cpu.h            |  4 +++-\n>>  src/libcamera/software_isp/debayer_egl.cpp          |  5 ++++-\n>>  src/libcamera/software_isp/debayer_egl.h            |  4 +++-\n>>  src/libcamera/software_isp/software_isp.cpp         | 13 ++++++++++---\n>>  10 files changed, 45 insertions(+), 15 deletions(-)\n>> \n>> diff --git a/include/libcamera/internal/software_isp/software_isp.h b/include/libcamera/internal/software_isp/software_isp.h\n>> index 2ec14a3c7..30b25cddf 100644\n>> --- a/include/libcamera/internal/software_isp/software_isp.h\n>> +++ b/include/libcamera/internal/software_isp/software_isp.h\n>> @@ -88,7 +88,8 @@ public:\n>>  \tSignal<const ControlList &> setSensorControls;\n>>  \n>>  private:\n>> -\tvoid saveIspParams();\n>> +\tvoid saveIspParams(uint32_t paramsBufferId);\n>> +\tvoid releaseIspParams(uint32_t paramsBufferId);\n>\n> This addition of release IspParams seems unnecessary ?\n\nCould you elaborate?  It's used in the followup patches to return the\nbuffer id back to availableParams_.\n\n>>  \tvoid setSensorCtrls(const ControlList &sensorControls);\n>>  \tvoid statsReady(uint32_t frame, uint32_t bufferId);\n>>  \tvoid inputReady(FrameBuffer *input);\n>> diff --git a/include/libcamera/ipa/soft.mojom b/include/libcamera/ipa/soft.mojom\n>> index 77328c5fd..f37c1e747 100644\n>> --- a/include/libcamera/ipa/soft.mojom\n>> +++ b/include/libcamera/ipa/soft.mojom\n>> @@ -25,7 +25,7 @@ interface IPASoftInterface {\n>>  \t\t=> (int32 ret);\n>>  \n>>  \t[async] queueRequest(uint32 frame, libcamera.ControlList sensorControls);\n>> -\t[async] computeParams(uint32 frame);\n>> +\t[async] computeParams(uint32 frame, uint32 paramsBufferId);\n>>  \t[async] processStats(uint32 frame,\n>>  \t\t\t     uint32 bufferId,\n>>  \t\t\t     libcamera.ControlList sensorControls);\n>> @@ -33,6 +33,6 @@ interface IPASoftInterface {\n>>  \n>>  interface IPASoftEventInterface {\n>>  \tsetSensorControls(libcamera.ControlList sensorControls);\n>> -\tsetIspParams();\n>> +\tsetIspParams(uint32 paramsBufferId);\n>\n> Other IPAs call this paramsComputed. \n\nOK, I can rename it.\n\n> Also the parameter typically is a frame number, not the\n> paramsBufferId, since most pipeline-handlers track there active\n> requests and there associated buffers by frame/requester number.\n\nYes.  I thought it's unnecessary to do here.  But there should be a\nreason why it's done that way in other pipelines, perhaps IPA isolation\nas Barnabás pointed out.\n\n> Regards,\n>\n> Hans\n>\n>\n>\n>>  \tmetadataReady(uint32 frame, libcamera.ControlList metadata);\n>>  };\n>> diff --git a/src/ipa/simple/soft_simple.cpp b/src/ipa/simple/soft_simple.cpp\n>> index 6bef597c8..1e8b5334c 100644\n>> --- a/src/ipa/simple/soft_simple.cpp\n>> +++ b/src/ipa/simple/soft_simple.cpp\n>> @@ -64,7 +64,9 @@ public:\n>>  \tvoid stop() override;\n>>  \n>>  \tvoid queueRequest(const uint32_t frame, const ControlList &controls) override;\n>> -\tvoid computeParams(const uint32_t frame) override;\n>> +\tvoid computeParams(const uint32_t frame,\n>> +\t\t\t   const uint32_t\n>> +\t\t\t\t   paramsBufferId) override;\n>>  \tvoid processStats(const uint32_t frame, const uint32_t bufferId,\n>>  \t\t\t  const ControlList &sensorControls) override;\n>>  \n>> @@ -283,7 +285,8 @@ void IPASoftSimple::queueRequest(const uint32_t frame, const ControlList &contro\n>>  \t\talgo->queueRequest(context_, frame, frameContext, controls);\n>>  }\n>>  \n>> -void IPASoftSimple::computeParams(const uint32_t frame)\n>> +void IPASoftSimple::computeParams(const uint32_t frame,\n>> +\t\t\t\t  const uint32_t paramsBufferId)\n>>  {\n>>  \tcontext_.activeState.combinedMatrix = Matrix<float, 3, 3>::identity();\n>>  \n>> @@ -292,7 +295,7 @@ void IPASoftSimple::computeParams(const uint32_t frame)\n>>  \t\talgo->prepare(context_, frame, frameContext, params_);\n>>  \tparams_->combinedMatrix = context_.activeState.combinedMatrix;\n>>  \n>> -\tsetIspParams.emit();\n>> +\tsetIspParams.emit(paramsBufferId);\n>>  }\n>>  \n>>  void IPASoftSimple::processStats(const uint32_t frame,\n>> diff --git a/src/libcamera/software_isp/debayer.cpp b/src/libcamera/software_isp/debayer.cpp\n>> index dccdd86b4..e2e294d3e 100644\n>> --- a/src/libcamera/software_isp/debayer.cpp\n>> +++ b/src/libcamera/software_isp/debayer.cpp\n>> @@ -105,9 +105,10 @@ Debayer::~Debayer()\n>>   */\n>>  \n>>  /**\n>> - * \\fn void Debayer::process(uint32_t frame, FrameBuffer *input, FrameBuffer *output, DebayerParams params)\n>> + * \\fn void Debayer::process(uint32_t frame, const uint32_t paramsBufferId, FrameBuffer *input, FrameBuffer *output, DebayerParams params)\n>>   * \\brief Process the bayer data into the requested format\n>>   * \\param[in] frame The frame number\n>> + * \\param[in] paramsBufferId The id of the params buffer in use\n>>   * \\param[in] input The input buffer\n>>   * \\param[in] output The output buffer\n>>   * \\param[in] params The parameters to be used in debayering\n>> @@ -176,6 +177,9 @@ Debayer::~Debayer()\n>>   *\n>>   * \\var Debayer::DebayerInputConfig::outputFormats\n>>   * List of pixel formats supported as output for this input configuration.\n>> + *\n>> + * \\var Signal<uint32_t> Debayer::releaseIspParams\n>> + * \\brief Signals when the processing params are no longer needed\n>>   */\n>>  \n>>  /**\n>> diff --git a/src/libcamera/software_isp/debayer.h b/src/libcamera/software_isp/debayer.h\n>> index ce9350b7b..0c9627d30 100644\n>> --- a/src/libcamera/software_isp/debayer.h\n>> +++ b/src/libcamera/software_isp/debayer.h\n>> @@ -47,7 +47,10 @@ public:\n>>  \tvirtual std::tuple<unsigned int, unsigned int>\n>>  \tstrideAndFrameSize(const PixelFormat &outputFormat, const Size &size) = 0;\n>>  \n>> -\tvirtual void process(uint32_t frame, FrameBuffer *input, FrameBuffer *output, const DebayerParams &params) = 0;\n>> +\tvirtual void process(uint32_t frame,\n>> +\t\t\t     const uint32_t paramsBufferId,\n>> +\t\t\t     FrameBuffer *input, FrameBuffer *output,\n>> +\t\t\t     const DebayerParams &params) = 0;\n>>  \tvirtual int start() { return 0; }\n>>  \tvirtual void stop() {}\n>>  \n>> @@ -59,6 +62,7 @@ public:\n>>  \n>>  \tSignal<FrameBuffer *> inputBufferReady;\n>>  \tSignal<FrameBuffer *> outputBufferReady;\n>> +\tSignal<uint32_t> releaseIspParams;\n>>  \n>>  \tstruct DebayerInputConfig {\n>>  \t\tSize patternSize;\n>> diff --git a/src/libcamera/software_isp/debayer_cpu.cpp b/src/libcamera/software_isp/debayer_cpu.cpp\n>> index d09883577..5d0e780f7 100644\n>> --- a/src/libcamera/software_isp/debayer_cpu.cpp\n>> +++ b/src/libcamera/software_isp/debayer_cpu.cpp\n>> @@ -842,7 +842,9 @@ void DebayerCpu::updateLookupTables(const DebayerParams &params)\n>>  \tparams_ = params;\n>>  }\n>>  \n>> -void DebayerCpu::process(uint32_t frame, FrameBuffer *input, FrameBuffer *output, const DebayerParams &params)\n>> +void DebayerCpu::process(uint32_t frame, const uint32_t paramsBufferId,\n>> +\t\t\t FrameBuffer *input, FrameBuffer *output,\n>> +\t\t\t const DebayerParams &params)\n>>  {\n>>  \tbench_.startFrame();\n>>  \n>> @@ -852,6 +854,8 @@ void DebayerCpu::process(uint32_t frame, FrameBuffer *input, FrameBuffer *output\n>>  \n>>  \tupdateLookupTables(params);\n>>  \n>> +\treleaseIspParams.emit(paramsBufferId);\n>> +\n>>  \t/* Copy metadata from the input buffer */\n>>  \tFrameMetadata &metadata = output->_d()->metadata();\n>>  \tmetadata.status = input->metadata().status;\n>> diff --git a/src/libcamera/software_isp/debayer_cpu.h b/src/libcamera/software_isp/debayer_cpu.h\n>> index 7a6517462..13253f999 100644\n>> --- a/src/libcamera/software_isp/debayer_cpu.h\n>> +++ b/src/libcamera/software_isp/debayer_cpu.h\n>> @@ -39,7 +39,9 @@ public:\n>>  \tstd::vector<PixelFormat> formats(PixelFormat input);\n>>  \tstd::tuple<unsigned int, unsigned int>\n>>  \tstrideAndFrameSize(const PixelFormat &outputFormat, const Size &size);\n>> -\tvoid process(uint32_t frame, FrameBuffer *input, FrameBuffer *output, const DebayerParams &params);\n>> +\tvoid process(uint32_t frame,\n>> +\t\t     const uint32_t paramsBufferId,\n>> +\t\t     FrameBuffer *input, FrameBuffer *output, const DebayerParams &params);\n>>  \tSizeRange sizes(PixelFormat inputFormat, const Size &inputSize);\n>>  \tconst SharedFD &getStatsFD() { return stats_->getStatsFD(); }\n>>  \n>> diff --git a/src/libcamera/software_isp/debayer_egl.cpp b/src/libcamera/software_isp/debayer_egl.cpp\n>> index 93f7c6946..947c05c07 100644\n>> --- a/src/libcamera/software_isp/debayer_egl.cpp\n>> +++ b/src/libcamera/software_isp/debayer_egl.cpp\n>> @@ -533,7 +533,9 @@ int DebayerEGL::debayerGPU(MappedFrameBuffer &in, int out_fd, const DebayerParam\n>>  \treturn 0;\n>>  }\n>>  \n>> -void DebayerEGL::process(uint32_t frame, FrameBuffer *input, FrameBuffer *output, const DebayerParams &params)\n>> +void DebayerEGL::process(uint32_t frame, const uint32_t paramsBufferId,\n>> +\t\t\t FrameBuffer *input, FrameBuffer *output,\n>> +\t\t\t const DebayerParams &params)\n>>  {\n>>  \tbench_.startFrame();\n>>  \n>> @@ -557,6 +559,7 @@ void DebayerEGL::process(uint32_t frame, FrameBuffer *input, FrameBuffer *output\n>>  \t\tLOG(Debayer, Error) << \"debayerGPU failed\";\n>>  \t\tgoto error;\n>>  \t}\n>> +\treleaseIspParams.emit(paramsBufferId);\n>>  \n>>  \tbench_.finishFrame();\n>>  \n>> diff --git a/src/libcamera/software_isp/debayer_egl.h b/src/libcamera/software_isp/debayer_egl.h\n>> index 59aebcc81..7f29f53e6 100644\n>> --- a/src/libcamera/software_isp/debayer_egl.h\n>> +++ b/src/libcamera/software_isp/debayer_egl.h\n>> @@ -50,7 +50,9 @@ public:\n>>  \tstd::vector<PixelFormat> formats(PixelFormat input);\n>>  \tstd::tuple<unsigned int, unsigned int> strideAndFrameSize(const PixelFormat &outputFormat, const Size &size);\n>>  \n>> -\tvoid process(uint32_t frame, FrameBuffer *input, FrameBuffer *output, const DebayerParams &params);\n>> +\tvoid process(uint32_t frame, const uint32_t paramsBufferId,\n>> +\t\t     FrameBuffer *input, FrameBuffer *output,\n>> +\t\t     const DebayerParams &params);\n>>  \tint start();\n>>  \tvoid stop();\n>>  \n>> diff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp\n>> index a83986b78..0447d2171 100644\n>> --- a/src/libcamera/software_isp/software_isp.cpp\n>> +++ b/src/libcamera/software_isp/software_isp.cpp\n>> @@ -123,6 +123,7 @@ SoftwareIsp::SoftwareIsp(PipelineHandler *pipe, const CameraSensor *sensor,\n>>  \n>>  \tdebayer_->inputBufferReady.connect(this, &SoftwareIsp::inputReady);\n>>  \tdebayer_->outputBufferReady.connect(this, &SoftwareIsp::outputReady);\n>> +\tdebayer_->releaseIspParams.connect(this, &SoftwareIsp::releaseIspParams);\n>>  \n>>  \tipa_ = IPAManager::createIPA<ipa::soft::IPAProxySoft>(pipe, 0, 0);\n>>  \tif (!ipa_) {\n>> @@ -396,16 +397,22 @@ void SoftwareIsp::stop()\n>>   */\n>>  void SoftwareIsp::process(uint32_t frame, FrameBuffer *input, FrameBuffer *output)\n>>  {\n>> -\tipa_->computeParams(frame);\n>> +\t/* \\todo Provide a real value */\n>> +\tconstexpr uint32_t paramsBufferId = 0;\n>> +\tipa_->computeParams(frame, paramsBufferId);\n>>  \tdebayer_->invokeMethod(&Debayer::process,\n>> -\t\t\t       ConnectionTypeQueued, frame, input, output, debayerParams_);\n>> +\t\t\t       ConnectionTypeQueued, frame, paramsBufferId, input, output, debayerParams_);\n>>  }\n>>  \n>> -void SoftwareIsp::saveIspParams()\n>> +void SoftwareIsp::saveIspParams([[maybe_unused]] uint32_t paramsBufferId)\n>>  {\n>>  \tdebayerParams_ = *sharedParams_;\n>>  }\n>>  \n>> +void SoftwareIsp::releaseIspParams([[maybe_unused]] uint32_t paramsBufferId)\n>> +{\n>> +}\n>> +\n>>  void SoftwareIsp::setSensorCtrls(const ControlList &sensorControls)\n>>  {\n>>  \tsetSensorControls.emit(sensorControls);","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 072EBBDCBC\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 15 May 2026 14:51:33 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 1BEFE62FD3;\n\tFri, 15 May 2026 16:51:32 +0200 (CEST)","from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.129.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 4141162FB1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 15 May 2026 16:51:30 +0200 (CEST)","from mail-wm1-f71.google.com (mail-wm1-f71.google.com\n\t[209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n\tus-mta-21-f7duGuV2OLms3EzwRQXyTw-1; Fri, 15 May 2026 10:51:27 -0400","by mail-wm1-f71.google.com with SMTP id\n\t5b1f17b1804b1-486fa07f2bbso56111015e9.2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 15 May 2026 07:51:27 -0700 (PDT)","from mzamazal-thinkpadp1gen7.tpbc.csb\n\t(ip-77-48-47-4.net.vodafone.cz. [77.48.47.4])\n\tby smtp.gmail.com with ESMTPSA id\n\t5b1f17b1804b1-48febe794e7sm14650015e9.30.2026.05.15.07.51.23\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tFri, 15 May 2026 07:51:24 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"JXfXoe/T\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1778856689;\n\th=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n\tto:to:cc:cc:mime-version:mime-version:content-type:content-type:\n\tcontent-transfer-encoding:content-transfer-encoding:\n\tin-reply-to:in-reply-to:references:references;\n\tbh=65et0aGpc0IvXf8CGxFdSvei7x8spYwNTY7biPS3fUU=;\n\tb=JXfXoe/T9c7Fz35wRcNeSF376B0bjIvdaOR3m1h/i88rBCAiP90fjOKdFugKuTJMvGHckx\n\tRP3GbApLc3KruTmRowOLhSaH61HVO9DRDIwxeYgcpQ9iszEebVGMZ5XBVs2mwE/8i2ThVF\n\ttr5D8pd3TTAzBIch8Tnyr8veNH7bU/0=","X-MC-Unique":"f7duGuV2OLms3EzwRQXyTw-1","X-Mimecast-MFC-AGG-ID":"f7duGuV2OLms3EzwRQXyTw_1778856686","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20251104; t=1778856686; x=1779461486;\n\th=content-transfer-encoding:mime-version:user-agent:message-id:date\n\t:references:in-reply-to:subject:cc:to:from:x-gm-gg\n\t:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;\n\tbh=tF5A+JHqvt1Xl3Ti/XPXYxMdxKjSqnm0sEOlRr9Upwc=;\n\tb=By4JwpVwiBA5IxbByMX6y1zS/9Vr3FPw5ogCQZxbexqTRr2M9+Ll883wsRIPczM29X\n\td/cLY43CGK7ULZUTzbZRYaAHAOsQD4m4897CTxNl4Wh4ka91WURBAaxWBgwa6gC9McTr\n\tdDMhdyULPbYchQQGTSPNZd3cr7U/tn5QioEj78vAj1/kip+0TdHv4VfoxbVRTM3Owc8M\n\tAuQI/5R8hQnFZnKx4ov/d0n2Dgxe/KtBmPB8PI2dwW2N2K/M0Q/bZyjCXNX/nRc84uV3\n\te4NC7OiP9WI7ctQfdJN2HhvHXlIGwZWGizfIn3zdAJ9YNdP/H0zBkNcMQMe8JzyWJg64\n\tpR4Q==","X-Gm-Message-State":"AOJu0Yzj1+ekgDurLgW4mTnw2BjASocE/TSwCq+eTq2aOBhmb361JQf/\n\tXtbTqisRotR0MqHRYf9Q+tjHvZMkAl++1pqRkJa7LhHY/jI0FDLBnGcwUoOSZ3J/qEcCEEa9HkJ\n\tlslnpweIpetfkDi6xwxhiBzM7NdRb4a6ueyiBNqTtESPmb1xYtylOuSqAFn3pax+Uz+PVk0aBc4\n\tyNeMHyv6+N6IuwDg110lB+Za3/TyR9gWUnDmic0S1DZwkTjmGh12TR2MCbSoY=","X-Gm-Gg":"Acq92OHm5FtZcd//kLKKlvI6JkZ2r/ZbnbZZPIdB3TtEgJ7LgMjwtBMkuK0vvCIYoAg\n\t5d9VDpkEYHi8OMjvGfpk9DbCBVVh+X1tdbdP0LyHfLG6Z8vIaBcUcuFux6KaCx5KNjgYV2U5ySQ\n\t3JKkF4pjpQ7N/LnaCJ6yMalrSvgky5bF3TWGhgj3vZz1stm6VelB4euiGa0UlKXfOYgcB+zy/u1\n\t00xM9TFj1HpWJI+OOADuBAuvcNDNRem/2Yc++7zJB45QXuB1BT0ESBmLQw6L1kPmB3k5MVgV7Dp\n\t1ujQvGOpzWh0luqvGnw/KsnIxjXIkwWzNvW+pzhLGJtWE1hxT5SGMNorzu2jXq/bHWrE7bINPSR\n\txLCEDzi8wVys+Q0OSDG2rBfj5aBd5uLFBJtkJitWGNvPHZQ48uMvbfTPj/VoGZKkf2oLycRxgFK\n\t8=","X-Received":["by 2002:a05:600c:a406:b0:48a:599a:3716 with SMTP id\n\t5b1f17b1804b1-48fe651487emr51448805e9.23.1778856685915; \n\tFri, 15 May 2026 07:51:25 -0700 (PDT)","by 2002:a05:600c:a406:b0:48a:599a:3716 with SMTP id\n\t5b1f17b1804b1-48fe651487emr51448315e9.23.1778856685336; \n\tFri, 15 May 2026 07:51:25 -0700 (PDT)"],"From":"Milan Zamazal <mzamazal@redhat.com>","To":"johannes.goede@oss.qualcomm.com","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [RFC PATCH v2 02/14] libcamera: software_isp: Introduce\n\targuments for parameters buffers","In-Reply-To":"<f8dcf083-e97b-42bd-bcdb-92a8cbd2f8a9@oss.qualcomm.com>\n\t(johannes goede's message of \"Thu, 30 Apr 2026 16:28:35 +0200\")","References":"<20260216203034.27558-1-mzamazal@redhat.com>\n\t<20260216203034.27558-3-mzamazal@redhat.com>\n\t<f8dcf083-e97b-42bd-bcdb-92a8cbd2f8a9@oss.qualcomm.com>","Date":"Fri, 15 May 2026 16:51:22 +0200","Message-ID":"<85ik8o4tg5.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","User-Agent":"Gnus/5.13 (Gnus v5.13)","MIME-Version":"1.0","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"qZPIOQVmTwTa-EigFXEjb21v-_2FGOKltbqwJ3QO0R8_1778856686","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain; charset=utf-8","Content-Transfer-Encoding":"quoted-printable","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>"}},{"id":38914,"web_url":"https://patchwork.libcamera.org/comment/38914/","msgid":"<1ef2e456-368d-4550-9156-638290abaa5c@oss.qualcomm.com>","date":"2026-05-18T13:18:18","subject":"Re: [RFC PATCH v2 02/14] libcamera: software_isp: Introduce\n\targuments for parameters buffers","submitter":{"id":242,"url":"https://patchwork.libcamera.org/api/people/242/","name":"Hans de Goede","email":"johannes.goede@oss.qualcomm.com"},"content":"Hi,\n\nOn 15-May-26 4:51 PM, Milan Zamazal wrote:\n> Hi Hans,\n> \n> johannes.goede@oss.qualcomm.com writes:\n> \n>> Hi Milan,\n>>\n>> On 16-Feb-26 9:30 PM, Milan Zamazal wrote:\n>>> Processing parameters in software ISP are currently passed by value.\n>>> This is unlike hardware pipelines, which use a ring of buffers for the\n>>> purpose and pass references to the buffers currently selected from the\n>>> ring rather than passing the whole parameters buffers.\n>>>\n>>> This is a preparatory patch to introduce a similar mechanism in software\n>>> ISP, in order to resolve TODO #5.  It adds a new argument paramsBufferId\n>>> for the future parameters buffer ids passed to the calls.  The buffer\n>>> ids must be passed to the following groups of methods:\n>>>\n>>> - IPASoftSimple::prepare, in order to create the parameters in the given\n>>>   buffer for the corresponding frame processing.\n>>>\n>>> - SoftwareIsp::saveParams, in order to signal that the parameters are\n>>>   set by the IPA.\n>>>\n>>> - Debayer::process, in order to get the buffer with the processing\n>>>   parameters.\n>>>\n>>> - SoftwareIsp::releaseIspParams, in order to signal that the selected\n>>>   parameters buffer from the ring is no longer needed for the given\n>>>   frame and can be reused.  This is a newly introduced signal.\n>>>\n>>> The type of the buffer id parameter is set to uint32_t because:\n>>>\n>>> - It can be used in mojom.\n>>> - It is consistent with the similar types in the hardware pipelines.\n>>> - It covers file descriptor number range, which will be used as buffer\n>>>   ids (more on this in followup patches).\n>>>\n>>> This patch doesn't do more than adding the arguments, to keep the patch\n>>> simple.  The buffer handling will be implemented in the followup\n>>> patches.\n>>>\n>>> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n>>> ---\n>>>  .../libcamera/internal/software_isp/software_isp.h  |  3 ++-\n>>>  include/libcamera/ipa/soft.mojom                    |  4 ++--\n>>>  src/ipa/simple/soft_simple.cpp                      |  9 ++++++---\n>>>  src/libcamera/software_isp/debayer.cpp              |  6 +++++-\n>>>  src/libcamera/software_isp/debayer.h                |  6 +++++-\n>>>  src/libcamera/software_isp/debayer_cpu.cpp          |  6 +++++-\n>>>  src/libcamera/software_isp/debayer_cpu.h            |  4 +++-\n>>>  src/libcamera/software_isp/debayer_egl.cpp          |  5 ++++-\n>>>  src/libcamera/software_isp/debayer_egl.h            |  4 +++-\n>>>  src/libcamera/software_isp/software_isp.cpp         | 13 ++++++++++---\n>>>  10 files changed, 45 insertions(+), 15 deletions(-)\n>>>\n>>> diff --git a/include/libcamera/internal/software_isp/software_isp.h b/include/libcamera/internal/software_isp/software_isp.h\n>>> index 2ec14a3c7..30b25cddf 100644\n>>> --- a/include/libcamera/internal/software_isp/software_isp.h\n>>> +++ b/include/libcamera/internal/software_isp/software_isp.h\n>>> @@ -88,7 +88,8 @@ public:\n>>>  \tSignal<const ControlList &> setSensorControls;\n>>>  \n>>>  private:\n>>> -\tvoid saveIspParams();\n>>> +\tvoid saveIspParams(uint32_t paramsBufferId);\n>>> +\tvoid releaseIspParams(uint32_t paramsBufferId);\n>>\n>> This addition of release IspParams seems unnecessary ?\n> \n> Could you elaborate?  It's used in the followup patches to return the\n> buffer id back to availableParams_.\n\nI see, so I guess this just needs a better name then.\n\nOn real hardware there will be a signal from the parameter\nV4L2VideoDevice object for the /dev/video# node representing\nthe parameter buffer queue called \"bufferReady\" which gets\nsignalled when the ISP hw is done with the parameter-buffer\n(at which point it can go back into the availableParams_ list).\n\nOther drivers typically call the method used as handler for this\nsignal paramBufferReady or paramsBufferReady.\n\nI think it would be clearer if you used a similar name here.\n\nRegards,\n\nHans","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 AA75DBDCBC\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 18 May 2026 13:18:26 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 6EFF263024;\n\tMon, 18 May 2026 15:18:25 +0200 (CEST)","from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com\n\t[205.220.168.131])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 69C9E62FB1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 18 May 2026 15:18:23 +0200 (CEST)","from pps.filterd (m0279867.ppops.net [127.0.0.1])\n\tby mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id\n\t64ICp2vD2438004 for <libcamera-devel@lists.libcamera.org>;\n\tMon, 18 May 2026 13:18:21 GMT","from mail-vs1-f69.google.com (mail-vs1-f69.google.com\n\t[209.85.217.69])\n\tby mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4e834v0359-1\n\t(version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT)\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 18 May 2026 13:18:21 +0000 (GMT)","by mail-vs1-f69.google.com with SMTP id\n\tada2fe7eead31-6326fc1256aso4415855137.1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 18 May 2026 06:18:21 -0700 (PDT)","from [10.40.99.10] ([78.108.130.194])\n\tby smtp.gmail.com with ESMTPSA id\n\ta640c23a62f3a-bd4f4dec7c4sm580399166b.40.2026.05.18.06.18.18\n\t(version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);\n\tMon, 18 May 2026 06:18:18 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=qualcomm.com header.i=@qualcomm.com\n\theader.b=\"SqZV+kVg\"; dkim=pass (2048-bit key;\n\tunprotected) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com\n\theader.b=\"cN6AARO0\"; dkim-atps=neutral","DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h=\n\tcc:content-transfer-encoding:content-type:date:from:in-reply-to\n\t:message-id:mime-version:references:subject:to; s=qcppdkim1; bh=\n\tsPcbbaJlh+120eiqohvcKGRoL+Xd9/ZB0h9p3hZ7Tbs=; b=SqZV+kVgreJU4nlv\n\tnC3yoIoQaYW4xYjuLMvqgXrsBBTwFNLXrXVuL/gz6PbLw2++90SjyWmvVm7grewS\n\tT00iCjaKs+7Lh7bercrsiNRcsekQrOnyYmqOduTyU6pJNK8NM4xRop+7dl8lpQwH\n\tDG8uhkF4Bay5jKmbHIiq6BWJr/xS9ARCypuV0hg0AAw5LwQAoPjhUfocotcHHC61\n\t5TTbnaJeIJmJ7tlMMwbjE8SUEgzF3iaUenTAGgkp40cBdxrBnQ99I1IwSHf/JU7F\n\tPmgCncPzH+dXgccl7nbjqhPtwOwx880Ca3u0ypgBSoel1xSjaFdyfiR3nX/2cNfb\n\t3qOl4A==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=oss.qualcomm.com; s=google; t=1779110300; x=1779715100;\n\tdarn=lists.libcamera.org; \n\th=content-transfer-encoding:in-reply-to:content-language:references\n\t:cc:to:subject:from:user-agent:mime-version:date:message-id:from:to\n\t:cc:subject:date:message-id:reply-to;\n\tbh=sPcbbaJlh+120eiqohvcKGRoL+Xd9/ZB0h9p3hZ7Tbs=;\n\tb=cN6AARO0lNoSrVCHfPxl9WVADzzPPTVE+ZWJoKgtA2mIBudMCU8wFnmQL8yqfBbkiZ\n\tX+hA+qmb4a3zhZq0lYxPb6HdKi1HxGwzo80t1hQXcMZnKNaliaYNj8KQ6Sr3d7oqLZpu\n\tR35FMTFb9lsjZhlIgpKFlXZa8mwLApxS4axDulU2OKmbaUD8sOti8JB7Ubq7HJjMRoIF\n\t5Xk7HEskRDZV6nzIseCQ3GiGXPZfCFTssvTCcLvX+VgSQPIavMjShmlnRKCvJTbfv60/\n\tk8Ha7uscXpKB4GZqV3bEmDd7Xqz/Qi1+CFfGSalMhVCI2JVQntoOd1f86jA5mcHxalV0\n\tyRTA=="],"X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20251104; t=1779110300; x=1779715100;\n\th=content-transfer-encoding:in-reply-to:content-language:references\n\t:cc:to:subject:from:user-agent:mime-version:date:message-id:x-gm-gg\n\t:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;\n\tbh=sPcbbaJlh+120eiqohvcKGRoL+Xd9/ZB0h9p3hZ7Tbs=;\n\tb=FaajysmaBZ/VLmWr7urNKg90i690l+QiQMSx0BkUEepD8xODt4pAG60RG9f/ZuDz+t\n\tbv2SDbesI9Eyyghh9soqebJ0iqyRoh96gYmpqjIh+K0Naumtp4IAdMyYgiyZGGwy7ywO\n\t3KjGAJvLeB1GprACsPy647PBmkx4jdKkBgG0Y/SgfSk8OiPh8bsKP10O34M929wxBG9G\n\tCQQ8j2x2y7eu0ckyjyyHdFmWKB7rm2hirR553Cu+0PCU6m9QjqgF+gdrIPt0TcmGWcOy\n\tSQx9sri1bttpPOl4/LrgytXsgLLCizzvLGqz66fvGUWHUgZR47BejdozhfuXQZOXGzk/\n\t2F0g==","X-Gm-Message-State":"AOJu0YzlqkqCVyBXWVZbq1c6GL3cfQq2yKpMVfdK2KVPlm203kjZcsXN\n\tfH2BxIYuGSSnKxKYCk3naXM7jZ8ms7k4eE6eGqhPQxSxLHIUG2DkZcRRWxr88tcZsHxrniD/wdP\n\tGaMyVH04F06bBKerd2RyBS65hgSNR7FuaRINNGpgDSYw39bSU7qa6vBjt7g8mJXFCtGe+2zP8HQ\n\tfN","X-Gm-Gg":"Acq92OHuQ3ypu8EltciJTBxroAJluVSbVFe9Ggjc+0PBXRzwDdMa+uhjClL4OGa0PN7\n\tUxch0DXnfihWC6BffPMFIB+Psl1+iKE29xY3UaRTqyOUqi3ci2yjLpr/uWVhgTR72nxkZiJY+cp\n\tH1CaK5cJuD7e3E0qvNJioBnIX4m5MpMm2ukZTpr5QaO+OwhyKHCPfV83fNLzYqAVBl1Ujya+CRT\n\tt0tq2rc3k904aMS99qz3RQf5N4pht5YY1q90yuj/nD2V89fHcfUGBDMUAGE6v5RpgtGXjS64erH\n\tYd8l0CFMklQS4bXIKdJF3IkTEklnMHz2cbwgvDmfaLuPfV1juEWD7WHQgKkvjgx06byZROoycHT\n\tPOh2KiL9briQt3f1wdoCUu/IN6tHen5gYYcQIvdu1","X-Received":["by 2002:a05:6102:50a9:b0:631:2624:e5ec with SMTP id\n\tada2fe7eead31-63a3eb8bb94mr7696914137.16.1779110300396; \n\tMon, 18 May 2026 06:18:20 -0700 (PDT)","by 2002:a05:6102:50a9:b0:631:2624:e5ec with SMTP id\n\tada2fe7eead31-63a3eb8bb94mr7696863137.16.1779110299717; \n\tMon, 18 May 2026 06:18:19 -0700 (PDT)"],"Message-ID":"<1ef2e456-368d-4550-9156-638290abaa5c@oss.qualcomm.com>","Date":"Mon, 18 May 2026 15:18:18 +0200","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","From":"johannes.goede@oss.qualcomm.com","Subject":"Re: [RFC PATCH v2 02/14] libcamera: software_isp: Introduce\n\targuments for parameters buffers","To":"Milan Zamazal <mzamazal@redhat.com>","Cc":"libcamera-devel@lists.libcamera.org","References":"<20260216203034.27558-1-mzamazal@redhat.com>\n\t<20260216203034.27558-3-mzamazal@redhat.com>\n\t<f8dcf083-e97b-42bd-bcdb-92a8cbd2f8a9@oss.qualcomm.com>\n\t<85ik8o4tg5.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","Content-Language":"en-US, nl","In-Reply-To":"<85ik8o4tg5.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"7bit","X-Authority-Analysis":"v=2.4 cv=F9ZnsKhN c=1 sm=1 tr=0 ts=6a0b119d cx=c_pps\n\ta=5HAIKLe1ejAbszaTRHs9Ug==:117 a=rrvG0T/C2D967D07Ol03YQ==:17\n\ta=IkcTkHD0fZMA:10 a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10\n\ta=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22\n\ta=eoimf2acIAo5FJnRuUoq:22\n\ta=EUspDBNiAAAA:8 a=20KFwNOVAAAA:8 a=Np297AZ5xM_IlZG1oTEA:9\n\ta=QEXdDO2ut3YA:10 a=gYDTvv6II1OnSo0itH1n:22","X-Proofpoint-ORIG-GUID":"J2-pI7iW1A_xMnfBdGkTVgicKFACFzmT","X-Proofpoint-GUID":"J2-pI7iW1A_xMnfBdGkTVgicKFACFzmT","X-Proofpoint-Spam-Details-Enc":"AW1haW4tMjYwNTE4MDEzMCBTYWx0ZWRfXy2avKx09ilb9\n\t/Xmy+tiv5Q2WwyDiAdGBhEX/4DHepfOIKwDBYVxzXmcjBKsOxQj7MpFdQgpV3FkxPnSVmev8+fp\n\t7gp8GYzonxrJ8t4G417A7t2FERU1B1bylK69tGStiNZK+OM3eUN20pNuarN82b3lUJNAmnXtqLV\n\tSarTEurxucf+EPncaRff2Bm2z4GenXnbZ5/ZTWprDDQxTQ8jYry18Rasif5Vup2HiAu5eKCV0xn\n\t+rZJpHR4LQPiL8pIHZsZFc8/+WMw+gZfuaw4J4cEX8M8IbWGuH+7bj88aUKF2BBNA5OYxfXYNs1\n\tO5bBhMECdloDT4GlYQvOONoCFKJqrrHawmvnTc8fZt8n1RWMah3Io7dnJTwQsPLwniRixTyZ7Zn\n\tMI5mwbot2x5VOAEaiGEVZNCE+m4qXSojC80zAMPM+A5eqHxLMektt+/YVgmx3CYgv2HscdA7z6Q\n\tx6LXoGbUdidzhKNTKmg==","X-Proofpoint-Virus-Version":"vendor=baseguard\n\tengine=ICAP:2.0.293, Aquarius:18.0.1143, Hydra:6.1.51,\n\tFMLib:17.12.100.49\n\tdefinitions=2026-05-18_03,2026-05-15_01,2025-10-01_01","X-Proofpoint-Spam-Details":"rule=outbound_notspam policy=outbound score=0\n\timpostorscore=0 malwarescore=0 priorityscore=1501 clxscore=1015\n\tsuspectscore=0 lowpriorityscore=0 phishscore=0 bulkscore=0\n\tspamscore=0\n\tadultscore=0 classifier=typeunknown authscore=0 authtc= authcc=\n\troute=outbound adjust=0 reason=mlx scancount=1\n\tengine=8.22.0-2605130000\n\tdefinitions=main-2605180130","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>"}}]