[libcamera-devel] [PATCH 10/20] ipa: rpi: Prepare AWB for PiSP support
Jacopo Mondi
jacopo.mondi at ideasonboard.com
Thu Oct 12 11:34:53 CEST 2023
Hi Naush
On Fri, Oct 06, 2023 at 02:19:50PM +0100, Naushir Patuck via libcamera-devel wrote:
> 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 at raspberrypi.com>
> Reviewed-by: David Plowman <david.plowman at raspberrypi.com>
Reviewed-by: Jacopo Mondi <jacopo.mondi at ideasonboard.com>
Thanks
j
> ---
> src/ipa/rpi/controller/rpi/awb.cpp | 29 ++++++++++++++++++++---------
> 1 file changed, 20 insertions(+), 9 deletions(-)
>
> diff --git a/src/ipa/rpi/controller/rpi/awb.cpp b/src/ipa/rpi/controller/rpi/awb.cpp
> index ef3435d66106..5ae0c2fad6e9 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 ®ion : stats) {
> + std::scoped_lock<RPiController::Metadata> l(globalMetadata);
> +
> + for (unsigned int i = 0; i < stats->awbRegions.numRegions(); i++) {
> Awb::RGB zone;
> + auto ®ion = 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.
> --
> 2.34.1
>
More information about the libcamera-devel
mailing list