summaryrefslogtreecommitdiff
path: root/src/ipa
diff options
context:
space:
mode:
authorNaushir Patuck <naush@raspberrypi.com>2023-10-13 08:48:31 +0100
committerKieran Bingham <kieran.bingham@ideasonboard.com>2023-10-18 11:01:22 +0100
commitc9fb1d44d850904a95d73e8773548485de1de081 (patch)
tree1ff642fbb1f1cabc1cd509afd72df8d19caec01a /src/ipa
parent0be32012ef378ad22b2715a2bddee0acfce33f92 (diff)
ipa: rpi: Prepare AWB for PiSP support
Prepare the AWB algorithm to support the PiSP hardware. The key change is to factor in the LS correction in the AWB zone statistics. This is different from VC4 where the LS correction happens before statistics gathering. Signed-off-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: David Plowman <david.plowman@raspberrypi.com> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Diffstat (limited to 'src/ipa')
-rw-r--r--src/ipa/rpi/controller/rpi/awb.cpp29
1 files changed, 20 insertions, 9 deletions
diff --git a/src/ipa/rpi/controller/rpi/awb.cpp b/src/ipa/rpi/controller/rpi/awb.cpp
index ef3435d6..5ae0c2fa 100644
--- a/src/ipa/rpi/controller/rpi/awb.cpp
+++ b/src/ipa/rpi/controller/rpi/awb.cpp
@@ -12,6 +12,7 @@
#include "../lux_status.h"
+#include "alsc_status.h"
#include "awb.h"
using namespace RPiController;
@@ -398,18 +399,28 @@ void Awb::asyncFunc()
}
static void generateStats(std::vector<Awb::RGB> &zones,
- RgbyRegions &stats, double minPixels,
- double minG)
+ StatisticsPtr &stats, double minPixels,
+ double minG, Metadata &globalMetadata)
{
- for (auto const &region : stats) {
+ std::scoped_lock<RPiController::Metadata> l(globalMetadata);
+
+ for (unsigned int i = 0; i < stats->awbRegions.numRegions(); i++) {
Awb::RGB zone;
+ auto &region = stats->awbRegions.get(i);
if (region.counted >= minPixels) {
zone.G = region.val.gSum / region.counted;
- if (zone.G >= minG) {
- zone.R = region.val.rSum / region.counted;
- zone.B = region.val.bSum / region.counted;
- zones.push_back(zone);
+ if (zone.G < minG)
+ continue;
+ zone.R = region.val.rSum / region.counted;
+ zone.B = region.val.bSum / region.counted;
+ /* Factor in the ALSC applied colour shading correction if required. */
+ const AlscStatus *alscStatus = globalMetadata.getLocked<AlscStatus>("alsc.status");
+ if (stats->colourStatsPos == Statistics::ColourStatsPos::PreLsc && alscStatus) {
+ zone.R *= alscStatus->r[i];
+ zone.G *= alscStatus->g[i];
+ zone.B *= alscStatus->b[i];
}
+ zones.push_back(zone);
}
}
}
@@ -421,8 +432,8 @@ void Awb::prepareStats()
* LSC has already been applied to the stats in this pipeline, so stop
* any LSC compensation. We also ignore config_.fast in this version.
*/
- generateStats(zones_, statistics_->awbRegions, config_.minPixels,
- config_.minG);
+ generateStats(zones_, statistics_, config_.minPixels,
+ config_.minG, getGlobalMetadata());
/*
* apply sensitivities, so values appear to come from our "canonical"
* sensor.