[libcamera-devel] [PATCH v2 5/6] ipu3: Run AIQ for the first frame to avoid blanking
Kieran Bingham
kieran.bingham at ideasonboard.com
Wed Nov 3 23:27:35 CET 2021
Quoting Han-Lin Chen (2021-10-29 13:00:00)
> 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.
Splitting the AIQ run to it's own function looks a lot better too
Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> Signed-off-by: Han-Lin Chen <hanlinchen at chromium.org>
> ---
> ipu3.cpp | 45 ++++++++++++++++++++++++++-------------------
> 1 file changed, 26 insertions(+), 19 deletions(-)
>
> diff --git a/ipu3.cpp b/ipu3.cpp
> index c2dc754..2232e07 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