{"id":26261,"url":"https://patchwork.libcamera.org/api/covers/26261/?format=json","web_url":"https://patchwork.libcamera.org/cover/26261/","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":"<20260305-agc-proportional-v3-0-25abc1bfacca@jetm.me>","date":"2026-03-05T20:10:36","name":"[v3,0/3] Simple pipeline: proportional AGC, AWB stats fix, OV2740 black level","submitter":{"id":261,"url":"https://patchwork.libcamera.org/api/people/261/?format=json","name":"Javier Tia","email":"floss@jetm.me"},"mbox":"https://patchwork.libcamera.org/cover/26261/mbox/","series":[{"id":5822,"url":"https://patchwork.libcamera.org/api/series/5822/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=5822","date":"2026-03-05T20:10:36","name":"Simple pipeline: proportional AGC, AWB stats fix, OV2740 black level","version":3,"mbox":"https://patchwork.libcamera.org/series/5822/mbox/"}],"comments":"https://patchwork.libcamera.org/api/covers/26261/comments/","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 2916ABE086\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu,  5 Mar 2026 20:16:24 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5345E625F7;\n\tThu,  5 Mar 2026 21:16:23 +0100 (CET)","from fhigh-b7-smtp.messagingengine.com\n\t(fhigh-b7-smtp.messagingengine.com [202.12.124.158])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id D6189622AE\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  5 Mar 2026 21:16:21 +0100 (CET)","from phl-compute-02.internal (phl-compute-02.internal\n\t[10.202.2.42])\n\tby mailfhigh.stl.internal (Postfix) with ESMTP id 863C77A01B3;\n\tThu,  5 Mar 2026 15:16:20 -0500 (EST)","from phl-imap-07 ([10.202.2.97])\n\tby phl-compute-02.internal (MEProxy); Thu, 05 Mar 2026 15:16:20 -0500","by mailuser.phl.internal (Postfix, from userid 501)\n\tid CE15B1EA006B; Thu,  5 Mar 2026 15:16:19 -0500 (EST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=jetm.me header.i=@jetm.me header.b=\"bHxb4eOm\";\n\tdkim=pass (2048-bit key;\n\tunprotected) header.d=messagingengine.com\n\theader.i=@messagingengine.com header.b=\"iFeyiCfD\"; \n\tdkim-atps=neutral","DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/relaxed; d=jetm.me; h=cc:cc\n\t:content-transfer-encoding:content-type:content-type:date:date\n\t:from:from:in-reply-to:message-id:mime-version:reply-to:subject\n\t:subject:to:to; s=fm3; t=1772741780; x=1772828180; bh=SUvy2mhbM5\n\tT8c1aUrCR8Pk3OtQoVFgy9zWn5seU+zKs=; b=bHxb4eOmC/BgwfeH5Im4lCroNj\n\tPW/fPSNf6fTCmsXFHReno56Vakc9mYhAiiuqaA2pqciVXGSv8tpFv/pXipO3LkdX\n\t3ALtYvmtcQP7GedrFZcoDPv+r75hDjB885nODNh0agY147oc8fxX9ayT6+7dVn6z\n\tNIsl+LRmL/t9Y/JaRta3vBSIhcFy4bF+tcpmzZOgZS0GxgNmWgdvealjhdJ8JTMy\n\tsR8xYtBh29zdu8paL5THHI/wRq/SdWXY+1lcZkBfuo1TGHcAGFIybl764uOn9Exs\n\tURYth3N6/bQVtHvzuqatzKzOYAAVf0lGmE3tMyeCdbUhw66JlxT5nPxdSVHQ==","v=1; a=rsa-sha256; c=relaxed/relaxed; d=\n\tmessagingengine.com; h=cc:cc:content-transfer-encoding\n\t:content-type:content-type:date:date:feedback-id:feedback-id\n\t:from:from:in-reply-to:message-id:mime-version:reply-to:subject\n\t:subject:to:to:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=\n\tfm1; t=1772741780; x=1772828180; bh=SUvy2mhbM5T8c1aUrCR8Pk3OtQoV\n\tFgy9zWn5seU+zKs=; b=iFeyiCfD8YYoAiiNcLesbrV6jETDyn1nWcm5RMJaL52p\n\ty5hZDfgWMfH2wE8/w+Dwq8aotG2X/01Oyhhibpv4At1wpALod29585herd07K6hl\n\tvOwY8o0HnD/dRfPEvj4RBmMHEUOD1ZsKNemkAviXvuUTaZGfbqf6xaqaU6+u11Ek\n\tWh3mJmfdoq4O/6au4/Tv6NgbTHmwQBzloKyhtF7TYvoxmbenQ3p++sEbOXY8b2yA\n\tLl+9J5aeSACxQR8h3iHBjDqPvI7tEYZquxtfzfeK8VawBU7VVk50qYM3XkIAFT3U\n\tslt3wydTuZXM/klAWTSQfEVdT8N6Wz/zG0FnOFxGXQ=="],"X-ME-Sender":"<xms:k-SpadQL6tZMEYZrl9E8q0lzHz087LPW6Uf_CIGJeSAMW4BS0F1Xtg>\n\t<xme:k-SpaRlVRmNLwt6ppsDajbAxd_7ELOERws3KhMrqsN9FfKYIny1f2IjX_qZnbY4lT\n\tAy7y7uIXprUJnvYmsT3UxsCZOhKNo7Fy6okuIQ0smXhGYZeO2GlqShF>","X-ME-Proxy-Cause":"gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgddvieejfedvucetufdoteggodetrf\n\tdotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu\n\trghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujf\n\tgurhepoffhufffkfggtgfgvfevofesthejredtredtjeenucfhrhhomheplfgrvhhivghr\n\tucfvihgruceofhhlohhsshesjhgvthhmrdhmvgeqnecuggftrfgrthhtvghrnhepjeegve\n\tfffeekhfegieeggfetveefgefgudeggfettddvtdffieevffdtgeeuueeunecuvehluhhs\n\tthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomhepfhhlohhsshesjhgvth\n\thmrdhmvgdpnhgspghrtghpthhtohepgedpmhhouggvpehsmhhtphhouhhtpdhrtghpthht\n\toheprhhosggvrhhtrdhmrgguvghrsegtohhllhgrsghorhgrrdgtohhmpdhrtghpthhtoh\n\tepfhhlohhsshesjhgvthhmrdhmvgdprhgtphhtthhopehlihgstggrmhgvrhgrqdguvghv\n\tvghlsehlihhsthhsrdhlihgstggrmhgvrhgrrdhorhhgpdhrtghpthhtohepmhiirghmrg\n\tiirghlsehrvgguhhgrthdrtghomh","X-ME-Proxy":"<xmx:k-SpaT5mBJpEYgFCbaQ1A8MKyZn3fJAnjTFEeR9LU1wnEEWxdYsoEA>\n\t<xmx:k-SpaWtKA2brbQbo0uq_V-o7GP-IKbs53p6QSABFj3_4RMMOaUuwJw>\n\t<xmx:k-SpaU4HKHadoSHhwS__4NPVHZf5IMRF4Y1h6Stz1LyFKiqoO0Ef5Q>\n\t<xmx:k-SpaRV-GfRVOCDiV6Bd214mstADo7AY508Pb2S9yleC2LlvNomvlg>\n\t<xmx:lOSpaYJ7v-I4xQQBR3jBb8Ox5_5-bYCHZXN47ihSV-Grr3Uf8WPIErGE>","Feedback-ID":"i9dde48b3:Fastmail","X-Mailer":["MessagingEngine.com Webmail Interface","b4 0.14.3"],"From":"Javier Tia <floss@jetm.me>","Subject":"[PATCH v3 0/3] Simple pipeline: proportional AGC, AWB stats fix,\n\tOV2740 black level","Date":"Thu, 05 Mar 2026 14:10:36 -0600","Message-Id":"<20260305-agc-proportional-v3-0-25abc1bfacca@jetm.me>","MIME-Version":"1.0","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"7bit","X-B4-Tracking":"v=1; b=H4sIAAAAAAAC/x2MQQqAIBAAvxJ7Tlgsg/pKdNBaayFU1ogg/HvSc\n\tWBmXsgkTBmm5gWhmzPHUKFrG1gPG3ZSvFUGjXrADo2y+6qSxBTlqqo9lbManR+N79FBzZKQ5+d\n\tfzkspH+1adWxiAAAA","X-Change-ID":"20260305-agc-proportional-ba20bf95f40b","To":"libcamera-devel@lists.libcamera.org","Cc":"Javier Tia <floss@jetm.me>, Milan Zamazal <mzamazal@redhat.com>, \n\tRobert Mader <robert.mader@collabora.com>","X-Developer-Signature":"v=1; a=openpgp-sha256; l=3012; i=floss@jetm.me;\n\th=from:subject:message-id;\n\tbh=wwVAZ/arlASqfg3ZpmeNKQIMDNyP02S89sLRsZE/jdM=; \n\tb=owEB7QES/pANAwAKAbXuwwuoZ3cfAcsmYgBpqeM8jAIIs7G4DhovcP4ASwUSSecbvSwOO46+N\n\twr3Ra6iFBCJAbMEAAEKAB0WIQSbE7ILzw7eI0VKk8m17sMLqGd3HwUCaanjPAAKCRC17sMLqGd3\n\tH02sDACehEIdD4G4O/pR18B6LPSwDhTr8zoOmm111jmiFHFM3OQ0wSMMRrT9XdWCXfwZjbJxihl\n\tCNzlIsJ636LBZstGPCpG1YEcBo/xY944SSbuQoRz/DmL5fHuZnAytEgMwuhSRc3QGphjV2/9zS1\n\t6aWVNH59Xx/qpjms4rpI4zvjS/VYXK2mRgzxeeb/pHM2affkU7EMeZn2FUqHDZGLFgyrVtd3h2u\n\tWzOVhf+wF7VCJyQ7iUVzKDzB0+aYNHuQeUSbRKDymtZkIcUhPrI/mdOrGjl6FAYBvmZntWKuWLY\n\t1ODr9qtYqkmzTkM/BRyj8yvlkmaIhQ5C+pByVGvbmqfDELvRVTXXEZVlQ1AtPu2qSSzdo+co8k/\n\t4qLwicNUk5IMZ2sULUie7nVxtZ4A7ngVG6q3mfud9Is+w2msdfR4mVdWIPzRLOVvu1kki2TUF78\n\tifjc5C7X61lR+nNzXhqX1F1ebjC4raJhfACkyIcamljEY/eLM3sfP2dMUr/qjVumxNMyw=","X-Developer-Key":"i=floss@jetm.me; a=openpgp;\n\tfpr=9B13B20BCF0EDE23454A93C9B5EEC30BA867771F","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":"This series fixes AGC oscillation and an AWB statistics bug in the\nSimple pipeline, and adds the OV2740 black level to the sensor helper.\n\nPatch 1 replaces the fixed 10% bang-bang step in the AGC with a\nproportional controller where step size scales with the MSV error.\nThis eliminates the brightness flicker observed on sensors with\nnon-trivial control latency (tested on OV2740 behind Intel\nIPU6/IVSC).\n\nPatch 2 fixes a bit-depth mismatch in the statistics gathering.\nThe SWSTATS_ACCUMULATE_LINE_STATS() macro divides the luminance value\nfor the histogram to normalize it to 8-bit range, but does not apply\nthe same normalization to the RGB sums. For 10-bit and 12-bit\nunpacked Bayer formats, the sums are accumulated at native bit depth\nwhile the AWB subtracts an 8-bit black level, under-correcting by 4x\nor 16x respectively. This skews the AWB grey world gains, producing a\nvisible color cast (~9% green on the OV2740 with BLC=16). The fix\nright-shifts the RGB sums in finishFrame() to normalize them to 8-bit\nscale, matching the histogram and the 8-bit BLC used by AWB.\n\nPatch 3 adds the OV2740 black level (4096, i.e. 0x40 at 10-bit) to\nCameraSensorHelperOv2740, following the established pattern used by\nOV5675, IMX219, and other sensors. This is the canonical location for\nsensor calibration data and is used across all pipeline handlers.\n\nChanges since v2:\n- Dropped the OV2740 tuning file patch (was 3/4). Without a CCM it\n  is identical to uncalibrated.yaml and adds no value. A proper\n  tuning file with calibrated color matrices can be added later.\n- Added Reviewed-by/Tested-by from Milan Zamazal on all patches.\n\nChanges since v1:\n- Added patch 2 (AWB stats normalization fix).\n- Removed CCM from the OV2740 tuning file (dropped in v3).\n- Moved black level from tuning file to CameraSensorHelper (patch 3)\n  as suggested by Robert Mader.\n\nTested on ThinkPad X1 Carbon Gen 10 (Alder Lake, OV2740, IPU6 ISYS,\nCachyOS kernel 6.19.3, libcamera 0.7.0).\n\nTest results (converged frames, 6500K lighting, no CCM):\n\n  With AWB fix (v2+):   R/G=0.984  B/G=0.985  (~1.5% residual)\n  Without fix (v1):     R/G=0.910  B/G=0.904  (~9% green cast)\n  BLC=0 control:        R/G=1.000  B/G=1.001  (proves the mismatch)\n\nSigned-off-by: Javier Tia <floss@jetm.me>\n---\nJavier Tia (3):\n      ipa: simple: agc: Replace bang-bang controller with proportional\n      libcamera: software_isp: Normalize statistics sums to 8-bit\n      ipa: libipa: camera_sensor_helper: Add OV2740 black level\n\n .../libcamera/internal/software_isp/swstats_cpu.h  |  1 +\n src/ipa/libipa/camera_sensor_helper.cpp            |  2 +\n src/ipa/simple/algorithms/agc.cpp                  | 73 +++++++++++++++-------\n src/libcamera/software_isp/swstats_cpu.cpp         |  9 +++\n 4 files changed, 61 insertions(+), 24 deletions(-)\n---\nbase-commit: 14ba4d168085dd27aed9bcb043996d6a5f28867e\nchange-id: 20260305-agc-proportional-ba20bf95f40b\n\nBest regards,"}