From b145ae42428b9f21fff01d7353a655e07e818c33 Mon Sep 17 00:00:00 2001 From: Jean-Michel Hautbois Date: Wed, 18 Aug 2021 17:54:02 +0200 Subject: ipa: ipu3: Move IPU3 awb into algorithms Now that the interface is properly used by the AWB class, move it into ipa::ipu3::algorithms and let the loops do the calls. Signed-off-by: Jean-Michel Hautbois Reviewed-by: Kieran Bingham Reviewed-by: Laurent Pinchart --- src/ipa/ipu3/algorithms/awb.h | 91 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 src/ipa/ipu3/algorithms/awb.h (limited to 'src/ipa/ipu3/algorithms/awb.h') diff --git a/src/ipa/ipu3/algorithms/awb.h b/src/ipa/ipu3/algorithms/awb.h new file mode 100644 index 00000000..fac54e45 --- /dev/null +++ b/src/ipa/ipu3/algorithms/awb.h @@ -0,0 +1,91 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2021, Ideas On Board + * + * awb.h - IPU3 AWB control algorithm + */ +#ifndef __LIBCAMERA_IPU3_ALGORITHMS_AWB_H__ +#define __LIBCAMERA_IPU3_ALGORITHMS_AWB_H__ + +#include + +#include + +#include + +#include "algorithm.h" + +namespace libcamera { + +namespace ipa::ipu3::algorithms { + +/* Region size for the statistics generation algorithm */ +static constexpr uint32_t kAwbStatsSizeX = 16; +static constexpr uint32_t kAwbStatsSizeY = 12; + +class Awb : public Algorithm +{ +public: + Awb(); + ~Awb(); + + void prepare(IPAContext &context, ipu3_uapi_params *params) override; + void process(IPAContext &context, const ipu3_uapi_stats_3a *stats) override; + + struct Ipu3AwbCell { + unsigned char greenRedAvg; + unsigned char redAvg; + unsigned char blueAvg; + unsigned char greenBlueAvg; + unsigned char satRatio; + unsigned char padding[3]; + } __attribute__((packed)); + + /* \todo Make these three structs available to all the ISPs ? */ + struct RGB { + RGB(double _R = 0, double _G = 0, double _B = 0) + : R(_R), G(_G), B(_B) + { + } + double R, G, B; + RGB &operator+=(RGB const &other) + { + R += other.R, G += other.G, B += other.B; + return *this; + } + }; + + struct IspStatsRegion { + unsigned int counted; + unsigned int uncounted; + unsigned long long rSum; + unsigned long long gSum; + unsigned long long bSum; + }; + + struct AwbStatus { + double temperatureK; + double redGain; + double greenGain; + double blueGain; + }; + +private: + void calculateWBGains(const ipu3_uapi_stats_3a *stats); + void generateZones(std::vector &zones); + void generateAwbStats(const ipu3_uapi_stats_3a *stats); + void clearAwbStats(); + void awbGreyWorld(); + uint32_t estimateCCT(double red, double green, double blue); + + struct ipu3_uapi_grid_config awbGrid_; + + std::vector zones_; + IspStatsRegion awbStats_[kAwbStatsSizeX * kAwbStatsSizeY]; + AwbStatus asyncResults_; +}; + +} /* namespace ipa::ipu3::algorithms */ + +} /* namespace libcamera*/ +#endif /* __LIBCAMERA_IPU3_ALGORITHMS_AWB_H__ */ -- cgit v1.2.1