[PATCH v4 1/9] libcamera: software_isp: Determine color temperature
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Sun Jan 26 23:50:21 CET 2025
Hi Milan,
Thank you for the patch.
On Mon, Jan 13, 2025 at 02:50:58PM +0100, Milan Zamazal wrote:
> The AWB algorithm has data to determine color temperature of the image.
> Let's compute the temperature from it and store it into the context.
> This piece of information is currently unused but it will be needed in a
> followup patch introducing support for color correction matrix.
>
> Let's store the white balance related information under `awb' subsection
> of the active state, as the hardware pipelines do.
>
> Signed-off-by: Milan Zamazal <mzamazal at redhat.com>
> Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> ---
> src/ipa/simple/algorithms/awb.cpp | 13 ++++++++++---
> src/ipa/simple/algorithms/lut.cpp | 2 +-
> src/ipa/simple/ipa_context.h | 11 +++++++----
> 3 files changed, 18 insertions(+), 8 deletions(-)
>
> diff --git a/src/ipa/simple/algorithms/awb.cpp b/src/ipa/simple/algorithms/awb.cpp
> index 195de41d..f4fe1af6 100644
> --- a/src/ipa/simple/algorithms/awb.cpp
> +++ b/src/ipa/simple/algorithms/awb.cpp
> @@ -12,6 +12,7 @@
>
> #include <libcamera/base/log.h>
>
> +#include "libipa/colours.h"
> #include "simple/ipa_context.h"
>
> namespace libcamera {
> @@ -23,7 +24,7 @@ namespace ipa::soft::algorithms {
> int Awb::configure(IPAContext &context,
> [[maybe_unused]] const IPAConfigInfo &configInfo)
> {
> - auto &gains = context.activeState.gains;
> + auto &gains = context.activeState.awb.gains;
> gains.red = gains.green = gains.blue = 1.0;
>
> return 0;
> @@ -54,12 +55,18 @@ void Awb::process(IPAContext &context,
> * Calculate red and blue gains for AWB.
> * Clamp max gain at 4.0, this also avoids 0 division.
> */
> - auto &gains = context.activeState.gains;
> + auto &gains = context.activeState.awb.gains;
> gains.red = sumR <= sumG / 4 ? 4.0 : static_cast<double>(sumG) / sumR;
> gains.blue = sumB <= sumG / 4 ? 4.0 : static_cast<double>(sumG) / sumB;
> /* Green gain is fixed to 1.0 */
>
> - LOG(IPASoftAwb, Debug) << "gain R/B " << gains.red << "/" << gains.blue;
> + RGB<double> rgbGains{ { 1 / gains.red, 1 / gains.green, 1 / gains.blue } };
> + uint32_t temperature = estimateCCT(rgbGains);
> + context.activeState.awb.temperatureK = temperature;
context.activeState.awb.temperatureK = estimateCCT(rgbGains);
> +
> + LOG(IPASoftAwb, Debug)
> + << "gain R/B: " << gains.red << "/" << gains.blue
> + << "; temperature: " << context.activeState.awb.temperatureK;
> }
>
> REGISTER_IPA_ALGORITHM(Awb, "Awb")
> diff --git a/src/ipa/simple/algorithms/lut.cpp b/src/ipa/simple/algorithms/lut.cpp
> index 0ba2391f..d75ff710 100644
> --- a/src/ipa/simple/algorithms/lut.cpp
> +++ b/src/ipa/simple/algorithms/lut.cpp
> @@ -95,7 +95,7 @@ void Lut::prepare(IPAContext &context,
> context.activeState.gamma.contrast != context.activeState.knobs.contrast)
> updateGammaTable(context);
>
> - auto &gains = context.activeState.gains;
> + auto &gains = context.activeState.awb.gains;
> auto &gammaTable = context.activeState.gamma.gammaTable;
> const unsigned int gammaTableSize = gammaTable.size();
>
> diff --git a/src/ipa/simple/ipa_context.h b/src/ipa/simple/ipa_context.h
> index 4af51306..607af45a 100644
> --- a/src/ipa/simple/ipa_context.h
> +++ b/src/ipa/simple/ipa_context.h
> @@ -36,10 +36,13 @@ struct IPAActiveState {
> } blc;
>
> struct {
> - double red;
> - double green;
> - double blue;
> - } gains;
> + struct {
> + double red;
> + double green;
> + double blue;
> + } gains;
Please add a patch on top (or at the bottom, up to you) to convert this
to
RGB<double> gains;
(don't forget to include vector.h)
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> + unsigned int temperatureK;
> + } awb;
>
> static constexpr unsigned int kGammaLookupSize = 1024;
> struct {
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list