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:
parent
16266def40
commit
b145ae4242
5 changed files with 27 additions and 33 deletions
|
@ -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 */
|
|
@ -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__ */
|
|
@ -2,5 +2,6 @@
|
||||||
|
|
||||||
ipu3_ipa_algorithms = files([
|
ipu3_ipa_algorithms = files([
|
||||||
'algorithm.cpp',
|
'algorithm.cpp',
|
||||||
|
'awb.cpp',
|
||||||
'tone_mapping.cpp',
|
'tone_mapping.cpp',
|
||||||
])
|
])
|
||||||
|
|
|
@ -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. */
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue