aiq_handler: fix ae adjustment issues
* apply ae manual exp time and analog gain only under manual mode
* limit aiq exposure result by max sensor integration time
diff --git a/xcore/aiq_handler.cpp b/xcore/aiq_handler.cpp
index 60c6c01..500759f 100644
--- a/xcore/aiq_handler.cpp
+++ b/xcore/aiq_handler.cpp
@@ -463,8 +463,15 @@
bool AiqAeHandler::ensure_ae_manual ()
{
- _input.manual_exposure_time_us = get_manual_exposure_time_unlock ();
- _input.manual_analog_gain = get_manual_analog_gain_unlock ();
+ if (this->get_mode_unlock () == XCAM_AE_MODE_MANUAL) {
+ _input.manual_exposure_time_us = get_manual_exposure_time_unlock ();
+ _input.manual_analog_gain = get_manual_analog_gain_unlock ();
+ }
+ else {
+ _input.manual_exposure_time_us = -1;
+ _input.manual_analog_gain = -1;
+ }
+
return true;
}
@@ -602,23 +609,26 @@
ia_aiq_exposure_sensor_descriptor * desc = &_sensor_descriptor;
uint64_t exposure_min = 0, exposure_max = 0;
double analog_max = get_max_analog_gain_unlock ();
- uint32_t min_coarse_value = 0, max_coarse_value = 0;
+ uint32_t min_coarse_value = desc->coarse_integration_time_min;
+ uint32_t max_coarse_value = desc->line_periods_per_field - desc->coarse_integration_time_max_margin;
+ uint32_t value;
get_exposure_time_range_unlock (exposure_min, exposure_max);
if (exposure_min) {
- min_coarse_value = _time_to_coarse_line (desc, exposure_min);
- if (min_coarse_value < desc->coarse_integration_time_min)
- min_coarse_value = desc->coarse_integration_time_min;
- if (cur_res.coarse_integration_time < min_coarse_value)
- cur_res.coarse_integration_time = min_coarse_value;
+ value = _time_to_coarse_line (desc, (uint32_t)exposure_min);
+ min_coarse_value = (value > min_coarse_value) ? value : min_coarse_value;
}
+ if (cur_res.coarse_integration_time < min_coarse_value) {
+ cur_res.coarse_integration_time = min_coarse_value;
+ }
+
if (exposure_max) {
- max_coarse_value = _time_to_coarse_line (desc, (uint32_t)exposure_max);
- if (max_coarse_value > (uint32_t)(desc->line_periods_per_field - desc->coarse_integration_time_max_margin))
- max_coarse_value = desc->line_periods_per_field - desc->coarse_integration_time_max_margin;
- if (cur_res.coarse_integration_time > max_coarse_value)
- cur_res.coarse_integration_time = max_coarse_value;
+ value = _time_to_coarse_line (desc, (uint32_t)exposure_max);
+ max_coarse_value = (value < max_coarse_value) ? value : max_coarse_value;
+ }
+ if (cur_res.coarse_integration_time > max_coarse_value) {
+ cur_res.coarse_integration_time = max_coarse_value;
}
if (analog_max >= 1.0) {