similarity index 94%
rename from src/ipa/ipu3/ipu3_awb.cpp
rename to src/ipa/ipu3/algorithms/awb.cpp
@@ -2,9 +2,9 @@
/*
* 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 <cmath>
@@ -13,7 +13,7 @@
namespace libcamera {
-namespace ipa::ipu3 {
+namespace ipa::ipu3::algorithms {
LOG_DEFINE_CATEGORY(IPU3Awb)
@@ -114,7 +114,7 @@ static const struct ipu3_uapi_ccm_mat_config imguCssCcmDefault = {
0, 0, 8191, 0
};
-IPU3Awb::IPU3Awb()
+Awb::Awb()
: Algorithm()
{
asyncResults_.blueGain = 1.0;
@@ -125,7 +125,7 @@ IPU3Awb::IPU3Awb()
zones_.reserve(kAwbStatsSizeX * kAwbStatsSizeY);
}
-IPU3Awb::~IPU3Awb()
+Awb::~Awb()
{
}
@@ -143,7 +143,7 @@ IPU3Awb::~IPU3Awb()
* More detailed information can be found in:
* 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) */
double X = (-0.14282) * (red) + (1.54924) * (green) + (-0.95641) * (blue);
@@ -160,7 +160,7 @@ uint32_t IPU3Awb::estimateCCT(double red, double green, double blue)
}
/* 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++) {
RGB zone;
@@ -177,7 +177,7 @@ void IPU3Awb::generateZones(std::vector<RGB> &zones)
}
/* 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 regionHeight = round(awbGrid_.height / static_cast<double>(kAwbStatsSizeY));
@@ -209,7 +209,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++) {
awbStats_[i].bSum = 0;
@@ -220,7 +220,7 @@ void IPU3Awb::clearAwbStats()
}
}
-void IPU3Awb::awbGreyWorld()
+void Awb::awbGreyWorld()
{
LOG(IPU3Awb, Debug) << "Grey world AWB";
/*
@@ -260,7 +260,7 @@ void IPU3Awb::awbGreyWorld()
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);
zones_.clear();
@@ -275,7 +275,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);
@@ -289,7 +289,7 @@ void IPU3Awb::process(IPAContext &context, const ipu3_uapi_stats_3a *stats)
context.frameContext.awb.gains.red = asyncResults_.redGain;
}
-void IPU3Awb::prepare(IPAContext &context, ipu3_uapi_params ¶ms)
+void Awb::prepare(IPAContext &context, ipu3_uapi_params ¶ms)
{
params.acc_param.awb.config.rgbs_thr_gr = 8191;
params.acc_param.awb.config.rgbs_thr_r = 8191;
@@ -336,6 +336,6 @@ void IPU3Awb::prepare(IPAContext &context, ipu3_uapi_params ¶ms)
params.use.acc_ccm = 1;
}
-} /* namespace ipa::ipu3 */
+} /* namespace ipa::ipu3::algorithms */
} /* namespace libcamera */
similarity index 84%
rename from src/ipa/ipu3/ipu3_awb.h
rename to src/ipa/ipu3/algorithms/awb.h
@@ -2,10 +2,10 @@
/*
* Copyright (C) 2021, Ideas On Board
*
- * ipu3_awb.h - IPU3 AWB control algorithm
+ * awb.h - IPU3 AWB control algorithm
*/
-#ifndef __LIBCAMERA_IPU3_AWB_H__
-#define __LIBCAMERA_IPU3_AWB_H__
+#ifndef __LIBCAMERA_IPU3_ALGORITHMS_AWB_H__
+#define __LIBCAMERA_IPU3_ALGORITHMS_AWB_H__
#include <vector>
@@ -13,21 +13,21 @@
#include <libcamera/geometry.h>
-#include "algorithms/algorithm.h"
+#include "algorithm.h"
namespace libcamera {
-namespace ipa::ipu3 {
+namespace ipa::ipu3::algorithms {
/* Region size for the statistics generation algorithm */
static constexpr uint32_t kAwbStatsSizeX = 16;
static constexpr uint32_t kAwbStatsSizeY = 12;
-class IPU3Awb : public Algorithm
+class Awb : public Algorithm
{
public:
- IPU3Awb();
- ~IPU3Awb();
+ Awb();
+ ~Awb();
void prepare(IPAContext &context, ipu3_uapi_params ¶ms) override;
void process(IPAContext &context, const ipu3_uapi_stats_3a *stats) override;
@@ -85,7 +85,7 @@ private:
AwbStatus asyncResults_;
};
-} /* namespace ipa::ipu3 */
+} /* namespace ipa::ipu3::algorithms */
} /* namespace libcamera*/
-#endif /* __LIBCAMERA_IPU3_AWB_H__ */
+#endif /* __LIBCAMERA_IPU3_ALGORITHMS_AWB_H__ */
@@ -2,5 +2,6 @@
ipu3_ipa_algorithms = files([
'algorithm.cpp',
+ 'awb.cpp',
'contrast.cpp',
])
@@ -30,9 +30,9 @@
#include "libcamera/internal/mapped_framebuffer.h"
#include "algorithms/algorithm.h"
+#include "algorithms/awb.h"
#include "algorithms/contrast.h"
#include "ipu3_agc.h"
-#include "ipu3_awb.h"
#include "libipa/camera_sensor_helper.h"
static constexpr uint32_t kMaxCellWidthPerSet = 160;
@@ -136,8 +136,6 @@ private:
uint32_t minGain_;
uint32_t maxGain_;
- /* Interface to the AWB algorithm */
- std::unique_ptr<IPU3Awb> awbAlgo_;
/* Interface to the AEC/AGC algorithm */
std::unique_ptr<IPU3Agc> agcAlgo_;
/* Interface to the Camera Helper */
@@ -220,6 +218,7 @@ int IPAIPU3::init(const IPASettings &settings,
*ipaControls = ControlInfoMap(std::move(controls), controls::controls);
/* Construct our Algorithms */
+ algorithms_.emplace_back(new algorithms::Awb());
algorithms_.emplace_back(new algorithms::Contrast());
return 0;
@@ -338,7 +337,6 @@ int IPAIPU3::configure(const IPAConfigInfo &configInfo)
return ret;
}
- awbAlgo_ = std::make_unique<IPU3Awb>();
agcAlgo_ = std::make_unique<IPU3Agc>();
agcAlgo_->configure(context_, configInfo);
@@ -418,8 +416,6 @@ void IPAIPU3::fillParams(unsigned int frame, ipu3_uapi_params *params)
for (auto const &algo : algorithms_)
algo->prepare(context_, params_);
- awbAlgo_->prepare(context_, params_);
-
*params = params_;
IPU3Action op;
@@ -443,9 +439,6 @@ void IPAIPU3::parseStatistics(unsigned int frame,
agcAlgo_->process(context_, stats);
exposure_ = context_.frameContext.agc.exposure;
gain_ = camHelper_->gainCode(context_.frameContext.agc.gain);
-
- awbAlgo_->process(context_, stats);
-
setControls(frame);
/* \todo Use VBlank value calculated from each frame exposure. */
@@ -7,7 +7,6 @@ ipa_name = 'ipa_ipu3'
ipu3_ipa_sources = files([
'ipu3.cpp',
'ipu3_agc.cpp',
- 'ipu3_awb.cpp',
])
ipu3_ipa_sources += ipu3_ipa_algorithms