[libcamera-devel,v2,01/13] ipa: ipu3: awb: Set a threshold for the green saturation
diff mbox series

Message ID 20211020154607.180161-2-jeanmichel.hautbois@ideasonboard.com
State Superseded
Headers show
Series
  • ipa: ipu3: Fix AGC bugs
Related show

Commit Message

Jean-Michel Hautbois Oct. 20, 2021, 3:45 p.m. UTC
We can have a saturation ratio per cell, giving the percentage of pixels
over a threshold within a cell where 100% is set to 0xff.

The parameter structure 'ipu3_uapi_awb_config_s' contains four fields to
set the threshold, one per channel.
The blue field is also used to configure the ImgU and make it calculate
the saturation ratio or not.

Set a green value saturated when it is more than 230 (90% of the maximum
value 255, coded as 8191). As this is the only channel used for AGC,
there is no need to apply it to the other ones.

Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
---
 src/ipa/ipu3/algorithms/awb.cpp | 29 +++++++++++++++++++++++------
 src/ipa/ipu3/algorithms/awb.h   |  1 +
 2 files changed, 24 insertions(+), 6 deletions(-)

Comments

Laurent Pinchart Oct. 21, 2021, 1:50 a.m. UTC | #1
Hi Jean-Michel,

Thank you for the patch.

On Wed, Oct 20, 2021 at 05:45:55PM +0200, Jean-Michel Hautbois wrote:
> We can have a saturation ratio per cell, giving the percentage of pixels
> over a threshold within a cell where 100% is set to 0xff.
> 
> The parameter structure 'ipu3_uapi_awb_config_s' contains four fields to
> set the threshold, one per channel.
> The blue field is also used to configure the ImgU and make it calculate
> the saturation ratio or not.
> 
> Set a green value saturated when it is more than 230 (90% of the maximum
> value 255, coded as 8191). As this is the only channel used for AGC,
> there is no need to apply it to the other ones.
> 
> Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
> ---
>  src/ipa/ipu3/algorithms/awb.cpp | 29 +++++++++++++++++++++++------
>  src/ipa/ipu3/algorithms/awb.h   |  1 +
>  2 files changed, 24 insertions(+), 6 deletions(-)
> 
> diff --git a/src/ipa/ipu3/algorithms/awb.cpp b/src/ipa/ipu3/algorithms/awb.cpp
> index 809de66a..e44bbd6c 100644
> --- a/src/ipa/ipu3/algorithms/awb.cpp
> +++ b/src/ipa/ipu3/algorithms/awb.cpp
> @@ -328,14 +328,31 @@ void Awb::process(IPAContext &context, const ipu3_uapi_stats_3a *stats)
>  	context.frameContext.awb.gains.red = asyncResults_.redGain;
>  }
>  
> +constexpr uint16_t Awb::Threshold(float value)

s/Threshold/threshold/

> +{
> +	/* AWB Thresholds are in the range [0, 8191] */

s/Thresholds/thresholds/

> +	constexpr uint16_t kMaxThreshold = 8191;
> +
> +	return value * kMaxThreshold;

I'd have written

	return value * 8191;

given the comment above. Up to you.

> +}
> +
>  void Awb::prepare(IPAContext &context, ipu3_uapi_params *params)
>  {
> -	params->acc_param.awb.config.rgbs_thr_gr = 8191;
> -	params->acc_param.awb.config.rgbs_thr_r = 8191;
> -	params->acc_param.awb.config.rgbs_thr_gb = 8191;
> -	params->acc_param.awb.config.rgbs_thr_b = IPU3_UAPI_AWB_RGBS_THR_B_INCL_SAT
> -					       | IPU3_UAPI_AWB_RGBS_THR_B_EN
> -					       | 8191;
> +	/*
> +	 * Green saturation thresholds are reduced because we are using the
> +	 * green channel only in the exposure computation.
> +	 */
> +	params->acc_param.awb.config.rgbs_thr_r = Threshold(1.0);
> +	params->acc_param.awb.config.rgbs_thr_gr = Threshold(0.9);
> +	params->acc_param.awb.config.rgbs_thr_gb = Threshold(0.9);
> +	params->acc_param.awb.config.rgbs_thr_b = Threshold(1.0);
> +
> +	/*
> +	 * Enable saturation inclusion on thr_b for ImgU to update the
> +	 * ipu3_uapi_awb_set_item->sat_ratio field.
> +	 */
> +	params->acc_param.awb.config.rgbs_thr_b |= IPU3_UAPI_AWB_RGBS_THR_B_INCL_SAT |
> +						   IPU3_UAPI_AWB_RGBS_THR_B_EN;
>  
>  	const ipu3_uapi_grid_config &grid = context.configuration.grid.bdsGrid;
>  
> diff --git a/src/ipa/ipu3/algorithms/awb.h b/src/ipa/ipu3/algorithms/awb.h
> index 3b81f600..b02d6b6c 100644
> --- a/src/ipa/ipu3/algorithms/awb.h
> +++ b/src/ipa/ipu3/algorithms/awb.h
> @@ -70,6 +70,7 @@ private:
>  	void clearAwbStats();
>  	void awbGreyWorld();
>  	uint32_t estimateCCT(double red, double green, double blue);
> +	constexpr uint16_t Threshold(float value);

	static constexpr uint16_t threshold(float value);

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

>  
>  	std::vector<RGB> zones_;
>  	Accumulator awbStats_[kAwbStatsSizeX * kAwbStatsSizeY];

Patch
diff mbox series

diff --git a/src/ipa/ipu3/algorithms/awb.cpp b/src/ipa/ipu3/algorithms/awb.cpp
index 809de66a..e44bbd6c 100644
--- a/src/ipa/ipu3/algorithms/awb.cpp
+++ b/src/ipa/ipu3/algorithms/awb.cpp
@@ -328,14 +328,31 @@  void Awb::process(IPAContext &context, const ipu3_uapi_stats_3a *stats)
 	context.frameContext.awb.gains.red = asyncResults_.redGain;
 }
 
+constexpr uint16_t Awb::Threshold(float value)
+{
+	/* AWB Thresholds are in the range [0, 8191] */
+	constexpr uint16_t kMaxThreshold = 8191;
+
+	return value * kMaxThreshold;
+}
+
 void Awb::prepare(IPAContext &context, ipu3_uapi_params *params)
 {
-	params->acc_param.awb.config.rgbs_thr_gr = 8191;
-	params->acc_param.awb.config.rgbs_thr_r = 8191;
-	params->acc_param.awb.config.rgbs_thr_gb = 8191;
-	params->acc_param.awb.config.rgbs_thr_b = IPU3_UAPI_AWB_RGBS_THR_B_INCL_SAT
-					       | IPU3_UAPI_AWB_RGBS_THR_B_EN
-					       | 8191;
+	/*
+	 * Green saturation thresholds are reduced because we are using the
+	 * green channel only in the exposure computation.
+	 */
+	params->acc_param.awb.config.rgbs_thr_r = Threshold(1.0);
+	params->acc_param.awb.config.rgbs_thr_gr = Threshold(0.9);
+	params->acc_param.awb.config.rgbs_thr_gb = Threshold(0.9);
+	params->acc_param.awb.config.rgbs_thr_b = Threshold(1.0);
+
+	/*
+	 * Enable saturation inclusion on thr_b for ImgU to update the
+	 * ipu3_uapi_awb_set_item->sat_ratio field.
+	 */
+	params->acc_param.awb.config.rgbs_thr_b |= IPU3_UAPI_AWB_RGBS_THR_B_INCL_SAT |
+						   IPU3_UAPI_AWB_RGBS_THR_B_EN;
 
 	const ipu3_uapi_grid_config &grid = context.configuration.grid.bdsGrid;
 
diff --git a/src/ipa/ipu3/algorithms/awb.h b/src/ipa/ipu3/algorithms/awb.h
index 3b81f600..b02d6b6c 100644
--- a/src/ipa/ipu3/algorithms/awb.h
+++ b/src/ipa/ipu3/algorithms/awb.h
@@ -70,6 +70,7 @@  private:
 	void clearAwbStats();
 	void awbGreyWorld();
 	uint32_t estimateCCT(double red, double green, double blue);
+	constexpr uint16_t Threshold(float value);
 
 	std::vector<RGB> zones_;
 	Accumulator awbStats_[kAwbStatsSizeX * kAwbStatsSizeY];