From patchwork Fri Nov 26 11:30:27 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hanlin Chen X-Patchwork-Id: 14809 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 258B0BF415 for ; Fri, 26 Nov 2021 11:30:35 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id D0801604FD; Fri, 26 Nov 2021 12:30:34 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="BAB9H+vE"; dkim-atps=neutral Received: from mail-pg1-x52d.google.com (mail-pg1-x52d.google.com [IPv6:2607:f8b0:4864:20::52d]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id A50CD6011E for ; Fri, 26 Nov 2021 12:30:33 +0100 (CET) Received: by mail-pg1-x52d.google.com with SMTP id 71so7901879pgb.4 for ; Fri, 26 Nov 2021 03:30:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=4wdN+JubTQyq72Sw7tfQAAl0btZplbUm+C7gcfqYipI=; b=BAB9H+vEyeZHorB/LQsTwQWrpvGMEITENg5NNXdvywjKH+XVWwu9c56MzoYzyFjqcE JVmrwHADLZyF8qsYisiIjFXLrBN2DwQ8HUlI3wZBHYXjyt6msguz2ts5WgHz1och7ZDJ hiAcUuKsia+heeooLrhdndWiSZ0ULv6DYJqSM= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=4wdN+JubTQyq72Sw7tfQAAl0btZplbUm+C7gcfqYipI=; b=Ci0VCmFSNYDsOvsdReF7+ajF8EOXjT8izdtRwJIHIx33abM9PY/7JXgKL0EHCyihBQ VVXnmKlz405Y4FDUzUhDL0LHA9zQ6GKZJl35xdB1eC5CgFrGkn7l/px0aUdFjg6UVR5t EYyfJddHyQv9R2zyVLHOh1keXgZfCdHnPPoUT7hk5P5BTNAA4Vovi+hNj0PDx/0Ahl4/ TaYC8SV+YFILxhl2XpN2jyD+GINhpzEGcrE5QjirUMVj8njXq92uDW81iVC5UPZu4Fbm PEurCGbKoaDUvc+3xjBBPFPXwC1lIciKmFLOQSO6tm7Hw4zd058eqOih367CcSbFXjaA Y+Sg== X-Gm-Message-State: AOAM531wLYxQMSAVpHgK4l8KRFbKnME9XR1Uh9YPNJWQDRSAkE7cZh6S Fs5LFMKMnmFsnIORb7+qoM0uannlxvnASQ== X-Google-Smtp-Source: ABdhPJxEoxhh5Rf0vQSr/Rpf1VAsPaiNbEB1LSstF4NwJAeyz0van4vWoHxg2nGovSpP97lkJbRLKQ== X-Received: by 2002:a63:1842:: with SMTP id 2mr7003883pgy.555.1637926231680; Fri, 26 Nov 2021 03:30:31 -0800 (PST) Received: from localhost ([2401:fa00:1:10:a0de:e637:c058:6824]) by smtp.gmail.com with UTF8SMTPSA id mm22sm5280014pjb.28.2021.11.26.03.30.30 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 26 Nov 2021 03:30:31 -0800 (PST) From: Han-Lin Chen To: libcamera-devel@lists.libcamera.org Date: Fri, 26 Nov 2021 19:30:27 +0800 Message-Id: <20211126113027.3280009-1-hanlinchen@chromium.org> X-Mailer: git-send-email 2.34.0.rc2.393.gf8c9666880-goog MIME-Version: 1.0 Subject: [libcamera-devel] [IPU3-IPA PATCH v5] ipu3: Apply auto focus and send lens controls to pipeline handler X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Apply auto focus and send lens controls to pipeline handler. Signed-off-by: Han-Lin Chen Reviewed-by: Kieran Bingham Reviewed-by: Umang Jain --- aiq/aiq.cpp | 3 +-- aiq/aiq.h | 4 +--- aiq/aiq_input_parameters.cpp | 2 +- ipu3.cpp | 25 +++++++++++++++++++++++++ 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/aiq/aiq.cpp b/aiq/aiq.cpp index 24c61cb..52a9c07 100644 --- a/aiq/aiq.cpp +++ b/aiq/aiq.cpp @@ -138,8 +138,7 @@ int AIQ::setStatistics(unsigned int frame, * might run asycnronously, or after receipt of statistics, with the filling * of the parameter buffer being the only part handled when called for. */ -int AIQ::run2a(unsigned int frame, AiqInputParameters ¶ms, - AiqResults &results) +int AIQ::run2a(unsigned int frame, AiqInputParameters ¶ms, AiqResults &results) { (void)frame; diff --git a/aiq/aiq.h b/aiq/aiq.h index fcd02d2..49eee2d 100644 --- a/aiq/aiq.h +++ b/aiq/aiq.h @@ -39,9 +39,7 @@ public: int setStatistics(unsigned int frame, int64_t timestamp, AiqResults &results, const ipu3_uapi_stats_3a *stats); - - int run2a(unsigned int frame, AiqInputParameters ¶ms, - AiqResults &results); + int run2a(unsigned int frame, AiqInputParameters ¶ms, AiqResults &results); private: std::string decodeError(ia_err err); diff --git a/aiq/aiq_input_parameters.cpp b/aiq/aiq_input_parameters.cpp index 8f60d14..7a6a1fa 100644 --- a/aiq/aiq_input_parameters.cpp +++ b/aiq/aiq_input_parameters.cpp @@ -166,7 +166,7 @@ void AiqInputParameters::setAeAwbAfDefaults() ia_aiq_af_range_normal, ia_aiq_af_metering_mode_auto, ia_aiq_flash_mode_off, - NULL, NULL, false + &focusRect, &manualFocusParams, false }; /* GBCE Params */ diff --git a/ipu3.cpp b/ipu3.cpp index e2b5710..6ab86e0 100644 --- a/ipu3.cpp +++ b/ipu3.cpp @@ -78,6 +78,10 @@ private: uint32_t gain_; uint32_t minGain_; uint32_t maxGain_; + int32_t lensPosition_; + + /* Intel AF library relies on timestamp to wait for lens movement */ + uint64_t lensMovementStartTime_; /* Intel Library Instances. */ aiq::AIQ aiq_; @@ -259,6 +263,9 @@ int IPAIPU3::configure(const IPAConfigInfo &configInfo, maxGain_ = itGain->second.max().get(); gain_ = maxGain_; + lensMovementStartTime_ = 0; + lensPosition_ = 0; + int ret; ret = aiq_.configure(); @@ -370,11 +377,27 @@ void IPAIPU3::runAiq([[maybe_unused]] unsigned int frame) resultsHistory_.extendOne(); aiq::AiqResults& latestResults = resultsHistory_.latest(); + /* Todo: Refactor AiqInputParameters interface to set following parameters. */ + aiqInputParams_.afParams.lens_position = lensPosition_; + aiqInputParams_.afParams.lens_movement_start_timestamp = lensMovementStartTime_; + 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; + /* + * Af algorithm compares the timestamp of start of the lens movement and + * that of the statistics generated to estimate whether next lens + * position should be produced. + * \todo use the lens movement start time reported by the pipeline handler. + */ + if (lensPosition_ != latestResults.af()->next_lens_position) { + utils::time_point time = utils::clock::now(); + uint64_t usecs = std::chrono::duration_cast(time.time_since_epoch()).count(); + lensMovementStartTime_ = usecs; + } + lensPosition_ = latestResults.af()->next_lens_position; } void IPAIPU3::fillParams(unsigned int frame, ipu3_uapi_params *params) @@ -483,6 +506,8 @@ void IPAIPU3::setControls(unsigned int frame) op.sensorControls = sensorCtrls; + op.lensControls.set(V4L2_CID_FOCUS_ABSOLUTE, lensPosition_); + queueFrameAction.emit(frame, op); }