{"id":22974,"url":"https://patchwork.libcamera.org/api/patches/22974/?format=json","web_url":"https://patchwork.libcamera.org/patch/22974/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/projects/1/?format=json","name":"libcamera","link_name":"libcamera","list_id":"libcamera_core","list_email":"libcamera-devel@lists.libcamera.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20250319095533.24550-1-mzamazal@redhat.com>","date":"2025-03-19T09:55:33","name":"[v2] libcamera: software_isp: Reset stored exposure in black level","commit_ref":"ceea066fa23c780eed65efbb243b216c7f511db8","pull_url":null,"state":"accepted","archived":false,"hash":"df2f940e5c8f3685584ffae066b6b1722d35582b","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/people/177/?format=json","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/22974/mbox/","series":[{"id":5069,"url":"https://patchwork.libcamera.org/api/series/5069/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=5069","date":"2025-03-19T09:55:33","name":"[v2] libcamera: software_isp: Reset stored exposure in black level","version":2,"mbox":"https://patchwork.libcamera.org/series/5069/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/22974/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/22974/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 BA87CC3301\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 19 Mar 2025 09:55:46 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 8526D68945;\n\tWed, 19 Mar 2025 10:55:45 +0100 (CET)","from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.133.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id A183968942\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 19 Mar 2025 10:55:42 +0100 (CET)","from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com\n\t(ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97])\n\tby relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n\tcipher=TLS_AES_256_GCM_SHA384) id us-mta-644-Xi2mKXd7PJeqzA24lFwenA-1;\n\tWed, 19 Mar 2025 05:55:39 -0400","from mx-prod-int-02.mail-002.prod.us-west-2.aws.redhat.com\n\t(mx-prod-int-02.mail-002.prod.us-west-2.aws.redhat.com\n\t[10.30.177.15])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\tkey-exchange X25519 server-signature RSA-PSS (2048 bits)\n\tserver-digest SHA256) (No client certificate requested)\n\tby mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTPS id 96919180035E; Wed, 19 Mar 2025 09:55:38 +0000 (UTC)","from mzamazal-thinkpadp1gen7.tpbc.com (unknown [10.45.226.102])\n\tby mx-prod-int-02.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTP id 4454C1956094; Wed, 19 Mar 2025 09:55:36 +0000 (UTC)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"iBYr5VXU\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1742378141;\n\th=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n\tto:to:cc:cc:mime-version:mime-version:content-type:content-type:\n\tcontent-transfer-encoding:content-transfer-encoding;\n\tbh=jLXJ9oh6OmoEOoNxTJbS7txMUPKgACaPLLp7jjPpkkk=;\n\tb=iBYr5VXUJvUNIZnwPqZewQtiknp118nwn0rgBluwMpe5Hu+TewHQiCjkoVtRe4DNMU0Scq\n\tQ+1Tx8nTDKOyfQceb4hTvmNNCEn5nr27ECFe4Hz8BCTx1UfPwzoE0soPecNIu2gvA1960C\n\t1dLTQb+F+mEFHfStPVXUUzAkEyOZeok=","X-MC-Unique":"Xi2mKXd7PJeqzA24lFwenA-1","X-Mimecast-MFC-AGG-ID":"Xi2mKXd7PJeqzA24lFwenA_1742378138","From":"Milan Zamazal <mzamazal@redhat.com>","To":"libcamera-devel@lists.libcamera.org","Cc":"Milan Zamazal <mzamazal@redhat.com>,\n\tRobert Mader <robert.mader@collabora.com>,\n\tKieran Bingham <kieran.bingham@ideasonboard.com>","Subject":"[PATCH v2] libcamera: software_isp: Reset stored exposure in black\n\tlevel","Date":"Wed, 19 Mar 2025 10:55:33 +0100","Message-ID":"<20250319095533.24550-1-mzamazal@redhat.com>","MIME-Version":"1.0","X-Scanned-By":"MIMEDefang 3.0 on 10.30.177.15","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"DAW3Byhe4YRjUmwP-d6n0UFo4na7aWdzooX_pcjoDBs_1742378138","X-Mimecast-Originator":"redhat.com","Content-Transfer-Encoding":"8bit","content-type":"text/plain; charset=\"US-ASCII\"; x-default=true","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":"Automatic black level setting in software ISP updates the determined\nblack level value when exposure or gain change.  It stores the last\nexposure and gain values to detect the change.\n\nBlackLevel::configure() resets the stored black level value but not the\nexposure and gain values.  This can prevent updating the black value and\ncause bad image output, e.g. after suspending and resuming a camera, if\nexposure and gain remain unchanged.\n\nLet's store exposure and gain in IPAActiveState.  Although the values\nare not supposed to be used outside BlackLevel class, storing them in\nthe context has the advantage of their automatic reset together with the\nother context contents and having them in `blc' struct indicates their\nrelationship to the black value computation.\n\nBug: https://bugs.libcamera.org/show_bug.cgi?id=259\nSigned-off-by: Milan Zamazal <mzamazal@redhat.com>\n---\n src/ipa/simple/algorithms/blc.cpp | 10 +++++-----\n src/ipa/simple/algorithms/blc.h   |  2 --\n src/ipa/simple/ipa_context.h      |  2 ++\n 3 files changed, 7 insertions(+), 7 deletions(-)","diff":"diff --git a/src/ipa/simple/algorithms/blc.cpp b/src/ipa/simple/algorithms/blc.cpp\nindex 1d7d370b..089e492a 100644\n--- a/src/ipa/simple/algorithms/blc.cpp\n+++ b/src/ipa/simple/algorithms/blc.cpp\n@@ -1,6 +1,6 @@\n /* SPDX-License-Identifier: LGPL-2.1-or-later */\n /*\n- * Copyright (C) 2024, Red Hat Inc.\n+ * Copyright (C) 2024-2025, Red Hat Inc.\n  *\n  * Black level handling\n  */\n@@ -54,8 +54,8 @@ void BlackLevel::process(IPAContext &context,\n \tif (context.configuration.black.level.has_value())\n \t\treturn;\n \n-\tif (frameContext.sensor.exposure == exposure_ &&\n-\t    frameContext.sensor.gain == gain_) {\n+\tif (frameContext.sensor.exposure == context.activeState.blc.lastExposure &&\n+\t    frameContext.sensor.gain == context.activeState.blc.lastGain) {\n \t\treturn;\n \t}\n \n@@ -79,8 +79,8 @@ void BlackLevel::process(IPAContext &context,\n \t\tseen += histogram[i];\n \t\tif (seen >= pixelThreshold) {\n \t\t\tcontext.activeState.blc.level = i * histogramRatio;\n-\t\t\texposure_ = frameContext.sensor.exposure;\n-\t\t\tgain_ = frameContext.sensor.gain;\n+\t\t\tcontext.activeState.blc.lastExposure = frameContext.sensor.exposure;\n+\t\t\tcontext.activeState.blc.lastGain = frameContext.sensor.gain;\n \t\t\tLOG(IPASoftBL, Debug)\n \t\t\t\t<< \"Auto-set black level: \"\n \t\t\t\t<< i << \"/\" << SwIspStats::kYHistogramSize\ndiff --git a/src/ipa/simple/algorithms/blc.h b/src/ipa/simple/algorithms/blc.h\nindex 52d59cab..db9e6d63 100644\n--- a/src/ipa/simple/algorithms/blc.h\n+++ b/src/ipa/simple/algorithms/blc.h\n@@ -30,8 +30,6 @@ public:\n \t\t     ControlList &metadata) override;\n \n private:\n-\tint32_t exposure_;\n-\tdouble gain_;\n \tstd::optional<uint8_t> definedLevel_;\n };\n \ndiff --git a/src/ipa/simple/ipa_context.h b/src/ipa/simple/ipa_context.h\nindex 4af51306..b1198af5 100644\n--- a/src/ipa/simple/ipa_context.h\n+++ b/src/ipa/simple/ipa_context.h\n@@ -33,6 +33,8 @@ struct IPASessionConfiguration {\n struct IPAActiveState {\n \tstruct {\n \t\tuint8_t level;\n+\t\tint32_t lastExposure;\n+\t\tdouble lastGain;\n \t} blc;\n \n \tstruct {\n","prefixes":["v2"]}