[PATCH v5 3/6] ipa: simple: Report the ColourGains in metadata

Kieran Bingham kieran.bingham at ideasonboard.com
Wed Mar 26 22:26:38 CET 2025


Quoting Milan Zamazal (2025-03-26 12:48:52)
> From: Kieran Bingham <kieran.bingham at ideasonboard.com>
> 
> Provide the determined colour gains back into the metadata
> to add to completed requests.
> 
> Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> Signed-off-by: Milan Zamazal <mzamazal at redhat.com>
> ---
>  src/ipa/simple/algorithms/awb.cpp | 21 ++++++++++++++++++++-
>  src/ipa/simple/algorithms/awb.h   |  6 +++++-
>  src/ipa/simple/ipa_context.h      |  4 ++++
>  3 files changed, 29 insertions(+), 2 deletions(-)
> 
> diff --git a/src/ipa/simple/algorithms/awb.cpp b/src/ipa/simple/algorithms/awb.cpp
> index ec77c6e5..55719059 100644
> --- a/src/ipa/simple/algorithms/awb.cpp
> +++ b/src/ipa/simple/algorithms/awb.cpp
> @@ -17,6 +17,8 @@
>  #include "libipa/colours.h"
>  #include "simple/ipa_context.h"
>  
> +#include "control_ids.h"
> +
>  namespace libcamera {
>  
>  LOG_DEFINE_CATEGORY(IPASoftAwb)
> @@ -32,15 +34,32 @@ int Awb::configure(IPAContext &context,
>         return 0;
>  }
>  
> +void Awb::prepare(IPAContext &context,
> +                 [[maybe_unused]] const uint32_t frame,
> +                 IPAFrameContext &frameContext,
> +                 [[maybe_unused]] DebayerParams *params)
> +{
> +       auto &gains = context.activeState.awb.gains;
> +       frameContext.gains.red = gains.r();
> +       frameContext.gains.blue = gains.b();

Interesting that this highlights the white balance parameters are
probably being used from the wrong 'time' as they should be determined
here in prepare... (by taking the most recent active state and combining
any decision from the controls for any manual white balance).

But - as this series is just trying to get the reporting in - lets leave
that issue for later, and try to keep this moving forwards:


Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>



> +}
> +
>  void Awb::process(IPAContext &context,
>                   [[maybe_unused]] const uint32_t frame,
> -                 [[maybe_unused]] IPAFrameContext &frameContext,
> +                 IPAFrameContext &frameContext,
>                   const SwIspStats *stats,
>                   ControlList &metadata)
>  {
>         const SwIspStats::Histogram &histogram = stats->yHistogram;
>         const uint8_t blackLevel = context.activeState.blc.level;
>  
> +       const float maxGain = 1024.0;
> +       const float mdGains[] = {
> +               static_cast<float>(frameContext.gains.red / maxGain),
> +               static_cast<float>(frameContext.gains.blue / maxGain)
> +       };
> +       metadata.set(controls::ColourGains, mdGains);
> +
>         /*
>          * Black level must be subtracted to get the correct AWB ratios, they
>          * would be off if they were computed from the whole brightness range
> diff --git a/src/ipa/simple/algorithms/awb.h b/src/ipa/simple/algorithms/awb.h
> index db1496cd..ad993f39 100644
> --- a/src/ipa/simple/algorithms/awb.h
> +++ b/src/ipa/simple/algorithms/awb.h
> @@ -1,6 +1,6 @@
>  /* SPDX-License-Identifier: LGPL-2.1-or-later */
>  /*
> - * Copyright (C) 2024, Red Hat Inc.
> + * Copyright (C) 2024-2025 Red Hat Inc.
>   *
>   * Auto white balance
>   */
> @@ -20,6 +20,10 @@ public:
>         ~Awb() = default;
>  
>         int configure(IPAContext &context, const IPAConfigInfo &configInfo) override;
> +       void prepare(IPAContext &context,
> +                    const uint32_t frame,
> +                    IPAFrameContext &frameContext,
> +                    DebayerParams *params) override;
>         void process(IPAContext &context,
>                      const uint32_t frame,
>                      IPAFrameContext &frameContext,
> diff --git a/src/ipa/simple/ipa_context.h b/src/ipa/simple/ipa_context.h
> index 17bcd4ca..bfac835b 100644
> --- a/src/ipa/simple/ipa_context.h
> +++ b/src/ipa/simple/ipa_context.h
> @@ -70,6 +70,10 @@ struct IPAFrameContext : public FrameContext {
>                 int32_t exposure;
>                 double gain;
>         } sensor;
> +       struct {
> +               double red;
> +               double blue;
> +       } gains;
>  };
>  
>  struct IPAContext {
> -- 
> 2.49.0
>


More information about the libcamera-devel mailing list