[{"id":36008,"web_url":"https://patchwork.libcamera.org/comment/36008/","msgid":"<175899979819.416692.18310728104416559711@ping.linuxembedded.co.uk>","date":"2025-09-27T19:03:18","subject":"Re: [PATCH v3 5/6] libcamera: software_isp: Add valid flag to struct\n\tSwIspStats","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Hans de Goede (2025-09-27 19:00:03)\n> Generating statistics for every single frame is not really necessary.\n> \n> However a roundtrip through ipa_->processStats() still need to be done\n> every frame, even if there are no stats to make the IPA generate metadata\n> for every frame.\n> \n> Add a valid flag to the statistics struct to let the IPA know when there\n> are no statistics for the frame being processed and modify the IPA to\n> only generate metadata for frames without valid statistics.\n> \n> This is a preparation patch for skipping statistics generation for some\n> frames.\n> \n> Signed-off-by: Hans de Goede <hansg@kernel.org>\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n> ---\n> Changes in v3:\n> - Drop if (!stats_->valid) early exit from IPASoftSimple::processStats()\n> - Save last AGC calculated new gain and exposure values and re-use these\n>   for frames without statistics, this avoids delayedCtrl history underruns\n> - Improve SwIspStats.valid documentation\n> \n> Changes in v2:\n> - This is a new patch in v2 of this series\n> ---\n>  .../libcamera/internal/software_isp/swisp_stats.h   |  5 +++++\n>  src/ipa/simple/algorithms/agc.cpp                   | 13 +++++++++++++\n>  src/ipa/simple/algorithms/awb.cpp                   |  3 +++\n>  src/ipa/simple/algorithms/blc.cpp                   |  3 +++\n>  src/ipa/simple/ipa_context.h                        |  4 ++++\n>  src/libcamera/software_isp/debayer_cpu.cpp          |  2 +-\n>  src/libcamera/software_isp/swstats_cpu.cpp          |  4 +++-\n>  src/libcamera/software_isp/swstats_cpu.h            |  2 +-\n>  8 files changed, 33 insertions(+), 3 deletions(-)\n> \n> diff --git a/include/libcamera/internal/software_isp/swisp_stats.h b/include/libcamera/internal/software_isp/swisp_stats.h\n> index ae11f112..3c986018 100644\n> --- a/include/libcamera/internal/software_isp/swisp_stats.h\n> +++ b/include/libcamera/internal/software_isp/swisp_stats.h\n> @@ -20,6 +20,11 @@ namespace libcamera {\n>   * wrap around.\n>   */\n>  struct SwIspStats {\n> +       /**\n> +        * \\brief True if the statistics buffer contains valid data, false if\n> +        *        no statistics were generated for this frame\n> +        */\n> +       bool valid;\n>         /**\n>          * \\brief Holds the sum of all sampled red pixels\n>          */\n> diff --git a/src/ipa/simple/algorithms/agc.cpp b/src/ipa/simple/algorithms/agc.cpp\n> index 3471cc88..af660a03 100644\n> --- a/src/ipa/simple/algorithms/agc.cpp\n> +++ b/src/ipa/simple/algorithms/agc.cpp\n> @@ -91,6 +91,9 @@ void Agc::updateExposure(IPAContext &context, IPAFrameContext &frameContext, dou\n>         again = std::clamp(again, context.configuration.agc.againMin,\n>                            context.configuration.agc.againMax);\n>  \n> +       context.activeState.agc.exposure = exposure;\n> +       context.activeState.agc.again = again;\n> +\n>         LOG(IPASoftExposure, Debug)\n>                 << \"exposureMSV \" << exposureMSV\n>                 << \" exp \" << exposure << \" again \" << again;\n> @@ -107,6 +110,16 @@ void Agc::process(IPAContext &context,\n>         metadata.set(controls::ExposureTime, exposureTime.get<std::micro>());\n>         metadata.set(controls::AnalogueGain, frameContext.sensor.gain);\n>  \n> +       if (!stats->valid) {\n> +               /*\n> +                * Use the new exposure and gain values calculated the last time\n> +                * there were valid stats.\n> +                */\n> +               frameContext.sensor.exposure = context.activeState.agc.exposure;\n> +               frameContext.sensor.gain = context.activeState.agc.again;\n> +               return;\n> +       }\n> +\n>         /*\n>          * Calculate Mean Sample Value (MSV) according to formula from:\n>          * https://www.araa.asn.au/acra/acra2007/papers/paper84final.pdf\n> diff --git a/src/ipa/simple/algorithms/awb.cpp b/src/ipa/simple/algorithms/awb.cpp\n> index cf567e89..ddd0b791 100644\n> --- a/src/ipa/simple/algorithms/awb.cpp\n> +++ b/src/ipa/simple/algorithms/awb.cpp\n> @@ -61,6 +61,9 @@ void Awb::process(IPAContext &context,\n>         };\n>         metadata.set(controls::ColourGains, mdGains);\n>  \n> +       if (!stats->valid)\n> +               return;\n> +\n>         /*\n>          * Black level must be subtracted to get the correct AWB ratios, they\n>          * would be off if they were computed from the whole brightness range\n> diff --git a/src/ipa/simple/algorithms/blc.cpp b/src/ipa/simple/algorithms/blc.cpp\n> index 8c1e9ed0..616da0ee 100644\n> --- a/src/ipa/simple/algorithms/blc.cpp\n> +++ b/src/ipa/simple/algorithms/blc.cpp\n> @@ -60,6 +60,9 @@ void BlackLevel::process(IPAContext &context,\n>         };\n>         metadata.set(controls::SensorBlackLevels, blackLevels);\n>  \n> +       if (!stats->valid)\n> +               return;\n> +\n>         if (context.configuration.black.level.has_value())\n>                 return;\n>  \n> diff --git a/src/ipa/simple/ipa_context.h b/src/ipa/simple/ipa_context.h\n> index 468fccab..441f2a73 100644\n> --- a/src/ipa/simple/ipa_context.h\n> +++ b/src/ipa/simple/ipa_context.h\n> @@ -37,6 +37,10 @@ struct IPASessionConfiguration {\n>  };\n>  \n>  struct IPAActiveState {\n> +       struct {\n> +               int32_t exposure;\n> +               double again;\n> +       } agc;\n>         struct {\n>                 uint8_t level;\n>                 int32_t lastExposure;\n> diff --git a/src/libcamera/software_isp/debayer_cpu.cpp b/src/libcamera/software_isp/debayer_cpu.cpp\n> index 2dc85e5e..bfa60888 100644\n> --- a/src/libcamera/software_isp/debayer_cpu.cpp\n> +++ b/src/libcamera/software_isp/debayer_cpu.cpp\n> @@ -851,7 +851,7 @@ void DebayerCpu::process(uint32_t frame, FrameBuffer *input, FrameBuffer *output\n>          *\n>          * \\todo Pass real bufferId once stats buffer passing is changed.\n>          */\n> -       stats_->finishFrame(frame, 0);\n> +       stats_->finishFrame(frame, 0, true);\n>         outputBufferReady.emit(output);\n>         inputBufferReady.emit(input);\n>  }\n> diff --git a/src/libcamera/software_isp/swstats_cpu.cpp b/src/libcamera/software_isp/swstats_cpu.cpp\n> index 4b77b360..da91f912 100644\n> --- a/src/libcamera/software_isp/swstats_cpu.cpp\n> +++ b/src/libcamera/software_isp/swstats_cpu.cpp\n> @@ -313,11 +313,13 @@ void SwStatsCpu::startFrame(void)\n>   * \\brief Finish statistics calculation for the current frame\n>   * \\param[in] frame The frame number\n>   * \\param[in] bufferId ID of the statistics buffer\n> + * \\param[in] valid Indicates if the statistics for the current frame are valid\n>   *\n>   * This may only be called after a successful setWindow() call.\n>   */\n> -void SwStatsCpu::finishFrame(uint32_t frame, uint32_t bufferId)\n> +void SwStatsCpu::finishFrame(uint32_t frame, uint32_t bufferId, bool valid)\n>  {\n> +       stats_.valid = valid;\n>         *sharedStats_ = stats_;\n>         statsReady.emit(frame, bufferId);\n>  }\n> diff --git a/src/libcamera/software_isp/swstats_cpu.h b/src/libcamera/software_isp/swstats_cpu.h\n> index 26a2f462..6ac3c4de 100644\n> --- a/src/libcamera/software_isp/swstats_cpu.h\n> +++ b/src/libcamera/software_isp/swstats_cpu.h\n> @@ -41,7 +41,7 @@ public:\n>         int configure(const StreamConfiguration &inputCfg);\n>         void setWindow(const Rectangle &window);\n>         void startFrame();\n> -       void finishFrame(uint32_t frame, uint32_t bufferId);\n> +       void finishFrame(uint32_t frame, uint32_t bufferId, bool valid);\n>  \n>         void processLine0(unsigned int y, const uint8_t *src[])\n>         {\n> -- \n> 2.51.0\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 C5DDABDB1C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSat, 27 Sep 2025 19:03:22 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 7201B6B5F3;\n\tSat, 27 Sep 2025 21:03:22 +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 D90A76B5A2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat, 27 Sep 2025 21:03:20 +0200 (CEST)","from pendragon.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust6594.18-1.cable.virginm.net [86.31.185.195])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id A2B99B7D;\n\tSat, 27 Sep 2025 21:01:54 +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=\"lOlwxwoP\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1758999714;\n\tbh=mQbww72hFP1AoRWcPhwhREME6Zv6s2xZ/p14/y7pDsg=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=lOlwxwoPgGh+Zw3dzJYnUwYoLyy8JXnicjfWf8jypGrRCBgfIBvD3/fwHRiBvr3rh\n\tbNG7kwOFkLa8gXQuay0h7HM6AjaajtyTw0RT/d5uMTj9n7/CyMbZpWFLwNqxbKB5SY\n\tgw+KhfrgbahMDgKbbMaxFk6q/9apaR8wkKETgAes=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20250927180004.84620-6-hansg@kernel.org>","References":"<20250927180004.84620-1-hansg@kernel.org>\n\t<20250927180004.84620-6-hansg@kernel.org>","Subject":"Re: [PATCH v3 5/6] libcamera: software_isp: Add valid flag to struct\n\tSwIspStats","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"Hans de Goede <hansg@kernel.org>","To":"Hans de Goede <hansg@kernel.org>, libcamera-devel@lists.libcamera.org","Date":"Sat, 27 Sep 2025 20:03:18 +0100","Message-ID":"<175899979819.416692.18310728104416559711@ping.linuxembedded.co.uk>","User-Agent":"alot/0.9.1","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":36019,"web_url":"https://patchwork.libcamera.org/comment/36019/","msgid":"<85h5wlr3mk.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","date":"2025-09-29T09:48:19","subject":"Re: [PATCH v3 5/6] libcamera: software_isp: Add valid flag to\n\tstruct SwIspStats","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/people/177/","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"content":"Hi Hans,\n\nHans de Goede <hansg@kernel.org> writes:\n\n> Generating statistics for every single frame is not really necessary.\n>\n> However a roundtrip through ipa_->processStats() still need to be done\n> every frame, even if there are no stats to make the IPA generate metadata\n> for every frame.\n>\n> Add a valid flag to the statistics struct to let the IPA know when there\n> are no statistics for the frame being processed and modify the IPA to\n> only generate metadata for frames without valid statistics.\n>\n> This is a preparation patch for skipping statistics generation for some\n> frames.\n>\n> Signed-off-by: Hans de Goede <hansg@kernel.org>\n> ---\n> Changes in v3:\n> - Drop if (!stats_->valid) early exit from IPASoftSimple::processStats()\n> - Save last AGC calculated new gain and exposure values and re-use these\n>   for frames without statistics, this avoids delayedCtrl history underruns\n> - Improve SwIspStats.valid documentation\n>\n> Changes in v2:\n> - This is a new patch in v2 of this series\n> ---\n>  .../libcamera/internal/software_isp/swisp_stats.h   |  5 +++++\n>  src/ipa/simple/algorithms/agc.cpp                   | 13 +++++++++++++\n>  src/ipa/simple/algorithms/awb.cpp                   |  3 +++\n>  src/ipa/simple/algorithms/blc.cpp                   |  3 +++\n>  src/ipa/simple/ipa_context.h                        |  4 ++++\n>  src/libcamera/software_isp/debayer_cpu.cpp          |  2 +-\n>  src/libcamera/software_isp/swstats_cpu.cpp          |  4 +++-\n>  src/libcamera/software_isp/swstats_cpu.h            |  2 +-\n>  8 files changed, 33 insertions(+), 3 deletions(-)\n>\n> diff --git a/include/libcamera/internal/software_isp/swisp_stats.h b/include/libcamera/internal/software_isp/swisp_stats.h\n> index ae11f112..3c986018 100644\n> --- a/include/libcamera/internal/software_isp/swisp_stats.h\n> +++ b/include/libcamera/internal/software_isp/swisp_stats.h\n> @@ -20,6 +20,11 @@ namespace libcamera {\n>   * wrap around.\n>   */\n>  struct SwIspStats {\n> +\t/**\n> +\t * \\brief True if the statistics buffer contains valid data, false if\n> +\t *        no statistics were generated for this frame\n> +\t */\n> +\tbool valid;\n>  \t/**\n>  \t * \\brief Holds the sum of all sampled red pixels\n>  \t */\n> diff --git a/src/ipa/simple/algorithms/agc.cpp b/src/ipa/simple/algorithms/agc.cpp\n> index 3471cc88..af660a03 100644\n> --- a/src/ipa/simple/algorithms/agc.cpp\n> +++ b/src/ipa/simple/algorithms/agc.cpp\n> @@ -91,6 +91,9 @@ void Agc::updateExposure(IPAContext &context, IPAFrameContext &frameContext, dou\n>  \tagain = std::clamp(again, context.configuration.agc.againMin,\n>  \t\t\t   context.configuration.agc.againMax);\n>  \n> +\tcontext.activeState.agc.exposure = exposure;\n> +\tcontext.activeState.agc.again = again;\n> +\n>  \tLOG(IPASoftExposure, Debug)\n>  \t\t<< \"exposureMSV \" << exposureMSV\n>  \t\t<< \" exp \" << exposure << \" again \" << again;\n> @@ -107,6 +110,16 @@ void Agc::process(IPAContext &context,\n>  \tmetadata.set(controls::ExposureTime, exposureTime.get<std::micro>());\n>  \tmetadata.set(controls::AnalogueGain, frameContext.sensor.gain);\n>  \n> +\tif (!stats->valid) {\n> +\t\t/*\n> +\t\t * Use the new exposure and gain values calculated the last time\n> +\t\t * there were valid stats.\n> +\t\t */\n> +\t\tframeContext.sensor.exposure = context.activeState.agc.exposure;\n> +\t\tframeContext.sensor.gain = context.activeState.agc.again;\n> +\t\treturn;\n> +\t}\n> +\n>  \t/*\n>  \t * Calculate Mean Sample Value (MSV) according to formula from:\n>  \t * https://www.araa.asn.au/acra/acra2007/papers/paper84final.pdf\n> diff --git a/src/ipa/simple/algorithms/awb.cpp b/src/ipa/simple/algorithms/awb.cpp\n> index cf567e89..ddd0b791 100644\n> --- a/src/ipa/simple/algorithms/awb.cpp\n> +++ b/src/ipa/simple/algorithms/awb.cpp\n> @@ -61,6 +61,9 @@ void Awb::process(IPAContext &context,\n>  \t};\n>  \tmetadata.set(controls::ColourGains, mdGains);\n>  \n> +\tif (!stats->valid)\n> +\t\treturn;\n> +\n>  \t/*\n>  \t * Black level must be subtracted to get the correct AWB ratios, they\n>  \t * would be off if they were computed from the whole brightness range\n> diff --git a/src/ipa/simple/algorithms/blc.cpp b/src/ipa/simple/algorithms/blc.cpp\n> index 8c1e9ed0..616da0ee 100644\n> --- a/src/ipa/simple/algorithms/blc.cpp\n> +++ b/src/ipa/simple/algorithms/blc.cpp\n> @@ -60,6 +60,9 @@ void BlackLevel::process(IPAContext &context,\n>  \t};\n>  \tmetadata.set(controls::SensorBlackLevels, blackLevels);\n>  \n> +\tif (!stats->valid)\n> +\t\treturn;\n> +\n>  \tif (context.configuration.black.level.has_value())\n>  \t\treturn;\n>  \n> diff --git a/src/ipa/simple/ipa_context.h b/src/ipa/simple/ipa_context.h\n> index 468fccab..441f2a73 100644\n> --- a/src/ipa/simple/ipa_context.h\n> +++ b/src/ipa/simple/ipa_context.h\n> @@ -37,6 +37,10 @@ struct IPASessionConfiguration {\n>  };\n>  \n>  struct IPAActiveState {\n> +\tstruct {\n> +\t\tint32_t exposure;\n> +\t\tdouble again;\n> +\t} agc;\n\nI guess a blank line separating the structs will be asked here.\n\n>  \tstruct {\n>  \t\tuint8_t level;\n>  \t\tint32_t lastExposure;\n> diff --git a/src/libcamera/software_isp/debayer_cpu.cpp b/src/libcamera/software_isp/debayer_cpu.cpp\n> index 2dc85e5e..bfa60888 100644\n> --- a/src/libcamera/software_isp/debayer_cpu.cpp\n> +++ b/src/libcamera/software_isp/debayer_cpu.cpp\n> @@ -851,7 +851,7 @@ void DebayerCpu::process(uint32_t frame, FrameBuffer *input, FrameBuffer *output\n>  \t *\n>  \t * \\todo Pass real bufferId once stats buffer passing is changed.\n>  \t */\n> -\tstats_->finishFrame(frame, 0);\n> +\tstats_->finishFrame(frame, 0, true);\n>  \toutputBufferReady.emit(output);\n>  \tinputBufferReady.emit(input);\n>  }\n> diff --git a/src/libcamera/software_isp/swstats_cpu.cpp b/src/libcamera/software_isp/swstats_cpu.cpp\n> index 4b77b360..da91f912 100644\n> --- a/src/libcamera/software_isp/swstats_cpu.cpp\n> +++ b/src/libcamera/software_isp/swstats_cpu.cpp\n> @@ -313,11 +313,13 @@ void SwStatsCpu::startFrame(void)\n>   * \\brief Finish statistics calculation for the current frame\n>   * \\param[in] frame The frame number\n>   * \\param[in] bufferId ID of the statistics buffer\n> + * \\param[in] valid Indicates if the statistics for the current frame are valid\n>   *\n>   * This may only be called after a successful setWindow() call.\n>   */\n> -void SwStatsCpu::finishFrame(uint32_t frame, uint32_t bufferId)\n> +void SwStatsCpu::finishFrame(uint32_t frame, uint32_t bufferId, bool valid)\n>  {\n> +\tstats_.valid = valid;\n>  \t*sharedStats_ = stats_;\n>  \tstatsReady.emit(frame, bufferId);\n>  }\n> diff --git a/src/libcamera/software_isp/swstats_cpu.h b/src/libcamera/software_isp/swstats_cpu.h\n> index 26a2f462..6ac3c4de 100644\n> --- a/src/libcamera/software_isp/swstats_cpu.h\n> +++ b/src/libcamera/software_isp/swstats_cpu.h\n> @@ -41,7 +41,7 @@ public:\n>  \tint configure(const StreamConfiguration &inputCfg);\n>  \tvoid setWindow(const Rectangle &window);\n>  \tvoid startFrame();\n> -\tvoid finishFrame(uint32_t frame, uint32_t bufferId);\n> +\tvoid finishFrame(uint32_t frame, uint32_t bufferId, bool valid);\n>  \n>  \tvoid processLine0(unsigned int y, const uint8_t *src[])\n>  \t{\n\nIt works for me now.\n\nReviewed-by: Milan Zamazal <mzamazal@redhat.com>\nTested-by: Milan Zamazal <mzamazal@redhat.com>","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 72C2FC328C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 29 Sep 2025 09:48:29 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 69C4D6B5F3;\n\tMon, 29 Sep 2025 11:48:28 +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 B4A6B6B58E\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 29 Sep 2025 11:48:26 +0200 (CEST)","from mail-wr1-f70.google.com (mail-wr1-f70.google.com\n\t[209.85.221.70]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n\tus-mta-263-OCWDh_V2O9i2EvpQOa-pCQ-1; Mon, 29 Sep 2025 05:48:23 -0400","by mail-wr1-f70.google.com with SMTP id\n\tffacd0b85a97d-3efa77de998so2698183f8f.0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 29 Sep 2025 02:48:23 -0700 (PDT)","from mzamazal-thinkpadp1gen7.tpbc.csb\n\t(ip-77-48-47-2.net.vodafone.cz. [77.48.47.2])\n\tby smtp.gmail.com with ESMTPSA id\n\tffacd0b85a97d-40fb72fb6b7sm18734066f8f.2.2025.09.29.02.48.20\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tMon, 29 Sep 2025 02:48:20 -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=\"WwtfKmcL\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1759139305;\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\tin-reply-to:in-reply-to:references:references;\n\tbh=5SmYDWu8cWZUQJDAAEf2ROaQTQ885W0o1wQVBuF90IM=;\n\tb=WwtfKmcLe85oOYtfq0Vzz+niOXaOB9tyjxDNjanOl2EAQyTUzcErOEQVL4LDVV8WnefRTs\n\tU2w6yytx0Kdx1qA8ulMTLjVXMpROQyD15X5C51Sa/WED4MGfTO8cOleGb77oMbd7dZMPqD\n\tYKanjS15cm51xPq99IsqXmQ0pudXgrs=","X-MC-Unique":"OCWDh_V2O9i2EvpQOa-pCQ-1","X-Mimecast-MFC-AGG-ID":"OCWDh_V2O9i2EvpQOa-pCQ_1759139302","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1759139301; x=1759744101;\n\th=mime-version:user-agent:message-id:date:references:in-reply-to\n\t:subject:cc:to:from:x-gm-message-state:from:to:cc:subject:date\n\t:message-id:reply-to;\n\tbh=5SmYDWu8cWZUQJDAAEf2ROaQTQ885W0o1wQVBuF90IM=;\n\tb=PCA/rrjPLXQ+gt2Xj0f0iq2n3Za82awsq7RViWgo/3EHJKeVHcPEiuQyCL97DGVtrV\n\tbcZ/6yQ2IBo1jJwz8Wqkmgc7dmI0doLUFG67pss14sU2yPVbvu8IjkfPpwBuzEnOKWPW\n\thSWWexlAPWlEiJiyoEM6UN0IXZipsdIl16Ve50I43hV/uysFknB22L0oF0BA+E7+HgWS\n\tV7R2pe4RT1DD41bZRNcFEpg/EMh4Dm1qUmWN9tmZw8aH5FMYa5n7/u7Yf51GLH7/BXgU\n\tEI1XlOoz8cj50HsyradIIgCw87+K9gcaTin9FsviFzf/J5NfuBCaZoVizHwxFKb+RCR0\n\tFO7A==","X-Gm-Message-State":"AOJu0YxGUYyImP+ICsqmQ4RKqXVsDtP4ezpuolXdAiyhHKad8YbhlnFU\n\tQ1HNbVCY7liJapYj4TyGVQ47rwT65JgaWxgd55yqwqxlhOiFohSZmHShBSulUuLrs+d0ZF8cDLg\n\tl2j+/6Q+lGRZRCQ40D5R8YpUhJY/RPiTNoD/9I7b9g4Dp3SO2wsj4u/u2GYDGBvAaqaEium6gIK\n\t87Twa7wRCR/RoQB2RDbSLCA4yeOtNBZOP1/50x7ahnahGsGR78de0Kd3tL8y8=","X-Gm-Gg":"ASbGncst7r7pZX01LG+Z8JSqbF04fQJn63/+WzNeZj8MfE1LkFVdfcrkuB+ruJSsML+\n\toDIsTH6jmGIxgjcp2fS7R5sxfSVtV7RuvUVPnDhch/DQ5ngqUeF1KwxFfN5Q5IjImf1WPTIePgM\n\taizKewZl3oKL3NnfqkS5CS+h17mWMRHXqFha+HsWeQ+FSGwtS3W/uQRf5SxZNzPaboWcmWO/1cT\n\tDDPnBNTSn4a9bXuBV7gHpmUCJGWcfzSNfIltjNjyNP15/kxItFxYydOlujBxWsk3IiNmEQw6q/8\n\tfvHJJqNaEe/hq/DIeeVpPK20xTo2Dz/b39x06CxRNrJdjvCuTFhpt/+8pKIxokh6gi0Fvz6ibo3\n\tlBJEf/91ayzl14ejh4Q==","X-Received":["by 2002:a05:6000:2c10:b0:3e9:ee54:af54 with SMTP id\n\tffacd0b85a97d-40e4745e1c5mr12525951f8f.21.1759139301529; \n\tMon, 29 Sep 2025 02:48:21 -0700 (PDT)","by 2002:a05:6000:2c10:b0:3e9:ee54:af54 with SMTP id\n\tffacd0b85a97d-40e4745e1c5mr12525923f8f.21.1759139300962; \n\tMon, 29 Sep 2025 02:48:20 -0700 (PDT)"],"X-Google-Smtp-Source":"AGHT+IHKzAnuubyvjDBN0lSC/e1izw52dMqO4PEBAYcLIrOXHnVa+iRESVsMZvbCLoRib6oLfH02qQ==","From":"Milan Zamazal <mzamazal@redhat.com>","To":"Hans de Goede <hansg@kernel.org>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH v3 5/6] libcamera: software_isp: Add valid flag to\n\tstruct SwIspStats","In-Reply-To":"<20250927180004.84620-6-hansg@kernel.org> (Hans de Goede's\n\tmessage of \"Sat, 27 Sep 2025 20:00:03 +0200\")","References":"<20250927180004.84620-1-hansg@kernel.org>\n\t<20250927180004.84620-6-hansg@kernel.org>","Date":"Mon, 29 Sep 2025 11:48:19 +0200","Message-ID":"<85h5wlr3mk.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":"iURcm47ujoX6pn28_EMmXGOxuZTdjDCokTKHT_J2bls_1759139302","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain","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>"}}]