[libcamera-devel] [PATCH 5/6] ipu3: Run AIQ for the first frame to avoid blanking
Han-Lin Chen
hanlinchen at chromium.org
Thu Oct 28 12:03:48 CEST 2021
The start() function set the first exposure time and analog gain to maximum.
In result, the first frame might be over bright and the user may see a
bright blank when changing the camera in application. Run AIQ to get an
initial exposure time and analog gain in start() to smooth the AE
process.
Signed-off-by: Han-Lin Chen <hanlinchen at chromium.com>
---
ipu3.cpp | 45 ++++++++++++++++++++++++++-------------------
1 file changed, 26 insertions(+), 19 deletions(-)
diff --git a/ipu3.cpp b/ipu3.cpp
index 45330ca..b124301 100644
--- a/ipu3.cpp
+++ b/ipu3.cpp
@@ -56,6 +56,7 @@ private:
const ControlInfoMap &sensorControls,
ControlInfoMap *ipaControls);
void processControls(unsigned int frame, const ControlList &metadata);
+ void runAiq(unsigned int frame);
void fillParams(unsigned int frame, ipu3_uapi_params *params);
void parseStatistics(unsigned int frame,
int64_t frameTimestamp,
@@ -221,6 +222,7 @@ int IPAIPU3::init(const IPASettings &settings,
int IPAIPU3::start()
{
+ runAiq(0);
setControls(0);
return 0;
@@ -370,29 +372,11 @@ void IPAIPU3::processControls([[maybe_unused]] unsigned int frame,
/* \todo Start processing for 'frame' based on 'controls'. */
}
-void IPAIPU3::fillParams(unsigned int frame, ipu3_uapi_params *params)
+void IPAIPU3::runAiq(unsigned int frame)
{
- /* Prepare parameters buffer. */
- memset(params, 0, sizeof(*params));
-
- /*
- * Call into the AIQ object, and set up the library with any requested
- * controls or settings from the incoming request.
- *
- * (statistics are fed into the library as a separate event
- * when available)
- *
- * - Run algorithms
- *
- * - Fill params buffer with the results of the algorithms.
- */
-
/* Run algorithms into/using this context structure */
aiq_.run2a(frame, aiqInputParams_, results_, lensPosition_, lensMovementStartTime_);
- aic_.updateRuntimeParams(results_);
- aic_.run(params);
-
exposure_ = results_.ae()->exposures[0].sensor_exposure->coarse_integration_time;
gain_ = results_.ae()->exposures[0].sensor_exposure->analog_gain_code_global;
@@ -410,6 +394,29 @@ void IPAIPU3::fillParams(unsigned int frame, ipu3_uapi_params *params)
lensPosition_ = results_.af()->next_lens_position;
resultsHistory_.Push(results_);
+}
+
+void IPAIPU3::fillParams(unsigned int frame, ipu3_uapi_params *params)
+{
+ /* Prepare parameters buffer. */
+ memset(params, 0, sizeof(*params));
+
+ /*
+ * Call into the AIQ object, and set up the library with any requested
+ * controls or settings from the incoming request.
+ *
+ * (statistics are fed into the library as a separate event
+ * when available)
+ *
+ * - Run algorithms
+ *
+ * - Fill params buffer with the results of the algorithms.
+ */
+
+ runAiq(frame);
+
+ aic_.updateRuntimeParams(results_);
+ aic_.run(params);
setControls(frame);
--
2.33.1.1089.g2158813163f-goog
More information about the libcamera-devel
mailing list