{"id":25199,"url":"https://patchwork.libcamera.org/api/1.1/patches/25199/?format=json","web_url":"https://patchwork.libcamera.org/patch/25199/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/1.1/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":"<20251125162851.2301793-21-stefan.klug@ideasonboard.com>","date":"2025-11-25T16:28:32","name":"[v3,20/29] pipeline: rkisp1: Enable the dewarper based on the tuning file","commit_ref":null,"pull_url":null,"state":"accepted","archived":false,"hash":"67f18b8057aa1b00882fdd71620b9b5ffe67a705","submitter":{"id":184,"url":"https://patchwork.libcamera.org/api/1.1/people/184/?format=json","name":"Stefan Klug","email":"stefan.klug@ideasonboard.com"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/25199/mbox/","series":[{"id":5613,"url":"https://patchwork.libcamera.org/api/1.1/series/5613/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=5613","date":"2025-11-25T16:28:12","name":"Full dewarper support on imx8mp","version":3,"mbox":"https://patchwork.libcamera.org/series/5613/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/25199/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/25199/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 4F038C333C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 25 Nov 2025 16:29:56 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 1323060AA9;\n\tTue, 25 Nov 2025 17:29:56 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 9CCA160A9E\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 25 Nov 2025 17:29:54 +0100 (CET)","from ideasonboard.com (unknown\n\t[IPv6:2a00:6020:448c:6c00:bae1:340c:573c:570b])\n\tby perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id B3515FDB;\n\tTue, 25 Nov 2025 17:27:45 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"iH8MQHEF\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1764088065;\n\tbh=SD7cz3jxHVqUE3yKJ+8BYwHqczjKFQHHlcGigHlrdN0=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=iH8MQHEFGqw6eFDDs86z/nlfnVAmUXICrN1vNFtH0vx4xKcOtVkhg0BCVVw9RP/KQ\n\tbF4AcCm+mcMsw7P7MYYlEFG1RmdvDUL0CVARQP5Joqml29HTTQozui4WGr9cW6rSVf\n\tGrSEzlRzIepMMhEDGEkNtJbhG8l2V+Bdnd+FXlXY=","From":"Stefan Klug <stefan.klug@ideasonboard.com>","To":"libcamera-devel@lists.libcamera.org","Cc":"Stefan Klug <stefan.klug@ideasonboard.com>,\n\tPaul Elder <paul.elder@ideasonboard.com>","Subject":"[PATCH v3 20/29] pipeline: rkisp1: Enable the dewarper based on the\n\ttuning file","Date":"Tue, 25 Nov 2025 17:28:32 +0100","Message-ID":"<20251125162851.2301793-21-stefan.klug@ideasonboard.com>","X-Mailer":"git-send-email 2.51.0","In-Reply-To":"<20251125162851.2301793-1-stefan.klug@ideasonboard.com>","References":"<20251125162851.2301793-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.\n\nAs 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\" entry under a new top level element\n'modules' in the tuning file.\n\nNote: 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.\n\nSigned-off-by: Stefan Klug <stefan.klug@ideasonboard.com>\nReviewed-by: Paul Elder <paul.elder@ideasonboard.com>\n\n---\n\nChanges in v3:\n- Collected tag\n- The config is now looked up under the toplevel key 'modules' instead\n  of 'algorithms'\n- Properly initialize canUseDewarper_ and usesDewarper() so that it\n  still works if there is no dewarper or it is not contained in the\ntuning file.\n\nChanges in v2:\n- Drop unused params variable\n- Moved patch a bit earlier so canUseDewarper is available for handling\n  the orientation\n---\n src/libcamera/pipeline/rkisp1/rkisp1.cpp | 52 +++++++++++++++++++++++-\n 1 file changed, 50 insertions(+), 2 deletions(-)","diff":"diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\nindex 2972d6e1cbd1..e3dca8b837e8 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@@ -46,6 +47,7 @@\n #include \"libcamera/internal/pipeline_handler.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@@ -94,7 +96,8 @@ public:\n \tRkISP1CameraData(PipelineHandler *pipe, RkISP1MainPath *mainPath,\n \t\t\t RkISP1SelfPath *selfPath)\n \t\t: Camera::Private(pipe), frame_(0), frameInfo_(pipe),\n-\t\t  mainPath_(mainPath), selfPath_(selfPath)\n+\t\t  mainPath_(mainPath), selfPath_(selfPath),\n+\t\t  canUseDewarper_(false), usesDewarper_(false)\n \t{\n \t}\n \n@@ -122,6 +125,7 @@ public:\n \t */\n \tMediaPipeline pipe_;\n \n+\tbool canUseDewarper_;\n \tbool usesDewarper_;\n \n private:\n@@ -130,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@@ -411,6 +416,49 @@ 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+\tint ret;\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\tret = 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(\"modules\"))\n+\t\treturn 0;\n+\n+\tconst auto &modules = (*data)[\"modules\"].asList();\n+\tfor (const auto &module : modules) {\n+\t\tif (module.contains(\"Dewarp\")) {\n+\t\t\tcanUseDewarper_ = true;\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+\n \treturn 0;\n }\n \n@@ -574,7 +622,7 @@ CameraConfiguration::Status RkISP1CameraConfiguration::validate()\n \t\t}\n \t}\n \n-\tbool useDewarper = (pipe->dewarper_ && !isRaw);\n+\tbool useDewarper = (data_->canUseDewarper_ && !isRaw);\n \n \t/*\n \t * If there are more than one stream in the configuration figure out the\n","prefixes":["v3","20/29"]}