[{"id":33712,"web_url":"https://patchwork.libcamera.org/comment/33712/","msgid":"<174298551517.670680.9819992777788187815@ping.linuxembedded.co.uk>","date":"2025-03-26T10:38:35","subject":"Re: [PATCH v8 09/10] libcamera: software_isp: Track whether CCM is\n\tenabled","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Milan Zamazal (2025-03-26 09:08:46)\n> Applying color correction matrix (CCM) in software ISP is optional due\n> to performance reasons.  CCM is applied if and only if `Ccm' algorithm\n> is present in the tuning file.\n> \n> Software ISP debayering is a performance critical piece of code and we\n> do not want to use dynamic conditionals there.  Therefore we pass\n> information about CCM application to debayering configuration and let it\n> select the right versions of debayering functions using templates.  This\n> is a trick similar to the previously used one for adding or not adding\n> an alpha channel to the output.\n> \n> Debayering gets this information but it ignores it in this patch.\n> Actual processing with CCM is added in the followup patch.\n> \n> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n> ---\n>  .../internal/software_isp/software_isp.h      |  1 +\n>  include/libcamera/ipa/soft.mojom              |  2 +-\n>  src/ipa/simple/algorithms/ccm.cpp             |  2 +\n>  src/ipa/simple/ipa_context.h                  |  1 +\n>  src/ipa/simple/soft_simple.cpp                |  8 +++-\n>  src/libcamera/software_isp/debayer.cpp        |  3 +-\n>  src/libcamera/software_isp/debayer.h          |  3 +-\n>  src/libcamera/software_isp/debayer_cpu.cpp    | 44 ++++++++++++-------\n>  src/libcamera/software_isp/debayer_cpu.h      | 29 ++++++------\n>  src/libcamera/software_isp/software_isp.cpp   |  5 ++-\n>  10 files changed, 61 insertions(+), 37 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 133b545c..0026cec2 100644\n> --- a/include/libcamera/internal/software_isp/software_isp.h\n> +++ b/include/libcamera/internal/software_isp/software_isp.h\n> @@ -99,6 +99,7 @@ private:\n>         SharedMemObject<DebayerParams> sharedParams_;\n>         DebayerParams debayerParams_;\n>         DmaBufAllocator dmaHeap_;\n> +       bool ccmEnabled_;\n>  \n>         std::unique_ptr<ipa::soft::IPAProxySoft> ipa_;\n>         std::deque<FrameBuffer *> queuedInputBuffers_;\n> diff --git a/include/libcamera/ipa/soft.mojom b/include/libcamera/ipa/soft.mojom\n> index d52e6f1a..ede74413 100644\n> --- a/include/libcamera/ipa/soft.mojom\n> +++ b/include/libcamera/ipa/soft.mojom\n> @@ -17,7 +17,7 @@ interface IPASoftInterface {\n>              libcamera.SharedFD fdStats,\n>              libcamera.SharedFD fdParams,\n>              libcamera.ControlInfoMap sensorCtrlInfoMap)\n> -               => (int32 ret, libcamera.ControlInfoMap ipaControls);\n> +               => (int32 ret, libcamera.ControlInfoMap ipaControls, bool ccmEnabled);\n>         start() => (int32 ret);\n>         stop();\n>         configure(IPAConfigInfo configInfo)\n> diff --git a/src/ipa/simple/algorithms/ccm.cpp b/src/ipa/simple/algorithms/ccm.cpp\n> index 86e0395c..d5ba928d 100644\n> --- a/src/ipa/simple/algorithms/ccm.cpp\n> +++ b/src/ipa/simple/algorithms/ccm.cpp\n> @@ -34,6 +34,8 @@ int Ccm::init([[maybe_unused]] IPAContext &context, const YamlObject &tuningData\n>                 return ret;\n>         }\n>  \n> +       context.ccmEnabled = true;\n> +\n>         return 0;\n>  }\n>  \n> diff --git a/src/ipa/simple/ipa_context.h b/src/ipa/simple/ipa_context.h\n> index 67183b3e..17bcd4ca 100644\n> --- a/src/ipa/simple/ipa_context.h\n> +++ b/src/ipa/simple/ipa_context.h\n> @@ -82,6 +82,7 @@ struct IPAContext {\n>         IPAActiveState activeState;\n>         FCQueue<IPAFrameContext> frameContexts;\n>         ControlInfoMap::Map ctrlMap;\n> +       bool ccmEnabled;\n>  };\n>  \n>  } /* namespace ipa::soft */\n> diff --git a/src/ipa/simple/soft_simple.cpp b/src/ipa/simple/soft_simple.cpp\n> index b26e4e15..a87c6cdd 100644\n> --- a/src/ipa/simple/soft_simple.cpp\n> +++ b/src/ipa/simple/soft_simple.cpp\n> @@ -51,7 +51,8 @@ public:\n>                  const SharedFD &fdStats,\n>                  const SharedFD &fdParams,\n>                  const ControlInfoMap &sensorInfoMap,\n> -                ControlInfoMap *ipaControls) override;\n> +                ControlInfoMap *ipaControls,\n> +                bool *ccmEnabled) override;\n>         int configure(const IPAConfigInfo &configInfo) override;\n>  \n>         int start() override;\n> @@ -89,7 +90,8 @@ int IPASoftSimple::init(const IPASettings &settings,\n>                         const SharedFD &fdStats,\n>                         const SharedFD &fdParams,\n>                         const ControlInfoMap &sensorInfoMap,\n> -                       ControlInfoMap *ipaControls)\n> +                       ControlInfoMap *ipaControls,\n> +                       bool *ccmEnabled)\n>  {\n>         camHelper_ = CameraSensorHelperFactoryBase::create(settings.sensorModel);\n>         if (!camHelper_) {\n> @@ -125,6 +127,8 @@ int IPASoftSimple::init(const IPASettings &settings,\n>         if (ret)\n>                 return ret;\n>  \n> +       *ccmEnabled = context_.ccmEnabled;\n> +\n>         params_ = nullptr;\n>         stats_ = nullptr;\n>  \n> diff --git a/src/libcamera/software_isp/debayer.cpp b/src/libcamera/software_isp/debayer.cpp\n> index f0b83261..34e42201 100644\n> --- a/src/libcamera/software_isp/debayer.cpp\n> +++ b/src/libcamera/software_isp/debayer.cpp\n> @@ -57,10 +57,11 @@ Debayer::~Debayer()\n>  }\n>  \n>  /**\n> - * \\fn int Debayer::configure(const StreamConfiguration &inputCfg, const std::vector<std::reference_wrapper<StreamConfiguration>> &outputCfgs)\n> + * \\fn int Debayer::configure()\n>   * \\brief Configure the debayer object according to the passed in parameters\n>   * \\param[in] inputCfg The input configuration\n>   * \\param[in] outputCfgs The output configurations\n> + * \\param[in] ccmEnabled Whether a color correction matrix is applied\n>   *\n>   * \\return 0 on success, a negative errno on failure\n>   */\n> diff --git a/src/libcamera/software_isp/debayer.h b/src/libcamera/software_isp/debayer.h\n> index d7ca060d..ba033d44 100644\n> --- a/src/libcamera/software_isp/debayer.h\n> +++ b/src/libcamera/software_isp/debayer.h\n> @@ -33,7 +33,8 @@ public:\n>         virtual ~Debayer() = 0;\n>  \n>         virtual int configure(const StreamConfiguration &inputCfg,\n> -                             const std::vector<std::reference_wrapper<StreamConfiguration>> &outputCfgs) = 0;\n> +                             const std::vector<std::reference_wrapper<StreamConfiguration>> &outputCfgs,\n> +                             bool ccmEnabled) = 0;\n>  \n>         virtual std::vector<PixelFormat> formats(PixelFormat inputFormat) = 0;\n>  \n> diff --git a/src/libcamera/software_isp/debayer_cpu.cpp b/src/libcamera/software_isp/debayer_cpu.cpp\n> index 01cfb36b..0cd03a8f 100644\n> --- a/src/libcamera/software_isp/debayer_cpu.cpp\n> +++ b/src/libcamera/software_isp/debayer_cpu.cpp\n> @@ -114,7 +114,7 @@ DebayerCpu::~DebayerCpu() = default;\n>                 (prev[x] + curr[x - p] + curr[x + n] + next[x]) / (4 * (div)),         \\\n>                 curr[x] / (div))\n>  \n> -template<bool addAlphaByte>\n> +template<bool addAlphaByte, bool ccmEnabled>\n>  void DebayerCpu::debayer8_BGBG_BGR888(uint8_t *dst, const uint8_t *src[])\n>  {\n>         DECLARE_SRC_POINTERS(uint8_t)\n> @@ -125,7 +125,7 @@ void DebayerCpu::debayer8_BGBG_BGR888(uint8_t *dst, const uint8_t *src[])\n>         }\n>  }\n>  \n> -template<bool addAlphaByte>\n> +template<bool addAlphaByte, bool ccmEnabled>\n>  void DebayerCpu::debayer8_GRGR_BGR888(uint8_t *dst, const uint8_t *src[])\n>  {\n>         DECLARE_SRC_POINTERS(uint8_t)\n> @@ -136,7 +136,7 @@ void DebayerCpu::debayer8_GRGR_BGR888(uint8_t *dst, const uint8_t *src[])\n>         }\n>  }\n>  \n> -template<bool addAlphaByte>\n> +template<bool addAlphaByte, bool ccmEnabled>\n>  void DebayerCpu::debayer10_BGBG_BGR888(uint8_t *dst, const uint8_t *src[])\n>  {\n>         DECLARE_SRC_POINTERS(uint16_t)\n> @@ -148,7 +148,7 @@ void DebayerCpu::debayer10_BGBG_BGR888(uint8_t *dst, const uint8_t *src[])\n>         }\n>  }\n>  \n> -template<bool addAlphaByte>\n> +template<bool addAlphaByte, bool ccmEnabled>\n>  void DebayerCpu::debayer10_GRGR_BGR888(uint8_t *dst, const uint8_t *src[])\n>  {\n>         DECLARE_SRC_POINTERS(uint16_t)\n> @@ -160,7 +160,7 @@ void DebayerCpu::debayer10_GRGR_BGR888(uint8_t *dst, const uint8_t *src[])\n>         }\n>  }\n>  \n> -template<bool addAlphaByte>\n> +template<bool addAlphaByte, bool ccmEnabled>\n>  void DebayerCpu::debayer12_BGBG_BGR888(uint8_t *dst, const uint8_t *src[])\n>  {\n>         DECLARE_SRC_POINTERS(uint16_t)\n> @@ -172,7 +172,7 @@ void DebayerCpu::debayer12_BGBG_BGR888(uint8_t *dst, const uint8_t *src[])\n>         }\n>  }\n>  \n> -template<bool addAlphaByte>\n> +template<bool addAlphaByte, bool ccmEnabled>\n>  void DebayerCpu::debayer12_GRGR_BGR888(uint8_t *dst, const uint8_t *src[])\n>  {\n>         DECLARE_SRC_POINTERS(uint16_t)\n> @@ -184,7 +184,7 @@ void DebayerCpu::debayer12_GRGR_BGR888(uint8_t *dst, const uint8_t *src[])\n>         }\n>  }\n>  \n> -template<bool addAlphaByte>\n> +template<bool addAlphaByte, bool ccmEnabled>\n>  void DebayerCpu::debayer10P_BGBG_BGR888(uint8_t *dst, const uint8_t *src[])\n>  {\n>         const int widthInBytes = window_.width * 5 / 4;\n> @@ -210,7 +210,7 @@ void DebayerCpu::debayer10P_BGBG_BGR888(uint8_t *dst, const uint8_t *src[])\n>         }\n>  }\n>  \n> -template<bool addAlphaByte>\n> +template<bool addAlphaByte, bool ccmEnabled>\n>  void DebayerCpu::debayer10P_GRGR_BGR888(uint8_t *dst, const uint8_t *src[])\n>  {\n>         const int widthInBytes = window_.width * 5 / 4;\n> @@ -231,7 +231,7 @@ void DebayerCpu::debayer10P_GRGR_BGR888(uint8_t *dst, const uint8_t *src[])\n>         }\n>  }\n>  \n> -template<bool addAlphaByte>\n> +template<bool addAlphaByte, bool ccmEnabled>\n>  void DebayerCpu::debayer10P_GBGB_BGR888(uint8_t *dst, const uint8_t *src[])\n>  {\n>         const int widthInBytes = window_.width * 5 / 4;\n> @@ -252,7 +252,7 @@ void DebayerCpu::debayer10P_GBGB_BGR888(uint8_t *dst, const uint8_t *src[])\n>         }\n>  }\n>  \n> -template<bool addAlphaByte>\n> +template<bool addAlphaByte, bool ccmEnabled>\n>  void DebayerCpu::debayer10P_RGRG_BGR888(uint8_t *dst, const uint8_t *src[])\n>  {\n>         const int widthInBytes = window_.width * 5 / 4;\n> @@ -368,11 +368,17 @@ int DebayerCpu::setupStandardBayerOrder(BayerFormat::Order order)\n>         return 0;\n>  }\n>  \n> -#define SET_DEBAYER_METHODS(method0, method1)                                                \\\n> -       debayer0_ = addAlphaByte ? &DebayerCpu::method0<true> : &DebayerCpu::method0<false>; \\\n> -       debayer1_ = addAlphaByte ? &DebayerCpu::method1<true> : &DebayerCpu::method1<false>;\n> -\n> -int DebayerCpu::setDebayerFunctions(PixelFormat inputFormat, PixelFormat outputFormat)\n> +#define SET_DEBAYER_METHODS(method0, method1)                                                                        \\\n> +       debayer0_ = addAlphaByte                                                                                     \\\n> +                           ? (ccmEnabled ? &DebayerCpu::method0<true, true> : &DebayerCpu::method0<true, false>)    \\\n> +                           : (ccmEnabled ? &DebayerCpu::method0<false, true> : &DebayerCpu::method0<false, false>); \\\n> +       debayer1_ = addAlphaByte                                                                                     \\\n> +                           ? (ccmEnabled ? &DebayerCpu::method1<true, true> : &DebayerCpu::method1<true, false>)    \\\n> +                           : (ccmEnabled ? &DebayerCpu::method1<false, true> : &DebayerCpu::method1<false, false>);\n> +\n> +int DebayerCpu::setDebayerFunctions(PixelFormat inputFormat,\n> +                                   PixelFormat outputFormat,\n> +                                   bool ccmEnabled)\n>  {\n>         BayerFormat bayerFormat =\n>                 BayerFormat::fromPixelFormat(inputFormat);\n> @@ -464,7 +470,8 @@ int DebayerCpu::setDebayerFunctions(PixelFormat inputFormat, PixelFormat outputF\n>  }\n>  \n>  int DebayerCpu::configure(const StreamConfiguration &inputCfg,\n> -                         const std::vector<std::reference_wrapper<StreamConfiguration>> &outputCfgs)\n> +                         const std::vector<std::reference_wrapper<StreamConfiguration>> &outputCfgs,\n> +                         bool ccmEnabled)\n>  {\n>         if (getInputConfig(inputCfg.pixelFormat, inputConfig_) != 0)\n>                 return -EINVAL;\n> @@ -503,7 +510,10 @@ int DebayerCpu::configure(const StreamConfiguration &inputCfg,\n>                 return -EINVAL;\n>         }\n>  \n> -       if (setDebayerFunctions(inputCfg.pixelFormat, outputCfg.pixelFormat) != 0)\n> +       int ret = setDebayerFunctions(inputCfg.pixelFormat,\n> +                                     outputCfg.pixelFormat,\n> +                                     ccmEnabled);\n> +       if (ret != 0)\n>                 return -EINVAL;\n>  \n>         window_.x = ((inputCfg.size.width - outputCfg.size.width) / 2) &\n> diff --git a/src/libcamera/software_isp/debayer_cpu.h b/src/libcamera/software_isp/debayer_cpu.h\n> index 2c47e7c6..21c08a2d 100644\n> --- a/src/libcamera/software_isp/debayer_cpu.h\n> +++ b/src/libcamera/software_isp/debayer_cpu.h\n> @@ -1,7 +1,7 @@\n>  /* SPDX-License-Identifier: LGPL-2.1-or-later */\n>  /*\n>   * Copyright (C) 2023, Linaro Ltd\n> - * Copyright (C) 2023, Red Hat Inc.\n> + * Copyright (C) 2023-2025 Red Hat Inc.\n>   *\n>   * Authors:\n>   * Hans de Goede <hdegoede@redhat.com>\n> @@ -31,7 +31,8 @@ public:\n>         ~DebayerCpu();\n>  \n>         int configure(const StreamConfiguration &inputCfg,\n> -                     const std::vector<std::reference_wrapper<StreamConfiguration>> &outputCfgs);\n> +                     const std::vector<std::reference_wrapper<StreamConfiguration>> &outputCfgs,\n> +                     bool ccmEnabled);\n>         Size patternSize(PixelFormat inputFormat);\n>         std::vector<PixelFormat> formats(PixelFormat input);\n>         std::tuple<unsigned int, unsigned int>\n> @@ -85,28 +86,28 @@ private:\n>         using debayerFn = void (DebayerCpu::*)(uint8_t *dst, const uint8_t *src[]);\n>  \n>         /* 8-bit raw bayer format */\n> -       template<bool addAlphaByte>\n> +       template<bool addAlphaByte, bool ccmEnabled>\n>         void debayer8_BGBG_BGR888(uint8_t *dst, const uint8_t *src[]);\n> -       template<bool addAlphaByte>\n> +       template<bool addAlphaByte, bool ccmEnabled>\n>         void debayer8_GRGR_BGR888(uint8_t *dst, const uint8_t *src[]);\n>         /* unpacked 10-bit raw bayer format */\n> -       template<bool addAlphaByte>\n> +       template<bool addAlphaByte, bool ccmEnabled>\n>         void debayer10_BGBG_BGR888(uint8_t *dst, const uint8_t *src[]);\n> -       template<bool addAlphaByte>\n> +       template<bool addAlphaByte, bool ccmEnabled>\n>         void debayer10_GRGR_BGR888(uint8_t *dst, const uint8_t *src[]);\n>         /* unpacked 12-bit raw bayer format */\n> -       template<bool addAlphaByte>\n> +       template<bool addAlphaByte, bool ccmEnabled>\n>         void debayer12_BGBG_BGR888(uint8_t *dst, const uint8_t *src[]);\n> -       template<bool addAlphaByte>\n> +       template<bool addAlphaByte, bool ccmEnabled>\n>         void debayer12_GRGR_BGR888(uint8_t *dst, const uint8_t *src[]);\n>         /* CSI-2 packed 10-bit raw bayer format (all the 4 orders) */\n> -       template<bool addAlphaByte>\n> +       template<bool addAlphaByte, bool ccmEnabled>\n>         void debayer10P_BGBG_BGR888(uint8_t *dst, const uint8_t *src[]);\n> -       template<bool addAlphaByte>\n> +       template<bool addAlphaByte, bool ccmEnabled>\n>         void debayer10P_GRGR_BGR888(uint8_t *dst, const uint8_t *src[]);\n> -       template<bool addAlphaByte>\n> +       template<bool addAlphaByte, bool ccmEnabled>\n>         void debayer10P_GBGB_BGR888(uint8_t *dst, const uint8_t *src[]);\n> -       template<bool addAlphaByte>\n> +       template<bool addAlphaByte, bool ccmEnabled>\n>         void debayer10P_RGRG_BGR888(uint8_t *dst, const uint8_t *src[]);\n>  \n>         struct DebayerInputConfig {\n> @@ -125,7 +126,9 @@ private:\n>         int getInputConfig(PixelFormat inputFormat, DebayerInputConfig &config);\n>         int getOutputConfig(PixelFormat outputFormat, DebayerOutputConfig &config);\n>         int setupStandardBayerOrder(BayerFormat::Order order);\n> -       int setDebayerFunctions(PixelFormat inputFormat, PixelFormat outputFormat);\n> +       int setDebayerFunctions(PixelFormat inputFormat,\n> +                               PixelFormat outputFormat,\n> +                               bool ccmEnabled);\n>         void setupInputMemcpy(const uint8_t *linePointers[]);\n>         void shiftLinePointers(const uint8_t *linePointers[], const uint8_t *src);\n>         void memcpyNextLine(const uint8_t *linePointers[]);\n> diff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp\n> index a64e6b2c..4a74dcb6 100644\n> --- a/src/libcamera/software_isp/software_isp.cpp\n> +++ b/src/libcamera/software_isp/software_isp.cpp\n> @@ -132,7 +132,8 @@ SoftwareIsp::SoftwareIsp(PipelineHandler *pipe, const CameraSensor *sensor,\n>                              debayer_->getStatsFD(),\n>                              sharedParams_.fd(),\n>                              sensor->controls(),\n> -                            ipaControls);\n> +                            ipaControls,\n> +                            &ccmEnabled_);\n>         if (ret) {\n>                 LOG(SoftwareIsp, Error) << \"IPA init failed\";\n>                 debayer_.reset();\n> @@ -244,7 +245,7 @@ int SoftwareIsp::configure(const StreamConfiguration &inputCfg,\n>         if (ret < 0)\n>                 return ret;\n>  \n> -       return debayer_->configure(inputCfg, outputCfgs);\n> +       return debayer_->configure(inputCfg, outputCfgs, ccmEnabled_);\n>  }\n>  \n>  /**\n> -- \n> 2.49.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 68066C3213\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 26 Mar 2025 10:38:39 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 1B4586895A;\n\tWed, 26 Mar 2025 11:38:39 +0100 (CET)","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 78CF06894B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 26 Mar 2025 11:38:37 +0100 (CET)","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 B3D98475;\n\tWed, 26 Mar 2025 11:36:49 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"Fi5GevFk\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1742985409;\n\tbh=cGWlGAc7e9s/DI+X7+RxnIhTIJpwQVsFOHreKaxoCLQ=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=Fi5GevFkhF+oIrx+MVsQLYSLx7ehzGXNlVEpHWxfT3TjaRwLejaGZm9uLDrlqTHVO\n\tCDUBRnRNOelmG50TVEOPjVS3qjOImQnhGpTkmlhNnBohU6uxRy48TFfiLZL1ITGx88\n\tqPieJ0W+9KfQWR0RQmKZkXHUNQuLNXE4kbtzvG7I=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20250326090849.15494-10-mzamazal@redhat.com>","References":"<20250326090849.15494-1-mzamazal@redhat.com>\n\t<20250326090849.15494-10-mzamazal@redhat.com>","Subject":"Re: [PATCH v8 09/10] libcamera: software_isp: Track whether CCM is\n\tenabled","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"Milan Zamazal <mzamazal@redhat.com>,\n\tRobert Mader <robert.mader@collabora.com>,\n\tHans de Goede <hdegoede@redhat.com>, \n\tLaurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Milan Zamazal <mzamazal@redhat.com>, libcamera-devel@lists.libcamera.org","Date":"Wed, 26 Mar 2025 10:38:35 +0000","Message-ID":"<174298551517.670680.9819992777788187815@ping.linuxembedded.co.uk>","User-Agent":"alot/0.10","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>"}}]