summaryrefslogtreecommitdiff
path: root/src/ipa/ipu3/ipu3.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ipa/ipu3/ipu3.cpp')
-rw-r--r--src/ipa/ipu3/ipu3.cpp57
1 files changed, 56 insertions, 1 deletions
diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp
index 71698d36..d37cdda7 100644
--- a/src/ipa/ipu3/ipu3.cpp
+++ b/src/ipa/ipu3/ipu3.cpp
@@ -22,6 +22,9 @@
#include "libcamera/internal/framebuffer.h"
+#include "algorithms/algorithm.h"
+#include "ipa_context.h"
+
#include "ipu3_agc.h"
#include "ipu3_awb.h"
#include "libipa/camera_sensor_helper.h"
@@ -51,6 +54,10 @@ public:
private:
void processControls(unsigned int frame, const ControlList &controls);
void fillParams(unsigned int frame, ipu3_uapi_params *params);
+
+ int initialiseAlgorithms();
+ int configureAlgorithms();
+ void processAlgorithms(const ipu3_uapi_stats_3a *stats);
void parseStatistics(unsigned int frame,
int64_t frameTimestamp,
const ipu3_uapi_stats_3a *stats);
@@ -80,10 +87,13 @@ private:
/* Interface to the Camera Helper */
std::unique_ptr<CameraSensorHelper> camHelper_;
+ /* Maintain the algorithms used by the IPA */
+ std::list<Algorithm> algorithms_;
+
/* Local parameter storage */
struct ipu3_uapi_params params_;
-
struct ipu3_uapi_grid_config bdsGrid_;
+ struct IPAContext context_;
};
int IPAIPU3::init(const IPASettings &settings)
@@ -94,6 +104,14 @@ int IPAIPU3::init(const IPASettings &settings)
return -ENODEV;
}
+ /*
+ * This may require better linking, or it could simply be moved into the
+ * context structure entirely. (Moving it makes more sense)
+ */
+ context_.params = &params_;
+
+ initialiseAlgorithms();
+
return 0;
}
@@ -197,6 +215,8 @@ int IPAIPU3::configure(const IPAConfigInfo &configInfo)
calculateBdsGrid(configInfo.bdsOutputSize);
+ configureAlgorithms();
+
awbAlgo_ = std::make_unique<IPU3Awb>();
awbAlgo_->initialise(params_, configInfo.bdsOutputSize, bdsGrid_);
@@ -286,12 +306,47 @@ void IPAIPU3::fillParams(unsigned int frame, ipu3_uapi_params *params)
queueFrameAction.emit(frame, op);
}
+int IPAIPU3::initialiseAlgorithms()
+{
+ for (Algorithm &algo : algorithms_) {
+ int ret = algo.initialise(&context_);
+ if (ret)
+ return ret;
+ }
+
+ return 0;
+}
+
+int IPAIPU3::configureAlgorithms()
+{
+ for (Algorithm &algo : algorithms_) {
+ int ret = algo.configure(&context_);
+ if (ret)
+ return ret;
+ }
+
+ return 0;
+}
+
+void IPAIPU3::processAlgorithms(const ipu3_uapi_stats_3a *stats)
+{
+ /* It might be better to pass the stats in as a parameter to process() ? */
+ context_.stats = stats;
+
+ for (Algorithm &algo : algorithms_) {
+ algo.process(&context_);
+ }
+}
+
void IPAIPU3::parseStatistics(unsigned int frame,
[[maybe_unused]] int64_t frameTimestamp,
[[maybe_unused]] const ipu3_uapi_stats_3a *stats)
{
ControlList ctrls(controls::controls);
+ /* Run the process for each algorithm on the stats */
+ processAlgorithms(stats);
+
double gain = camHelper_->gain(gain_);
agcAlgo_->process(stats, exposure_, gain);
gain_ = camHelper_->gainCode(gain);