Show a patch.

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

{
    "id": 24528,
    "url": "https://patchwork.libcamera.org/api/1.1/patches/24528/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/24528/",
    "project": {
        "id": 1,
        "url": "https://patchwork.libcamera.org/api/1.1/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": "<20250930122726.1837524-30-stefan.klug@ideasonboard.com>",
    "date": "2025-09-30T12:26:50",
    "name": "[v1,29/33] pipeline: rkisp1: Enable the dewarper based on the tuning file",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "b09de39f2e79c6d64ff9ff18727a9e9347150a88",
    "submitter": {
        "id": 184,
        "url": "https://patchwork.libcamera.org/api/1.1/people/184/?format=api",
        "name": "Stefan Klug",
        "email": "stefan.klug@ideasonboard.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/24528/mbox/",
    "series": [
        {
            "id": 5468,
            "url": "https://patchwork.libcamera.org/api/1.1/series/5468/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5468",
            "date": "2025-09-30T12:26:21",
            "name": "Full dewarper support on imx8mp",
            "version": 1,
            "mbox": "https://patchwork.libcamera.org/series/5468/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/24528/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/24528/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 D1EABC328C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 30 Sep 2025 13:34:18 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id E7CE76B5F0;\n\tTue, 30 Sep 2025 15:34:17 +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 1967C62C35\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 30 Sep 2025 15:34:15 +0200 (CEST)",
            "from ideasonboard.com (unknown [94.31.94.171])\n\tby perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id BEA7E16A;\n\tTue, 30 Sep 2025 15:32:46 +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=\"lovTQ5pR\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1759239166;\n\tbh=eauvXfNddQH20Q9V/RZ1gG3g7AsZ7qaeEL4sbl+f9T0=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=lovTQ5pRrtX7I7HetqOL6HI6jeqGhizq8S+e2ck2MItTYqaFraqLuWY2XDOhzf7Uy\n\tWELGZ48gckYOas5/db7Lk61ac5RfxdCVCEdO7M4ugPJ7KduaW2/svR1JvCNA0RKIUT\n\tDuOT+GmrAuElMKoFVHwxV4d98Bn5f6CMD1Je2PLU=",
        "From": "Stefan Klug <stefan.klug@ideasonboard.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Cc": "Stefan Klug <stefan.klug@ideasonboard.com>",
        "Subject": "[PATCH v1 29/33] pipeline: rkisp1: Enable the dewarper based on the\n\ttuning file",
        "Date": "Tue, 30 Sep 2025 14:26:50 +0200",
        "Message-ID": "<20250930122726.1837524-30-stefan.klug@ideasonboard.com>",
        "X-Mailer": "git-send-email 2.48.1",
        "In-Reply-To": "<20250930122726.1837524-1-stefan.klug@ideasonboard.com>",
        "References": "<20250930122726.1837524-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": "To do actual lens dewarping, the dewarper will be configured based on\nthe tuning file. As a first step implement the basic loading of the\ntuning file and enable/disable the dewarper for the given camera based\non the existence of the \"Dewarp\" algorithm in the tuning file.\n\nTodo: This is an backwards incompatible change in that the dewarper is\ncurrently included in the chain unconditionally. Some users may want to\nnot use the dewarper, so it is sensible to make that configurable. If it\nshould be in the algorithms section or in a different one is open for\ndebate.\n\nSigned-off-by: Stefan Klug <stefan.klug@ideasonboard.com>\n---\n src/ipa/libipa/module.h                  |  4 ++\n src/libcamera/pipeline/rkisp1/rkisp1.cpp | 51 +++++++++++++++++++++++-\n 2 files changed, 54 insertions(+), 1 deletion(-)",
    "diff": "diff --git a/src/ipa/libipa/module.h b/src/ipa/libipa/module.h\nindex 0fb51916fff6..84386f901534 100644\n--- a/src/ipa/libipa/module.h\n+++ b/src/ipa/libipa/module.h\n@@ -74,6 +74,10 @@ private:\n \tint createAlgorithm(Context &context, const YamlObject &data)\n \t{\n \t\tconst auto &[name, algoData] = *data.asDict().begin();\n+\n+\t\tif (name == \"Dewarp\")\n+\t\t\treturn 0;\n+\n \t\tstd::unique_ptr<Algorithm<Module>> algo = createAlgorithm(name);\n \t\tif (!algo) {\n \t\t\tLOG(IPAModuleAlgo, Error)\ndiff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\nindex 1046930857e1..07dd5dc8d99a 100644\n--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n@@ -16,6 +16,7 @@\n #include <linux/media-bus-format.h>\n #include <linux/rkisp1-config.h>\n \n+#include <libcamera/base/file.h>\n #include <libcamera/base/log.h>\n #include <libcamera/base/utils.h>\n \n@@ -47,6 +48,7 @@\n #include \"libcamera/internal/v4l2_request.h\"\n #include \"libcamera/internal/v4l2_subdevice.h\"\n #include \"libcamera/internal/v4l2_videodevice.h\"\n+#include \"libcamera/internal/yaml_parser.h\"\n \n #include \"rkisp1_path.h\"\n \n@@ -123,6 +125,7 @@ public:\n \t */\n \tMediaPipeline pipe_;\n \n+\tbool canUseDewarper_;\n \tbool usesDewarper_;\n \n private:\n@@ -131,6 +134,7 @@ private:\n \t\t\t       const ControlList &sensorControls);\n \n \tvoid metadataReady(unsigned int frame, const ControlList &metadata);\n+\tint loadTuningFile(const std::string &file);\n };\n \n class RkISP1CameraConfiguration : public CameraConfiguration\n@@ -416,6 +420,51 @@ int RkISP1CameraData::loadIPA(unsigned int hwRevision, uint32_t supportedBlocks)\n \t\treturn ret;\n \t}\n \n+\tret = loadTuningFile(ipaTuningFile);\n+\tif (ret < 0) {\n+\t\tLOG(RkISP1, Error) << \"Failed to load tuning file\";\n+\t\treturn ret;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+int RkISP1CameraData::loadTuningFile(const std::string &path)\n+{\n+\tif (!pipe()->dewarper_)\n+\t\t/* Nothing to do without dewarper */\n+\t\treturn 0;\n+\n+\tLOG(RkISP1, Debug) << \"Load tuning file \" << path;\n+\n+\tFile file(path);\n+\tif (!file.open(File::OpenModeFlag::ReadOnly)) {\n+\t\tint ret = file.error();\n+\t\tLOG(RkISP1, Error)\n+\t\t\t<< \"Failed to open tuning file \"\n+\t\t\t<< path << \": \" << strerror(-ret);\n+\t\treturn ret;\n+\t}\n+\n+\tstd::unique_ptr<libcamera::YamlObject> data = YamlParser::parse(file);\n+\tif (!data)\n+\t\treturn -EINVAL;\n+\n+\tif (!data->contains(\"algorithms\")) {\n+\t\tLOG(RkISP1, Error)\n+\t\t\t<< \"Tuning file doesn't contain any algorithm\";\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tconst auto &algos = (*data)[\"algorithms\"].asList();\n+\tfor (const auto &algo : algos) {\n+\t\tif (algo.contains(\"Dewarp\")) {\n+\t\t\tconst auto &params = algo[\"Dewarp\"];\n+\n+\t\t\tcanUseDewarper_ = true;\n+\t\t}\n+\t}\n+\n \treturn 0;\n }\n \n@@ -572,7 +621,7 @@ CameraConfiguration::Status RkISP1CameraConfiguration::validate()\n \t */\n \tbool transposeAfterIsp = false;\n \tbool useDewarper = false;\n-\tif (pipe->dewarper_) {\n+\tif (data_->canUseDewarper_) {\n \t\t/*\n \t\t * Platforms with dewarper support, such as i.MX8MP, support\n \t\t * only a single stream. We can inspect config_[0] only here.\n",
    "prefixes": [
        "v1",
        "29/33"
    ]
}