Message ID | 20211021164401.110033-2-jeanmichel.hautbois@ideasonboard.com |
---|---|
State | Superseded |
Headers | show |
Series |
|
Related | show |
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@ideasonboard.com> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@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 >
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];