[PATCH 2/6] ipa: ipu3: Use centralised libipa helpers
Jacopo Mondi
jacopo.mondi at ideasonboard.com
Mon Nov 4 12:08:09 CET 2024
Hi Dan
On Thu, Oct 31, 2024 at 04:07:37PM +0000, Daniel Scally wrote:
> Use the centralised libipa helpers instead of open coding common
> functions.
>
> Signed-off-by: Daniel Scally <dan.scally at ideasonboard.com>
> ---
> src/ipa/ipu3/algorithms/agc.cpp | 7 ++++---
> src/ipa/ipu3/algorithms/awb.cpp | 34 +++------------------------------
> src/ipa/ipu3/algorithms/awb.h | 1 -
> 3 files changed, 7 insertions(+), 35 deletions(-)
>
> diff --git a/src/ipa/ipu3/algorithms/agc.cpp b/src/ipa/ipu3/algorithms/agc.cpp
> index c5f3d8f0..3eb73ef0 100644
> --- a/src/ipa/ipu3/algorithms/agc.cpp
> +++ b/src/ipa/ipu3/algorithms/agc.cpp
> @@ -17,6 +17,7 @@
>
> #include <libcamera/ipa/core_ipa_interface.h>
>
> +#include "libipa/helpers.h"
> #include "libipa/histogram.h"
>
> /**
> @@ -185,9 +186,9 @@ double Agc::estimateLuminance(double gain) const
> blueSum += std::min(std::get<2>(rgbTriples_[i]) * gain, 255.0);
> }
>
> - double ySum = redSum * rGain_ * 0.299
> - + greenSum * gGain_ * 0.587
> - + blueSum * bGain_ * 0.114;
> + double ySum = ipa::rec601LuminanceFromRGB(redSum * rGain_,
Here and in the next patches you can drop the ipa:: namespace
qualifier
> + greenSum * gGain_,
> + blueSum * bGain_);
>
> return ySum / (bdsGrid_.height * bdsGrid_.width) / 255;
> }
> diff --git a/src/ipa/ipu3/algorithms/awb.cpp b/src/ipa/ipu3/algorithms/awb.cpp
> index 4d6e3994..0085edf4 100644
> --- a/src/ipa/ipu3/algorithms/awb.cpp
> +++ b/src/ipa/ipu3/algorithms/awb.cpp
> @@ -13,6 +13,8 @@
>
> #include <libcamera/control_ids.h>
>
> +#include "libipa/helpers.h"
> +
> /**
> * \file awb.h
> */
> @@ -301,36 +303,6 @@ void Awb::prepare(IPAContext &context,
> params->use.acc_ccm = 1;
> }
>
> -/**
> - * The function estimates the correlated color temperature using
> - * from RGB color space input.
> - * In physics and color science, the Planckian locus or black body locus is
> - * the path or locus that the color of an incandescent black body would take
> - * in a particular chromaticity space as the blackbody temperature changes.
> - *
> - * If a narrow range of color temperatures is considered (those encapsulating
> - * daylight being the most practical case) one can approximate the Planckian
> - * locus in order to calculate the CCT in terms of chromaticity coordinates.
> - *
> - * More detailed information can be found in:
> - * https://en.wikipedia.org/wiki/Color_temperature#Approximation
> - */
> -uint32_t Awb::estimateCCT(double red, double green, double blue)
> -{
> - /* Convert the RGB values to CIE tristimulus values (XYZ) */
> - double X = (-0.14282) * (red) + (1.54924) * (green) + (-0.95641) * (blue);
> - double Y = (-0.32466) * (red) + (1.57837) * (green) + (-0.73191) * (blue);
> - double Z = (-0.68202) * (red) + (0.77073) * (green) + (0.56332) * (blue);
> -
> - /* Calculate the normalized chromaticity values */
> - double x = X / (X + Y + Z);
> - double y = Y / (X + Y + Z);
> -
> - /* Calculate CCT */
> - double n = (x - 0.3320) / (0.1858 - y);
> - return 449 * n * n * n + 3525 * n * n + 6823.3 * n + 5520.33;
> -}
> -
> /* Generate an RGB vector with the average values for each zone */
> void Awb::generateZones()
> {
> @@ -437,7 +409,7 @@ void Awb::awbGreyWorld()
> blueGain = sumBlue.G / (sumBlue.B + 1);
>
> /* Color temperature is not relevant in Grey world but still useful to estimate it :-) */
> - asyncResults_.temperatureK = estimateCCT(sumRed.R, sumRed.G, sumBlue.B);
> + asyncResults_.temperatureK = ipa::estimateCCT(sumRed.R, sumRed.G, sumBlue.B);
>
> /*
> * Gain values are unsigned integer value ranging [0, 8) with 13 bit
> diff --git a/src/ipa/ipu3/algorithms/awb.h b/src/ipa/ipu3/algorithms/awb.h
> index c0202823..a13c49ac 100644
> --- a/src/ipa/ipu3/algorithms/awb.h
> +++ b/src/ipa/ipu3/algorithms/awb.h
> @@ -75,7 +75,6 @@ private:
> void generateAwbStats(const ipu3_uapi_stats_3a *stats);
> void clearAwbStats();
> void awbGreyWorld();
> - uint32_t estimateCCT(double red, double green, double blue);
> static constexpr uint16_t threshold(float value);
> static constexpr uint16_t gainValue(double gain);
>
> --
> 2.30.2
>
More information about the libcamera-devel
mailing list