Message ID | 20210820141104.94438-3-jeanmichel.hautbois@ideasonboard.com |
---|---|
State | Accepted |
Headers | show |
Series |
|
Related | show |
Hi Jean-Michel, Thank you for the patch. On Fri, Aug 20, 2021 at 04:11:04PM +0200, Jean-Michel Hautbois wrote: > The IPASessionConfiguration now has the grid configuration stored. Use > it it at prepare() and process() calls in AWB and pass it as a reference > to the private functions when needed. > > Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com> > --- > src/ipa/ipu3/algorithms/awb.cpp | 27 +++++++++++++++------------ > src/ipa/ipu3/algorithms/awb.h | 8 ++++---- > 2 files changed, 19 insertions(+), 16 deletions(-) > > diff --git a/src/ipa/ipu3/algorithms/awb.cpp b/src/ipa/ipu3/algorithms/awb.cpp > index e15f7406..c193c080 100644 > --- a/src/ipa/ipu3/algorithms/awb.cpp > +++ b/src/ipa/ipu3/algorithms/awb.cpp > @@ -175,20 +175,21 @@ void Awb::generateZones(std::vector<RGB> &zones) > } > > /* Translate the IPU3 statistics into the default statistics region array */ > -void Awb::generateAwbStats(const ipu3_uapi_stats_3a *stats) > +void Awb::generateAwbStats(const ipu3_uapi_stats_3a *stats, > + const ipu3_uapi_grid_config &grid) > { > - uint32_t regionWidth = round(awbGrid_.width / static_cast<double>(kAwbStatsSizeX)); > - uint32_t regionHeight = round(awbGrid_.height / static_cast<double>(kAwbStatsSizeY)); > + uint32_t regionWidth = round(grid.width / static_cast<double>(kAwbStatsSizeX)); > + uint32_t regionHeight = round(grid.height / static_cast<double>(kAwbStatsSizeY)); > > /* > * Generate a (kAwbStatsSizeX x kAwbStatsSizeY) array from the IPU3 grid which is > - * (awbGrid_.width x awbGrid_.height). > + * (grid.width x grid.height). > */ > for (unsigned int j = 0; j < kAwbStatsSizeY * regionHeight; j++) { > for (unsigned int i = 0; i < kAwbStatsSizeX * regionWidth; i++) { > - uint32_t cellPosition = j * awbGrid_.width + i; > + uint32_t cellPosition = j * grid.width + i; > uint32_t cellX = (cellPosition / regionWidth) % kAwbStatsSizeX; > - uint32_t cellY = ((cellPosition / awbGrid_.width) / regionHeight) % kAwbStatsSizeY; > + uint32_t cellY = ((cellPosition / grid.width) / regionHeight) % kAwbStatsSizeY; > > uint32_t awbRegionPosition = cellY * kAwbStatsSizeX + cellX; > cellPosition *= 8; > @@ -258,12 +259,13 @@ void Awb::awbGreyWorld() > asyncResults_.blueGain = blueGain; > } > > -void Awb::calculateWBGains(const ipu3_uapi_stats_3a *stats) > +void Awb::calculateWBGains(const ipu3_uapi_stats_3a *stats, > + const ipu3_uapi_grid_config &grid) > { > ASSERT(stats->stats_3a_status.awb_en); > zones_.clear(); > clearAwbStats(); > - generateAwbStats(stats); > + generateAwbStats(stats, grid); > generateZones(zones_); > LOG(IPU3Awb, Debug) << "Valid zones: " << zones_.size(); > if (zones_.size() > 10) { > @@ -275,7 +277,8 @@ void Awb::calculateWBGains(const ipu3_uapi_stats_3a *stats) > > void Awb::process(IPAContext &context, const ipu3_uapi_stats_3a *stats) > { > - calculateWBGains(stats); > + struct ipu3_uapi_grid_config grid = context.configuration.grid.bdsGrid; > + calculateWBGains(stats, grid); calculateWBGains(stats, context.configuration.grid.bdsGrid); > > /* > * Gains are only recalculated if enough zones were detected. > @@ -296,7 +299,7 @@ void Awb::prepare(IPAContext &context, ipu3_uapi_params *params) > | IPU3_UAPI_AWB_RGBS_THR_B_EN > | 8191; > > - awbGrid_ = context.configuration.grid.bdsGrid; > + struct ipu3_uapi_grid_config &grid = context.configuration.grid.bdsGrid; This should be const. Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > > params->acc_param.awb.config.grid = context.configuration.grid.bdsGrid; > > @@ -310,8 +313,8 @@ void Awb::prepare(IPAContext &context, ipu3_uapi_params *params) > params->acc_param.bnr = imguCssBnrDefaults; > Size &bdsOutputSize = context.configuration.grid.bdsOutputSize; > params->acc_param.bnr.column_size = bdsOutputSize.width; > - params->acc_param.bnr.opt_center.x_reset = awbGrid_.x_start - (bdsOutputSize.width / 2); > - params->acc_param.bnr.opt_center.y_reset = awbGrid_.y_start - (bdsOutputSize.height / 2); > + params->acc_param.bnr.opt_center.x_reset = grid.x_start - (bdsOutputSize.width / 2); > + params->acc_param.bnr.opt_center.y_reset = grid.y_start - (bdsOutputSize.height / 2); > params->acc_param.bnr.opt_center_sqr.x_sqr_reset = params->acc_param.bnr.opt_center.x_reset > * params->acc_param.bnr.opt_center.x_reset; > params->acc_param.bnr.opt_center_sqr.y_sqr_reset = params->acc_param.bnr.opt_center.y_reset > diff --git a/src/ipa/ipu3/algorithms/awb.h b/src/ipa/ipu3/algorithms/awb.h > index fac54e45..a16dd68d 100644 > --- a/src/ipa/ipu3/algorithms/awb.h > +++ b/src/ipa/ipu3/algorithms/awb.h > @@ -71,15 +71,15 @@ public: > }; > > private: > - void calculateWBGains(const ipu3_uapi_stats_3a *stats); > + void calculateWBGains(const ipu3_uapi_stats_3a *stats, > + const ipu3_uapi_grid_config &grid); > void generateZones(std::vector<RGB> &zones); > - void generateAwbStats(const ipu3_uapi_stats_3a *stats); > + void generateAwbStats(const ipu3_uapi_stats_3a *stats, > + const ipu3_uapi_grid_config &grid); > void clearAwbStats(); > void awbGreyWorld(); > uint32_t estimateCCT(double red, double green, double blue); > > - struct ipu3_uapi_grid_config awbGrid_; > - > std::vector<RGB> zones_; > IspStatsRegion awbStats_[kAwbStatsSizeX * kAwbStatsSizeY]; > AwbStatus asyncResults_;
diff --git a/src/ipa/ipu3/algorithms/awb.cpp b/src/ipa/ipu3/algorithms/awb.cpp index e15f7406..c193c080 100644 --- a/src/ipa/ipu3/algorithms/awb.cpp +++ b/src/ipa/ipu3/algorithms/awb.cpp @@ -175,20 +175,21 @@ void Awb::generateZones(std::vector<RGB> &zones) } /* Translate the IPU3 statistics into the default statistics region array */ -void Awb::generateAwbStats(const ipu3_uapi_stats_3a *stats) +void Awb::generateAwbStats(const ipu3_uapi_stats_3a *stats, + const ipu3_uapi_grid_config &grid) { - uint32_t regionWidth = round(awbGrid_.width / static_cast<double>(kAwbStatsSizeX)); - uint32_t regionHeight = round(awbGrid_.height / static_cast<double>(kAwbStatsSizeY)); + uint32_t regionWidth = round(grid.width / static_cast<double>(kAwbStatsSizeX)); + uint32_t regionHeight = round(grid.height / static_cast<double>(kAwbStatsSizeY)); /* * Generate a (kAwbStatsSizeX x kAwbStatsSizeY) array from the IPU3 grid which is - * (awbGrid_.width x awbGrid_.height). + * (grid.width x grid.height). */ for (unsigned int j = 0; j < kAwbStatsSizeY * regionHeight; j++) { for (unsigned int i = 0; i < kAwbStatsSizeX * regionWidth; i++) { - uint32_t cellPosition = j * awbGrid_.width + i; + uint32_t cellPosition = j * grid.width + i; uint32_t cellX = (cellPosition / regionWidth) % kAwbStatsSizeX; - uint32_t cellY = ((cellPosition / awbGrid_.width) / regionHeight) % kAwbStatsSizeY; + uint32_t cellY = ((cellPosition / grid.width) / regionHeight) % kAwbStatsSizeY; uint32_t awbRegionPosition = cellY * kAwbStatsSizeX + cellX; cellPosition *= 8; @@ -258,12 +259,13 @@ void Awb::awbGreyWorld() asyncResults_.blueGain = blueGain; } -void Awb::calculateWBGains(const ipu3_uapi_stats_3a *stats) +void Awb::calculateWBGains(const ipu3_uapi_stats_3a *stats, + const ipu3_uapi_grid_config &grid) { ASSERT(stats->stats_3a_status.awb_en); zones_.clear(); clearAwbStats(); - generateAwbStats(stats); + generateAwbStats(stats, grid); generateZones(zones_); LOG(IPU3Awb, Debug) << "Valid zones: " << zones_.size(); if (zones_.size() > 10) { @@ -275,7 +277,8 @@ void Awb::calculateWBGains(const ipu3_uapi_stats_3a *stats) void Awb::process(IPAContext &context, const ipu3_uapi_stats_3a *stats) { - calculateWBGains(stats); + struct ipu3_uapi_grid_config grid = context.configuration.grid.bdsGrid; + calculateWBGains(stats, grid); /* * Gains are only recalculated if enough zones were detected. @@ -296,7 +299,7 @@ void Awb::prepare(IPAContext &context, ipu3_uapi_params *params) | IPU3_UAPI_AWB_RGBS_THR_B_EN | 8191; - awbGrid_ = context.configuration.grid.bdsGrid; + struct ipu3_uapi_grid_config &grid = context.configuration.grid.bdsGrid; params->acc_param.awb.config.grid = context.configuration.grid.bdsGrid; @@ -310,8 +313,8 @@ void Awb::prepare(IPAContext &context, ipu3_uapi_params *params) params->acc_param.bnr = imguCssBnrDefaults; Size &bdsOutputSize = context.configuration.grid.bdsOutputSize; params->acc_param.bnr.column_size = bdsOutputSize.width; - params->acc_param.bnr.opt_center.x_reset = awbGrid_.x_start - (bdsOutputSize.width / 2); - params->acc_param.bnr.opt_center.y_reset = awbGrid_.y_start - (bdsOutputSize.height / 2); + params->acc_param.bnr.opt_center.x_reset = grid.x_start - (bdsOutputSize.width / 2); + params->acc_param.bnr.opt_center.y_reset = grid.y_start - (bdsOutputSize.height / 2); params->acc_param.bnr.opt_center_sqr.x_sqr_reset = params->acc_param.bnr.opt_center.x_reset * params->acc_param.bnr.opt_center.x_reset; params->acc_param.bnr.opt_center_sqr.y_sqr_reset = params->acc_param.bnr.opt_center.y_reset diff --git a/src/ipa/ipu3/algorithms/awb.h b/src/ipa/ipu3/algorithms/awb.h index fac54e45..a16dd68d 100644 --- a/src/ipa/ipu3/algorithms/awb.h +++ b/src/ipa/ipu3/algorithms/awb.h @@ -71,15 +71,15 @@ public: }; private: - void calculateWBGains(const ipu3_uapi_stats_3a *stats); + void calculateWBGains(const ipu3_uapi_stats_3a *stats, + const ipu3_uapi_grid_config &grid); void generateZones(std::vector<RGB> &zones); - void generateAwbStats(const ipu3_uapi_stats_3a *stats); + void generateAwbStats(const ipu3_uapi_stats_3a *stats, + const ipu3_uapi_grid_config &grid); void clearAwbStats(); void awbGreyWorld(); uint32_t estimateCCT(double red, double green, double blue); - struct ipu3_uapi_grid_config awbGrid_; - std::vector<RGB> zones_; IspStatsRegion awbStats_[kAwbStatsSizeX * kAwbStatsSizeY]; AwbStatus asyncResults_;
The IPASessionConfiguration now has the grid configuration stored. Use it it at prepare() and process() calls in AWB and pass it as a reference to the private functions when needed. Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com> --- src/ipa/ipu3/algorithms/awb.cpp | 27 +++++++++++++++------------ src/ipa/ipu3/algorithms/awb.h | 8 ++++---- 2 files changed, 19 insertions(+), 16 deletions(-)