@@ -118,6 +118,8 @@ int Agc::configure(IPAContext &context,
AgcMeanLuminance::SensorConfiguration sensorConfig;
sensorConfig.lineDuration = context.configuration.sensor.lineDuration;
sensorConfig.minExposureTime = minExposureTime_;
+ sensorConfig.minFrameDuration = context.configuration.sensor.minFrameDuration;
+ sensorConfig.maxFrameDuration = context.configuration.sensor.maxFrameDuration;
sensorConfig.maxExposureTime = maxExposureTime_;
sensorConfig.minAnalogueGain = minAnalogueGain_;
sensorConfig.maxAnalogueGain = maxAnalogueGain_;
@@ -39,6 +39,8 @@ struct IPASessionConfiguration {
Size size;
utils::Duration minExposureTime;
utils::Duration maxExposureTime;
+ utils::Duration minFrameDuration;
+ utils::Duration maxFrameDuration;
double minAnalogueGain;
double maxAnalogueGain;
} sensor;
@@ -56,6 +58,8 @@ struct IPAActiveState {
double gain;
uint32_t constraintMode;
uint32_t exposureMode;
+ utils::Duration minFrameDuration;
+ utils::Duration maxFrameDuration;
} agc;
struct {
@@ -167,7 +167,8 @@ private:
void updateControls(const IPACameraSensorInfo &sensorInfo,
const ControlInfoMap &sensorControls,
ControlInfoMap *ipaControls);
- void updateSessionConfiguration(const ControlInfoMap &sensorControls);
+ void updateSessionConfiguration(const IPACameraSensorInfo &sensorInfo,
+ const ControlInfoMap &sensorControls);
void setControls(unsigned int frame);
void calculateBdsGrid(const Size &bdsOutputSize);
@@ -197,7 +198,8 @@ std::string IPAIPU3::logPrefix() const
* \brief Compute IPASessionConfiguration using the sensor information and the
* sensor V4L2 controls
*/
-void IPAIPU3::updateSessionConfiguration(const ControlInfoMap &sensorControls)
+void IPAIPU3::updateSessionConfiguration(const IPACameraSensorInfo &sensorInfo,
+ const ControlInfoMap &sensorControls)
{
const ControlInfo vBlank = sensorControls.find(V4L2_CID_VBLANK)->second;
context_.configuration.sensor.defVBlank = vBlank.def().get<int32_t>();
@@ -210,6 +212,12 @@ void IPAIPU3::updateSessionConfiguration(const ControlInfoMap &sensorControls)
int32_t minGain = v4l2Gain.min().get<int32_t>();
int32_t maxGain = v4l2Gain.max().get<int32_t>();
+ const ControlInfo &v4l2VBlank = sensorControls.find(V4L2_CID_VBLANK)->second;
+ std::array<uint32_t, 2> frameHeights{
+ v4l2VBlank.min().get<int32_t>() + sensorInfo.outputSize.height,
+ v4l2VBlank.max().get<int32_t>() + sensorInfo.outputSize.height,
+ };
+
/*
* When the AGC computes the new exposure values for a frame, it needs
* to know the limits for exposure time and analogue gain.
@@ -219,6 +227,10 @@ void IPAIPU3::updateSessionConfiguration(const ControlInfoMap &sensorControls)
*/
context_.configuration.sensor.minExposureTime = minExposure * context_.configuration.sensor.lineDuration;
context_.configuration.sensor.maxExposureTime = maxExposure * context_.configuration.sensor.lineDuration;
+ context_.configuration.sensor.minFrameDuration = frameHeights[0] *
+ context_.configuration.sensor.lineDuration;
+ context_.configuration.sensor.maxFrameDuration = frameHeights[1] *
+ context_.configuration.sensor.lineDuration;
context_.configuration.sensor.minAnalogueGain = context_.camHelper->gain(minGain);
context_.configuration.sensor.maxAnalogueGain = context_.camHelper->gain(maxGain);
}
@@ -488,7 +500,7 @@ int IPAIPU3::configure(const IPAConfigInfo &configInfo,
updateControls(sensorInfo_, sensorCtrls_, ipaControls);
/* Update the IPASessionConfiguration using the sensor settings. */
- updateSessionConfiguration(sensorCtrls_);
+ updateSessionConfiguration(sensorInfo_, sensorCtrls_);
for (auto const &algo : algorithms()) {
int ret = algo->configure(context_, configInfo);
@@ -117,6 +117,12 @@ static constexpr double kMaxRelativeLuminanceTarget = 0.95;
* \var AgcMeanLuminance::SensorConfiguration::maxExposureTime
* \brief The sensor maximum exposure time in microseconds
*
+ * \var AgcMeanLuminance::SensorConfiguration::minFrameDuration
+ * \brief The sensor minimum frame duration in microseconds
+ *
+ * \var AgcMeanLuminance::SensorConfiguration::maxFrameDuration
+ * \brief The sensor maximum frame duration in microseconds
+ *
* \var AgcMeanLuminance::SensorConfiguration::minAnalogueGain
* \brief The sensor minimum analogue gain absolute value
*
@@ -366,6 +372,8 @@ void AgcMeanLuminance::configure(const SensorConfiguration &config,
sensorConfig.lineDuration_ = config.lineDuration;
sensorConfig.minExposureTime_ = config.minExposureTime;
sensorConfig.maxExposureTime_ = config.maxExposureTime;
+ sensorConfig.minFrameDuration_ = config.minFrameDuration;
+ sensorConfig.maxFrameDuration_ = config.maxFrameDuration;
sensorConfig.minGain_ = config.minAnalogueGain;
sensorConfig.maxGain_ = config.maxAnalogueGain;
@@ -46,6 +46,8 @@ public:
utils::Duration lineDuration;
utils::Duration minExposureTime;
utils::Duration maxExposureTime;
+ utils::Duration minFrameDuration;
+ utils::Duration maxFrameDuration;
double minAnalogueGain;
double maxAnalogueGain;
};
@@ -168,11 +168,17 @@ int Agc::configure(IPAContext &context,
context.activeState.agc.manual.ispGain = kMinDigitalGain;
context.activeState.agc.constraintMode = constraintModes().begin()->first;
context.activeState.agc.exposureMode = exposureModeHelpers().begin()->first;
+ context.activeState.agc.minFrameDuration =
+ context.configuration.sensor.minFrameDuration;
+ context.activeState.agc.maxFrameDuration =
+ context.configuration.sensor.maxFrameDuration;
AgcMeanLuminance::SensorConfiguration sensorConfig;
sensorConfig.lineDuration = context.configuration.sensor.lineDuration;
sensorConfig.minExposureTime = context.configuration.sensor.minShutterSpeed;
sensorConfig.maxExposureTime = context.configuration.sensor.maxShutterSpeed;
+ sensorConfig.minFrameDuration = context.configuration.sensor.minFrameDuration;
+ sensorConfig.maxFrameDuration = context.configuration.sensor.maxFrameDuration;
sensorConfig.minAnalogueGain = context.configuration.sensor.minAnalogueGain;
sensorConfig.maxAnalogueGain = context.configuration.sensor.maxAnalogueGain;
@@ -30,6 +30,8 @@ struct IPASessionConfiguration {
uint32_t blackLevel;
utils::Duration minShutterSpeed;
utils::Duration maxShutterSpeed;
+ utils::Duration minFrameDuration;
+ utils::Duration maxFrameDuration;
double minAnalogueGain;
double maxAnalogueGain;
} sensor;
@@ -51,6 +53,8 @@ struct IPAActiveState {
uint32_t constraintMode;
uint32_t exposureMode;
uint32_t temperatureK;
+ utils::Duration minFrameDuration;
+ utils::Duration maxFrameDuration;
} agc;
struct {
@@ -177,16 +177,23 @@ void IPAMaliC55::updateSessionConfiguration(const IPACameraSensorInfo &info,
int32_t minGain = v4l2Gain.min().get<int32_t>();
int32_t maxGain = v4l2Gain.max().get<int32_t>();
+ const ControlInfo &v4l2VBlank = sensorControls.find(V4L2_CID_VBLANK)->second;
+ std::array<uint32_t, 2> frameHeights{
+ v4l2VBlank.min().get<int32_t>() + info.outputSize.height,
+ v4l2VBlank.max().get<int32_t>() + info.outputSize.height,
+ };
+
/*
* When the AGC computes the new exposure values for a frame, it needs
* to know the limits for shutter speed and analogue gain.
* As it depends on the sensor, update it with the controls.
- *
- * \todo take VBLANK into account for maximum shutter speed
*/
- context_.configuration.sensor.lineDuration = info.minLineLength * 1.0s / info.pixelRate;
- context_.configuration.sensor.minShutterSpeed = minExposure * context_.configuration.sensor.lineDuration;
- context_.configuration.sensor.maxShutterSpeed = maxExposure * context_.configuration.sensor.lineDuration;
+ utils::Duration lineDuration = info.minLineLength * 1.0s / info.pixelRate;
+ context_.configuration.sensor.lineDuration = lineDuration;
+ context_.configuration.sensor.minShutterSpeed = minExposure * lineDuration;
+ context_.configuration.sensor.maxShutterSpeed = maxExposure * lineDuration;
+ context_.configuration.sensor.minFrameDuration = frameHeights[0] * lineDuration;
+ context_.configuration.sensor.maxFrameDuration = frameHeights[1] * lineDuration;
context_.configuration.sensor.minAnalogueGain = context_.camHelper->gain(minGain);
context_.configuration.sensor.maxAnalogueGain = context_.camHelper->gain(maxGain);
@@ -204,6 +204,8 @@ 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.minFrameDuration = context.configuration.sensor.minFrameDuration;
+ sensorConfig.maxFrameDuration = context.configuration.sensor.maxFrameDuration;
sensorConfig.minAnalogueGain = context.configuration.sensor.minAnalogueGain;
sensorConfig.maxAnalogueGain = context.configuration.sensor.maxAnalogueGain;
Pass the min/max sensor 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 in the context sensor configuration, like it was already done for the RkISP1 IPA. Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> --- src/ipa/ipu3/algorithms/agc.cpp | 2 ++ src/ipa/ipu3/ipa_context.h | 4 ++++ src/ipa/ipu3/ipu3.cpp | 18 +++++++++++++++--- src/ipa/libipa/agc_mean_luminance.cpp | 8 ++++++++ src/ipa/libipa/agc_mean_luminance.h | 2 ++ src/ipa/mali-c55/algorithms/agc.cpp | 6 ++++++ src/ipa/mali-c55/ipa_context.h | 4 ++++ src/ipa/mali-c55/mali-c55.cpp | 17 ++++++++++++----- src/ipa/rkisp1/algorithms/agc.cpp | 2 ++ 9 files changed, 55 insertions(+), 8 deletions(-)