Patch Detail
Show a patch.
GET /api/patches/24535/?format=api
{ "id": 24535, "url": "https://patchwork.libcamera.org/api/patches/24535/?format=api", "web_url": "https://patchwork.libcamera.org/patch/24535/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/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": "<20250930150428.11101-3-hansg@kernel.org>", "date": "2025-09-30T15:04:24", "name": "[v4,2/6] ipa: software_isp: AGC: Do not lower gain below 1.0", "commit_ref": "950ca85e8aa5a894278893e20eb029e1dcecf8d7", "pull_url": null, "state": "accepted", "archived": false, "hash": "0a08a8e5b5aca34c84a947bee03f6c3ebb4efebe", "submitter": { "id": 239, "url": "https://patchwork.libcamera.org/api/people/239/?format=api", "name": "Hans de Goede", "email": "hansg@kernel.org" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/24535/mbox/", "series": [ { "id": 5470, "url": "https://patchwork.libcamera.org/api/series/5470/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5470", "date": "2025-09-30T15:04:22", "name": "ipa: software_isp: AGC: Fix AGC oscillation bug", "version": 4, "mbox": "https://patchwork.libcamera.org/series/5470/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/24535/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/24535/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 75F68C328C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 30 Sep 2025 15:04:43 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 28C2E6B5F8;\n\tTue, 30 Sep 2025 17:04:41 +0200 (CEST)", "from tor.source.kernel.org (tor.source.kernel.org\n\t[IPv6:2600:3c04:e001:324:0:1991:8:25])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 85FA36936E\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 30 Sep 2025 17:04:37 +0200 (CEST)", "from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58])\n\tby tor.source.kernel.org (Postfix) with ESMTP id B647562392;\n\tTue, 30 Sep 2025 15:04:36 +0000 (UTC)", "by smtp.kernel.org (Postfix) with ESMTPSA id 13532C4CEF0;\n\tTue, 30 Sep 2025 15:04:34 +0000 (UTC)" ], "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=kernel.org header.i=@kernel.org\n\theader.b=\"uQ1NRTJB\"; dkim-atps=neutral", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;\n\ts=k20201202; t=1759244676;\n\tbh=byFQsN32b7e8y5Kk37vOrxjURkNYLKfUJWAyd2JThNc=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=uQ1NRTJBe3+vjJm8oix/i8Cmi1dcD1W0bIUpgqdisBnNPp8oqDHDebv/1mSkSKyDq\n\tvKhTd+3/LW4Y3NSy6F7hUOpMq3VnBhe0YZkG61McXT029STM6MtH6RYvDZC7dnZb5A\n\tnZHetLfn5/JBLIvkHP0cnNzB0qGey5zEYddf+ZDwP8O+fnO/Nx6T0XrmfR4hRSJ1+E\n\tu+YRitAVKa5rzZ129IE/pqtkoiEICUo32ocnApO1CRBEa2MPXutVKVR83XN2rpsr6v\n\tdNkLXKQ76ohwhD4h9cfYOicPD6W54ORRPjRY8lGmLM5JqDD38i8/P/tgR26HOepJn6\n\tVxhCT9P0dl/tw==", "From": "Hans de Goede <hansg@kernel.org>", "To": "libcamera-devel@lists.libcamera.org", "Cc": "Hans de Goede <hansg@kernel.org>, Milan Zamazal <mzamazal@redhat.com>,\n\tKieran Bingham <kieran.bingham@ideasonboard.com>,\n\tIsaac Scott <isaac.scott@ideasonboard.com>", "Subject": "[PATCH v4 2/6] ipa: software_isp: AGC: Do not lower gain below 1.0", "Date": "Tue, 30 Sep 2025 17:04:24 +0200", "Message-ID": "<20250930150428.11101-3-hansg@kernel.org>", "X-Mailer": "git-send-email 2.51.0", "In-Reply-To": "<20250930150428.11101-1-hansg@kernel.org>", "References": "<20250930150428.11101-1-hansg@kernel.org>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "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": "At the moment when the overall image brightness is considered too high\nthe AGC code will lower the gain all the way down to againMin before\nconsidering lowering the exposure.\n\nWhat should happen instead is lower the gain no lower than 1.0 and after\nthat lower the exposure instead of lowering the gain.\n\nOtherwise there might be a heavily overexposed image (e.g. all white)\nwhich then is made less white by a gain < 1.0 which is no good.\n\nWhen there is no sensor-helper, assume the driver reported default-gain\nvalue is close to a gain of 1.0 .\n\nWhile at it also remove the weird limitation to only lower the gain\nwhen exposure is set to the maximum. As long as the gain is higher\nthan the default gain, the gain should be lowered first.\n\nReviewed-by: Milan Zamazal <mzamazal@redhat.com>\nTested-by: Milan Zamazal <mzamazal@redhat.com>\nTested-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\nReviewed-by: Isaac Scott <isaac.scott@ideasonboard.com>\nSigned-off-by: Hans de Goede <hansg@kernel.org>\n---\nChanges in v2:\n- Use a gain of 1.0 as low-limit instead of always using the default-gain,\n falling back to the default if there is no sensor-helper for the sensor.\n---\n src/ipa/simple/algorithms/agc.cpp | 3 +--\n src/ipa/simple/ipa_context.h | 2 +-\n src/ipa/simple/soft_simple.cpp | 3 +++\n 3 files changed, 5 insertions(+), 3 deletions(-)", "diff": "diff --git a/src/ipa/simple/algorithms/agc.cpp b/src/ipa/simple/algorithms/agc.cpp\nindex c46bb0ebe..1fc8d7f42 100644\n--- a/src/ipa/simple/algorithms/agc.cpp\n+++ b/src/ipa/simple/algorithms/agc.cpp\n@@ -71,8 +71,7 @@ void Agc::updateExposure(IPAContext &context, IPAFrameContext &frameContext, dou\n \t}\n \n \tif (exposureMSV > kExposureOptimal + kExposureSatisfactory) {\n-\t\tif (exposure == context.configuration.agc.exposureMax &&\n-\t\t again > context.configuration.agc.againMin) {\n+\t\tif (again > context.configuration.agc.again10) {\n \t\t\tnext = again * kExpNumeratorDown / kExpDenominator;\n \t\t\tif (again - next < context.configuration.agc.againMinStep)\n \t\t\t\tagain -= context.configuration.agc.againMinStep;\ndiff --git a/src/ipa/simple/ipa_context.h b/src/ipa/simple/ipa_context.h\nindex a471b80ae..468fccabb 100644\n--- a/src/ipa/simple/ipa_context.h\n+++ b/src/ipa/simple/ipa_context.h\n@@ -28,7 +28,7 @@ struct IPASessionConfiguration {\n \tfloat gamma;\n \tstruct {\n \t\tint32_t exposureMin, exposureMax;\n-\t\tdouble againMin, againMax, againMinStep;\n+\t\tdouble againMin, againMax, again10, againMinStep;\n \t\tutils::Duration lineDuration;\n \t} agc;\n \tstruct {\ndiff --git a/src/ipa/simple/soft_simple.cpp b/src/ipa/simple/soft_simple.cpp\nindex e70439ee5..b147aca2e 100644\n--- a/src/ipa/simple/soft_simple.cpp\n+++ b/src/ipa/simple/soft_simple.cpp\n@@ -216,10 +216,12 @@ int IPASoftSimple::configure(const IPAConfigInfo &configInfo)\n \n \tint32_t againMin = gainInfo.min().get<int32_t>();\n \tint32_t againMax = gainInfo.max().get<int32_t>();\n+\tint32_t againDef = gainInfo.def().get<int32_t>();\n \n \tif (camHelper_) {\n \t\tcontext_.configuration.agc.againMin = camHelper_->gain(againMin);\n \t\tcontext_.configuration.agc.againMax = camHelper_->gain(againMax);\n+\t\tcontext_.configuration.agc.again10 = camHelper_->gain(1.0);\n \t\tcontext_.configuration.agc.againMinStep =\n \t\t\t(context_.configuration.agc.againMax -\n \t\t\t context_.configuration.agc.againMin) /\n@@ -246,6 +248,7 @@ int IPASoftSimple::configure(const IPAConfigInfo &configInfo)\n \t\t * other) we limit the range of the gain values used.\n \t\t */\n \t\tcontext_.configuration.agc.againMax = againMax;\n+\t\tcontext_.configuration.agc.again10 = againDef;\n \t\tif (againMin) {\n \t\t\tcontext_.configuration.agc.againMin = againMin;\n \t\t} else {\n", "prefixes": [ "v4", "2/6" ] }