[{"id":37502,"web_url":"https://patchwork.libcamera.org/comment/37502/","msgid":"<85wm1ulbtg.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","date":"2026-01-06T20:34:51","subject":"Re: [PATCH v11 01/24] libcamera: software_isp: debayer: Latch\n\tcontrastExp not contrast to debayer parameters","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/people/177/","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"content":"Bryan O'Donoghue <bryan.odonoghue@linaro.org> writes:\n\n> Pass contrastExp as calculated in lut to debayer params not the raw\n> contrast. This way we calculate contrastExp once per frame in lut and pass\n> the calculated value into the shaders, instead of passing contrast and\n> calculating contrastExp once per pixel in the shaders.\n>\n> Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>\n\nFrom v10:\n\nReviewed-by: Milan Zamazal <mzamazal@redhat.com>\n\n> ---\n>  include/libcamera/internal/software_isp/debayer_params.h | 2 +-\n>  src/ipa/simple/algorithms/lut.cpp                        | 7 ++++---\n>  src/ipa/simple/ipa_context.h                             | 1 +\n>  src/libcamera/software_isp/debayer.cpp                   | 2 +-\n>  4 files changed, 7 insertions(+), 5 deletions(-)\n>\n> diff --git a/include/libcamera/internal/software_isp/debayer_params.h b/include/libcamera/internal/software_isp/debayer_params.h\n> index 8033f7d5b..256c7d43d 100644\n> --- a/include/libcamera/internal/software_isp/debayer_params.h\n> +++ b/include/libcamera/internal/software_isp/debayer_params.h\n> @@ -59,7 +59,7 @@ struct DebayerParams {\n>  \tMatrix<float, 3, 3> ccm;\n>  \tRGB<float> blackLevel;\n>  \tfloat gamma;\n> -\tfloat contrast;\n> +\tdouble contrastExp;\n>  };\n>  \n>  } /* namespace libcamera */\n> diff --git a/src/ipa/simple/algorithms/lut.cpp b/src/ipa/simple/algorithms/lut.cpp\n> index 9aaab54f1..7d015ac89 100644\n> --- a/src/ipa/simple/algorithms/lut.cpp\n> +++ b/src/ipa/simple/algorithms/lut.cpp\n> @@ -60,12 +60,13 @@ void Lut::updateGammaTable(IPAContext &context)\n>  \tconst auto blackLevel = context.activeState.blc.level;\n>  \tconst unsigned int blackIndex = blackLevel * gammaTable.size() / 256;\n>  \tconst auto contrast = context.activeState.knobs.contrast.value_or(1.0);\n> +\t/* Convert 0..2 to 0..infinity; avoid actual inifinity at tan(pi/2) */\n> +\tdouble contrastExp = tan(std::clamp(contrast * M_PI_4, 0.0, M_PI_2 - 0.00001));\n>  \n>  \tconst float divisor = gammaTable.size() - blackIndex - 1.0;\n>  \tfor (unsigned int i = blackIndex; i < gammaTable.size(); i++) {\n>  \t\tdouble normalized = (i - blackIndex) / divisor;\n>  \t\t/* Convert 0..2 to 0..infinity; avoid actual inifinity at tan(pi/2) */\n> -\t\tdouble contrastExp = tan(std::clamp(contrast * M_PI_4, 0.0, M_PI_2 - 0.00001));\n>  \t\t/* Apply simple S-curve */\n>  \t\tif (normalized < 0.5)\n>  \t\t\tnormalized = 0.5 * std::pow(normalized / 0.5, contrastExp);\n> @@ -84,7 +85,7 @@ void Lut::updateGammaTable(IPAContext &context)\n>  \t\t  gammaTable[blackIndex]);\n>  \n>  \tcontext.activeState.gamma.blackLevel = blackLevel;\n> -\tcontext.activeState.gamma.contrast = contrast;\n> +\tcontext.activeState.gamma.contrastExp = contrastExp;\n>  }\n>  \n>  int16_t Lut::ccmValue(unsigned int i, float ccm) const\n> @@ -149,7 +150,7 @@ void Lut::prepare(IPAContext &context,\n>  \t}\n>  \n>  \tparams->gamma = context.configuration.gamma;\n> -\tparams->contrast = context.activeState.gamma.contrast;\n> +\tparams->contrastExp = context.activeState.gamma.contrastExp;\n>  }\n>  \n>  void Lut::process([[maybe_unused]] IPAContext &context,\n> diff --git a/src/ipa/simple/ipa_context.h b/src/ipa/simple/ipa_context.h\n> index 26b60fb68..7837bb4dd 100644\n> --- a/src/ipa/simple/ipa_context.h\n> +++ b/src/ipa/simple/ipa_context.h\n> @@ -59,6 +59,7 @@ struct IPAActiveState {\n>  \t\tstd::array<double, kGammaLookupSize> gammaTable;\n>  \t\tuint8_t blackLevel;\n>  \t\tdouble contrast;\n> +\t\tdouble contrastExp;\n>  \t} gamma;\n>  \n>  \tstruct {\n> diff --git a/src/libcamera/software_isp/debayer.cpp b/src/libcamera/software_isp/debayer.cpp\n> index b33f818a7..4cb5b4da4 100644\n> --- a/src/libcamera/software_isp/debayer.cpp\n> +++ b/src/libcamera/software_isp/debayer.cpp\n> @@ -116,7 +116,7 @@ namespace libcamera {\n>   */\n>  \n>  /**\n> - * \\var DebayerParams::contrast\n> + * \\var DebayerParams::contrastExp\n>   * \\brief Contrast value for GPUISP\n>   */","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 60E0BBDCBF\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  6 Jan 2026 20:34:59 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 8D3FE61FBB;\n\tTue,  6 Jan 2026 21:34:58 +0100 (CET)","from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.129.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 0930661F9F\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  6 Jan 2026 21:34:56 +0100 (CET)","from mail-wm1-f69.google.com (mail-wm1-f69.google.com\n\t[209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n\tus-mta-627-uGYNtZhmOneU2Q7n9X-nGw-1; Tue, 06 Jan 2026 15:34:54 -0500","by mail-wm1-f69.google.com with SMTP id\n\t5b1f17b1804b1-47777158a85so16485955e9.3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 06 Jan 2026 12:34:54 -0800 (PST)","from mzamazal-thinkpadp1gen7.tpbc.csb\n\t(ip-77-48-47-2.net.vodafone.cz. [77.48.47.2])\n\tby smtp.gmail.com with ESMTPSA id\n\tffacd0b85a97d-432bd0daa78sm6264815f8f.6.2026.01.06.12.34.51\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tTue, 06 Jan 2026 12:34:52 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"I755iLSB\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1767731695;\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\tin-reply-to:in-reply-to:references:references;\n\tbh=eE/lxX/nKmN1u0AcmjQGF8jiYALFl/FeNGE896x+gU0=;\n\tb=I755iLSBg7Z2zD45KZ1L4V51DCx5ypWjHWP32r+iigcXhu+tsZgpgU1Z5l2T4Vd5a1AAaU\n\tsdPffjfDQaTrH+E9KGW1yZlnaik0iYV1IMo8vIDFoScPtGA4cX9RB4m/28zHQiFHtnVEAr\n\t72luFdHkXQcEV8lQKVusJIL9tnGzKZE=","X-MC-Unique":"uGYNtZhmOneU2Q7n9X-nGw-1","X-Mimecast-MFC-AGG-ID":"uGYNtZhmOneU2Q7n9X-nGw_1767731693","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1767731693; x=1768336493;\n\th=mime-version:user-agent:message-id:date:references:in-reply-to\n\t:subject:cc:to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject\n\t:date:message-id:reply-to;\n\tbh=eE/lxX/nKmN1u0AcmjQGF8jiYALFl/FeNGE896x+gU0=;\n\tb=m4ru11bHcqOxYwEu87qslKILeY4qJ0wgU0jW3TJ+oNhnH+FuWtmBJ7xIWiC0bc01oK\n\tqwfSyefM/djDebBQxVvFVi/GWYZhssld5SQv1Ra1h+j+TfDf5bySuIrqkHx6W29sCfb2\n\tehlW+On2LIybKp31ZNQ1ATQ7/l8uKGZ/xb1R3c1V+uFprp0V5ZoUmYK5eWMXmjPC+Yr0\n\tCtNvCqqDbrMoXou5BuAvpdx2MxGSn65wtMB/9muhtAAH6R300nZt3RrQ8yY+INdeb5l+\n\tYFx13IUVqS29/kwvo0jd86WBl53VThS3Zy2p5XH6XXjrqyIR7f8vFZjzX4ZjZr7sfI9e\n\tM2wg==","X-Gm-Message-State":"AOJu0YxyizP+mcrmjovKrv7jihjiSj9HpoQmypymtkRqLlWgbDqKaWH2\n\tkFBYlPjqiJLWNrrJvfV8MTyi2XYNnq9XJxyvcDktA6gdrAEwvEOPrp+mKBTmD4y55Ga3zz8oViX\n\twlTZwrtNd9k5O2q9t7uzfkCfL9+V+Jpf+cPPTXmMZBGuRLRo4S9QLARbAFxzVGp4qEezjpna6X1\n\tI=","X-Gm-Gg":"AY/fxX7WMYc3Zo4afJjNVyGOl8O50WTNg2eeYNeYNDa1JrN+r8kG3eZhrg+p+h8jzl9\n\ttaNSmcxMAo+GMmnhvLMMEOCgjMYWyT3eT8Ic6RuDjb4vwZDsKDm6wZq2abisBY/VFpue6xYQ1z5\n\tm3biUekGSThLlfRcu/kCHdSMyT+s2Tc7odGwuQPIcUU7eB1V1tn0plqQTBvSLW4hQes9r6iiWdv\n\t1w5wPjVPmuLmpIm75Bg7xUGYZVNJPDQb2d+WeTmj9c7VazzbnjYHH/PMGtMLIOIRxG+OACHP9hH\n\tWxPGdkq9tCTcHQ+FtZ9g+KLZjDu+GiqDbFFvjYnFRMSsBwcyxJlTxhjZYxRMJNbV5XR6SOKjP2K\n\tPxVPAzuySb2KY/DS2Sepgpxgc0C/Vz/DGy9/04E9zxiYiXdh2th+EMBBgy/GYev0=","X-Received":["by 2002:a05:600c:630f:b0:46e:1abc:1811 with SMTP id\n\t5b1f17b1804b1-47d84b3b75amr1713765e9.27.1767731693168; \n\tTue, 06 Jan 2026 12:34:53 -0800 (PST)","by 2002:a05:600c:630f:b0:46e:1abc:1811 with SMTP id\n\t5b1f17b1804b1-47d84b3b75amr1713565e9.27.1767731692740; \n\tTue, 06 Jan 2026 12:34:52 -0800 (PST)"],"X-Google-Smtp-Source":"AGHT+IGxMyWeOnAl8/bWoDI3/Kz5grehshDsGkdAh/3bvkWyWpzTarAgeetNFVs7hMhaogwTUaQD8g==","From":"Milan Zamazal <mzamazal@redhat.com>","To":"Bryan O'Donoghue <bryan.odonoghue@linaro.org>","Cc":"libcamera-devel@lists.libcamera.org,  pavel@ucw.cz","Subject":"Re: [PATCH v11 01/24] libcamera: software_isp: debayer: Latch\n\tcontrastExp not contrast to debayer parameters","In-Reply-To":"<20260106170059.56193-2-bryan.odonoghue@linaro.org> (Bryan\n\tO'Donoghue's message of \"Tue, 6 Jan 2026 17:00:36 +0000\")","References":"<20260106170059.56193-1-bryan.odonoghue@linaro.org>\n\t<20260106170059.56193-2-bryan.odonoghue@linaro.org>","Date":"Tue, 06 Jan 2026 21:34:51 +0100","Message-ID":"<85wm1ulbtg.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","User-Agent":"Gnus/5.13 (Gnus v5.13)","MIME-Version":"1.0","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"jfsH4Agb9XbOP9XO_2iZ3CAobMuvP4cKP452cCYu_Eg_1767731693","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain","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>"}}]