ipa: ipu3: awb: Use the line stride for the stats
The statistics buffer 'ipu3_uapi_awb_raw_buffer' stores the ImgU calculation results in a buffer aligned horizontally to a multiple of 4 cells. The AWB loop should take care of it to add the proper offset between lines and avoid any staircase effect. It is no longer required to pass the grid configuration context to the private functions called from process() which simplifies the code flow. Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
parent
03132d0ff9
commit
380b08754f
4 changed files with 16 additions and 11 deletions
|
@ -176,6 +176,7 @@ int Awb::configure(IPAContext &context,
|
|||
[[maybe_unused]] const IPAConfigInfo &configInfo)
|
||||
{
|
||||
const ipu3_uapi_grid_config &grid = context.configuration.grid.bdsGrid;
|
||||
stride_ = context.configuration.grid.stride;
|
||||
|
||||
cellsPerZoneX_ = std::round(grid.width / static_cast<double>(kAwbStatsSizeX));
|
||||
cellsPerZoneY_ = std::round(grid.height / static_cast<double>(kAwbStatsSizeY));
|
||||
|
@ -238,8 +239,7 @@ void Awb::generateZones(std::vector<RGB> &zones)
|
|||
}
|
||||
|
||||
/* Translate the IPU3 statistics into the default statistics zone array */
|
||||
void Awb::generateAwbStats(const ipu3_uapi_stats_3a *stats,
|
||||
const ipu3_uapi_grid_config &grid)
|
||||
void Awb::generateAwbStats(const ipu3_uapi_stats_3a *stats)
|
||||
{
|
||||
/*
|
||||
* Generate a (kAwbStatsSizeX x kAwbStatsSizeY) array from the IPU3 grid which is
|
||||
|
@ -247,7 +247,7 @@ void Awb::generateAwbStats(const ipu3_uapi_stats_3a *stats,
|
|||
*/
|
||||
for (unsigned int cellY = 0; cellY < kAwbStatsSizeY * cellsPerZoneY_; cellY++) {
|
||||
for (unsigned int cellX = 0; cellX < kAwbStatsSizeX * cellsPerZoneX_; cellX++) {
|
||||
uint32_t cellPosition = (cellY * grid.width + cellX)
|
||||
uint32_t cellPosition = (cellY * stride_ + cellX)
|
||||
* sizeof(Ipu3AwbCell);
|
||||
uint32_t zoneX = cellX / cellsPerZoneX_;
|
||||
uint32_t zoneY = cellY / cellsPerZoneY_;
|
||||
|
@ -322,13 +322,12 @@ void Awb::awbGreyWorld()
|
|||
asyncResults_.blueGain = blueGain;
|
||||
}
|
||||
|
||||
void Awb::calculateWBGains(const ipu3_uapi_stats_3a *stats,
|
||||
const ipu3_uapi_grid_config &grid)
|
||||
void Awb::calculateWBGains(const ipu3_uapi_stats_3a *stats)
|
||||
{
|
||||
ASSERT(stats->stats_3a_status.awb_en);
|
||||
zones_.clear();
|
||||
clearAwbStats();
|
||||
generateAwbStats(stats, grid);
|
||||
generateAwbStats(stats);
|
||||
generateZones(zones_);
|
||||
LOG(IPU3Awb, Debug) << "Valid zones: " << zones_.size();
|
||||
if (zones_.size() > 10) {
|
||||
|
@ -340,7 +339,7 @@ void Awb::calculateWBGains(const ipu3_uapi_stats_3a *stats,
|
|||
|
||||
void Awb::process(IPAContext &context, const ipu3_uapi_stats_3a *stats)
|
||||
{
|
||||
calculateWBGains(stats, context.configuration.grid.bdsGrid);
|
||||
calculateWBGains(stats);
|
||||
|
||||
/*
|
||||
* Gains are only recalculated if enough zones were detected.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue