[v1,2/6] ipa: rkisp1: awb: Load white balance gains from tuning file
diff mbox series

Message ID 20240805120522.1613342-3-stefan.klug@ideasonboard.com
State Superseded
Headers show
Series
  • rkisp1: Add manual colour temperature control
Related show

Commit Message

Stefan Klug Aug. 5, 2024, 12:05 p.m. UTC
For the implementation of a manual colour temperature setting, it is
necessary to read predefined colour gains per colour temperature from
the tuning file. Implement this in a backwards compatible way. If no
gains are contained in the tuning file, loading just continues as
before.

Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
---
 src/ipa/rkisp1/algorithms/awb.cpp | 18 ++++++++++++++++++
 src/ipa/rkisp1/algorithms/awb.h   |  6 ++++++
 2 files changed, 24 insertions(+)

Comments

Kieran Bingham Aug. 5, 2024, 1:43 p.m. UTC | #1
Quoting Stefan Klug (2024-08-05 13:05:03)
> For the implementation of a manual colour temperature setting, it is
> necessary to read predefined colour gains per colour temperature from
> the tuning file. Implement this in a backwards compatible way. If no
> gains are contained in the tuning file, loading just continues as
> before.
> 
> Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
> ---
>  src/ipa/rkisp1/algorithms/awb.cpp | 18 ++++++++++++++++++
>  src/ipa/rkisp1/algorithms/awb.h   |  6 ++++++
>  2 files changed, 24 insertions(+)
> 
> diff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp
> index 4ccafd48dedd..957d24fe3425 100644
> --- a/src/ipa/rkisp1/algorithms/awb.cpp
> +++ b/src/ipa/rkisp1/algorithms/awb.cpp
> @@ -39,6 +39,24 @@ Awb::Awb()
>  {
>  }
>  
> +/**
> + * \copydoc libcamera::ipa::Algorithm::init
> + */
> +int Awb::init(IPAContext &context, const YamlObject &tuningData)
> +{
> +       MatrixInterpolator<double, 2, 1> gains;
> +       int ret = gains.readYaml(tuningData["gains"], "ct", "gains");

Do we have a way to check if there are gains set at all? If there are no
gains set in the yaml - we wouldn't report a warning at all I'd expect?

(And presumably we wouldn't expose/report a manual color temperature
control as setable either?)

> +       if (ret < 0)
> +               LOG(RkISP1Awb, Warning)
> +                       << "Failed to parse 'gains' "
> +                       << "parameter from tuning file; "
> +                       << "rgb gains will not be set based on colour temperature";
> +       else
> +               gains_ = gains;
> +
> +       return 0;
> +}
> +
>  /**
>   * \copydoc libcamera::ipa::Algorithm::configure
>   */
> diff --git a/src/ipa/rkisp1/algorithms/awb.h b/src/ipa/rkisp1/algorithms/awb.h
> index 06c92896e2dc..a010e6d1cb3c 100644
> --- a/src/ipa/rkisp1/algorithms/awb.h
> +++ b/src/ipa/rkisp1/algorithms/awb.h
> @@ -7,6 +7,10 @@
>  
>  #pragma once
>  
> +#include <optional>
> +
> +#include "libipa/matrix_interpolator.h"
> +
>  #include "algorithm.h"
>  
>  namespace libcamera {
> @@ -19,6 +23,7 @@ public:
>         Awb();
>         ~Awb() = default;
>  
> +       int init(IPAContext &context, const YamlObject &tuningData) override;
>         int configure(IPAContext &context, const IPACameraSensorInfo &configInfo) override;
>         void queueRequest(IPAContext &context, const uint32_t frame,
>                           IPAFrameContext &frameContext,
> @@ -34,6 +39,7 @@ public:
>  private:
>         uint32_t estimateCCT(double red, double green, double blue);
>  
> +       std::optional<MatrixInterpolator<double, 2, 1>> gains_;
>         bool rgbMode_;
>  };
>  
> -- 
> 2.43.0
>
Stefan Klug Aug. 6, 2024, 6:26 a.m. UTC | #2
On Mon, Aug 05, 2024 at 02:43:39PM +0100, Kieran Bingham wrote:
> Quoting Stefan Klug (2024-08-05 13:05:03)
> > For the implementation of a manual colour temperature setting, it is
> > necessary to read predefined colour gains per colour temperature from
> > the tuning file. Implement this in a backwards compatible way. If no
> > gains are contained in the tuning file, loading just continues as
> > before.
> > 
> > Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
> > ---
> >  src/ipa/rkisp1/algorithms/awb.cpp | 18 ++++++++++++++++++
> >  src/ipa/rkisp1/algorithms/awb.h   |  6 ++++++
> >  2 files changed, 24 insertions(+)
> > 
> > diff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp
> > index 4ccafd48dedd..957d24fe3425 100644
> > --- a/src/ipa/rkisp1/algorithms/awb.cpp
> > +++ b/src/ipa/rkisp1/algorithms/awb.cpp
> > @@ -39,6 +39,24 @@ Awb::Awb()
> >  {
> >  }
> >  
> > +/**
> > + * \copydoc libcamera::ipa::Algorithm::init
> > + */
> > +int Awb::init(IPAContext &context, const YamlObject &tuningData)
> > +{
> > +       MatrixInterpolator<double, 2, 1> gains;
> > +       int ret = gains.readYaml(tuningData["gains"], "ct", "gains");
> 
> Do we have a way to check if there are gains set at all? If there are no
> gains set in the yaml - we wouldn't report a warning at all I'd expect?

If there are no gains in the yaml, readYaml returns an error. We could
add a check for that specific case and silence the warning. But do we
really want to silence that? It basically says "You have an old tuning
file, some features are limited but I'll continue". So I think it's
reasonable - up to you.

> 
> (And presumably we wouldn't expose/report a manual color temperature
> control as setable either?)

That's a bit difficult here as the temperature also controls the ccm.
So we would need to check the existence of ccms also. As the ccms are
necessary for a properly tuned sensor, I think it is ok to
unconditionally add the control. 

> 
> > +       if (ret < 0)
> > +               LOG(RkISP1Awb, Warning)
> > +                       << "Failed to parse 'gains' "
> > +                       << "parameter from tuning file; "
> > +                       << "rgb gains will not be set based on colour temperature";
> > +       else
> > +               gains_ = gains;
> > +
> > +       return 0;
> > +}
> > +
> >  /**
> >   * \copydoc libcamera::ipa::Algorithm::configure
> >   */
> > diff --git a/src/ipa/rkisp1/algorithms/awb.h b/src/ipa/rkisp1/algorithms/awb.h
> > index 06c92896e2dc..a010e6d1cb3c 100644
> > --- a/src/ipa/rkisp1/algorithms/awb.h
> > +++ b/src/ipa/rkisp1/algorithms/awb.h
> > @@ -7,6 +7,10 @@
> >  
> >  #pragma once
> >  
> > +#include <optional>
> > +
> > +#include "libipa/matrix_interpolator.h"
> > +
> >  #include "algorithm.h"
> >  
> >  namespace libcamera {
> > @@ -19,6 +23,7 @@ public:
> >         Awb();
> >         ~Awb() = default;
> >  
> > +       int init(IPAContext &context, const YamlObject &tuningData) override;
> >         int configure(IPAContext &context, const IPACameraSensorInfo &configInfo) override;
> >         void queueRequest(IPAContext &context, const uint32_t frame,
> >                           IPAFrameContext &frameContext,
> > @@ -34,6 +39,7 @@ public:
> >  private:
> >         uint32_t estimateCCT(double red, double green, double blue);
> >  
> > +       std::optional<MatrixInterpolator<double, 2, 1>> gains_;
> >         bool rgbMode_;
> >  };
> >  
> > -- 
> > 2.43.0
> >
Kieran Bingham Aug. 6, 2024, 8:52 a.m. UTC | #3
Quoting Stefan Klug (2024-08-06 07:26:59)
> On Mon, Aug 05, 2024 at 02:43:39PM +0100, Kieran Bingham wrote:
> > Quoting Stefan Klug (2024-08-05 13:05:03)
> > > For the implementation of a manual colour temperature setting, it is
> > > necessary to read predefined colour gains per colour temperature from
> > > the tuning file. Implement this in a backwards compatible way. If no
> > > gains are contained in the tuning file, loading just continues as
> > > before.
> > > 
> > > Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
> > > ---
> > >  src/ipa/rkisp1/algorithms/awb.cpp | 18 ++++++++++++++++++
> > >  src/ipa/rkisp1/algorithms/awb.h   |  6 ++++++
> > >  2 files changed, 24 insertions(+)
> > > 
> > > diff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp
> > > index 4ccafd48dedd..957d24fe3425 100644
> > > --- a/src/ipa/rkisp1/algorithms/awb.cpp
> > > +++ b/src/ipa/rkisp1/algorithms/awb.cpp
> > > @@ -39,6 +39,24 @@ Awb::Awb()
> > >  {
> > >  }
> > >  
> > > +/**
> > > + * \copydoc libcamera::ipa::Algorithm::init
> > > + */
> > > +int Awb::init(IPAContext &context, const YamlObject &tuningData)
> > > +{
> > > +       MatrixInterpolator<double, 2, 1> gains;
> > > +       int ret = gains.readYaml(tuningData["gains"], "ct", "gains");
> > 
> > Do we have a way to check if there are gains set at all? If there are no
> > gains set in the yaml - we wouldn't report a warning at all I'd expect?
> 
> If there are no gains in the yaml, readYaml returns an error. We could
> add a check for that specific case and silence the warning. But do we
> really want to silence that? It basically says "You have an old tuning
> file, some features are limited but I'll continue". So I think it's
> reasonable - up to you.

I think if we can get the schema validation then we can add this as an
expected/required tuning entry then and maybe that also solves the issue
as then the warning really would be a warning, so I'm fine with leaving
this as it is given we're aiming in that direction.

> 
> > 
> > (And presumably we wouldn't expose/report a manual color temperature
> > control as setable either?)
> 
> That's a bit difficult here as the temperature also controls the ccm.
> So we would need to check the existence of ccms also. As the ccms are
> necessary for a properly tuned sensor, I think it is ok to
> unconditionally add the control. 

Ok so we have a dependency on both algo's for the suitable / acceptable
parameters for the control? That makes me think back to how we determine
what the min/max values can be - but that's in a later patch I think ;-)

> 
> > 
> > > +       if (ret < 0)
> > > +               LOG(RkISP1Awb, Warning)
> > > +                       << "Failed to parse 'gains' "
> > > +                       << "parameter from tuning file; "
> > > +                       << "rgb gains will not be set based on colour temperature";
> > > +       else
> > > +               gains_ = gains;
> > > +
> > > +       return 0;
> > > +}
> > > +
> > >  /**
> > >   * \copydoc libcamera::ipa::Algorithm::configure
> > >   */
> > > diff --git a/src/ipa/rkisp1/algorithms/awb.h b/src/ipa/rkisp1/algorithms/awb.h
> > > index 06c92896e2dc..a010e6d1cb3c 100644
> > > --- a/src/ipa/rkisp1/algorithms/awb.h
> > > +++ b/src/ipa/rkisp1/algorithms/awb.h
> > > @@ -7,6 +7,10 @@
> > >  
> > >  #pragma once
> > >  
> > > +#include <optional>
> > > +
> > > +#include "libipa/matrix_interpolator.h"
> > > +
> > >  #include "algorithm.h"
> > >  
> > >  namespace libcamera {
> > > @@ -19,6 +23,7 @@ public:
> > >         Awb();
> > >         ~Awb() = default;
> > >  
> > > +       int init(IPAContext &context, const YamlObject &tuningData) override;
> > >         int configure(IPAContext &context, const IPACameraSensorInfo &configInfo) override;
> > >         void queueRequest(IPAContext &context, const uint32_t frame,
> > >                           IPAFrameContext &frameContext,
> > > @@ -34,6 +39,7 @@ public:
> > >  private:
> > >         uint32_t estimateCCT(double red, double green, double blue);
> > >  
> > > +       std::optional<MatrixInterpolator<double, 2, 1>> gains_;
> > >         bool rgbMode_;
> > >  };
> > >  
> > > -- 
> > > 2.43.0
> > >
Kieran Bingham Aug. 6, 2024, 8:57 a.m. UTC | #4
Quoting Kieran Bingham (2024-08-06 09:52:25)
> Quoting Stefan Klug (2024-08-06 07:26:59)
> > On Mon, Aug 05, 2024 at 02:43:39PM +0100, Kieran Bingham wrote:
> > > Quoting Stefan Klug (2024-08-05 13:05:03)
> > > > For the implementation of a manual colour temperature setting, it is
> > > > necessary to read predefined colour gains per colour temperature from
> > > > the tuning file. Implement this in a backwards compatible way. If no
> > > > gains are contained in the tuning file, loading just continues as
> > > > before.
> > > > 
> > > > Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
> > > > ---
> > > >  src/ipa/rkisp1/algorithms/awb.cpp | 18 ++++++++++++++++++
> > > >  src/ipa/rkisp1/algorithms/awb.h   |  6 ++++++
> > > >  2 files changed, 24 insertions(+)
> > > > 
> > > > diff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp
> > > > index 4ccafd48dedd..957d24fe3425 100644
> > > > --- a/src/ipa/rkisp1/algorithms/awb.cpp
> > > > +++ b/src/ipa/rkisp1/algorithms/awb.cpp
> > > > @@ -39,6 +39,24 @@ Awb::Awb()
> > > >  {
> > > >  }
> > > >  
> > > > +/**
> > > > + * \copydoc libcamera::ipa::Algorithm::init
> > > > + */
> > > > +int Awb::init(IPAContext &context, const YamlObject &tuningData)
> > > > +{
> > > > +       MatrixInterpolator<double, 2, 1> gains;
> > > > +       int ret = gains.readYaml(tuningData["gains"], "ct", "gains");
> > > 
> > > Do we have a way to check if there are gains set at all? If there are no
> > > gains set in the yaml - we wouldn't report a warning at all I'd expect?
> > 
> > If there are no gains in the yaml, readYaml returns an error. We could
> > add a check for that specific case and silence the warning. But do we
> > really want to silence that? It basically says "You have an old tuning
> > file, some features are limited but I'll continue". So I think it's
> > reasonable - up to you.
> 
> I think if we can get the schema validation then we can add this as an
> expected/required tuning entry then and maybe that also solves the issue
> as then the warning really would be a warning, so I'm fine with leaving
> this as it is given we're aiming in that direction.
> 
> > 
> > > 
> > > (And presumably we wouldn't expose/report a manual color temperature
> > > control as setable either?)
> > 
> > That's a bit difficult here as the temperature also controls the ccm.
> > So we would need to check the existence of ccms also. As the ccms are
> > necessary for a properly tuned sensor, I think it is ok to
> > unconditionally add the control. 
> 
> Ok so we have a dependency on both algo's for the suitable / acceptable
> parameters for the control? That makes me think back to how we determine
> what the min/max values can be - but that's in a later patch I think ;-)


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

> 
> > 
> > > 
> > > > +       if (ret < 0)
> > > > +               LOG(RkISP1Awb, Warning)
> > > > +                       << "Failed to parse 'gains' "
> > > > +                       << "parameter from tuning file; "
> > > > +                       << "rgb gains will not be set based on colour temperature";
> > > > +       else
> > > > +               gains_ = gains;
> > > > +
> > > > +       return 0;
> > > > +}
> > > > +
> > > >  /**
> > > >   * \copydoc libcamera::ipa::Algorithm::configure
> > > >   */
> > > > diff --git a/src/ipa/rkisp1/algorithms/awb.h b/src/ipa/rkisp1/algorithms/awb.h
> > > > index 06c92896e2dc..a010e6d1cb3c 100644
> > > > --- a/src/ipa/rkisp1/algorithms/awb.h
> > > > +++ b/src/ipa/rkisp1/algorithms/awb.h
> > > > @@ -7,6 +7,10 @@
> > > >  
> > > >  #pragma once
> > > >  
> > > > +#include <optional>
> > > > +
> > > > +#include "libipa/matrix_interpolator.h"
> > > > +
> > > >  #include "algorithm.h"
> > > >  
> > > >  namespace libcamera {
> > > > @@ -19,6 +23,7 @@ public:
> > > >         Awb();
> > > >         ~Awb() = default;
> > > >  
> > > > +       int init(IPAContext &context, const YamlObject &tuningData) override;
> > > >         int configure(IPAContext &context, const IPACameraSensorInfo &configInfo) override;
> > > >         void queueRequest(IPAContext &context, const uint32_t frame,
> > > >                           IPAFrameContext &frameContext,
> > > > @@ -34,6 +39,7 @@ public:
> > > >  private:
> > > >         uint32_t estimateCCT(double red, double green, double blue);
> > > >  
> > > > +       std::optional<MatrixInterpolator<double, 2, 1>> gains_;
> > > >         bool rgbMode_;
> > > >  };
> > > >  
> > > > -- 
> > > > 2.43.0
> > > >

Patch
diff mbox series

diff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp
index 4ccafd48dedd..957d24fe3425 100644
--- a/src/ipa/rkisp1/algorithms/awb.cpp
+++ b/src/ipa/rkisp1/algorithms/awb.cpp
@@ -39,6 +39,24 @@  Awb::Awb()
 {
 }
 
+/**
+ * \copydoc libcamera::ipa::Algorithm::init
+ */
+int Awb::init(IPAContext &context, const YamlObject &tuningData)
+{
+	MatrixInterpolator<double, 2, 1> gains;
+	int ret = gains.readYaml(tuningData["gains"], "ct", "gains");
+	if (ret < 0)
+		LOG(RkISP1Awb, Warning)
+			<< "Failed to parse 'gains' "
+			<< "parameter from tuning file; "
+			<< "rgb gains will not be set based on colour temperature";
+	else
+		gains_ = gains;
+
+	return 0;
+}
+
 /**
  * \copydoc libcamera::ipa::Algorithm::configure
  */
diff --git a/src/ipa/rkisp1/algorithms/awb.h b/src/ipa/rkisp1/algorithms/awb.h
index 06c92896e2dc..a010e6d1cb3c 100644
--- a/src/ipa/rkisp1/algorithms/awb.h
+++ b/src/ipa/rkisp1/algorithms/awb.h
@@ -7,6 +7,10 @@ 
 
 #pragma once
 
+#include <optional>
+
+#include "libipa/matrix_interpolator.h"
+
 #include "algorithm.h"
 
 namespace libcamera {
@@ -19,6 +23,7 @@  public:
 	Awb();
 	~Awb() = default;
 
+	int init(IPAContext &context, const YamlObject &tuningData) override;
 	int configure(IPAContext &context, const IPACameraSensorInfo &configInfo) override;
 	void queueRequest(IPAContext &context, const uint32_t frame,
 			  IPAFrameContext &frameContext,
@@ -34,6 +39,7 @@  public:
 private:
 	uint32_t estimateCCT(double red, double green, double blue);
 
+	std::optional<MatrixInterpolator<double, 2, 1>> gains_;
 	bool rgbMode_;
 };