[libcamera-devel] [PATCH v3 01/14] ipa: ipu3: awb: Set a threshold for the green saturation

Kieran Bingham kieran.bingham at ideasonboard.com
Thu Oct 21 22:53:05 CEST 2021


Quoting Jean-Michel Hautbois (2021-10-21 17:43:48)
> 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 at ideasonboard.com>
> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

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

> ---
>  src/ipa/ipu3/algorithms/awb.cpp | 27 +++++++++++++++++++++------
>  src/ipa/ipu3/algorithms/awb.h   |  1 +
>  2 files changed, 22 insertions(+), 6 deletions(-)
> 
> diff --git a/src/ipa/ipu3/algorithms/awb.cpp b/src/ipa/ipu3/algorithms/awb.cpp
> index 809de66a..4364928c 100644
> --- a/src/ipa/ipu3/algorithms/awb.cpp
> +++ b/src/ipa/ipu3/algorithms/awb.cpp
> @@ -328,14 +328,29 @@ 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] */
> +       return value * 8191;
> +}
> +
>  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..0c81e39e 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);
> +       static constexpr uint16_t threshold(float value);
>  
>         std::vector<RGB> zones_;
>         Accumulator awbStats_[kAwbStatsSizeX * kAwbStatsSizeY];
> -- 
> 2.32.0
>


More information about the libcamera-devel mailing list