From patchwork Tue Jun 8 07:42:23 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Umang Jain X-Patchwork-Id: 12510 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 51EDCC320B for ; Tue, 8 Jun 2021 07:42:40 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 159546892E; Tue, 8 Jun 2021 09:42:40 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="cQecKwef"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 8AEEF6892F for ; Tue, 8 Jun 2021 09:42:37 +0200 (CEST) Received: from perceval.ideasonboard.com (unknown [103.251.226.98]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 23FB23E6; Tue, 8 Jun 2021 09:42:35 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1623138157; bh=29JvRM1DAdnudqlIIoDguhKJwBRIl7s29++81r4K/ho=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=cQecKwefvlOMmgmPfVFb5yjCncOzQYAOuMvYst0vU88DrXofx4b2kZ8MjKO90S/GA K6mBSoxD31Z5TdxKbTDDhhMhtfRfmVVfwF3zE/lhPZlZx5OxpZbPP84gienoLNQrWQ XWP/SN7Ib/rs86DKel8OWqpZllmakpW5hQIh0Fac= From: Umang Jain To: libcamera-devel@lists.libcamera.org Date: Tue, 8 Jun 2021 13:12:23 +0530 Message-Id: <20210608074225.59862-2-umang.jain@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210608074225.59862-1-umang.jain@ideasonboard.com> References: <20210608074225.59862-1-umang.jain@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 1/3] ipa: ipu3: Calculate line duration from IPACameraSensorInfo 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" Squash \todo by calculating line duration from IPACameraSensorInfo, now passed in, to IPU3Agc::initialise(). Since line duration is now calculated from real values, store it as a private member in IPU3Agc class. As a further step, replace the associated global constant, kMaxExposureTime, with a private IPU3Agc class member as well, and assign its value correspondingly in IPU3Agc::initialise(), similar to previous precedence. Signed-off-by: Umang Jain Tested-by: Paul Elder Reviewed-by: Kieran Bingham Reviewed-by: Paul Elder --- src/ipa/ipu3/ipu3.cpp | 2 +- src/ipa/ipu3/ipu3_agc.cpp | 24 +++++++++++++----------- src/ipa/ipu3/ipu3_agc.h | 7 ++++++- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp index 700a5660..2496b0a0 100644 --- a/src/ipa/ipu3/ipu3.cpp +++ b/src/ipa/ipu3/ipu3.cpp @@ -174,7 +174,7 @@ void IPAIPU3::configure(const IPAConfigInfo &configInfo) awbAlgo_->initialise(params_, configInfo.bdsOutputSize, bdsGrid_); agcAlgo_ = std::make_unique(); - agcAlgo_->initialise(bdsGrid_); + agcAlgo_->initialise(bdsGrid_, configInfo.sensorInfo); } void IPAIPU3::mapBuffers(const std::vector &buffers) diff --git a/src/ipa/ipu3/ipu3_agc.cpp b/src/ipa/ipu3/ipu3_agc.cpp index 8bae423f..8ca95013 100644 --- a/src/ipa/ipu3/ipu3_agc.cpp +++ b/src/ipa/ipu3/ipu3_agc.cpp @@ -11,6 +11,8 @@ #include #include +#include + #include "libcamera/internal/log.h" #include "libipa/histogram.h" @@ -39,11 +41,6 @@ static constexpr uint32_t kMaxGain = kMaxISO / 100; static constexpr uint32_t kMinExposure = 1; static constexpr uint32_t kMaxExposure = 1976; -/* \todo those should be got from IPACameraSensorInfo ! */ -/* line duration in microseconds */ -static constexpr double kLineDuration = 16.8; -static constexpr double kMaxExposureTime = kMaxExposure * kLineDuration; - /* Histogram constants */ static constexpr uint32_t knumHistogramBins = 256; static constexpr double kEvGainTarget = 0.5; @@ -54,14 +51,19 @@ static constexpr uint8_t kCellSize = 8; IPU3Agc::IPU3Agc() : frameCount_(0), lastFrame_(0), converged_(false), updateControls_(false), iqMean_(0.0), gamma_(1.0), + lineDuration_(0.0), maxExposureTime_(0.0), prevExposure_(0.0), prevExposureNoDg_(0.0), currentExposure_(0.0), currentExposureNoDg_(0.0) { } -void IPU3Agc::initialise(struct ipu3_uapi_grid_config &bdsGrid) +void IPU3Agc::initialise(struct ipu3_uapi_grid_config &bdsGrid, const IPACameraSensorInfo &sensorInfo) { aeGrid_ = bdsGrid; + + /* line duration in microseconds */ + lineDuration_ = sensorInfo.lineLength * 1000000ULL / static_cast(sensorInfo.pixelRate); + maxExposureTime_ = kMaxExposure * lineDuration_; } void IPU3Agc::processBrightness(const ipu3_uapi_stats_3a *stats) @@ -160,13 +162,13 @@ void IPU3Agc::lockExposureGain(uint32_t &exposure, uint32_t &gain) double newGain = kEvGainTarget * knumHistogramBins / iqMean_; /* extracted from Rpi::Agc::computeTargetExposure */ - double currentShutter = exposure * kLineDuration; + double currentShutter = exposure * lineDuration_; currentExposureNoDg_ = currentShutter * gain; LOG(IPU3Agc, Debug) << "Actual total exposure " << currentExposureNoDg_ << " Shutter speed " << currentShutter << " Gain " << gain; currentExposure_ = currentExposureNoDg_ * newGain; - double maxTotalExposure = kMaxExposureTime * kMaxGain; + double maxTotalExposure = maxExposureTime_ * kMaxGain; currentExposure_ = std::min(currentExposure_, maxTotalExposure); LOG(IPU3Agc, Debug) << "Target total exposure " << currentExposure_; @@ -174,18 +176,18 @@ void IPU3Agc::lockExposureGain(uint32_t &exposure, uint32_t &gain) filterExposure(); double newExposure = 0.0; - if (currentShutter < kMaxExposureTime) { + if (currentShutter < maxExposureTime_) { exposure = std::clamp(static_cast(exposure * currentExposure_ / currentExposureNoDg_), kMinExposure, kMaxExposure); newExposure = currentExposure_ / exposure; gain = std::clamp(static_cast(gain * currentExposure_ / newExposure), kMinGain, kMaxGain); updateControls_ = true; - } else if (currentShutter >= kMaxExposureTime) { + } else if (currentShutter >= maxExposureTime_) { gain = std::clamp(static_cast(gain * currentExposure_ / currentExposureNoDg_), kMinGain, kMaxGain); newExposure = currentExposure_ / gain; exposure = std::clamp(static_cast(exposure * currentExposure_ / newExposure), kMinExposure, kMaxExposure); updateControls_ = true; } - LOG(IPU3Agc, Debug) << "Adjust exposure " << exposure * kLineDuration << " and gain " << gain; + LOG(IPU3Agc, Debug) << "Adjust exposure " << exposure * lineDuration_ << " and gain " << gain; } lastFrame_ = frameCount_; } diff --git a/src/ipa/ipu3/ipu3_agc.h b/src/ipa/ipu3/ipu3_agc.h index bfdf45d1..99a582a9 100644 --- a/src/ipa/ipu3/ipu3_agc.h +++ b/src/ipa/ipu3/ipu3_agc.h @@ -18,6 +18,8 @@ namespace libcamera { +class IPACameraSensorInfo; + namespace ipa::ipu3 { class IPU3Agc : public Algorithm @@ -26,7 +28,7 @@ public: IPU3Agc(); ~IPU3Agc() = default; - void initialise(struct ipu3_uapi_grid_config &bdsGrid); + void initialise(struct ipu3_uapi_grid_config &bdsGrid, const IPACameraSensorInfo &sensorInfo); void process(const ipu3_uapi_stats_3a *stats, uint32_t &exposure, uint32_t &gain); bool converged() { return converged_; } bool updateControls() { return updateControls_; } @@ -49,6 +51,9 @@ private: double iqMean_; double gamma_; + double lineDuration_; + double maxExposureTime_; + double prevExposure_; double prevExposureNoDg_; double currentExposure_; From patchwork Tue Jun 8 07:42:24 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Umang Jain X-Patchwork-Id: 12511 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 ADCA7C3206 for ; Tue, 8 Jun 2021 07:42:41 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 6BCF46892D; Tue, 8 Jun 2021 09:42:41 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="LlHp+4BD"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 3B9F768933 for ; Tue, 8 Jun 2021 09:42:40 +0200 (CEST) Received: from perceval.ideasonboard.com (unknown [103.251.226.98]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id A2CECE71; Tue, 8 Jun 2021 09:42:38 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1623138160; bh=2j2uy5e7NniPJvJTncUwfhFUESzu266LQlyFR+UkQFQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=LlHp+4BD/bmz4z8KBz15RjkTS3FJ+pYybK0fZTBRSnirZVINdlU/Fx10gf4Mhxfy0 zPQXiQLIjZ5/U/G7T65hqVx+zA46Vmatjvt0BnlZBwVCL+0ttZeaezqGWRhPBsonm3 sFxGuRJfJaWtyeKhgRitOilzTVqd6owxAG9zbxxA= From: Umang Jain To: libcamera-devel@lists.libcamera.org Date: Tue, 8 Jun 2021 13:12:24 +0530 Message-Id: <20210608074225.59862-3-umang.jain@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210608074225.59862-1-umang.jain@ideasonboard.com> References: <20210608074225.59862-1-umang.jain@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 2/3] ipa: ipu3: Copy IPACameraSensorInfo for future usage 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" IPACameraSensorInfo members will be needed at various places in the IPAIPU3 class, in subsequent commits. Hence, it seems trivial to copy this structure for wider availability throughout the class. This commit does not introduce any functional changes. Signed-off-by: Umang Jain Tested-by: Paul Elder Reviewed-by: Laurent Pinchart Reviewed-by: Paul Elder --- src/ipa/ipu3/ipu3.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp index 2496b0a0..97ddb863 100644 --- a/src/ipa/ipu3/ipu3.cpp +++ b/src/ipa/ipu3/ipu3.cpp @@ -63,6 +63,8 @@ private: ControlInfoMap ctrls_; + IPACameraSensorInfo sensorInfo_; + /* Camera sensor controls. */ uint32_t exposure_; uint32_t minExposure_; @@ -144,6 +146,8 @@ void IPAIPU3::configure(const IPAConfigInfo &configInfo) if (configInfo.entityControls.empty()) return; + sensorInfo_ = configInfo.sensorInfo; + ctrls_ = configInfo.entityControls.at(0); const auto itExp = ctrls_.find(V4L2_CID_EXPOSURE); @@ -174,7 +178,7 @@ void IPAIPU3::configure(const IPAConfigInfo &configInfo) awbAlgo_->initialise(params_, configInfo.bdsOutputSize, bdsGrid_); agcAlgo_ = std::make_unique(); - agcAlgo_->initialise(bdsGrid_, configInfo.sensorInfo); + agcAlgo_->initialise(bdsGrid_, sensorInfo_); } void IPAIPU3::mapBuffers(const std::vector &buffers) From patchwork Tue Jun 8 07:42:25 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Umang Jain X-Patchwork-Id: 12512 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 1162BC3206 for ; Tue, 8 Jun 2021 07:42:45 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id C44C46892E; Tue, 8 Jun 2021 09:42:44 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="T++RZiwz"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 1C37668928 for ; Tue, 8 Jun 2021 09:42:43 +0200 (CEST) Received: from perceval.ideasonboard.com (unknown [103.251.226.98]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 51601E71; Tue, 8 Jun 2021 09:42:41 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1623138162; bh=/DsO1KS8zSViahVeRlWJBzPZPZsC+CIWJU/8rg56Gyk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=T++RZiwzqEnoxi9NO0oH28zpYnt1097Zq47GuFsYAV+qtu8JwYH/C8ddD/RY2uruX TaO0LDBOV/al0qf3NSJEV0qUo4BUPB65JMm5ju82HV70uH3Olsdhts0rb6o/3SvCee QRkbqiX0l33ZdWMnSX35s37mVkAdRxVIJGIhEP2Y= From: Umang Jain To: libcamera-devel@lists.libcamera.org Date: Tue, 8 Jun 2021 13:12:25 +0530 Message-Id: <20210608074225.59862-4-umang.jain@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210608074225.59862-1-umang.jain@ideasonboard.com> References: <20210608074225.59862-1-umang.jain@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 3/3] ipa: ipu3: Calculate frame duration from minimum VBLANK value 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" Frame duration is hard-coded for CTS as per [1]. Ideally, to accurately calculate the frame duration, it needs the VBLANK value from every frame's exposure. However, this particular bit is yet to be implemented in IPAIPU3. Meanwhile, we can atleast head in the right direction by not hard coding the value, instead using the default VBLANK value as reported by the sensor. Update the existing \todo, to use the derived VBLANK value as and when it's available from each frame exposure. [1] 6c5f3fe6ced7 ("ipa: ipu3: Set output frame duration metadata") Signed-off-by: Umang Jain Tested-by: Paul Elder Tested-by: Jean-Michel Hautbois Reviewed-by: Laurent Pinchart Reviewed-by: Jean-Michel Hautbois Reviewed-by: Paul Elder --- src/ipa/ipu3/ipu3.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp index 97ddb863..415ea9e5 100644 --- a/src/ipa/ipu3/ipu3.cpp +++ b/src/ipa/ipu3/ipu3.cpp @@ -66,6 +66,7 @@ private: IPACameraSensorInfo sensorInfo_; /* Camera sensor controls. */ + uint32_t defVBlank_; uint32_t exposure_; uint32_t minExposure_; uint32_t maxExposure_; @@ -162,6 +163,12 @@ void IPAIPU3::configure(const IPAConfigInfo &configInfo) return; } + const auto itVBlank = ctrls_.find(V4L2_CID_VBLANK); + if (itVBlank == ctrls_.end()) { + LOG(IPAIPU3, Error) << "Can't find VBLANK control"; + return; + } + minExposure_ = std::max(itExp->second.min().get(), 1); maxExposure_ = itExp->second.max().get(); exposure_ = minExposure_; @@ -170,6 +177,8 @@ void IPAIPU3::configure(const IPAConfigInfo &configInfo) maxGain_ = itGain->second.max().get(); gain_ = minGain_; + defVBlank_ = itVBlank->second.def().get(); + params_ = {}; calculateBdsGrid(configInfo.bdsOutputSize); @@ -273,9 +282,10 @@ void IPAIPU3::parseStatistics(unsigned int frame, if (agcAlgo_->updateControls()) setControls(frame); - /* \todo Populate this with real values */ - ctrls.set(controls::FrameDuration, - static_cast(33334)); + /* \todo Use VBlank value calculated from each frame exposure. */ + int64_t frameDuration = sensorInfo_.lineLength * (defVBlank_ + sensorInfo_.outputSize.height) / + (sensorInfo_.pixelRate / 1e6); + ctrls.set(controls::FrameDuration, frameDuration); IPU3Action op; op.op = ActionMetadataReady;