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 <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:
Jean-Michel Hautbois 2021-08-18 17:54:02 +02:00
parent 16266def40
commit b145ae4242
5 changed files with 27 additions and 33 deletions

View file

@ -2,9 +2,9 @@
/* /*
* Copyright (C) 2021, Ideas On Board * Copyright (C) 2021, Ideas On Board
* *
* ipu3_awb.cpp - AWB control algorithm * awb.cpp - AWB control algorithm
*/ */
#include "ipu3_awb.h" #include "awb.h"
#include <algorithm> #include <algorithm>
#include <cmath> #include <cmath>
@ -13,7 +13,7 @@
namespace libcamera { namespace libcamera {
namespace ipa::ipu3 { namespace ipa::ipu3::algorithms {
LOG_DEFINE_CATEGORY(IPU3Awb) LOG_DEFINE_CATEGORY(IPU3Awb)
@ -114,7 +114,7 @@ static const struct ipu3_uapi_ccm_mat_config imguCssCcmDefault = {
0, 0, 8191, 0 0, 0, 8191, 0
}; };
IPU3Awb::IPU3Awb() Awb::Awb()
: Algorithm() : Algorithm()
{ {
asyncResults_.blueGain = 1.0; asyncResults_.blueGain = 1.0;
@ -125,7 +125,7 @@ IPU3Awb::IPU3Awb()
zones_.reserve(kAwbStatsSizeX * kAwbStatsSizeY); zones_.reserve(kAwbStatsSizeX * kAwbStatsSizeY);
} }
IPU3Awb::~IPU3Awb() = default; Awb::~Awb() = default;
/** /**
* The function estimates the correlated color temperature using * The function estimates the correlated color temperature using
@ -141,7 +141,7 @@ IPU3Awb::~IPU3Awb() = default;
* More detailed information can be found in: * More detailed information can be found in:
* https://en.wikipedia.org/wiki/Color_temperature#Approximation * https://en.wikipedia.org/wiki/Color_temperature#Approximation
*/ */
uint32_t IPU3Awb::estimateCCT(double red, double green, double blue) uint32_t Awb::estimateCCT(double red, double green, double blue)
{ {
/* Convert the RGB values to CIE tristimulus values (XYZ) */ /* Convert the RGB values to CIE tristimulus values (XYZ) */
double X = (-0.14282) * (red) + (1.54924) * (green) + (-0.95641) * (blue); double X = (-0.14282) * (red) + (1.54924) * (green) + (-0.95641) * (blue);
@ -158,7 +158,7 @@ uint32_t IPU3Awb::estimateCCT(double red, double green, double blue)
} }
/* Generate an RGB vector with the average values for each region */ /* Generate an RGB vector with the average values for each region */
void IPU3Awb::generateZones(std::vector<RGB> &zones) void Awb::generateZones(std::vector<RGB> &zones)
{ {
for (unsigned int i = 0; i < kAwbStatsSizeX * kAwbStatsSizeY; i++) { for (unsigned int i = 0; i < kAwbStatsSizeX * kAwbStatsSizeY; i++) {
RGB zone; RGB zone;
@ -175,7 +175,7 @@ void IPU3Awb::generateZones(std::vector<RGB> &zones)
} }
/* Translate the IPU3 statistics into the default statistics region array */ /* Translate the IPU3 statistics into the default statistics region array */
void IPU3Awb::generateAwbStats(const ipu3_uapi_stats_3a *stats) void Awb::generateAwbStats(const ipu3_uapi_stats_3a *stats)
{ {
uint32_t regionWidth = round(awbGrid_.width / static_cast<double>(kAwbStatsSizeX)); uint32_t regionWidth = round(awbGrid_.width / static_cast<double>(kAwbStatsSizeX));
uint32_t regionHeight = round(awbGrid_.height / static_cast<double>(kAwbStatsSizeY)); uint32_t regionHeight = round(awbGrid_.height / static_cast<double>(kAwbStatsSizeY));
@ -207,7 +207,7 @@ void IPU3Awb::generateAwbStats(const ipu3_uapi_stats_3a *stats)
} }
} }
void IPU3Awb::clearAwbStats() void Awb::clearAwbStats()
{ {
for (unsigned int i = 0; i < kAwbStatsSizeX * kAwbStatsSizeY; i++) { for (unsigned int i = 0; i < kAwbStatsSizeX * kAwbStatsSizeY; i++) {
awbStats_[i].bSum = 0; awbStats_[i].bSum = 0;
@ -218,7 +218,7 @@ void IPU3Awb::clearAwbStats()
} }
} }
void IPU3Awb::awbGreyWorld() void Awb::awbGreyWorld()
{ {
LOG(IPU3Awb, Debug) << "Grey world AWB"; LOG(IPU3Awb, Debug) << "Grey world AWB";
/* /*
@ -258,7 +258,7 @@ void IPU3Awb::awbGreyWorld()
asyncResults_.blueGain = blueGain; asyncResults_.blueGain = blueGain;
} }
void IPU3Awb::calculateWBGains(const ipu3_uapi_stats_3a *stats) void Awb::calculateWBGains(const ipu3_uapi_stats_3a *stats)
{ {
ASSERT(stats->stats_3a_status.awb_en); ASSERT(stats->stats_3a_status.awb_en);
zones_.clear(); zones_.clear();
@ -273,7 +273,7 @@ void IPU3Awb::calculateWBGains(const ipu3_uapi_stats_3a *stats)
} }
} }
void IPU3Awb::process(IPAContext &context, const ipu3_uapi_stats_3a *stats) void Awb::process(IPAContext &context, const ipu3_uapi_stats_3a *stats)
{ {
calculateWBGains(stats); calculateWBGains(stats);
@ -287,7 +287,7 @@ void IPU3Awb::process(IPAContext &context, const ipu3_uapi_stats_3a *stats)
context.frameContext.awb.gains.red = asyncResults_.redGain; context.frameContext.awb.gains.red = asyncResults_.redGain;
} }
void IPU3Awb::prepare(IPAContext &context, ipu3_uapi_params *params) void Awb::prepare(IPAContext &context, ipu3_uapi_params *params)
{ {
params->acc_param.awb.config.rgbs_thr_gr = 8191; params->acc_param.awb.config.rgbs_thr_gr = 8191;
params->acc_param.awb.config.rgbs_thr_r = 8191; params->acc_param.awb.config.rgbs_thr_r = 8191;
@ -336,6 +336,6 @@ void IPU3Awb::prepare(IPAContext &context, ipu3_uapi_params *params)
params->use.acc_ccm = 1; params->use.acc_ccm = 1;
} }
} /* namespace ipa::ipu3 */ } /* namespace ipa::ipu3::algorithms */
} /* namespace libcamera */ } /* namespace libcamera */

View file

@ -2,10 +2,10 @@
/* /*
* Copyright (C) 2021, Ideas On Board * Copyright (C) 2021, Ideas On Board
* *
* ipu3_awb.h - IPU3 AWB control algorithm * awb.h - IPU3 AWB control algorithm
*/ */
#ifndef __LIBCAMERA_IPU3_AWB_H__ #ifndef __LIBCAMERA_IPU3_ALGORITHMS_AWB_H__
#define __LIBCAMERA_IPU3_AWB_H__ #define __LIBCAMERA_IPU3_ALGORITHMS_AWB_H__
#include <vector> #include <vector>
@ -13,21 +13,21 @@
#include <libcamera/geometry.h> #include <libcamera/geometry.h>
#include "algorithms/algorithm.h" #include "algorithm.h"
namespace libcamera { namespace libcamera {
namespace ipa::ipu3 { namespace ipa::ipu3::algorithms {
/* Region size for the statistics generation algorithm */ /* Region size for the statistics generation algorithm */
static constexpr uint32_t kAwbStatsSizeX = 16; static constexpr uint32_t kAwbStatsSizeX = 16;
static constexpr uint32_t kAwbStatsSizeY = 12; static constexpr uint32_t kAwbStatsSizeY = 12;
class IPU3Awb : public Algorithm class Awb : public Algorithm
{ {
public: public:
IPU3Awb(); Awb();
~IPU3Awb(); ~Awb();
void prepare(IPAContext &context, ipu3_uapi_params *params) override; void prepare(IPAContext &context, ipu3_uapi_params *params) override;
void process(IPAContext &context, const ipu3_uapi_stats_3a *stats) override; void process(IPAContext &context, const ipu3_uapi_stats_3a *stats) override;
@ -85,7 +85,7 @@ private:
AwbStatus asyncResults_; AwbStatus asyncResults_;
}; };
} /* namespace ipa::ipu3 */ } /* namespace ipa::ipu3::algorithms */
} /* namespace libcamera*/ } /* namespace libcamera*/
#endif /* __LIBCAMERA_IPU3_AWB_H__ */ #endif /* __LIBCAMERA_IPU3_ALGORITHMS_AWB_H__ */

View file

@ -2,5 +2,6 @@
ipu3_ipa_algorithms = files([ ipu3_ipa_algorithms = files([
'algorithm.cpp', 'algorithm.cpp',
'awb.cpp',
'tone_mapping.cpp', 'tone_mapping.cpp',
]) ])

View file

@ -30,9 +30,9 @@
#include "libcamera/internal/mapped_framebuffer.h" #include "libcamera/internal/mapped_framebuffer.h"
#include "algorithms/algorithm.h" #include "algorithms/algorithm.h"
#include "algorithms/awb.h"
#include "algorithms/tone_mapping.h" #include "algorithms/tone_mapping.h"
#include "ipu3_agc.h" #include "ipu3_agc.h"
#include "ipu3_awb.h"
#include "libipa/camera_sensor_helper.h" #include "libipa/camera_sensor_helper.h"
/** /**
@ -187,8 +187,6 @@ private:
uint32_t minGain_; uint32_t minGain_;
uint32_t maxGain_; uint32_t maxGain_;
/* Interface to the AWB algorithm */
std::unique_ptr<IPU3Awb> awbAlgo_;
/* Interface to the AEC/AGC algorithm */ /* Interface to the AEC/AGC algorithm */
std::unique_ptr<IPU3Agc> agcAlgo_; std::unique_ptr<IPU3Agc> agcAlgo_;
/* Interface to the Camera Helper */ /* Interface to the Camera Helper */
@ -270,6 +268,7 @@ int IPAIPU3::init(const IPASettings &settings,
*ipaControls = ControlInfoMap(std::move(controls), controls::controls); *ipaControls = ControlInfoMap(std::move(controls), controls::controls);
/* Construct our Algorithms */ /* Construct our Algorithms */
algorithms_.push_back(std::make_unique<algorithms::Awb>());
algorithms_.push_back(std::make_unique<algorithms::ToneMapping>()); algorithms_.push_back(std::make_unique<algorithms::ToneMapping>());
return 0; return 0;
@ -387,7 +386,6 @@ int IPAIPU3::configure(const IPAConfigInfo &configInfo)
return ret; return ret;
} }
awbAlgo_ = std::make_unique<IPU3Awb>();
agcAlgo_ = std::make_unique<IPU3Agc>(); agcAlgo_ = std::make_unique<IPU3Agc>();
agcAlgo_->configure(context_, configInfo); agcAlgo_->configure(context_, configInfo);
@ -466,8 +464,6 @@ void IPAIPU3::fillParams(unsigned int frame, ipu3_uapi_params *params)
for (auto const &algo : algorithms_) for (auto const &algo : algorithms_)
algo->prepare(context_, params); algo->prepare(context_, params);
awbAlgo_->prepare(context_, params);
IPU3Action op; IPU3Action op;
op.op = ActionParamFilled; op.op = ActionParamFilled;
@ -490,8 +486,6 @@ void IPAIPU3::parseStatistics(unsigned int frame,
exposure_ = context_.frameContext.agc.exposure; exposure_ = context_.frameContext.agc.exposure;
gain_ = camHelper_->gainCode(context_.frameContext.agc.gain); gain_ = camHelper_->gainCode(context_.frameContext.agc.gain);
awbAlgo_->process(context_, stats);
setControls(frame); setControls(frame);
/* \todo Use VBlank value calculated from each frame exposure. */ /* \todo Use VBlank value calculated from each frame exposure. */

View file

@ -7,7 +7,6 @@ ipa_name = 'ipa_ipu3'
ipu3_ipa_sources = files([ ipu3_ipa_sources = files([
'ipu3.cpp', 'ipu3.cpp',
'ipu3_agc.cpp', 'ipu3_agc.cpp',
'ipu3_awb.cpp',
]) ])
ipu3_ipa_sources += ipu3_ipa_algorithms ipu3_ipa_sources += ipu3_ipa_algorithms