@@ -115,9 +115,13 @@ int Agc::configure(IPAContext &context,
context.activeState.agc.constraintMode = constraintModes().begin()->first;
context.activeState.agc.exposureMode = exposureModeHelpers().begin()->first;
+ ControlInfo &frameDurationLimits = context.ctrlMap[&controls::FrameDurationLimits];
+
AgcMeanLuminance::AgcSensorConfiguration sensorConfig;
sensorConfig.lineDuration = context.configuration.sensor.lineDuration;
sensorConfig.minExposureTime = minExposureTime_;
+ sensorConfig.maxFrameDuration =
+ std::chrono::microseconds(frameDurationLimits.max().get<int64_t>());
sensorConfig.maxExposureTime = maxExposureTime_;
sensorConfig.minAnalogueGain = minAnalogueGain_;
sensorConfig.maxAnalogueGain = maxAnalogueGain_;
@@ -278,11 +278,10 @@ void IPAIPU3::updateControls(const IPACameraSensorInfo &sensorInfo,
frameDurations[i] = frameSize / (sensorInfo.pixelRate / 1000000U);
}
- controls[&controls::FrameDurationLimits] = ControlInfo(frameDurations[0],
- frameDurations[1],
- frameDurations[2]);
+ context_.ctrlMap[&controls::FrameDurationLimits] =
+ ControlInfo(frameDurations[0], frameDurations[1], frameDurations[2]);
- controls.merge(context_.ctrlMap);
+ controls.insert(context_.ctrlMap.begin(), context_.ctrlMap.end());
*ipaControls = ControlInfoMap(std::move(controls), controls::controls);
}
@@ -121,6 +121,11 @@ static constexpr double kMaxRelativeLuminanceTarget = 0.95;
* \brief The sensor maximum exposure time in microseconds
*/
+/**
+ * \var AgcMeanLuminance::AgcSensorConfiguration::maxFrameDuration
+ * \brief The sensor maximum frame duration in microseconds
+ */
+
/**
* \var AgcMeanLuminance::AgcSensorConfiguration::minAnalogueGain
* \brief The sensor minimum analogue gain absolute value
@@ -363,6 +368,7 @@ void AgcMeanLuminance::configure(const AgcSensorConfiguration &config,
for (auto &[id, helper] : exposureModeHelpers_)
helper->configure(config.lineDuration,
config.minExposureTime, config.maxExposureTime,
+ config.maxFrameDuration,
config.minAnalogueGain, config.maxAnalogueGain,
sensorHelper);
}
@@ -46,6 +46,7 @@ public:
utils::Duration lineDuration;
utils::Duration minExposureTime;
utils::Duration maxExposureTime;
+ utils::Duration maxFrameDuration;
double minAnalogueGain;
double maxAnalogueGain;
};
@@ -84,6 +84,7 @@ ExposureModeHelper::ExposureModeHelper(const Span<std::pair<utils::Duration, dou
* \param[in] lineDuration The current line length of the sensor
* \param[in] minExposureTime The minimum exposure time supported
* \param[in] maxExposureTime The maximum exposure time supported
+ * \param[in] maxFrameDuration The maximum frame duration
* \param[in] minGain The minimum analogue gain supported
* \param[in] maxGain The maximum analogue gain supported
* \param[in] sensorHelper The sensor helper
@@ -100,12 +101,14 @@ ExposureModeHelper::ExposureModeHelper(const Span<std::pair<utils::Duration, dou
void ExposureModeHelper::configure(utils::Duration lineDuration,
utils::Duration minExposureTime,
utils::Duration maxExposureTime,
+ utils::Duration maxFrameDuration,
double minGain, double maxGain,
const CameraSensorHelper *sensorHelper)
{
lineDuration_ = lineDuration;
minExposureTime_ = minExposureTime;
maxExposureTime_ = maxExposureTime;
+ maxFrameDuration_ = maxFrameDuration;
minGain_ = minGain;
maxGain_ = maxGain;
sensorHelper_ = sensorHelper;
@@ -289,6 +292,12 @@ ExposureModeHelper::splitExposure(utils::Duration exposure) const
* \return The maxExposureTime_ value
*/
+/**
+ * \fn ExposureModeHelper::maxFrameDuration()
+ * \brief Retrieve the configured maximum frame duration set through setLimits()
+ * \return The maxFrameDuration_ value
+ */
+
/**
* \fn ExposureModeHelper::minGain()
* \brief Retrieve the configured minimum gain set through setLimits()
@@ -27,7 +27,8 @@ public:
~ExposureModeHelper() = default;
void configure(utils::Duration lineLength, utils::Duration minExposureTime,
- utils::Duration maxExposureTime, double minGain, double maxGain,
+ utils::Duration maxExposureTime, utils::Duration maxFrameDuration,
+ double minGain, double maxGain,
const CameraSensorHelper *sensorHelper);
void setLimits(utils::Duration minExposureTime, utils::Duration maxExposureTime,
double minGain, double maxGain);
@@ -37,6 +38,7 @@ public:
utils::Duration minExposureTime() const { return minExposureTime_; }
utils::Duration maxExposureTime() const { return maxExposureTime_; }
+ utils::Duration maxFrameDuration() const { return maxFrameDuration_; }
double minGain() const { return minGain_; }
double maxGain() const { return maxGain_; }
@@ -51,6 +53,7 @@ private:
utils::Duration lineDuration_;
utils::Duration minExposureTime_;
utils::Duration maxExposureTime_;
+ utils::Duration maxFrameDuration_;
double minGain_;
double maxGain_;
const CameraSensorHelper *sensorHelper_;
@@ -169,10 +169,14 @@ int Agc::configure(IPAContext &context,
context.activeState.agc.constraintMode = constraintModes().begin()->first;
context.activeState.agc.exposureMode = exposureModeHelpers().begin()->first;
+ ControlInfo &frameDurationLimits = context.ctrlMap[&controls::FrameDurationLimits];
+
AgcMeanLuminance::AgcSensorConfiguration sensorConfig;
sensorConfig.lineDuration = context.configuration.sensor.lineDuration;
sensorConfig.minExposureTime = context.configuration.agc.minShutterSpeed;
sensorConfig.maxExposureTime = context.configuration.agc.maxShutterSpeed;
+ sensorConfig.maxFrameDuration =
+ std::chrono::microseconds(frameDurationLimits.max().get<int64_t>());
sensorConfig.minAnalogueGain = context.configuration.agc.minAnalogueGain;
sensorConfig.maxAnalogueGain = context.configuration.agc.maxAnalogueGain;
@@ -10,6 +10,8 @@
#include <libcamera/base/utils.h>
#include <libcamera/controls.h>
+#include <libcamera/ipa/core_ipa_interface.h>
+
#include "libcamera/internal/bayer_format.h"
#include <libipa/camera_sensor_helper.h>
@@ -231,9 +231,8 @@ void IPAMaliC55::updateControls(const IPACameraSensorInfo &sensorInfo,
frameDurations[i] = frameSize / (sensorInfo.pixelRate / 1000000U);
}
- ctrlMap[&controls::FrameDurationLimits] = ControlInfo(frameDurations[0],
- frameDurations[1],
- frameDurations[2]);
+ context_.ctrlMap[&controls::FrameDurationLimits] =
+ ControlInfo(frameDurations[0], frameDurations[1], frameDurations[2]);
/*
* Compute exposure time limits from the V4L2_CID_EXPOSURE control
@@ -258,7 +257,7 @@ void IPAMaliC55::updateControls(const IPACameraSensorInfo &sensorInfo,
* Merge in any controls that we support either statically or from the
* algorithms.
*/
- ctrlMap.merge(context_.ctrlMap);
+ ctrlMap.insert(context_.ctrlMap.begin(), context_.ctrlMap.end());
*ipaControls = ControlInfoMap(std::move(ctrlMap), controls::controls);
}
@@ -204,6 +204,7 @@ int Agc::configure(IPAContext &context, const IPACameraSensorInfo &configInfo)
sensorConfig.lineDuration = context.configuration.sensor.lineDuration;
sensorConfig.minExposureTime = context.configuration.sensor.minExposureTime;
sensorConfig.maxExposureTime = context.configuration.sensor.maxExposureTime;
+ sensorConfig.maxFrameDuration = context.activeState.agc.maxFrameDuration;
sensorConfig.minAnalogueGain = context.configuration.sensor.minAnalogueGain;
sensorConfig.maxAnalogueGain = context.configuration.sensor.maxAnalogueGain;
Pass the maximum allowed frame duration to the AGC configure() operation. This prepares for limiting the exposure time to the frame duration. In order to be able to provide to the AGC the frame duration in the IPU3 and Mali-C55 IPAs it is necessary to store the FrameDurationLimits control in the context. Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> --- src/ipa/ipu3/algorithms/agc.cpp | 4 ++++ src/ipa/ipu3/ipu3.cpp | 7 +++---- src/ipa/libipa/agc_mean_luminance.cpp | 6 ++++++ src/ipa/libipa/agc_mean_luminance.h | 1 + src/ipa/libipa/exposure_mode_helper.cpp | 9 +++++++++ src/ipa/libipa/exposure_mode_helper.h | 5 ++++- src/ipa/mali-c55/algorithms/agc.cpp | 4 ++++ src/ipa/mali-c55/ipa_context.h | 2 ++ src/ipa/mali-c55/mali-c55.cpp | 7 +++---- src/ipa/rkisp1/algorithms/agc.cpp | 1 + 10 files changed, 37 insertions(+), 9 deletions(-)