Patch Detail
Show a patch.
GET /api/1.1/patches/14219/?format=api
{ "id": 14219, "url": "https://patchwork.libcamera.org/api/1.1/patches/14219/?format=api", "web_url": "https://patchwork.libcamera.org/patch/14219/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/1.1/projects/1/?format=api", "name": "libcamera", "link_name": "libcamera", "list_id": "libcamera_core", "list_email": "libcamera-devel@lists.libcamera.org", "web_url": "", "scm_url": "", "webscm_url": "" }, "msgid": "<20211020154607.180161-12-jeanmichel.hautbois@ideasonboard.com>", "date": "2021-10-20T15:46:05", "name": "[libcamera-devel,v2,11/13] ipa: ipu3: agc: Remove condition on exposure correction", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "e7015671f25eb35c493a60223f3138d8976ebe24", "submitter": { "id": 75, "url": "https://patchwork.libcamera.org/api/1.1/people/75/?format=api", "name": "Jean-Michel Hautbois", "email": "jeanmichel.hautbois@ideasonboard.com" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/14219/mbox/", "series": [ { "id": 2645, "url": "https://patchwork.libcamera.org/api/1.1/series/2645/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=2645", "date": "2021-10-20T15:45:54", "name": "ipa: ipu3: Fix AGC bugs", "version": 2, "mbox": "https://patchwork.libcamera.org/series/2645/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/14219/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/14219/checks/", "tags": {}, "headers": { "Return-Path": "<libcamera-devel-bounces@lists.libcamera.org>", "X-Original-To": "parsemail@patchwork.libcamera.org", "Delivered-To": "parsemail@patchwork.libcamera.org", "Received": [ "from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id ACA39C324E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 20 Oct 2021 15:46:26 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 50CDB68F60;\n\tWed, 20 Oct 2021 17:46:26 +0200 (CEST)", "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 6011968F58\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 20 Oct 2021 17:46:15 +0200 (CEST)", "from tatooine.ideasonboard.com (unknown\n\t[IPv6:2a01:e0a:169:7140:ce4b:1c5f:7302:b899])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 13F5C3F6;\n\tWed, 20 Oct 2021 17:46:15 +0200 (CEST)" ], "Authentication-Results": "lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"eZyzpbgz\"; dkim-atps=neutral", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1634744775;\n\tbh=w7fjAlq+LLKYhHuPWeL/CdYSaCl9VC9fZy49ZbmKwXk=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=eZyzpbgz43xjgrKlzMrfHrDihMcqP1LGJFBXs3DuuQdljyp0LWgNUCsdf/4UjiEyi\n\t+9PCX77yQBdTgPWP1IEsjjjvyW2JFO2VNr8lOAr5A0aFTplwccFxDDjPuFYs+EZH1E\n\tL0H7V5Q+hhmO1eaRKZfQtVQDZXFcIAE0P6ThlYcY=", "From": "Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>", "To": "libcamera-devel@lists.libcamera.org", "Date": "Wed, 20 Oct 2021 17:46:05 +0200", "Message-Id": "<20211020154607.180161-12-jeanmichel.hautbois@ideasonboard.com>", "X-Mailer": "git-send-email 2.32.0", "In-Reply-To": "<20211020154607.180161-1-jeanmichel.hautbois@ideasonboard.com>", "References": "<20211020154607.180161-1-jeanmichel.hautbois@ideasonboard.com>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Subject": "[libcamera-devel] [PATCH v2 11/13] ipa: ipu3: agc: Remove condition\n\ton exposure correction", "X-BeenThere": "libcamera-devel@lists.libcamera.org", "X-Mailman-Version": "2.1.29", "Precedence": "list", "List-Id": "<libcamera-devel.lists.libcamera.org>", "List-Unsubscribe": "<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>", "List-Archive": "<https://lists.libcamera.org/pipermail/libcamera-devel/>", "List-Post": "<mailto:libcamera-devel@lists.libcamera.org>", "List-Help": "<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>", "List-Subscribe": "<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>", "Errors-To": "libcamera-devel-bounces@lists.libcamera.org", "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>" }, "content": "Until now, we can't know when the exposure and gains applied in the\nIPAIPU3::setControls() are really applied (it can be several frames). We\ndon't want to use the values calculated as if they are already applied,\nand this is done by testing the frame number.\n\nWhen the exposure is estimated, we verify if it changed enough for\nexposure and gain to be updated.\n\nThere is no need for that because we are now filtering the value with\nthe previous one correctly, so if the change is very small the exposure\nand analogue gain my evolve a bit but it should not be visible to the\nuser.\n\nSigned-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n---\n src/ipa/ipu3/algorithms/agc.cpp | 78 ++++++++++++++++-----------------\n 1 file changed, 37 insertions(+), 41 deletions(-)", "diff": "diff --git a/src/ipa/ipu3/algorithms/agc.cpp b/src/ipa/ipu3/algorithms/agc.cpp\nindex 19f3a420..0417dc99 100644\n--- a/src/ipa/ipu3/algorithms/agc.cpp\n+++ b/src/ipa/ipu3/algorithms/agc.cpp\n@@ -138,53 +138,49 @@ void Agc::lockExposureGain(uint32_t &exposure, double &analogueGain)\n \tif ((frameCount_ < kInitialFrameMinAECount) || (frameCount_ - lastFrame_ < kFrameSkipCount))\n \t\treturn;\n \n-\t/* Are we correctly exposed ? */\n-\tif (std::abs(iqMean_ - kEvGainTarget * knumHistogramBins) <= 1) {\n-\t\tLOG(IPU3Agc, Debug) << \"!!! Good exposure with iqMean = \" << iqMean_;\n-\t} else {\n-\t\tdouble evGain = kEvGainTarget * knumHistogramBins / iqMean_;\n+\tdouble evGain = kEvGainTarget * knumHistogramBins / iqMean_;\n \n-\t\t/* extracted from Rpi::Agc::computeTargetExposure */\n-\t\tutils::Duration currentShutter = exposure * lineDuration_;\n-\t\tcurrentExposureNoDg_ = currentShutter * analogueGain;\n-\t\tLOG(IPU3Agc, Debug) << \"Actual total exposure \" << currentExposureNoDg_\n-\t\t\t\t << \" Shutter speed \" << currentShutter\n-\t\t\t\t << \" Gain \" << analogueGain\n-\t\t\t\t << \" Needed ev gain \" << evGain;\n+\t/* extracted from Rpi::Agc::computeTargetExposure */\n+\tutils::Duration currentShutter = exposure * lineDuration_;\n+\tcurrentExposureNoDg_ = currentShutter * analogueGain;\n+\tLOG(IPU3Agc, Debug) << \"Actual total exposure \" << currentExposureNoDg_\n+\t\t\t << \" Shutter speed \" << currentShutter\n+\t\t\t << \" Gain \" << analogueGain\n+\t\t\t << \" Needed ev gain \" << evGain;\n \n-\t\tcurrentExposure_ = prevExposureValue_ * evGain;\n-\t\tutils::Duration minShutterSpeed = minExposureLines_ * lineDuration_;\n-\t\tutils::Duration maxShutterSpeed = maxExposureLines_ * lineDuration_;\n+\tcurrentExposure_ = prevExposureValue_ * evGain;\n+\tutils::Duration minShutterSpeed = minExposureLines_ * lineDuration_;\n+\tutils::Duration maxShutterSpeed = maxExposureLines_ * lineDuration_;\n \n-\t\tutils::Duration maxTotalExposure = maxShutterSpeed * kMaxGain;\n-\t\tcurrentExposure_ = std::min(currentExposure_, maxTotalExposure);\n-\t\tLOG(IPU3Agc, Debug) << \"Target total exposure \" << currentExposure_\n-\t\t\t\t << \", maximum is \" << maxTotalExposure;\n+\tutils::Duration maxTotalExposure = maxShutterSpeed * kMaxGain;\n+\tcurrentExposure_ = std::min(currentExposure_, maxTotalExposure);\n+\tLOG(IPU3Agc, Debug) << \"Target total exposure \" << currentExposure_\n+\t\t\t << \", maximum is \" << maxTotalExposure;\n \n-\t\t/* \\todo: estimate if we need to desaturate */\n-\t\tfilterExposure();\n+\t/* \\todo: estimate if we need to desaturate */\n+\tfilterExposure();\n \n-\t\tutils::Duration exposureValue = filteredExposure_;\n-\t\tutils::Duration shutterTime = minShutterSpeed;\n+\tutils::Duration exposureValue = filteredExposure_;\n+\tutils::Duration shutterTime = minShutterSpeed;\n+\n+\t/*\n+\t* Push the shutter time up to the maximum first, and only then\n+\t* increase the gain.\n+\t*/\n+\tshutterTime = std::clamp<utils::Duration>(exposureValue / kMinGain,\n+\t\t\t\t\t\t minShutterSpeed, maxShutterSpeed);\n+\tdouble stepGain = std::clamp(exposureValue / shutterTime,\n+\t\t\t\t kMinGain, kMaxGain);\n+\tLOG(IPU3Agc, Debug) << \"Divided up shutter and gain are \"\n+\t\t\t << shutterTime << \" and \"\n+\t\t\t << stepGain;\n+\n+\texposure = shutterTime / lineDuration_;\n+\tanalogueGain = stepGain;\n+\n+\t/* Update the exposure value for the next process call */\n+\tprevExposureValue_ = shutterTime * analogueGain;\n \n-\t\t/*\n-\t\t * Push the shutter time up to the maximum first, and only then\n-\t\t * increase the gain.\n-\t\t */\n-\t\tshutterTime = std::clamp<utils::Duration>(exposureValue / kMinGain,\n-\t\t\t\t\t\t\t minShutterSpeed, maxShutterSpeed);\n-\t\tdouble stepGain = std::clamp(exposureValue / shutterTime,\n-\t\t\t\t\t kMinGain, kMaxGain);\n-\t\tLOG(IPU3Agc, Debug) << \"Divided up shutter and gain are \"\n-\t\t\t\t << shutterTime << \" and \"\n-\t\t\t\t << stepGain;\n-\n-\t\texposure = shutterTime / lineDuration_;\n-\t\tanalogueGain = stepGain;\n-\n-\t\t/* Update the exposure value for the next process call */\n-\t\tprevExposureValue_ = shutterTime * analogueGain;\n-\t}\n \tlastFrame_ = frameCount_;\n }\n \n", "prefixes": [ "libcamera-devel", "v2", "11/13" ] }