summaryrefslogtreecommitdiff
path: root/src/ipa/rpi/controller
diff options
context:
space:
mode:
Diffstat (limited to 'src/ipa/rpi/controller')
-rw-r--r--src/ipa/rpi/controller/agc_status.h9
-rw-r--r--src/ipa/rpi/controller/rpi/agc.cpp20
-rw-r--r--src/ipa/rpi/controller/rpi/agc.h2
3 files changed, 19 insertions, 12 deletions
diff --git a/src/ipa/rpi/controller/agc_status.h b/src/ipa/rpi/controller/agc_status.h
index 6c112e76..597eddd7 100644
--- a/src/ipa/rpi/controller/agc_status.h
+++ b/src/ipa/rpi/controller/agc_status.h
@@ -11,8 +11,10 @@
#include <libcamera/base/utils.h>
/*
- * The AGC algorithm should post the following structure into the image's
- * "agc.status" metadata.
+ * The AGC algorithm process method should post an AgcStatus into the image
+ * metadata under the tag "agc.status".
+ * The AGC algorithm prepare method should post an AgcPrepareStatus instead
+ * under "agc.prepare_status".
*/
/*
@@ -34,6 +36,9 @@ struct AgcStatus {
int floatingRegionEnable;
libcamera::utils::Duration fixedShutter;
double fixedAnalogueGain;
+};
+
+struct AgcPrepareStatus {
double digitalGain;
int locked;
};
diff --git a/src/ipa/rpi/controller/rpi/agc.cpp b/src/ipa/rpi/controller/rpi/agc.cpp
index 6087fc60..7b02972a 100644
--- a/src/ipa/rpi/controller/rpi/agc.cpp
+++ b/src/ipa/rpi/controller/rpi/agc.cpp
@@ -419,11 +419,13 @@ void Agc::prepare(Metadata *imageMetadata)
{
Duration totalExposureValue = status_.totalExposureValue;
AgcStatus delayedStatus;
+ AgcPrepareStatus prepareStatus;
if (!imageMetadata->get("agc.delayed_status", delayedStatus))
totalExposureValue = delayedStatus.totalExposureValue;
- status_.digitalGain = 1.0;
+ prepareStatus.digitalGain = 1.0;
+ prepareStatus.locked = false;
if (status_.totalExposureValue) {
/* Process has run, so we have meaningful values. */
@@ -432,23 +434,23 @@ void Agc::prepare(Metadata *imageMetadata)
Duration actualExposure = deviceStatus.shutterSpeed *
deviceStatus.analogueGain;
if (actualExposure) {
- status_.digitalGain = totalExposureValue / actualExposure;
+ double digitalGain = totalExposureValue / actualExposure;
LOG(RPiAgc, Debug) << "Want total exposure " << totalExposureValue;
/*
* Never ask for a gain < 1.0, and also impose
* some upper limit. Make it customisable?
*/
- status_.digitalGain = std::max(1.0, std::min(status_.digitalGain, 4.0));
+ prepareStatus.digitalGain = std::max(1.0, std::min(digitalGain, 4.0));
LOG(RPiAgc, Debug) << "Actual exposure " << actualExposure;
- LOG(RPiAgc, Debug) << "Use digitalGain " << status_.digitalGain;
+ LOG(RPiAgc, Debug) << "Use digitalGain " << prepareStatus.digitalGain;
LOG(RPiAgc, Debug) << "Effective exposure "
- << actualExposure * status_.digitalGain;
+ << actualExposure * prepareStatus.digitalGain;
/* Decide whether AEC/AGC has converged. */
- updateLockStatus(deviceStatus);
+ prepareStatus.locked = updateLockStatus(deviceStatus);
}
} else
LOG(RPiAgc, Warning) << name() << ": no device metadata";
- imageMetadata->set("agc.status", status_);
+ imageMetadata->set("agc.prepare_status", prepareStatus);
}
}
@@ -486,7 +488,7 @@ void Agc::process(StatisticsPtr &stats, Metadata *imageMetadata)
writeAndFinish(imageMetadata, desaturate);
}
-void Agc::updateLockStatus(DeviceStatus const &deviceStatus)
+bool Agc::updateLockStatus(DeviceStatus const &deviceStatus)
{
const double errorFactor = 0.10; /* make these customisable? */
const int maxLockCount = 5;
@@ -522,7 +524,7 @@ void Agc::updateLockStatus(DeviceStatus const &deviceStatus)
lastTargetExposure_ = status_.targetExposureValue;
LOG(RPiAgc, Debug) << "Lock count updated to " << lockCount_;
- status_.locked = lockCount_ == maxLockCount;
+ return lockCount_ == maxLockCount;
}
void Agc::housekeepConfig()
diff --git a/src/ipa/rpi/controller/rpi/agc.h b/src/ipa/rpi/controller/rpi/agc.h
index b7122de3..aaf77c8f 100644
--- a/src/ipa/rpi/controller/rpi/agc.h
+++ b/src/ipa/rpi/controller/rpi/agc.h
@@ -85,7 +85,7 @@ public:
void process(StatisticsPtr &stats, Metadata *imageMetadata) override;
private:
- void updateLockStatus(DeviceStatus const &deviceStatus);
+ bool updateLockStatus(DeviceStatus const &deviceStatus);
AgcConfig config_;
void housekeepConfig();
void fetchCurrentExposure(Metadata *imageMetadata);