Patch Detail
Show a patch.
GET /api/patches/26733/?format=api
{ "id": 26733, "url": "https://patchwork.libcamera.org/api/patches/26733/?format=api", "web_url": "https://patchwork.libcamera.org/patch/26733/", "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": "<20260512123619.120068-11-mzamazal@redhat.com>", "date": "2026-05-12T12:36:14", "name": "[RFC,v5,10/10] libcamera: software_isp: Add polynomial LSC", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "3a4fd8350f26cecef3396f8e2b5358972e0663d7", "submitter": { "id": 177, "url": "https://patchwork.libcamera.org/api/people/177/?format=api", "name": "Milan Zamazal", "email": "mzamazal@redhat.com" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/26733/mbox/", "series": [ { "id": 5936, "url": "https://patchwork.libcamera.org/api/series/5936/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5936", "date": "2026-05-12T12:36:04", "name": "LSC for SoftISP simple pipeline", "version": 5, "mbox": "https://patchwork.libcamera.org/series/5936/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/26733/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/26733/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 7CB18BDB1C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 12 May 2026 12:37:08 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 1E13E63039;\n\tTue, 12 May 2026 14:37:08 +0200 (CEST)", "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 4C75463039\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 12 May 2026 14:37:05 +0200 (CEST)", "from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com\n\t(ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63])\n\tby relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n\tcipher=TLS_AES_256_GCM_SHA384) id us-mta-9-fcP3_nY7NTi4pjLs8V223Q-1;\n\tTue, 12 May 2026 08:37:00 -0400", "from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com\n\t(mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com\n\t[10.30.177.17])\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-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTPS id 855981956095; Tue, 12 May 2026 12:36:59 +0000 (UTC)", "from mzamazal-thinkpadp1gen7.tpbc.com (unknown [10.44.50.44])\n\tby mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTP id BBB4B1955D84; Tue, 12 May 2026 12:36:57 +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=\"XPIlyzmz\"; dkim-atps=neutral", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1778589424;\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\tin-reply-to:in-reply-to:references:references;\n\tbh=Dy9SKuAzEW9xA5akmA/eiuI7dLFSDoVPtineW4JKjb0=;\n\tb=XPIlyzmzwKVjUM4XOxDxvCHRNY59cr1qo8Km4DWdybNzqhPApeDwnBaYI6qTrAns//wDdj\n\tYYQ0WfRwg/vFoprA31306B18VgEnEPAa8Y0k4lGq9Gyg8FEdFZmaqO7RXXPUV29jLk58jk\n\t7iyNt5C1t7OPFJPKPIUJHB+D6hF0BpM=", "X-MC-Unique": "fcP3_nY7NTi4pjLs8V223Q-1", "X-Mimecast-MFC-AGG-ID": "fcP3_nY7NTi4pjLs8V223Q_1778589419", "From": "Milan Zamazal <mzamazal@redhat.com>", "To": "libcamera-devel@lists.libcamera.org", "Cc": "Milan Zamazal <mzamazal@redhat.com>, Bryan O'Donoghue <bod.linux@nxsw.ie>,\n\tHans de Goede <johannes.goede@oss.qualcomm.com>,\n\tLaurent Pinchart <laurent.pinchart@ideasonboard.com>", "Subject": "[RFC PATCH v5 10/10] libcamera: software_isp: Add polynomial LSC", "Date": "Tue, 12 May 2026 14:36:14 +0200", "Message-ID": "<20260512123619.120068-11-mzamazal@redhat.com>", "In-Reply-To": "<20260512123619.120068-1-mzamazal@redhat.com>", "References": "<20260512123619.120068-1-mzamazal@redhat.com>", "MIME-Version": "1.0", "X-Scanned-By": "MIMEDefang 3.0 on 10.30.177.17", "X-Mimecast-Spam-Score": "0", "X-Mimecast-MFC-PROC-ID": "6at_ebdfqeqeXSjiFvdquvdX6yuUjoMgrFAzh07YtnE_1778589419", "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": "In addition to the already implemented table based lens shading\ncorrection, let's implement polynomial lens shading correction.\nThe primary differences between the two are:\n\n- Table based correction is based on a 16x16 grid of values, while\n polynomial correction uses 3 coefficients for polynomial computation\n of the scaling factor.\n\n- The polynomial correction implemented here is faster (at least in my\n environment).\n\n- Table based correction allows specifying non-symmetric corrections.\n\nThis patch implements just the simplest form of the polynomial\ncorrection, for ease of implementation and speed. It assumes that lens\nshading is centred and uses only 3-item polynomial: lsc0 + lsc1 * dist^2\n+ lsc2 * dist^4, where dist is the distance from the centre. The\ndistance is measured in kilopixels, which is definitely debatable, but\nit makes easy to deal with different vertical and horizontal sizes and\nwith cropping, assuming the pixels have the same horizontal and vertical\nsizes. Shifted crops are not considered but can be added easily in\nanother patch by specifying the shift as another uniform.\n\nThe coefficients are specified for each of the RGB colours. The YAML\ndefinition looks like:\n\n - Lsc:\n type: polynomial\n sets:\n - ct: temperature-1\n r: [ lsc0, lsc1, lsc2 ]\n g: [ ... ]\n b: [ ... ]\n - ct: temperature-2\n r: [ ... ]\n g: [ ... ]\n b: [ ... ]\n - ...\n\nSigned-off-by: Milan Zamazal <mzamazal@redhat.com>\n---\n .../internal/software_isp/debayer_params.h | 4 ++\n src/ipa/simple/algorithms/lsc.cpp | 69 +++++++++++++------\n src/ipa/simple/algorithms/lsc.h | 4 ++\n src/libcamera/shaders/bayer_1x_packed.frag | 9 +++\n src/libcamera/shaders/bayer_unpacked.frag | 9 +++\n src/libcamera/software_isp/debayer.cpp | 15 ++++\n src/libcamera/software_isp/debayer_egl.cpp | 28 +++++++-\n src/libcamera/software_isp/debayer_egl.h | 4 ++\n 8 files changed, 121 insertions(+), 21 deletions(-)", "diff": "diff --git a/include/libcamera/internal/software_isp/debayer_params.h b/include/libcamera/internal/software_isp/debayer_params.h\nindex 37fff49a2..bef6820cb 100644\n--- a/include/libcamera/internal/software_isp/debayer_params.h\n+++ b/include/libcamera/internal/software_isp/debayer_params.h\n@@ -37,8 +37,12 @@ struct DebayerParams {\n \tenum LscType : uint32_t {\n \t\tLscNone,\n \t\tLscTable,\n+\t\tLscPolynomial,\n \t};\n \tLscLookupTable lscLut{};\n+\n+\tstatic constexpr unsigned int kNLscCoefficients = 3;\n+\tstd::array<RGB<float>, kNLscCoefficients> lscCoefficients;\n };\n \n } /* namespace libcamera */\ndiff --git a/src/ipa/simple/algorithms/lsc.cpp b/src/ipa/simple/algorithms/lsc.cpp\nindex ae5179cfc..0470b5e76 100644\n--- a/src/ipa/simple/algorithms/lsc.cpp\n+++ b/src/ipa/simple/algorithms/lsc.cpp\n@@ -18,23 +18,27 @@ LOG_DEFINE_CATEGORY(IPASoftLsc)\n int Lsc::init(IPAContext &context, const ValueNode &tuningData)\n {\n \tstd::string type = tuningData[\"type\"].get<std::string>(\"table\");\n+\tint retR, retG, retB;\n \n \tif (type == \"table\") {\n-\t\tint retR = lscR_.readYaml(tuningData[\"sets\"], \"ct\", \"r\");\n-\t\tint retG = lscG_.readYaml(tuningData[\"sets\"], \"ct\", \"g\");\n-\t\tint retB = lscB_.readYaml(tuningData[\"sets\"], \"ct\", \"b\");\n-\n-\t\tif (retR < 0 || retG < 0 || retB < 0) {\n-\t\t\tLOG(IPASoftLsc, Error)\n-\t\t\t\t<< \"Failed to parse 'lsc' parameter from tuning file.\";\n-\t\t\treturn -EINVAL;\n-\t\t}\n-\n+\t\tretR = lscR_.readYaml(tuningData[\"sets\"], \"ct\", \"r\");\n+\t\tretG = lscG_.readYaml(tuningData[\"sets\"], \"ct\", \"g\");\n+\t\tretB = lscB_.readYaml(tuningData[\"sets\"], \"ct\", \"b\");\n \t\ttype_ = DebayerParams::LscTable;\n+\t} else if (type == \"polynomial\") {\n+\t\tretR = lscCoefR_.readYaml(tuningData[\"sets\"], \"ct\", \"r\");\n+\t\tretG = lscCoefG_.readYaml(tuningData[\"sets\"], \"ct\", \"g\");\n+\t\tretB = lscCoefB_.readYaml(tuningData[\"sets\"], \"ct\", \"b\");\n+\t\ttype_ = DebayerParams::LscPolynomial;\n \t} else {\n \t\tLOG(IPASoftLsc, Error) << \"LSC: type \" << type << \" not supported\";\n \t\treturn -EINVAL;\n \t}\n+\tif (retR < 0 || retG < 0 || retB < 0) {\n+\t\tLOG(IPASoftLsc, Error)\n+\t\t\t<< \"Failed to parse 'lsc' parameter from tuning file.\";\n+\t\treturn -EINVAL;\n+\t}\n \n \tcontext.lscType = type_;\n \n@@ -53,18 +57,43 @@ void Lsc::prepare(IPAContext &context, [[maybe_unused]] const uint32_t frame,\n \tunsigned int ct =\n \t\tcontext.activeState.awb.temperatureK.value_or(kDefaultTemperature);\n \n-\tconst LscMatrix matrixR = lscR_.getInterpolated(ct);\n-\tconst LscMatrix matrixG = lscG_.getInterpolated(ct);\n-\tconst LscMatrix matrixB = lscB_.getInterpolated(ct);\n+\tswitch (type_) {\n+\tcase DebayerParams::LscNone:\n+\t\tbreak;\n+\n+\tcase DebayerParams::LscTable: {\n+\t\tconst LscMatrix matrixR = lscR_.getInterpolated(ct);\n+\t\tconst LscMatrix matrixG = lscG_.getInterpolated(ct);\n+\t\tconst LscMatrix matrixB = lscB_.getInterpolated(ct);\n+\n+\t\tDebayerParams::LscLookupTable lut;\n+\t\tconstexpr unsigned int gridSize = DebayerParams::kLscGridSize;\n+\t\tfor (unsigned int i = 0, j = 0; i < gridSize * gridSize; i++) {\n+\t\t\tlut[j++] = matrixR.data()[i];\n+\t\t\tlut[j++] = matrixG.data()[i];\n+\t\t\tlut[j++] = matrixB.data()[i];\n+\t\t}\n+\t\tparams->lscLut = lut;\n \n-\tDebayerParams::LscLookupTable lut;\n-\tconstexpr unsigned int gridSize = DebayerParams::kLscGridSize;\n-\tfor (unsigned int i = 0, j = 0; i < gridSize * gridSize; i++) {\n-\t\tlut[j++] = matrixR.data()[i];\n-\t\tlut[j++] = matrixG.data()[i];\n-\t\tlut[j++] = matrixB.data()[i];\n+\t\tbreak;\n+\t}\n+\n+\tcase DebayerParams::LscPolynomial: {\n+\t\tconst Vector<float, DebayerParams::kNLscCoefficients> coefR =\n+\t\t\tlscCoefR_.getInterpolated(ct);\n+\t\tconst Vector<float, DebayerParams::kNLscCoefficients> coefG =\n+\t\t\tlscCoefG_.getInterpolated(ct);\n+\t\tconst Vector<float, DebayerParams::kNLscCoefficients> coefB =\n+\t\t\tlscCoefB_.getInterpolated(ct);\n+\n+\t\tfor (unsigned int i = 0; i < DebayerParams::kNLscCoefficients; i++) {\n+\t\t\tparams->lscCoefficients[i].r() = coefR[i];\n+\t\t\tparams->lscCoefficients[i].g() = coefG[i];\n+\t\t\tparams->lscCoefficients[i].b() = coefB[i];\n+\t\t}\n+\t\tbreak;\n+\t}\n \t}\n-\tparams->lscLut = lut;\n }\n \n REGISTER_IPA_ALGORITHM(Lsc, \"Lsc\")\ndiff --git a/src/ipa/simple/algorithms/lsc.h b/src/ipa/simple/algorithms/lsc.h\nindex d7d7c9559..e1981dec7 100644\n--- a/src/ipa/simple/algorithms/lsc.h\n+++ b/src/ipa/simple/algorithms/lsc.h\n@@ -6,6 +6,7 @@\n #pragma once\n \n #include \"libcamera/internal/matrix.h\"\n+#include \"libcamera/internal/vector.h\"\n \n #include <libipa/interpolator.h>\n \n@@ -35,6 +36,9 @@ private:\n \tInterpolator<LscMatrix> lscR_;\n \tInterpolator<LscMatrix> lscG_;\n \tInterpolator<LscMatrix> lscB_;\n+\tInterpolator<Vector<float, DebayerParams::kNLscCoefficients>> lscCoefR_;\n+\tInterpolator<Vector<float, DebayerParams::kNLscCoefficients>> lscCoefG_;\n+\tInterpolator<Vector<float, DebayerParams::kNLscCoefficients>> lscCoefB_;\n };\n \n } /* namespace ipa::soft::algorithms */\ndiff --git a/src/libcamera/shaders/bayer_1x_packed.frag b/src/libcamera/shaders/bayer_1x_packed.frag\nindex dc2b582f8..bc45c1993 100644\n--- a/src/libcamera/shaders/bayer_1x_packed.frag\n+++ b/src/libcamera/shaders/bayer_1x_packed.frag\n@@ -72,6 +72,11 @@ uniform float contrastExp;\n \n #if defined(APPLY_LSC_TABLE)\n uniform sampler2D lsc_tex;\n+#elif defined(APPLY_LSC_POLYNOMIAL)\n+uniform vec2 lscScale;\n+uniform vec3 lsc0;\n+uniform vec3 lsc1;\n+uniform vec3 lsc2;\n #endif\n \n float apply_contrast(float value)\n@@ -233,6 +238,10 @@ void main(void)\n \n #if defined(APPLY_LSC_TABLE)\n \trgb = rgb * texture2D(lsc_tex, textureOut).rgb;\n+#elif defined(APPLY_LSC_POLYNOMIAL)\n+\tvec2 offCenter = (textureOut - vec2(0.5, 0.5)) * lscScale;\n+\tfloat dist2 = dot(offCenter, offCenter);\n+\trgb = rgb * (lsc0 + lsc1 * dist2 + lsc2 * dist2 * dist2);\n #endif\n \n \t/*\ndiff --git a/src/libcamera/shaders/bayer_unpacked.frag b/src/libcamera/shaders/bayer_unpacked.frag\nindex df324e6e1..5a1d82325 100644\n--- a/src/libcamera/shaders/bayer_unpacked.frag\n+++ b/src/libcamera/shaders/bayer_unpacked.frag\n@@ -31,6 +31,11 @@ uniform float contrastExp;\n \n #if defined(APPLY_LSC_TABLE)\n uniform sampler2D lsc_tex;\n+#elif defined(APPLY_LSC_POLYNOMIAL)\n+uniform vec2 lscScale;\n+uniform vec3 lsc0;\n+uniform vec3 lsc1;\n+uniform vec3 lsc2;\n #endif\n \n float apply_contrast(float value)\n@@ -136,6 +141,10 @@ void main(void) {\n \n #if defined(APPLY_LSC_TABLE)\n rgb = rgb * texture2D(lsc_tex, center.xy).rgb;\n+#elif defined(APPLY_LSC_POLYNOMIAL)\n+ vec2 offCenter = (center.xy - vec2(0.5, 0.5)) * lscScale;\n+ float dist2 = dot(offCenter, offCenter);\n+ rgb = rgb * (lsc0 + lsc1 * dist2 + lsc2 * dist2 * dist2);\n #endif\n \n /*\ndiff --git a/src/libcamera/software_isp/debayer.cpp b/src/libcamera/software_isp/debayer.cpp\nindex a77b3c9fc..ec0c618ba 100644\n--- a/src/libcamera/software_isp/debayer.cpp\n+++ b/src/libcamera/software_isp/debayer.cpp\n@@ -63,6 +63,11 @@ namespace libcamera {\n * \\brief Lens shading correction using a lookup table\n */\n \n+/**\n+ * \\var DebayerParams::LscPolynomial\n+ * \\brief Lens shading correction using polynomial coefficients\n+ */\n+\n /**\n * \\typedef DebayerParams::LscValueType\n * \\brief Type of LSC grid values\n@@ -86,6 +91,16 @@ namespace libcamera {\n * \\brief Lens shading lookup table\n */\n \n+/**\n+ * \\var DebayerParams::kNLscCoefficients\n+ * \\brief Number of the lens shading correction polynomial coefficients\n+ */\n+\n+/**\n+ * \\var DebayerParams::lscCoefficients\n+ * \\brief Polynomial coefficients for lens shading correction, one per colour channel\n+ */\n+\n /**\n * \\class Debayer\n * \\brief Base debayering class\ndiff --git a/src/libcamera/software_isp/debayer_egl.cpp b/src/libcamera/software_isp/debayer_egl.cpp\nindex 03ec5c5da..560a87d66 100644\n--- a/src/libcamera/software_isp/debayer_egl.cpp\n+++ b/src/libcamera/software_isp/debayer_egl.cpp\n@@ -116,6 +116,10 @@ int DebayerEGL::getShaderVariableLocations(void)\n \ttextureUniformProjMatrix_ = glGetUniformLocation(programId_, \"proj_matrix\");\n \n \ttextureUniformLsc_ = glGetUniformLocation(programId_, \"lsc_tex\");\n+\tlscScale_ = glGetUniformLocation(programId_, \"lscScale\");\n+\tlsc0_ = glGetUniformLocation(programId_, \"lsc0\");\n+\tlsc1_ = glGetUniformLocation(programId_, \"lsc1\");\n+\tlsc2_ = glGetUniformLocation(programId_, \"lsc2\");\n \n \tLOG(Debayer, Debug) << \"vertexIn \" << attributeVertex_ << \" textureIn \" << attributeTexture_\n \t\t\t << \" tex_y \" << textureUniformBayerDataIn_\n@@ -128,7 +132,11 @@ int DebayerEGL::getShaderVariableLocations(void)\n \t\t\t << \" stride_factor \" << textureUniformStrideFactor_\n \t\t\t << \" tex_bayer_first_red \" << textureUniformBayerFirstRed_\n \t\t\t << \" proj_matrix \" << textureUniformProjMatrix_\n-\t\t\t << \" lsc \" << textureUniformLsc_;\n+\t\t\t << \" lscTexture \" << textureUniformLsc_\n+\t\t\t << \" lscScale \" << lscScale_\n+\t\t\t << \" lsc0 \" << lsc0_\n+\t\t\t << \" lsc1 \" << lsc1_\n+\t\t\t << \" lsc2 \" << lsc2_;\n \treturn 0;\n }\n \n@@ -153,6 +161,9 @@ int DebayerEGL::initBayerShaders(PixelFormat inputFormat, PixelFormat outputForm\n \tcase DebayerParams::LscTable:\n \t\tegl_.pushEnv(shaderEnv, \"#define APPLY_LSC_TABLE\");\n \t\tbreak;\n+\tcase DebayerParams::LscPolynomial:\n+\t\tegl_.pushEnv(shaderEnv, \"#define APPLY_LSC_POLYNOMIAL\");\n+\t\tbreak;\n \t}\n \n \t/*\n@@ -513,6 +524,21 @@ void DebayerEGL::setShaderVariableValues(const DebayerParams ¶ms)\n \t\t\t\t params.lscLut.data(), GL_LINEAR);\n \t\tglUniform1i(textureUniformLsc_, eglImageLscLookup_->texture_unit_uniform_id_);\n \t\tbreak;\n+\tcase DebayerParams::LscPolynomial:\n+\t\tglUniform2f(lscScale_, imgSize[0] / 1000.0, imgSize[1] / 1000.0);\n+\t\tglUniform3f(lsc0_,\n+\t\t\t params.lscCoefficients[0].r(),\n+\t\t\t params.lscCoefficients[0].g(),\n+\t\t\t params.lscCoefficients[0].b());\n+\t\tglUniform3f(lsc1_,\n+\t\t\t params.lscCoefficients[1].r(),\n+\t\t\t params.lscCoefficients[1].g(),\n+\t\t\t params.lscCoefficients[1].b());\n+\t\tglUniform3f(lsc2_,\n+\t\t\t params.lscCoefficients[2].r(),\n+\t\t\t params.lscCoefficients[2].g(),\n+\t\t\t params.lscCoefficients[2].b());\n+\t\tbreak;\n \t}\n \n \t/*\ndiff --git a/src/libcamera/software_isp/debayer_egl.h b/src/libcamera/software_isp/debayer_egl.h\nindex d5cfcad1e..7d1fa31cb 100644\n--- a/src/libcamera/software_isp/debayer_egl.h\n+++ b/src/libcamera/software_isp/debayer_egl.h\n@@ -95,6 +95,10 @@ private:\n \tGLint textureUniformBayerDataIn_;\n \n \tGLint textureUniformLsc_;\n+\tGLint lscScale_;\n+\tGLint lsc0_;\n+\tGLint lsc1_;\n+\tGLint lsc2_;\n \n \t/* Represent per-frame CCM as a uniform vector of floats 3 x 3 */\n \tGLint ccmUniformDataIn_;\n", "prefixes": [ "RFC", "v5", "10/10" ] }