summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHan-Lin Chen <hanlinchen@chromium.org>2021-11-11 18:49:07 +0800
committerKieran Bingham <kieran.bingham@ideasonboard.com>2021-11-19 16:44:59 +0000
commit28b041628e7e6c1a88163ffbebf71ffb2ca7851f (patch)
treeeee68450ea5b86ba60e774f307e29d1fb2677e3a
parent2ba9ab1bac8fc82acfa18aa3be2c13dbaf39949b (diff)
ipu3: Run AIQ for the first frame to avoid blanking
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@chromium.org> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> [Kieran: Rebased without lens controls] Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
-rw-r--r--ipu3.cpp43
1 files changed, 26 insertions, 17 deletions
diff --git a/ipu3.cpp b/ipu3.cpp
index 682b7ef..e2b5710 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,
@@ -216,6 +217,7 @@ int IPAIPU3::init(const IPASettings &settings,
int IPAIPU3::start()
{
+ runAiq(0);
setControls(0);
return 0;
@@ -362,34 +364,41 @@ void IPAIPU3::processControls([[maybe_unused]] unsigned int frame,
/* \todo Start processing for 'frame' based on 'controls'. */
}
+void IPAIPU3::runAiq([[maybe_unused]] unsigned int frame)
+{
+ /* Run algorithms into/using this context structure */
+ resultsHistory_.extendOne();
+ aiq::AiqResults& latestResults = resultsHistory_.latest();
+
+ aiq_.run2a(frame, aiqInputParams_, latestResults);
+
+ exposure_ = latestResults.ae()->exposures[0].sensor_exposure->coarse_integration_time;
+ gain_ = latestResults.ae()->exposures[0].sensor_exposure->analog_gain_code_global;
+
+}
+
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.
- */
+ * 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);
- /* Run algorithms into/using this context structure */
- resultsHistory_.extendOne();
aiq::AiqResults& latestResults = resultsHistory_.latest();
-
- aiq_.run2a(frame, aiqInputParams_, latestResults);
aic_.updateRuntimeParams(latestResults);
aic_.run(params);
- exposure_ = latestResults.ae()->exposures[0].sensor_exposure->coarse_integration_time;
- gain_ = latestResults.ae()->exposures[0].sensor_exposure->analog_gain_code_global;
-
setControls(frame);
IPU3Action op;