Show a patch.

GET /api/patches/24626/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 24626,
    "url": "https://patchwork.libcamera.org/api/patches/24626/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/24626/",
    "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": "<20251014075252.2876485-11-stefan.klug@ideasonboard.com>",
    "date": "2025-10-14T07:52:32",
    "name": "[v1,10/12] ipa: rkisp1: lsc: Resample polynomial lens shading tables at configure time",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "5e90e86258c6bdeb80308a22a23d40ef9a4ce40c",
    "submitter": {
        "id": 184,
        "url": "https://patchwork.libcamera.org/api/people/184/?format=api",
        "name": "Stefan Klug",
        "email": "stefan.klug@ideasonboard.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/24626/mbox/",
    "series": [
        {
            "id": 5498,
            "url": "https://patchwork.libcamera.org/api/series/5498/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5498",
            "date": "2025-10-14T07:52:22",
            "name": "Add resampling support for polynomial LSC data",
            "version": 1,
            "mbox": "https://patchwork.libcamera.org/series/5498/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/24626/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/24626/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 65919BF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 14 Oct 2025 07:53:29 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 16407605ED;\n\tTue, 14 Oct 2025 09:53:29 +0200 (CEST)",
            "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id BDFF3605D0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 14 Oct 2025 09:53:27 +0200 (CEST)",
            "from ideasonboard.com (unknown\n\t[IPv6:2a00:6020:448c:6c00:61fb:8e55:ff1e:be62])\n\tby perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id 8CC3CC73;\n\tTue, 14 Oct 2025 09:51:49 +0200 (CEST)"
        ],
        "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"uwYJZXXQ\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1760428309;\n\tbh=cMre7HJg244MUXqGL2X0oASmhIDQ++HGk2yYZJ+FtKM=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=uwYJZXXQSdML2v/kAdCfl4QoiW1ZqABXqIB54lsMElsmUzhZAQrH3HbM3hqK2ue+t\n\tUvbCk8yPi20L06Z7SmlDIFByCpmgIGU9I6k5VRMQm8pPViFp63x5hSZpruhpiMhyye\n\tvVcVHQhvSZr0NXYM/mSg9JQCujF1guxIfw7hI1Rc=",
        "From": "Stefan Klug <stefan.klug@ideasonboard.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Cc": "Stefan Klug <stefan.klug@ideasonboard.com>",
        "Subject": "[PATCH v1 10/12] ipa: rkisp1: lsc: Resample polynomial lens shading\n\ttables at configure time",
        "Date": "Tue, 14 Oct 2025 09:52:32 +0200",
        "Message-ID": "<20251014075252.2876485-11-stefan.klug@ideasonboard.com>",
        "X-Mailer": "git-send-email 2.48.1",
        "In-Reply-To": "<20251014075252.2876485-1-stefan.klug@ideasonboard.com>",
        "References": "<20251014075252.2876485-1-stefan.klug@ideasonboard.com>",
        "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": "The lens shading correction is always applied based on the sensor crop\nbounds. This leads to incorrect lens shading correction for analog crops\nthat do not cover the whole sensor.\n\nTo fix that, we need to adapt the lens shading table for the selected\nanalog crop at configure time. Introduce an abstract ShadingDescriptor\nclass that holds the lens shading information that can then be sampled\nat configure time for a specific crop rectangle.\n\nResampling for a specific crop is only implemented for polynomial lsc\ndata. For tabular data, a warning is logged and the unmodified table is\nreturned. This matches the current functionality for tabular data and is\na huge improvement for polynomial data.\n\nSigned-off-by: Stefan Klug <stefan.klug@ideasonboard.com>\n---\n src/ipa/rkisp1/algorithms/lsc.cpp | 230 +++++++++++++++++++-----------\n src/ipa/rkisp1/algorithms/lsc.h   |  14 ++\n 2 files changed, 157 insertions(+), 87 deletions(-)",
    "diff": "diff --git a/src/ipa/rkisp1/algorithms/lsc.cpp b/src/ipa/rkisp1/algorithms/lsc.cpp\nindex 29cd7efd83ef..68cf35064182 100644\n--- a/src/ipa/rkisp1/algorithms/lsc.cpp\n+++ b/src/ipa/rkisp1/algorithms/lsc.cpp\n@@ -70,38 +70,124 @@ namespace ipa::rkisp1::algorithms {\n \n LOG_DEFINE_CATEGORY(RkISP1Lsc)\n \n-class LscPolynomialLoader\n+class LscPolynomialShadingDescriptor : public LensShadingCorrection::ShadingDescriptor\n {\n public:\n-\tLscPolynomialLoader(const Size &sensorSize,\n-\t\t\t    const Rectangle &cropRectangle,\n-\t\t\t    const std::vector<double> &xSizes,\n-\t\t\t    const std::vector<double> &ySizes)\n-\t\t: sensorSize_(sensorSize),\n-\t\t  cropRectangle_(cropRectangle),\n-\t\t  xSizes_(xSizes),\n-\t\t  ySizes_(ySizes)\n+\tLscPolynomialShadingDescriptor(const LscPolynomial &pr, const LscPolynomial &pgr,\n+\t\t\t\t       const LscPolynomial &pgb, const LscPolynomial &pb)\n+\t\t: pr_(pr), pgr_(pgr), pgb_(pgb), pb_(pb)\n \t{\n \t}\n \n-\tint parseLscData(const YamlObject &yamlSets,\n-\t\t\t std::map<unsigned int, LensShadingCorrection::Components> &lscData);\n+\tvoid sampleForCrop(const Rectangle &cropRectangle,\n+\t\t\t   const std::vector<double> &xSizes,\n+\t\t\t   const std::vector<double> &ySizes,\n+\t\t\t   LensShadingCorrection::Components &components) override;\n \n private:\n-\tstd::vector<double> sizesListToPositions(const std::vector<double> &sizes);\n \tstd::vector<uint16_t> samplePolynomial(const LscPolynomial &poly,\n \t\t\t\t\t       const std::vector<double> &xPositions,\n \t\t\t\t\t       const std::vector<double> &yPositions,\n \t\t\t\t\t       const Rectangle &cropRectangle);\n \n+\tstd::vector<double> sizesListToPositions(const std::vector<double> &sizes);\n+\n+\tLscPolynomial pr_;\n+\tLscPolynomial pgr_;\n+\tLscPolynomial pgb_;\n+\tLscPolynomial pb_;\n+};\n+\n+void LscPolynomialShadingDescriptor::sampleForCrop(const Rectangle &cropRectangle,\n+\t\t\t\t\t\t   const std::vector<double> &xSizes,\n+\t\t\t\t\t\t   const std::vector<double> &ySizes,\n+\t\t\t\t\t\t   LensShadingCorrection::Components &components)\n+{\n+\tstd::vector<double> xPos = sizesListToPositions(xSizes);\n+\tstd::vector<double> yPos = sizesListToPositions(ySizes);\n+\tcomponents.r = samplePolynomial(pr_, xPos, yPos, cropRectangle);\n+\tcomponents.gr = samplePolynomial(pgr_, xPos, yPos, cropRectangle);\n+\tcomponents.gb = samplePolynomial(pgb_, xPos, yPos, cropRectangle);\n+\tcomponents.b = samplePolynomial(pb_, xPos, yPos, cropRectangle);\n+}\n+\n+std::vector<uint16_t>\n+LscPolynomialShadingDescriptor::samplePolynomial(const LscPolynomial &poly,\n+\t\t\t\t\t\t const std::vector<double> &xPositions,\n+\t\t\t\t\t\t const std::vector<double> &yPositions,\n+\t\t\t\t\t\t const Rectangle &cropRectangle)\n+{\n+\tdouble m = poly.getM();\n+\tdouble x0 = cropRectangle.x / m;\n+\tdouble y0 = cropRectangle.y / m;\n+\tdouble w = cropRectangle.width / m;\n+\tdouble h = cropRectangle.height / m;\n+\tstd::vector<uint16_t> samples;\n+\n+\tsamples.reserve(xPositions.size() * yPositions.size());\n+\n+\tfor (double y : yPositions) {\n+\t\tfor (double x : xPositions) {\n+\t\t\tdouble xp = x0 + x * w;\n+\t\t\tdouble yp = y0 + y * h;\n+\t\t\t/*\n+\t\t\t * The hardware uses 2.10 fixed point format and limits\n+\t\t\t * the legal values to [1..3.999]. Scale and clamp the\n+\t\t\t * sampled value accordingly.\n+\t\t\t */\n+\t\t\tint v = static_cast<int>(\n+\t\t\t\tpoly.sampleAtNormalizedPixelPos(xp, yp) *\n+\t\t\t\t1024);\n+\t\t\tv = std::min(std::max(v, 1024), 4095);\n+\t\t\tsamples.push_back(v);\n+\t\t}\n+\t}\n+\treturn samples;\n+}\n+\n+/*\n+ * The rkisp1 LSC grid spacing is defined by the cell sizes on the first half of\n+ * the grid. This is then mirrored in hardware to the other half. See\n+ * parseSizes() for further details. For easier handling, this function converts\n+ * the cell sizes of half the grid to a list of position of the whole grid (on\n+ * one axis). Example:\n+ *\n+ * input:   | 0.2 | 0.3 |\n+ * output: 0.0   0.2   0.5   0.8   1.0\n+ */\n+std::vector<double>\n+LscPolynomialShadingDescriptor::sizesListToPositions(const std::vector<double> &sizes)\n+{\n+\tconst int half = sizes.size();\n+\tstd::vector<double> positions(half * 2 + 1);\n+\tdouble x = 0.0;\n+\n+\tpositions[half] = 0.5;\n+\tfor (int i = 1; i <= half; i++) {\n+\t\tx += sizes[half - i];\n+\t\tpositions[half - i] = 0.5 - x;\n+\t\tpositions[half + i] = 0.5 + x;\n+\t}\n+\n+\treturn positions;\n+}\n+\n+class LscPolynomialLoader\n+{\n+public:\n+\tLscPolynomialLoader(const Size &sensorSize) : sensorSize_(sensorSize)\n+\t{\n+\t}\n+\n+\tint parseLscData(const YamlObject &yamlSets,\n+\t\t\t LensShadingCorrection::ShadingDescriptorMap &lscData);\n+\n+private:\n \tSize sensorSize_;\n-\tRectangle cropRectangle_;\n-\tconst std::vector<double> &xSizes_;\n-\tconst std::vector<double> &ySizes_;\n };\n \n int LscPolynomialLoader::parseLscData(const YamlObject &yamlSets,\n-\t\t\t\t      std::map<unsigned int, LensShadingCorrection::Components> &lscData)\n+\t\t\t\t      LensShadingCorrection::ShadingDescriptorMap &lscData)\n {\n \tconst auto &sets = yamlSets.asList();\n \tfor (const auto &yamlSet : sets) {\n@@ -115,7 +201,6 @@ int LscPolynomialLoader::parseLscData(const YamlObject &yamlSets,\n \t\t\treturn -EINVAL;\n \t\t}\n \n-\t\tLensShadingCorrection::Components &set = lscData[ct];\n \t\tpr = yamlSet[\"r\"].get<LscPolynomial>();\n \t\tpgr = yamlSet[\"gr\"].get<LscPolynomial>();\n \t\tpgb = yamlSet[\"gb\"].get<LscPolynomial>();\n@@ -133,12 +218,9 @@ int LscPolynomialLoader::parseLscData(const YamlObject &yamlSets,\n \t\tpgb->setReferenceImageSize(sensorSize_);\n \t\tpb->setReferenceImageSize(sensorSize_);\n \n-\t\tstd::vector<double> xPos(sizesListToPositions(xSizes_));\n-\t\tstd::vector<double> yPos(sizesListToPositions(ySizes_));\n-\t\tset.r = samplePolynomial(*pr, xPos, yPos, cropRectangle_);\n-\t\tset.gr = samplePolynomial(*pgr, xPos, yPos, cropRectangle_);\n-\t\tset.gb = samplePolynomial(*pgb, xPos, yPos, cropRectangle_);\n-\t\tset.b = samplePolynomial(*pb, xPos, yPos, cropRectangle_);\n+\t\tlscData.emplace(\n+\t\t\tct, std::make_unique<LscPolynomialShadingDescriptor>(\n+\t\t\t\t    *pr, *pgr, *pgb, *pb));\n \t}\n \n \tif (lscData.empty()) {\n@@ -149,70 +231,33 @@ int LscPolynomialLoader::parseLscData(const YamlObject &yamlSets,\n \treturn 0;\n }\n \n-/*\n- * The rkisp1 LSC grid spacing is defined by the cell sizes on the first half of\n- * the grid. This is then mirrored in hardware to the other half. See\n- * parseSizes() for further details. For easier handling, this function converts\n- * the cell sizes of half the grid to a list of position of the whole grid (on\n- * one axis). Example:\n- *\n- * input:   | 0.2 | 0.3 |\n- * output: 0.0   0.2   0.5   0.8   1.0\n- */\n-std::vector<double> LscPolynomialLoader::sizesListToPositions(const std::vector<double> &sizes)\n+class LscTableShadingDescriptor : public LensShadingCorrection::ShadingDescriptor\n {\n-\tconst int half = sizes.size();\n-\tstd::vector<double> positions(half * 2 + 1);\n-\tdouble x = 0.0;\n-\n-\tpositions[half] = 0.5;\n-\tfor (int i = 1; i <= half; i++) {\n-\t\tx += sizes[half - i];\n-\t\tpositions[half - i] = 0.5 - x;\n-\t\tpositions[half + i] = 0.5 + x;\n+public:\n+\tLscTableShadingDescriptor(LensShadingCorrection::Components components)\n+\t\t: lscData_(std::move(components))\n+\t{\n \t}\n \n-\treturn positions;\n-}\n-\n-std::vector<uint16_t> LscPolynomialLoader::samplePolynomial(const LscPolynomial &poly,\n-\t\t\t\t\t\t\t    const std::vector<double> &xPositions,\n-\t\t\t\t\t\t\t    const std::vector<double> &yPositions,\n-\t\t\t\t\t\t\t    const Rectangle &cropRectangle)\n-{\n-\tdouble m = poly.getM();\n-\tdouble x0 = cropRectangle.x / m;\n-\tdouble y0 = cropRectangle.y / m;\n-\tdouble w = cropRectangle.width / m;\n-\tdouble h = cropRectangle.height / m;\n-\tstd::vector<uint16_t> samples;\n-\n-\tsamples.reserve(xPositions.size() * yPositions.size());\n-\n-\tfor (double y : yPositions) {\n-\t\tfor (double x : xPositions) {\n-\t\t\tdouble xp = x0 + x * w;\n-\t\t\tdouble yp = y0 + y * h;\n-\t\t\t/*\n-\t\t\t * The hardware uses 2.10 fixed point format and limits\n-\t\t\t * the legal values to [1..3.999]. Scale and clamp the\n-\t\t\t * sampled value accordingly.\n-\t\t\t */\n-\t\t\tint v = static_cast<int>(\n-\t\t\t\tpoly.sampleAtNormalizedPixelPos(xp, yp) *\n-\t\t\t\t1024);\n-\t\t\tv = std::min(std::max(v, 1024), 4095);\n-\t\t\tsamples.push_back(v);\n-\t\t}\n+\tvoid sampleForCrop([[maybe_unused]] const Rectangle &cropRectangle,\n+\t\t\t   [[maybe_unused]] const std::vector<double> &xSizes,\n+\t\t\t   [[maybe_unused]] const std::vector<double> &ySizes,\n+\t\t\t   LensShadingCorrection::Components &components)\n+\t{\n+\t\tLOG(RkISP1Lsc, Warning)\n+\t\t\t<< \"Tabular LSC data doesn't support resampling.\";\n+\t\tcomponents = lscData_;\n \t}\n-\treturn samples;\n-}\n+\n+private:\n+\tLensShadingCorrection::Components lscData_;\n+};\n \n class LscTableLoader\n {\n public:\n \tint parseLscData(const YamlObject &yamlSets,\n-\t\t\t std::map<unsigned int, LensShadingCorrection::Components> &lscData);\n+\t\t\t LensShadingCorrection::ShadingDescriptorMap &lscData);\n \n private:\n \tstd::vector<uint16_t> parseTable(const YamlObject &tuningData,\n@@ -220,7 +265,7 @@ private:\n };\n \n int LscTableLoader::parseLscData(const YamlObject &yamlSets,\n-\t\t\t\t std::map<unsigned int, LensShadingCorrection::Components> &lscData)\n+\t\t\t\t LensShadingCorrection::ShadingDescriptorMap &lscData)\n {\n \tconst auto &sets = yamlSets.asList();\n \n@@ -234,8 +279,7 @@ int LscTableLoader::parseLscData(const YamlObject &yamlSets,\n \t\t\treturn -EINVAL;\n \t\t}\n \n-\t\tLensShadingCorrection::Components &set = lscData[ct];\n-\n+\t\tLensShadingCorrection::Components set;\n \t\tset.r = parseTable(yamlSet, \"r\");\n \t\tset.gr = parseTable(yamlSet, \"gr\");\n \t\tset.gb = parseTable(yamlSet, \"gb\");\n@@ -248,6 +292,9 @@ int LscTableLoader::parseLscData(const YamlObject &yamlSets,\n \t\t\t\t<< \" is missing tables\";\n \t\t\treturn -EINVAL;\n \t\t}\n+\n+\t\tlscData.emplace(\n+\t\t\tct, std::make_unique<LscTableShadingDescriptor>(std::move(set)));\n \t}\n \n \tif (lscData.empty()) {\n@@ -334,7 +381,7 @@ int LensShadingCorrection::init([[maybe_unused]] IPAContext &context,\n \t}\n \n \tint ret = 0;\n-\tstd::map<unsigned int, Components> lscData;\n+\tstd::map<unsigned int, std::unique_ptr<ShadingDescriptor>> lscData;\n \n \tstd::string type = tuningData[\"type\"].get<std::string>(\"table\");\n \tif (type == \"table\") {\n@@ -343,10 +390,11 @@ int LensShadingCorrection::init([[maybe_unused]] IPAContext &context,\n \t\tret = loader.parseLscData(yamlSets, lscData);\n \t} else if (type == \"polynomial\") {\n \t\tLOG(RkISP1Lsc, Debug) << \"Loading polynomial LSC data.\";\n-\t\tauto loader = LscPolynomialLoader(context.sensorInfo.activeAreaSize,\n-\t\t\t\t\t\t  context.sensorInfo.analogCrop,\n-\t\t\t\t\t\t  xSize_,\n-\t\t\t\t\t\t  ySize_);\n+\t\t/*\n+\t\t * \\todo: Most likely the reference frame should be native_size.\n+\t\t * Let's wait how the internal discussions progress.\n+\t\t */\n+\t\tauto loader = LscPolynomialLoader(context.sensorInfo.activeAreaSize);\n \t\tret = loader.parseLscData(yamlSets, lscData);\n \t} else {\n \t\tLOG(RkISP1Lsc, Error) << \"Unsupported LSC data type '\"\n@@ -357,7 +405,7 @@ int LensShadingCorrection::init([[maybe_unused]] IPAContext &context,\n \tif (ret)\n \t\treturn ret;\n \n-\tsets_.setData(std::move(lscData));\n+\tshadingDescriptors_.swap(lscData);\n \n \treturn 0;\n }\n@@ -393,6 +441,14 @@ int LensShadingCorrection::configure(IPAContext &context,\n \t\tyGrad_[i] = std::round(32768 / ySizes_[i]);\n \t}\n \n+\tLOG(RkISP1Lsc, Debug) << \"Sample LSC data for \" << configInfo.analogCrop;\n+\tstd::map<unsigned int, LensShadingCorrection::Components> shadingData;\n+\tfor (auto const &[t, descriptor] : shadingDescriptors_)\n+\t\tdescriptor->sampleForCrop(configInfo.analogCrop, xSize_, ySize_,\n+\t\t\t\t\t  shadingData[t]);\n+\n+\tsets_.setData(std::move(shadingData));\n+\n \tcontext.configuration.lsc.enabled = true;\n \treturn 0;\n }\ndiff --git a/src/ipa/rkisp1/algorithms/lsc.h b/src/ipa/rkisp1/algorithms/lsc.h\nindex 7b68dda1a0d4..43fee337931f 100644\n--- a/src/ipa/rkisp1/algorithms/lsc.h\n+++ b/src/ipa/rkisp1/algorithms/lsc.h\n@@ -8,6 +8,7 @@\n #pragma once\n \n #include <map>\n+#include <memory>\n \n #include \"libipa/interpolator.h\"\n \n@@ -36,10 +37,23 @@ public:\n \t\tstd::vector<uint16_t> b;\n \t};\n \n+\tclass ShadingDescriptor\n+\t{\n+\tpublic:\n+\t\tvirtual ~ShadingDescriptor() = default;\n+\t\tvirtual void sampleForCrop(const Rectangle &cropRectangle,\n+\t\t\t\t\t   const std::vector<double> &xSizes,\n+\t\t\t\t\t   const std::vector<double> &ySizes,\n+\t\t\t\t\t   Components &components) = 0;\n+\t};\n+\n+\tusing ShadingDescriptorMap = std::map<unsigned int, std::unique_ptr<ShadingDescriptor>>;\n+\n private:\n \tvoid setParameters(rkisp1_cif_isp_lsc_config &config);\n \tvoid copyTable(rkisp1_cif_isp_lsc_config &config, const Components &set0);\n \n+\tstd::map<unsigned int, std::unique_ptr<ShadingDescriptor>> shadingDescriptors_;\n \tipa::Interpolator<Components> sets_;\n \tstd::vector<double> xSize_;\n \tstd::vector<double> ySize_;\n",
    "prefixes": [
        "v1",
        "10/12"
    ]
}