ipa: rpi: agc: Gracefully handle missing agc modes

If a metering/exposure/constraint mode is not listed in the sensor
tuning file, and a control for the missing mode is set on the agc, we
terminate the application with a fatal log message.

Instead of this fatal termination, log a warning message and switch to
the appropriate default mode so that the application continues running.

Bug: https://github.com/raspberrypi/libcamera/issues/59
Bug: https://github.com/ayufan/camera-streamer/issues/67
Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
Naushir Patuck 2023-06-07 11:00:54 +01:00 committed by Kieran Bingham
parent 5242b78c0b
commit 0ee9339331

View file

@ -540,24 +540,39 @@ void Agc::housekeepConfig()
*/ */
if (meteringModeName_ != status_.meteringMode) { if (meteringModeName_ != status_.meteringMode) {
auto it = config_.meteringModes.find(meteringModeName_); auto it = config_.meteringModes.find(meteringModeName_);
if (it == config_.meteringModes.end()) if (it == config_.meteringModes.end()) {
LOG(RPiAgc, Fatal) << "No metering mode " << meteringModeName_; LOG(RPiAgc, Warning) << "No metering mode " << meteringModeName_
meteringMode_ = &it->second; << ", defaulting to " << config_.defaultMeteringMode;
meteringModeName_ = config_.defaultMeteringMode;
meteringMode_ = &config_.meteringModes[meteringModeName_];
} else {
meteringMode_ = &it->second;
}
status_.meteringMode = meteringModeName_; status_.meteringMode = meteringModeName_;
} }
if (exposureModeName_ != status_.exposureMode) { if (exposureModeName_ != status_.exposureMode) {
auto it = config_.exposureModes.find(exposureModeName_); auto it = config_.exposureModes.find(exposureModeName_);
if (it == config_.exposureModes.end()) if (it == config_.exposureModes.end()) {
LOG(RPiAgc, Fatal) << "No exposure profile " << exposureModeName_; LOG(RPiAgc, Warning) << "No exposure profile " << exposureModeName_
exposureMode_ = &it->second; << ", defaulting to " << config_.defaultExposureMode;
exposureModeName_ = config_.defaultExposureMode;
exposureMode_ = &config_.exposureModes[exposureModeName_];
} else {
exposureMode_ = &it->second;
}
status_.exposureMode = exposureModeName_; status_.exposureMode = exposureModeName_;
} }
if (constraintModeName_ != status_.constraintMode) { if (constraintModeName_ != status_.constraintMode) {
auto it = auto it =
config_.constraintModes.find(constraintModeName_); config_.constraintModes.find(constraintModeName_);
if (it == config_.constraintModes.end()) if (it == config_.constraintModes.end()) {
LOG(RPiAgc, Fatal) << "No constraint list " << constraintModeName_; LOG(RPiAgc, Warning) << "No constraint list " << constraintModeName_
constraintMode_ = &it->second; << ", defaulting to " << config_.defaultConstraintMode;
constraintModeName_ = config_.defaultConstraintMode;
constraintMode_ = &config_.constraintModes[constraintModeName_];
} else {
constraintMode_ = &it->second;
}
status_.constraintMode = constraintModeName_; status_.constraintMode = constraintModeName_;
} }
LOG(RPiAgc, Debug) << "exposureMode " LOG(RPiAgc, Debug) << "exposureMode "