Patch Detail
Show a patch.
GET /api/1.1/patches/16820/?format=api
{ "id": 16820, "url": "https://patchwork.libcamera.org/api/1.1/patches/16820/?format=api", "web_url": "https://patchwork.libcamera.org/patch/16820/", "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": "<20220727023816.30008-9-laurent.pinchart@ideasonboard.com>", "date": "2022-07-27T02:38:10", "name": "[libcamera-devel,v7,08/14] ipa: raspberrypi: Use YamlParser to replace dependency on boost", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": false, "hash": "f03179e825dd5a3437f4d3e63dbdf0af706584a2", "submitter": { "id": 2, "url": "https://patchwork.libcamera.org/api/1.1/people/2/?format=api", "name": "Laurent Pinchart", "email": "laurent.pinchart@ideasonboard.com" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/16820/mbox/", "series": [ { "id": 3331, "url": "https://patchwork.libcamera.org/api/1.1/series/3331/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=3331", "date": "2022-07-27T02:38:02", "name": "Replace boost JSON parser with libyaml in Raspberry Pi IPA", "version": 7, "mbox": "https://patchwork.libcamera.org/series/3331/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/16820/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/16820/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 A2BC3BE173\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 27 Jul 2022 02:38:32 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 40AB963331;\n\tWed, 27 Jul 2022 04:38:32 +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 87BF563315\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 27 Jul 2022 04:38:27 +0200 (CEST)", "from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 07EBB56D;\n\tWed, 27 Jul 2022 04:38:26 +0200 (CEST)" ], "DKIM-Signature": [ "v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1658889512;\n\tbh=C+sXxYIz/yBXCraY1dQQe7KZHHXpTJB3vWxTW5+eQAM=;\n\th=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:\n\tFrom;\n\tb=Ub6MJG/SxiWB4jMGUMvaKr7fYvRZAXIXkea6QMcKH656EuERH3fBr4MT5ZLL43ll2\n\ttkh2GQuqORITfSpfDDUWWwt1jGPSif4Rvfs/Tfn3NAiUl8DOmrNR1skIsz/FGn/o0j\n\tu2thfpPJJOrleDAmogedhr/OGaqI8yi9A7rvnEK7aIL0Ez/eiJTuXn/r1nDSkj4Y0V\n\tDvZC7pXULZieQGzVKZr1W49z4UDLBFUj48tLThbnUb0onZOUkqTBzdVnUjqCkj3gqa\n\tctu88pdnGyWxMMPMx+p21OceIG8TBY9mBeXwaCNyRHk9lWu0flwZO1a5nCuutOCzwt\n\ta3BjN5yjlrLmA==", "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1658889507;\n\tbh=C+sXxYIz/yBXCraY1dQQe7KZHHXpTJB3vWxTW5+eQAM=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=tmIVCYma9tiUPa5noG+KHStAZhTRCdiHvPWSfU0tfRZc2wRPeVnUKLSHRda2L8g5T\n\tGoyuIVYspMmfJXCUoVRwTHRnK/PcpkLDdcOM7sONFZWOd2NNq7CfZGRuZcSg3jjbpk\n\tJz52Nx2LXM7UUf8x/51V/GkQ3VvLzWZi7gMDESWY=" ], "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"tmIVCYma\"; dkim-atps=neutral", "To": "libcamera-devel@lists.libcamera.org", "Date": "Wed, 27 Jul 2022 05:38:10 +0300", "Message-Id": "<20220727023816.30008-9-laurent.pinchart@ideasonboard.com>", "X-Mailer": "git-send-email 2.35.1", "In-Reply-To": "<20220727023816.30008-1-laurent.pinchart@ideasonboard.com>", "References": "<20220727023816.30008-1-laurent.pinchart@ideasonboard.com>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Subject": "[libcamera-devel] [PATCH v7 08/14] ipa: raspberrypi: Use YamlParser\n\tto replace dependency on boost", "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>", "From": "Laurent Pinchart via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>", "Reply-To": "Laurent Pinchart <laurent.pinchart@ideasonboard.com>", "Errors-To": "libcamera-devel-bounces@lists.libcamera.org", "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>" }, "content": "The Raspberry Pi IPA module depends on boost only to parse the JSON\ntuning data files. As libcamera depends on libyaml, use the YamlParser\nclass to parse those files and drop the dependency on boost.\n\nSigned-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n---\nChanges since v6:\n\n- Propagate tuning data read errors\n---\n README.rst | 6 -\n src/ipa/raspberrypi/controller/algorithm.cpp | 2 +-\n src/ipa/raspberrypi/controller/algorithm.h | 6 +-\n src/ipa/raspberrypi/controller/controller.cpp | 27 ++--\n src/ipa/raspberrypi/controller/pwl.cpp | 12 +-\n src/ipa/raspberrypi/controller/pwl.h | 4 +-\n src/ipa/raspberrypi/controller/rpi/agc.cpp | 136 ++++++++++--------\n src/ipa/raspberrypi/controller/rpi/agc.h | 10 +-\n src/ipa/raspberrypi/controller/rpi/alsc.cpp | 105 +++++++-------\n src/ipa/raspberrypi/controller/rpi/alsc.h | 2 +-\n src/ipa/raspberrypi/controller/rpi/awb.cpp | 134 ++++++++++-------\n src/ipa/raspberrypi/controller/rpi/awb.h | 8 +-\n .../controller/rpi/black_level.cpp | 12 +-\n .../raspberrypi/controller/rpi/black_level.h | 2 +-\n src/ipa/raspberrypi/controller/rpi/ccm.cpp | 47 +++---\n src/ipa/raspberrypi/controller/rpi/ccm.h | 4 +-\n .../raspberrypi/controller/rpi/contrast.cpp | 28 ++--\n src/ipa/raspberrypi/controller/rpi/contrast.h | 2 +-\n src/ipa/raspberrypi/controller/rpi/dpc.cpp | 7 +-\n src/ipa/raspberrypi/controller/rpi/dpc.h | 2 +-\n src/ipa/raspberrypi/controller/rpi/geq.cpp | 10 +-\n src/ipa/raspberrypi/controller/rpi/geq.h | 2 +-\n src/ipa/raspberrypi/controller/rpi/lux.cpp | 30 +++-\n src/ipa/raspberrypi/controller/rpi/lux.h | 2 +-\n src/ipa/raspberrypi/controller/rpi/noise.cpp | 14 +-\n src/ipa/raspberrypi/controller/rpi/noise.h | 2 +-\n src/ipa/raspberrypi/controller/rpi/sdn.cpp | 6 +-\n src/ipa/raspberrypi/controller/rpi/sdn.h | 2 +-\n .../raspberrypi/controller/rpi/sharpen.cpp | 8 +-\n src/ipa/raspberrypi/controller/rpi/sharpen.h | 2 +-\n src/ipa/raspberrypi/meson.build | 1 -\n src/ipa/raspberrypi/raspberrypi.cpp | 1 +\n 32 files changed, 362 insertions(+), 274 deletions(-)", "diff": "diff --git a/README.rst b/README.rst\nindex b9e72d81b90c..3d4e48ddc8f6 100644\n--- a/README.rst\n+++ b/README.rst\n@@ -71,12 +71,6 @@ for improved debugging: [optional]\n information, and libunwind is not needed if both libdw and the glibc\n backtrace() function are available.\n \n-for the Raspberry Pi IPA: [optional]\n- libboost-dev\n-\n- Support for Raspberry Pi can be disabled through the meson\n- 'pipelines' option to avoid this dependency.\n-\n for device hotplug enumeration: [optional]\n libudev-dev\n \ndiff --git a/src/ipa/raspberrypi/controller/algorithm.cpp b/src/ipa/raspberrypi/controller/algorithm.cpp\nindex d73cb36fe2d6..6d91ee292bd1 100644\n--- a/src/ipa/raspberrypi/controller/algorithm.cpp\n+++ b/src/ipa/raspberrypi/controller/algorithm.cpp\n@@ -9,7 +9,7 @@\n \n using namespace RPiController;\n \n-int Algorithm::read([[maybe_unused]] boost::property_tree::ptree const ¶ms)\n+int Algorithm::read([[maybe_unused]] const libcamera::YamlObject ¶ms)\n {\n \treturn 0;\n }\ndiff --git a/src/ipa/raspberrypi/controller/algorithm.h b/src/ipa/raspberrypi/controller/algorithm.h\nindex 0c5566fda874..cbbb13ba07a3 100644\n--- a/src/ipa/raspberrypi/controller/algorithm.h\n+++ b/src/ipa/raspberrypi/controller/algorithm.h\n@@ -15,10 +15,10 @@\n #include <memory>\n #include <map>\n \n+#include \"libcamera/internal/yaml_parser.h\"\n+\n #include \"controller.h\"\n \n-#include <boost/property_tree/ptree.hpp>\n-\n namespace RPiController {\n \n /* This defines the basic interface for all control algorithms. */\n@@ -35,7 +35,7 @@ public:\n \tvirtual bool isPaused() const { return paused_; }\n \tvirtual void pause() { paused_ = true; }\n \tvirtual void resume() { paused_ = false; }\n-\tvirtual int read(boost::property_tree::ptree const ¶ms);\n+\tvirtual int read(const libcamera::YamlObject ¶ms);\n \tvirtual void initialise();\n \tvirtual void switchMode(CameraMode const &cameraMode, Metadata *metadata);\n \tvirtual void prepare(Metadata *imageMetadata);\ndiff --git a/src/ipa/raspberrypi/controller/controller.cpp b/src/ipa/raspberrypi/controller/controller.cpp\nindex d91ac90704cb..bceb62540dbd 100644\n--- a/src/ipa/raspberrypi/controller/controller.cpp\n+++ b/src/ipa/raspberrypi/controller/controller.cpp\n@@ -5,14 +5,16 @@\n * controller.cpp - ISP controller\n */\n \n+#include <assert.h>\n+\n+#include <libcamera/base/file.h>\n #include <libcamera/base/log.h>\n \n+#include \"libcamera/internal/yaml_parser.h\"\n+\n #include \"algorithm.h\"\n #include \"controller.h\"\n \n-#include <boost/property_tree/json_parser.hpp>\n-#include <boost/property_tree/ptree.hpp>\n-\n using namespace RPiController;\n using namespace libcamera;\n \n@@ -34,18 +36,25 @@ Controller::~Controller() {}\n \n int Controller::read(char const *filename)\n {\n-\tboost::property_tree::ptree root;\n-\tboost::property_tree::read_json(filename, root);\n-\tfor (auto const &keyAndValue : root) {\n-\t\tAlgorithm *algo = createAlgorithm(keyAndValue.first.c_str());\n+\tFile file(filename);\n+\tif (!file.open(File::OpenModeFlag::ReadOnly)) {\n+\t\tLOG(RPiController, Warning)\n+\t\t\t<< \"Failed to open tuning file '\" << filename << \"'\";\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tstd::unique_ptr<YamlObject> root = YamlParser::parse(file);\n+\n+\tfor (auto const &[key, value] : root->asDict()) {\n+\t\tAlgorithm *algo = createAlgorithm(key.c_str());\n \t\tif (algo) {\n-\t\t\tint ret = algo->read(keyAndValue.second);\n+\t\t\tint ret = algo->read(value);\n \t\t\tif (ret)\n \t\t\t\treturn ret;\n \t\t\talgorithms_.push_back(AlgorithmPtr(algo));\n \t\t} else\n \t\t\tLOG(RPiController, Warning)\n-\t\t\t\t<< \"No algorithm found for \\\"\" << keyAndValue.first << \"\\\"\";\n+\t\t\t\t<< \"No algorithm found for \\\"\" << key << \"\\\"\";\n \t}\n \n \treturn 0;\ndiff --git a/src/ipa/raspberrypi/controller/pwl.cpp b/src/ipa/raspberrypi/controller/pwl.cpp\nindex fde0b298c6ce..8e6201920062 100644\n--- a/src/ipa/raspberrypi/controller/pwl.cpp\n+++ b/src/ipa/raspberrypi/controller/pwl.cpp\n@@ -12,13 +12,15 @@\n \n using namespace RPiController;\n \n-int Pwl::read(boost::property_tree::ptree const ¶ms)\n+int Pwl::read(const libcamera::YamlObject ¶ms)\n {\n-\tfor (auto it = params.begin(); it != params.end(); it++) {\n-\t\tdouble x = it->second.get_value<double>();\n-\t\tassert(it == params.begin() || x > points_.back().x);\n+\tconst auto &list = params.asList();\n+\n+\tfor (auto it = list.begin(); it != list.end(); it++) {\n+\t\tdouble x = it->get<double>(0.0);\n+\t\tassert(it == list.begin() || x > points_.back().x);\n \t\tit++;\n-\t\tdouble y = it->second.get_value<double>();\n+\t\tdouble y = it->get<double>(0.0);\n \t\tpoints_.push_back(Point(x, y));\n \t}\n \tassert(points_.size() >= 2);\ndiff --git a/src/ipa/raspberrypi/controller/pwl.h b/src/ipa/raspberrypi/controller/pwl.h\nindex ef1cc2ed113a..546482cd04d7 100644\n--- a/src/ipa/raspberrypi/controller/pwl.h\n+++ b/src/ipa/raspberrypi/controller/pwl.h\n@@ -9,7 +9,7 @@\n #include <math.h>\n #include <vector>\n \n-#include <boost/property_tree/ptree.hpp>\n+#include \"libcamera/internal/yaml_parser.h\"\n \n namespace RPiController {\n \n@@ -57,7 +57,7 @@ public:\n \t};\n \tPwl() {}\n \tPwl(std::vector<Point> const &points) : points_(points) {}\n-\tint read(boost::property_tree::ptree const ¶ms);\n+\tint read(const libcamera::YamlObject ¶ms);\n \tvoid append(double x, double y, const double eps = 1e-6);\n \tvoid prepend(double x, double y, const double eps = 1e-6);\n \tInterval domain() const;\ndiff --git a/src/ipa/raspberrypi/controller/rpi/agc.cpp b/src/ipa/raspberrypi/controller/rpi/agc.cpp\nindex 153493f8b8e2..9fd339c6904e 100644\n--- a/src/ipa/raspberrypi/controller/rpi/agc.cpp\n+++ b/src/ipa/raspberrypi/controller/rpi/agc.cpp\n@@ -31,67 +31,76 @@ LOG_DEFINE_CATEGORY(RPiAgc)\n \n static constexpr unsigned int PipelineBits = 13; /* seems to be a 13-bit pipeline */\n \n-int AgcMeteringMode::read(boost::property_tree::ptree const ¶ms)\n+int AgcMeteringMode::read(const libcamera::YamlObject ¶ms)\n {\n-\tint num = 0;\n-\n-\tfor (auto &p : params.get_child(\"weights\")) {\n-\t\tif (num == AgcStatsSize) {\n-\t\t\tLOG(RPiAgc, Error) << \"AgcMeteringMode: too many weights\";\n-\t\t\treturn -EINVAL;\n-\t\t}\n-\t\tweights[num++] = p.second.get_value<double>();\n-\t}\n-\n-\tif (num != AgcStatsSize) {\n-\t\tLOG(RPiAgc, Error) << \"AgcMeteringMode: insufficient weights\";\n+\tconst YamlObject &yamlWeights = params[\"weights\"];\n+\tif (yamlWeights.size() != AgcStatsSize) {\n+\t\tLOG(RPiAgc, Error) << \"AgcMeteringMode: Incorrect number of weights\";\n \t\treturn -EINVAL;\n \t}\n \n+\tunsigned int num = 0;\n+\tfor (const auto &p : yamlWeights.asList()) {\n+\t\tauto value = p.get<double>();\n+\t\tif (!value)\n+\t\t\treturn -EINVAL;\n+\t\tweights[num++] = *value;\n+\t}\n+\n \treturn 0;\n }\n \n static std::tuple<int, std::string>\n-readMeteringModes(std::map<std::string, AgcMeteringMode> &meteringModes,\n-\t\t boost::property_tree::ptree const ¶ms)\n+readMeteringModes(std::map<std::string, AgcMeteringMode> &metering_modes,\n+\t\t const libcamera::YamlObject ¶ms)\n {\n \tstd::string first;\n \tint ret;\n \n-\tfor (auto &p : params) {\n+\tfor (const auto &[key, value] : params.asDict()) {\n \t\tAgcMeteringMode meteringMode;\n-\t\tret = meteringMode.read(p.second);\n+\t\tret = meteringMode.read(value);\n \t\tif (ret)\n \t\t\treturn { ret, {} };\n \n-\t\tmeteringModes[p.first] = std::move(meteringMode);\n+\t\tmetering_modes[key] = std::move(meteringMode);\n \t\tif (first.empty())\n-\t\t\tfirst = p.first;\n+\t\t\tfirst = key;\n \t}\n \n \treturn { 0, first };\n }\n \n static int readList(std::vector<double> &list,\n-\t\t boost::property_tree::ptree const ¶ms)\n+\t\t const libcamera::YamlObject ¶ms)\n {\n-\tfor (auto &p : params)\n-\t\tlist.push_back(p.second.get_value<double>());\n+\tfor (const auto &p : params.asList()) {\n+\t\tauto value = p.get<double>();\n+\t\tif (!value)\n+\t\t\treturn -EINVAL;\n+\t\tlist.push_back(*value);\n+\t}\n+\n \treturn list.size();\n }\n \n static int readList(std::vector<Duration> &list,\n-\t\t boost::property_tree::ptree const ¶ms)\n+\t\t const libcamera::YamlObject ¶ms)\n {\n-\tfor (auto &p : params)\n-\t\tlist.push_back(p.second.get_value<double>() * 1us);\n+\tfor (const auto &p : params.asList()) {\n+\t\tauto value = p.get<double>();\n+\t\tif (!value)\n+\t\t\treturn -EINVAL;\n+\t\tlist.push_back(*value * 1us);\n+\t}\n+\n \treturn list.size();\n }\n \n-int AgcExposureMode::read(boost::property_tree::ptree const ¶ms)\n+int AgcExposureMode::read(const libcamera::YamlObject ¶ms)\n {\n-\tint numShutters = readList(shutter, params.get_child(\"shutter\"));\n-\tint numAgs = readList(gain, params.get_child(\"gain\"));\n+\tint numShutters = readList(shutter, params[\"shutter\"]);\n+\tint numAgs = readList(gain, params[\"gain\"]);\n \n \tif (numShutters < 2 || numAgs < 2) {\n \t\tLOG(RPiAgc, Error)\n@@ -110,28 +119,28 @@ int AgcExposureMode::read(boost::property_tree::ptree const ¶ms)\n \n static std::tuple<int, std::string>\n readExposureModes(std::map<std::string, AgcExposureMode> &exposureModes,\n-\t\t boost::property_tree::ptree const ¶ms)\n+\t\t const libcamera::YamlObject ¶ms)\n {\n \tstd::string first;\n \tint ret;\n \n-\tfor (auto &p : params) {\n+\tfor (const auto &[key, value] : params.asDict()) {\n \t\tAgcExposureMode exposureMode;\n-\t\tret = exposureMode.read(p.second);\n+\t\tret = exposureMode.read(value);\n \t\tif (ret)\n \t\t\treturn { ret, {} };\n \n-\t\texposureModes[p.first] = std::move(exposureMode);\n+\t\texposureModes[key] = std::move(exposureMode);\n \t\tif (first.empty())\n-\t\t\tfirst = p.first;\n+\t\t\tfirst = key;\n \t}\n \n \treturn { 0, first };\n }\n \n-int AgcConstraint::read(boost::property_tree::ptree const ¶ms)\n+int AgcConstraint::read(const libcamera::YamlObject ¶ms)\n {\n-\tstd::string boundString = params.get<std::string>(\"bound\", \"\");\n+\tstd::string boundString = params[\"bound\"].get<std::string>(\"\");\n \ttransform(boundString.begin(), boundString.end(),\n \t\t boundString.begin(), ::toupper);\n \tif (boundString != \"UPPER\" && boundString != \"LOWER\") {\n@@ -139,20 +148,29 @@ int AgcConstraint::read(boost::property_tree::ptree const ¶ms)\n \t\treturn -EINVAL;\n \t}\n \tbound = boundString == \"UPPER\" ? Bound::UPPER : Bound::LOWER;\n-\tqLo = params.get<double>(\"q_lo\");\n-\tqHi = params.get<double>(\"q_hi\");\n-\treturn yTarget.read(params.get_child(\"y_target\"));\n+\n+\tauto value = params[\"q_lo\"].get<double>();\n+\tif (!value)\n+\t\treturn -EINVAL;\n+\tqLo = *value;\n+\n+\tvalue = params[\"q_hi\"].get<double>();\n+\tif (!value)\n+\t\treturn -EINVAL;\n+\tqHi = *value;\n+\n+\treturn yTarget.read(params[\"y_target\"]);\n }\n \n static std::tuple<int, AgcConstraintMode>\n-readConstraintMode(boost::property_tree::ptree const ¶ms)\n+readConstraintMode(const libcamera::YamlObject ¶ms)\n {\n \tAgcConstraintMode mode;\n \tint ret;\n \n-\tfor (auto &p : params) {\n+\tfor (const auto &p : params.asList()) {\n \t\tAgcConstraint constraint;\n-\t\tret = constraint.read(p.second);\n+\t\tret = constraint.read(p);\n \t\tif (ret)\n \t\t\treturn { ret, {} };\n \n@@ -164,53 +182,55 @@ readConstraintMode(boost::property_tree::ptree const ¶ms)\n \n static std::tuple<int, std::string>\n readConstraintModes(std::map<std::string, AgcConstraintMode> &constraintModes,\n-\t\t boost::property_tree::ptree const ¶ms)\n+\t\t const libcamera::YamlObject ¶ms)\n {\n \tstd::string first;\n \tint ret;\n \n-\tfor (auto &p : params) {\n-\t\tstd::tie(ret, constraintModes[p.first]) = readConstraintMode(p.second);\n+\tfor (const auto &[key, value] : params.asDict()) {\n+\t\tstd::tie(ret, constraintModes[key]) = readConstraintMode(value);\n \t\tif (ret)\n \t\t\treturn { ret, {} };\n \n \t\tif (first.empty())\n-\t\t\tfirst = p.first;\n+\t\t\tfirst = key;\n \t}\n \n \treturn { 0, first };\n }\n \n-int AgcConfig::read(boost::property_tree::ptree const ¶ms)\n+int AgcConfig::read(const libcamera::YamlObject ¶ms)\n {\n \tLOG(RPiAgc, Debug) << \"AgcConfig\";\n \tint ret;\n \n \tstd::tie(ret, defaultMeteringMode) =\n-\t\treadMeteringModes(meteringModes, params.get_child(\"metering_modes\"));\n+\t\treadMeteringModes(meteringModes, params[\"metering_modes\"]);\n \tif (ret)\n \t\treturn ret;\n \tstd::tie(ret, defaultExposureMode) =\n-\t\treadExposureModes(exposureModes, params.get_child(\"exposure_modes\"));\n+\t\treadExposureModes(exposureModes, params[\"exposure_modes\"]);\n \tif (ret)\n \t\treturn ret;\n \tstd::tie(ret, defaultConstraintMode) =\n-\t\treadConstraintModes(constraintModes, params.get_child(\"constraint_modes\"));\n+\t\treadConstraintModes(constraintModes, params[\"constraint_modes\"]);\n \tif (ret)\n \t\treturn ret;\n \n-\tret = yTarget.read(params.get_child(\"y_target\"));\n+\tret = yTarget.read(params[\"y_target\"]);\n \tif (ret)\n \t\treturn ret;\n \n-\tspeed = params.get<double>(\"speed\", 0.2);\n-\tstartupFrames = params.get<uint16_t>(\"startup_frames\", 10);\n-\tconvergenceFrames = params.get<unsigned int>(\"convergence_frames\", 6);\n-\tfastReduceThreshold = params.get<double>(\"fast_reduce_threshold\", 0.4);\n-\tbaseEv = params.get<double>(\"base_ev\", 1.0);\n+\tspeed = params[\"speed\"].get<double>(0.2);\n+\tstartupFrames = params[\"startup_frames\"].get<uint16_t>(10);\n+\tconvergenceFrames = params[\"convergence_frames\"].get<unsigned int>(6);\n+\tfastReduceThreshold = params[\"fast_reduce_threshold\"].get<double>(0.4);\n+\tbaseEv = params[\"base_ev\"].get<double>(1.0);\n+\n \t/* Start with quite a low value as ramping up is easier than ramping down. */\n-\tdefaultExposureTime = params.get<double>(\"default_exposure_time\", 1000) * 1us;\n-\tdefaultAnalogueGain = params.get<double>(\"default_analogueGain\", 1.0);\n+\tdefaultExposureTime = params[\"default_exposure_time\"].get<double>(1000) * 1us;\n+\tdefaultAnalogueGain = params[\"default_analogue_gain\"].get<double>(1.0);\n+\n \treturn 0;\n }\n \n@@ -242,7 +262,7 @@ char const *Agc::name() const\n \treturn NAME;\n }\n \n-int Agc::read(boost::property_tree::ptree const ¶ms)\n+int Agc::read(const libcamera::YamlObject ¶ms)\n {\n \tLOG(RPiAgc, Debug) << \"Agc\";\n \ndiff --git a/src/ipa/raspberrypi/controller/rpi/agc.h b/src/ipa/raspberrypi/controller/rpi/agc.h\nindex 1351b0ee079c..6d6b0e5ad857 100644\n--- a/src/ipa/raspberrypi/controller/rpi/agc.h\n+++ b/src/ipa/raspberrypi/controller/rpi/agc.h\n@@ -28,13 +28,13 @@ namespace RPiController {\n \n struct AgcMeteringMode {\n \tdouble weights[AgcStatsSize];\n-\tint read(boost::property_tree::ptree const ¶ms);\n+\tint read(const libcamera::YamlObject ¶ms);\n };\n \n struct AgcExposureMode {\n \tstd::vector<libcamera::utils::Duration> shutter;\n \tstd::vector<double> gain;\n-\tint read(boost::property_tree::ptree const ¶ms);\n+\tint read(const libcamera::YamlObject ¶ms);\n };\n \n struct AgcConstraint {\n@@ -43,13 +43,13 @@ struct AgcConstraint {\n \tdouble qLo;\n \tdouble qHi;\n \tPwl yTarget;\n-\tint read(boost::property_tree::ptree const ¶ms);\n+\tint read(const libcamera::YamlObject ¶ms);\n };\n \n typedef std::vector<AgcConstraint> AgcConstraintMode;\n \n struct AgcConfig {\n-\tint read(boost::property_tree::ptree const ¶ms);\n+\tint read(const libcamera::YamlObject ¶ms);\n \tstd::map<std::string, AgcMeteringMode> meteringModes;\n \tstd::map<std::string, AgcExposureMode> exposureModes;\n \tstd::map<std::string, AgcConstraintMode> constraintModes;\n@@ -74,7 +74,7 @@ class Agc : public AgcAlgorithm\n public:\n \tAgc(Controller *controller);\n \tchar const *name() const override;\n-\tint read(boost::property_tree::ptree const ¶ms) override;\n+\tint read(const libcamera::YamlObject ¶ms) override;\n \t/* AGC handles \"pausing\" for itself. */\n \tbool isPaused() const override;\n \tvoid pause() override;\ndiff --git a/src/ipa/raspberrypi/controller/rpi/alsc.cpp b/src/ipa/raspberrypi/controller/rpi/alsc.cpp\nindex 49aaf6b74603..a4afaf841c41 100644\n--- a/src/ipa/raspberrypi/controller/rpi/alsc.cpp\n+++ b/src/ipa/raspberrypi/controller/rpi/alsc.cpp\n@@ -5,6 +5,7 @@\n * alsc.cpp - ALSC (auto lens shading correction) control algorithm\n */\n \n+#include <functional>\n #include <math.h>\n #include <numeric>\n \n@@ -50,15 +51,15 @@ char const *Alsc::name() const\n \treturn NAME;\n }\n \n-static int generateLut(double *lut, boost::property_tree::ptree const ¶ms)\n+static int generateLut(double *lut, const libcamera::YamlObject ¶ms)\n {\n-\tdouble cstrength = params.get<double>(\"corner_strength\", 2.0);\n+\tdouble cstrength = params[\"corner_strength\"].get<double>(2.0);\n \tif (cstrength <= 1.0) {\n \t\tLOG(RPiAlsc, Error) << \"corner_strength must be > 1.0\";\n \t\treturn -EINVAL;\n \t}\n \n-\tdouble asymmetry = params.get<double>(\"asymmetry\", 1.0);\n+\tdouble asymmetry = params[\"asymmetry\"].get<double>(1.0);\n \tif (asymmetry < 0) {\n \t\tLOG(RPiAlsc, Error) << \"asymmetry must be >= 0\";\n \t\treturn -EINVAL;\n@@ -80,34 +81,35 @@ static int generateLut(double *lut, boost::property_tree::ptree const ¶ms)\n \treturn 0;\n }\n \n-static int readLut(double *lut, boost::property_tree::ptree const ¶ms)\n+static int readLut(double *lut, const libcamera::YamlObject ¶ms)\n {\n-\tint num = 0;\n-\tconst int maxNum = XY;\n+\tif (params.size() != XY) {\n+\t\tLOG(RPiAlsc, Error) << \"Invalid number of entries in LSC table\";\n+\t\treturn -EINVAL;\n+\t}\n \n-\tfor (auto &p : params) {\n-\t\tif (num == maxNum) {\n-\t\t\tLOG(RPiAlsc, Error) << \"Too many entries in LSC table\";\n+\tint num = 0;\n+\tfor (const auto &p : params.asList()) {\n+\t\tauto value = p.get<double>();\n+\t\tif (!value)\n \t\t\treturn -EINVAL;\n-\t\t}\n-\t\tlut[num++] = p.second.get_value<double>();\n+\t\tlut[num++] = *value;\n \t}\n \n-\tif (num < maxNum) {\n-\t\tLOG(RPiAlsc, Error) << \"Too few entries in LSC table\";\n-\t\treturn -EINVAL;\n-\t}\n \treturn 0;\n }\n \n static int readCalibrations(std::vector<AlscCalibration> &calibrations,\n-\t\t\t boost::property_tree::ptree const ¶ms,\n+\t\t\t const libcamera::YamlObject ¶ms,\n \t\t\t std::string const &name)\n {\n-\tif (params.get_child_optional(name)) {\n+\tif (params.contains(name)) {\n \t\tdouble lastCt = 0;\n-\t\tfor (auto &p : params.get_child(name)) {\n-\t\t\tdouble ct = p.second.get<double>(\"ct\");\n+\t\tfor (const auto &p : params[name].asList()) {\n+\t\t\tauto value = p[\"ct\"].get<double>();\n+\t\t\tif (!value)\n+\t\t\t\treturn -EINVAL;\n+\t\t\tdouble ct = *value;\n \t\t\tif (ct <= lastCt) {\n \t\t\t\tLOG(RPiAlsc, Error)\n \t\t\t\t\t<< \"Entries in \" << name << \" must be in increasing ct order\";\n@@ -115,23 +117,23 @@ static int readCalibrations(std::vector<AlscCalibration> &calibrations,\n \t\t\t}\n \t\t\tAlscCalibration calibration;\n \t\t\tcalibration.ct = lastCt = ct;\n-\t\t\tboost::property_tree::ptree const &table =\n-\t\t\t\tp.second.get_child(\"table\");\n+\n+\t\t\tconst libcamera::YamlObject &table = p[\"table\"];\n+\t\t\tif (table.size() != XY) {\n+\t\t\t\tLOG(RPiAlsc, Error)\n+\t\t\t\t\t<< \"Incorrect number of values for ct \"\n+\t\t\t\t\t<< ct << \" in \" << name;\n+\t\t\t\treturn -EINVAL;\n+\t\t\t}\n+\n \t\t\tint num = 0;\n-\t\t\tfor (auto it = table.begin(); it != table.end(); it++) {\n-\t\t\t\tif (num == XY) {\n-\t\t\t\t\tLOG(RPiAlsc, Error)\n-\t\t\t\t\t\t<< \"Too many values for ct \" << ct << \" in \" << name;\n+\t\t\tfor (const auto &elem : table.asList()) {\n+\t\t\t\tvalue = elem.get<double>();\n+\t\t\t\tif (!value)\n \t\t\t\t\treturn -EINVAL;\n-\t\t\t\t}\n-\t\t\t\tcalibration.table[num++] =\n-\t\t\t\t\tit->second.get_value<double>();\n-\t\t\t}\n-\t\t\tif (num != XY) {\n-\t\t\t\tLOG(RPiAlsc, Error)\n-\t\t\t\t\t<< \"Too few values for ct \" << ct << \" in \" << name;\n-\t\t\t\treturn -EINVAL;\n+\t\t\t\tcalibration.table[num++] = *value;\n \t\t\t}\n+\n \t\t\tcalibrations.push_back(calibration);\n \t\t\tLOG(RPiAlsc, Debug)\n \t\t\t\t<< \"Read \" << name << \" calibration for ct \" << ct;\n@@ -140,30 +142,29 @@ static int readCalibrations(std::vector<AlscCalibration> &calibrations,\n \treturn 0;\n }\n \n-int Alsc::read(boost::property_tree::ptree const ¶ms)\n+int Alsc::read(const libcamera::YamlObject ¶ms)\n {\n-\tconfig_.framePeriod = params.get<uint16_t>(\"frame_period\", 12);\n-\tconfig_.startupFrames = params.get<uint16_t>(\"startup_frames\", 10);\n-\tconfig_.speed = params.get<double>(\"speed\", 0.05);\n-\tdouble sigma = params.get<double>(\"sigma\", 0.01);\n-\tconfig_.sigmaCr = params.get<double>(\"sigma_Cr\", sigma);\n-\tconfig_.sigmaCb = params.get<double>(\"sigma_Cb\", sigma);\n-\tconfig_.minCount = params.get<double>(\"min_count\", 10.0);\n-\tconfig_.minG = params.get<uint16_t>(\"min_G\", 50);\n-\tconfig_.omega = params.get<double>(\"omega\", 1.3);\n-\tconfig_.nIter = params.get<uint32_t>(\"n_iter\", X + Y);\n+\tconfig_.framePeriod = params[\"frame_period\"].get<uint16_t>(12);\n+\tconfig_.startupFrames = params[\"startup_frames\"].get<uint16_t>(10);\n+\tconfig_.speed = params[\"speed\"].get<double>(0.05);\n+\tdouble sigma = params[\"sigma\"].get<double>(0.01);\n+\tconfig_.sigmaCr = params[\"sigma_Cr\"].get<double>(sigma);\n+\tconfig_.sigmaCb = params[\"sigma_Cb\"].get<double>(sigma);\n+\tconfig_.minCount = params[\"min_count\"].get<double>(10.0);\n+\tconfig_.minG = params[\"min_G\"].get<uint16_t>(50);\n+\tconfig_.omega = params[\"omega\"].get<double>(1.3);\n+\tconfig_.nIter = params[\"n_iter\"].get<uint32_t>(X + Y);\n \tconfig_.luminanceStrength =\n-\t\tparams.get<double>(\"luminance_strength\", 1.0);\n+\t\tparams[\"luminance_strength\"].get<double>(1.0);\n \tfor (int i = 0; i < XY; i++)\n \t\tconfig_.luminanceLut[i] = 1.0;\n \n \tint ret = 0;\n \n-\tif (params.get_child_optional(\"corner_strength\"))\n+\tif (params.contains(\"corner_strength\"))\n \t\tret = generateLut(config_.luminanceLut, params);\n-\telse if (params.get_child_optional(\"luminance_lut\"))\n-\t\tret = readLut(config_.luminanceLut,\n-\t\t\t params.get_child(\"luminance_lut\"));\n+\telse if (params.contains(\"luminance_lut\"))\n+\t\tret = readLut(config_.luminanceLut, params[\"luminance_lut\"]);\n \telse\n \t\tLOG(RPiAlsc, Warning)\n \t\t\t<< \"no luminance table - assume unity everywhere\";\n@@ -177,9 +178,9 @@ int Alsc::read(boost::property_tree::ptree const ¶ms)\n \tif (ret)\n \t\treturn ret;\n \n-\tconfig_.defaultCt = params.get<double>(\"default_ct\", 4500.0);\n-\tconfig_.threshold = params.get<double>(\"threshold\", 1e-3);\n-\tconfig_.lambdaBound = params.get<double>(\"lambda_bound\", 0.05);\n+\tconfig_.defaultCt = params[\"default_ct\"].get<double>(4500.0);\n+\tconfig_.threshold = params[\"threshold\"].get<double>(1e-3);\n+\tconfig_.lambdaBound = params[\"lambda_bound\"].get<double>(0.05);\n \n \treturn 0;\n }\ndiff --git a/src/ipa/raspberrypi/controller/rpi/alsc.h b/src/ipa/raspberrypi/controller/rpi/alsc.h\nindex 773fd338ea8e..a858ef5a6551 100644\n--- a/src/ipa/raspberrypi/controller/rpi/alsc.h\n+++ b/src/ipa/raspberrypi/controller/rpi/alsc.h\n@@ -52,7 +52,7 @@ public:\n \tchar const *name() const override;\n \tvoid initialise() override;\n \tvoid switchMode(CameraMode const &cameraMode, Metadata *metadata) override;\n-\tint read(boost::property_tree::ptree const ¶ms) override;\n+\tint read(const libcamera::YamlObject ¶ms) override;\n \tvoid prepare(Metadata *imageMetadata) override;\n \tvoid process(StatisticsPtr &stats, Metadata *imageMetadata) override;\n \ndiff --git a/src/ipa/raspberrypi/controller/rpi/awb.cpp b/src/ipa/raspberrypi/controller/rpi/awb.cpp\nindex 10c49c126341..d6d312993cdd 100644\n--- a/src/ipa/raspberrypi/controller/rpi/awb.cpp\n+++ b/src/ipa/raspberrypi/controller/rpi/awb.cpp\n@@ -5,6 +5,8 @@\n * awb.cpp - AWB control algorithm\n */\n \n+#include <assert.h>\n+\n #include <libcamera/base/log.h>\n \n #include \"../lux_status.h\"\n@@ -26,62 +28,87 @@ static constexpr unsigned int AwbStatsSizeY = DEFAULT_AWB_REGIONS_Y;\n * elsewhere (ALSC and AGC).\n */\n \n-int AwbMode::read(boost::property_tree::ptree const ¶ms)\n+int AwbMode::read(const libcamera::YamlObject ¶ms)\n {\n-\tctLo = params.get<double>(\"lo\");\n-\tctHi = params.get<double>(\"hi\");\n+\tauto value = params[\"lo\"].get<double>();\n+\tif (!value)\n+\t\treturn -EINVAL;\n+\tctLo = *value;\n+\n+\tvalue = params[\"hi\"].get<double>();\n+\tif (!value)\n+\t\treturn -EINVAL;\n+\tctHi = *value;\n+\n \treturn 0;\n }\n \n-int AwbPrior::read(boost::property_tree::ptree const ¶ms)\n+int AwbPrior::read(const libcamera::YamlObject ¶ms)\n {\n-\tlux = params.get<double>(\"lux\");\n-\treturn prior.read(params.get_child(\"prior\"));\n+\tauto value = params[\"lux\"].get<double>();\n+\tif (!value)\n+\t\treturn -EINVAL;\n+\tlux = *value;\n+\n+\treturn prior.read(params[\"prior\"]);\n }\n \n-static int readCtCurve(Pwl &ctR, Pwl &ctB,\n-\t\t boost::property_tree::ptree const ¶ms)\n+static int readCtCurve(Pwl &ctR, Pwl &ctB, const libcamera::YamlObject ¶ms)\n {\n-\tint num = 0;\n-\tfor (auto it = params.begin(); it != params.end(); it++) {\n-\t\tdouble ct = it->second.get_value<double>();\n-\t\tassert(it == params.begin() || ct != ctR.domain().end);\n-\t\tif (++it == params.end()) {\n-\t\t\tLOG(RPiAwb, Error) << \"AwbConfig: incomplete CT curve entry\";\n-\t\t\treturn -EINVAL;\n-\t\t}\n-\t\tctR.append(ct, it->second.get_value<double>());\n-\t\tif (++it == params.end()) {\n-\t\t\tLOG(RPiAwb, Error) << \"AwbConfig: incomplete CT curve entry\";\n-\t\t\treturn -EINVAL;\n-\t\t}\n-\t\tctB.append(ct, it->second.get_value<double>());\n-\t\tnum++;\n+\tif (params.size() % 3) {\n+\t\tLOG(RPiAwb, Error) << \"AwbConfig: incomplete CT curve entry\";\n+\t\treturn -EINVAL;\n \t}\n-\tif (num < 2) {\n+\n+\tif (params.size() < 6) {\n \t\tLOG(RPiAwb, Error) << \"AwbConfig: insufficient points in CT curve\";\n \t\treturn -EINVAL;\n \t}\n+\n+\tconst auto &list = params.asList();\n+\n+\tfor (auto it = list.begin(); it != list.end(); it++) {\n+\t\tauto value = it->get<double>();\n+\t\tif (!value)\n+\t\t\treturn -EINVAL;\n+\t\tdouble ct = *value;\n+\n+\t\tassert(it == list.begin() || ct != ctR.domain().end);\n+\n+\t\tvalue = (++it)->get<double>();\n+\t\tif (!value)\n+\t\t\treturn -EINVAL;\n+\t\tctR.append(ct, *value);\n+\n+\t\tvalue = (++it)->get<double>();\n+\t\tif (!value)\n+\t\t\treturn -EINVAL;\n+\t\tctB.append(ct, *value);\n+\t}\n+\n \treturn 0;\n }\n \n-int AwbConfig::read(boost::property_tree::ptree const ¶ms)\n+int AwbConfig::read(const libcamera::YamlObject ¶ms)\n {\n \tint ret;\n-\tbayes = params.get<int>(\"bayes\", 1);\n-\tframePeriod = params.get<uint16_t>(\"framePeriod\", 10);\n-\tstartupFrames = params.get<uint16_t>(\"startupFrames\", 10);\n-\tconvergenceFrames = params.get<unsigned int>(\"convergence_frames\", 3);\n-\tspeed = params.get<double>(\"speed\", 0.05);\n-\tif (params.get_child_optional(\"ct_curve\")) {\n-\t\tret = readCtCurve(ctR, ctB, params.get_child(\"ct_curve\"));\n+\n+\tbayes = params[\"bayes\"].get<int>(1);\n+\tframePeriod = params[\"frame_period\"].get<uint16_t>(10);\n+\tstartupFrames = params[\"startup_frames\"].get<uint16_t>(10);\n+\tconvergenceFrames = params[\"convergence_frames\"].get<unsigned int>(3);\n+\tspeed = params[\"speed\"].get<double>(0.05);\n+\n+\tif (params.contains(\"ct_curve\")) {\n+\t\tret = readCtCurve(ctR, ctB, params[\"ct_curve\"]);\n \t\tif (ret)\n \t\t\treturn ret;\n \t}\n-\tif (params.get_child_optional(\"priors\")) {\n-\t\tfor (auto &p : params.get_child(\"priors\")) {\n+\n+\tif (params.contains(\"priors\")) {\n+\t\tfor (const auto &p : params[\"priors\"].asList()) {\n \t\t\tAwbPrior prior;\n-\t\t\tret = prior.read(p.second);\n+\t\t\tret = prior.read(p);\n \t\t\tif (ret)\n \t\t\t\treturn ret;\n \t\t\tif (!priors.empty() && prior.lux <= priors.back().lux) {\n@@ -95,32 +122,35 @@ int AwbConfig::read(boost::property_tree::ptree const ¶ms)\n \t\t\treturn ret;\n \t\t}\n \t}\n-\tif (params.get_child_optional(\"modes\")) {\n-\t\tfor (auto &p : params.get_child(\"modes\")) {\n-\t\t\tret = modes[p.first].read(p.second);\n+\tif (params.contains(\"modes\")) {\n+\t\tfor (const auto &[key, value] : params[\"modes\"].asDict()) {\n+\t\t\tret = modes[key].read(value);\n \t\t\tif (ret)\n \t\t\t\treturn ret;\n \t\t\tif (defaultMode == nullptr)\n-\t\t\t\tdefaultMode = &modes[p.first];\n+\t\t\t\tdefaultMode = &modes[key];\n \t\t}\n \t\tif (defaultMode == nullptr) {\n \t\t\tLOG(RPiAwb, Error) << \"AwbConfig: no AWB modes configured\";\n \t\t\treturn -EINVAL;\n \t\t}\n \t}\n-\tminPixels = params.get<double>(\"min_pixels\", 16.0);\n-\tminG = params.get<uint16_t>(\"min_G\", 32);\n-\tminRegions = params.get<uint32_t>(\"min_regions\", 10);\n-\tdeltaLimit = params.get<double>(\"delta_limit\", 0.2);\n-\tcoarseStep = params.get<double>(\"coarse_step\", 0.2);\n-\ttransversePos = params.get<double>(\"transverse_pos\", 0.01);\n-\ttransverseNeg = params.get<double>(\"transverse_neg\", 0.01);\n+\n+\tminPixels = params[\"min_pixels\"].get<double>(16.0);\n+\tminG = params[\"min_G\"].get<uint16_t>(32);\n+\tminRegions = params[\"min_regions\"].get<uint32_t>(10);\n+\tdeltaLimit = params[\"delta_limit\"].get<double>(0.2);\n+\tcoarseStep = params[\"coarse_step\"].get<double>(0.2);\n+\ttransversePos = params[\"transverse_pos\"].get<double>(0.01);\n+\ttransverseNeg = params[\"transverse_neg\"].get<double>(0.01);\n \tif (transversePos <= 0 || transverseNeg <= 0) {\n \t\tLOG(RPiAwb, Error) << \"AwbConfig: transverse_pos/neg must be > 0\";\n \t\treturn -EINVAL;\n \t}\n-\tsensitivityR = params.get<double>(\"sensitivity_r\", 1.0);\n-\tsensitivityB = params.get<double>(\"sensitivity_b\", 1.0);\n+\n+\tsensitivityR = params[\"sensitivity_r\"].get<double>(1.0);\n+\tsensitivityB = params[\"sensitivity_b\"].get<double>(1.0);\n+\n \tif (bayes) {\n \t\tif (ctR.empty() || ctB.empty() || priors.empty() ||\n \t\t defaultMode == nullptr) {\n@@ -129,9 +159,9 @@ int AwbConfig::read(boost::property_tree::ptree const ¶ms)\n \t\t\tbayes = false;\n \t\t}\n \t}\n-\tfast = params.get<int>(\"fast\", bayes); /* default to fast for Bayesian, otherwise slow */\n-\twhitepointR = params.get<double>(\"whitepoint_r\", 0.0);\n-\twhitepointB = params.get<double>(\"whitepoint_b\", 0.0);\n+\tfast = params[fast].get<int>(bayes); /* default to fast for Bayesian, otherwise slow */\n+\twhitepointR = params[\"whitepoint_r\"].get<double>(0.0);\n+\twhitepointB = params[\"whitepoint_b\"].get<double>(0.0);\n \tif (bayes == false)\n \t\tsensitivityR = sensitivityB = 1.0; /* nor do sensitivities make any sense */\n \treturn 0;\n@@ -162,7 +192,7 @@ char const *Awb::name() const\n \treturn NAME;\n }\n \n-int Awb::read(boost::property_tree::ptree const ¶ms)\n+int Awb::read(const libcamera::YamlObject ¶ms)\n {\n \treturn config_.read(params);\n }\ndiff --git a/src/ipa/raspberrypi/controller/rpi/awb.h b/src/ipa/raspberrypi/controller/rpi/awb.h\nindex fa0715735fcf..0bcbc4fe44d4 100644\n--- a/src/ipa/raspberrypi/controller/rpi/awb.h\n+++ b/src/ipa/raspberrypi/controller/rpi/awb.h\n@@ -19,20 +19,20 @@ namespace RPiController {\n /* Control algorithm to perform AWB calculations. */\n \n struct AwbMode {\n-\tint read(boost::property_tree::ptree const ¶ms);\n+\tint read(const libcamera::YamlObject ¶ms);\n \tdouble ctLo; /* low CT value for search */\n \tdouble ctHi; /* high CT value for search */\n };\n \n struct AwbPrior {\n-\tint read(boost::property_tree::ptree const ¶ms);\n+\tint read(const libcamera::YamlObject ¶ms);\n \tdouble lux; /* lux level */\n \tPwl prior; /* maps CT to prior log likelihood for this lux level */\n };\n \n struct AwbConfig {\n \tAwbConfig() : defaultMode(nullptr) {}\n-\tint read(boost::property_tree::ptree const ¶ms);\n+\tint read(const libcamera::YamlObject ¶ms);\n \t/* Only repeat the AWB calculation every \"this many\" frames */\n \tuint16_t framePeriod;\n \t/* number of initial frames for which speed taken as 1.0 (maximum) */\n@@ -92,7 +92,7 @@ public:\n \t~Awb();\n \tchar const *name() const override;\n \tvoid initialise() override;\n-\tint read(boost::property_tree::ptree const ¶ms) override;\n+\tint read(const libcamera::YamlObject ¶ms) override;\n \t/* AWB handles \"pausing\" for itself. */\n \tbool isPaused() const override;\n \tvoid pause() override;\ndiff --git a/src/ipa/raspberrypi/controller/rpi/black_level.cpp b/src/ipa/raspberrypi/controller/rpi/black_level.cpp\nindex aa6f602acd7d..85baec3fcbdd 100644\n--- a/src/ipa/raspberrypi/controller/rpi/black_level.cpp\n+++ b/src/ipa/raspberrypi/controller/rpi/black_level.cpp\n@@ -31,13 +31,13 @@ char const *BlackLevel::name() const\n \treturn NAME;\n }\n \n-int BlackLevel::read(boost::property_tree::ptree const ¶ms)\n+int BlackLevel::read(const libcamera::YamlObject ¶ms)\n {\n-\tuint16_t blackLevel = params.get<uint16_t>(\n-\t\t\"black_level\", 4096); /* 64 in 10 bits scaled to 16 bits */\n-\tblackLevelR_ = params.get<uint16_t>(\"blackLevelR\", blackLevel);\n-\tblackLevelG_ = params.get<uint16_t>(\"blackLevelG\", blackLevel);\n-\tblackLevelB_ = params.get<uint16_t>(\"blackLevelB\", blackLevel);\n+\t/* 64 in 10 bits scaled to 16 bits */\n+\tuint16_t blackLevel = params[\"black_level\"].get<uint16_t>(4096);\n+\tblackLevelR_ = params[\"black_level_r\"].get<uint16_t>(blackLevel);\n+\tblackLevelG_ = params[\"black_level_g\"].get<uint16_t>(blackLevel);\n+\tblackLevelB_ = params[\"black_level_b\"].get<uint16_t>(blackLevel);\n \tLOG(RPiBlackLevel, Debug)\n \t\t<< \" Read black levels red \" << blackLevelR_\n \t\t<< \" green \" << blackLevelG_\ndiff --git a/src/ipa/raspberrypi/controller/rpi/black_level.h b/src/ipa/raspberrypi/controller/rpi/black_level.h\nindex 6ec8c4f9ba8f..2403f7f77625 100644\n--- a/src/ipa/raspberrypi/controller/rpi/black_level.h\n+++ b/src/ipa/raspberrypi/controller/rpi/black_level.h\n@@ -18,7 +18,7 @@ class BlackLevel : public Algorithm\n public:\n \tBlackLevel(Controller *controller);\n \tchar const *name() const override;\n-\tint read(boost::property_tree::ptree const ¶ms) override;\n+\tint read(const libcamera::YamlObject ¶ms) override;\n \tvoid prepare(Metadata *imageMetadata) override;\n \n private:\ndiff --git a/src/ipa/raspberrypi/controller/rpi/ccm.cpp b/src/ipa/raspberrypi/controller/rpi/ccm.cpp\nindex 9588e94adeb1..2e2e66647e86 100644\n--- a/src/ipa/raspberrypi/controller/rpi/ccm.cpp\n+++ b/src/ipa/raspberrypi/controller/rpi/ccm.cpp\n@@ -39,21 +39,22 @@ Matrix::Matrix(double m0, double m1, double m2, double m3, double m4, double m5,\n \tm[0][0] = m0, m[0][1] = m1, m[0][2] = m2, m[1][0] = m3, m[1][1] = m4,\n \tm[1][2] = m5, m[2][0] = m6, m[2][1] = m7, m[2][2] = m8;\n }\n-int Matrix::read(boost::property_tree::ptree const ¶ms)\n+int Matrix::read(const libcamera::YamlObject ¶ms)\n {\n \tdouble *ptr = (double *)m;\n-\tint n = 0;\n-\tfor (auto it = params.begin(); it != params.end(); it++) {\n-\t\tif (n++ == 9) {\n-\t\t\tLOG(RPiCcm, Error) << \"Too many values in CCM\";\n-\t\t\treturn -EINVAL;\n-\t\t}\n-\t\t*ptr++ = it->second.get_value<double>();\n-\t}\n-\tif (n < 9) {\n-\t\tLOG(RPiCcm, Error) << \"Too few values in CCM\";\n+\n+\tif (params.size() != 9) {\n+\t\tLOG(RPiCcm, Error) << \"Wrong number of values in CCM\";\n \t\treturn -EINVAL;\n \t}\n+\n+\tfor (const auto ¶m : params.asList()) {\n+\t\tauto value = param.get<double>();\n+\t\tif (!value)\n+\t\t\treturn -EINVAL;\n+\t\t*ptr++ = *value;\n+\t}\n+\n \treturn 0;\n }\n \n@@ -65,27 +66,33 @@ char const *Ccm::name() const\n \treturn NAME;\n }\n \n-int Ccm::read(boost::property_tree::ptree const ¶ms)\n+int Ccm::read(const libcamera::YamlObject ¶ms)\n {\n \tint ret;\n \n-\tif (params.get_child_optional(\"saturation\")) {\n-\t\tret = config_.saturation.read(params.get_child(\"saturation\"));\n+\tif (params.contains(\"saturation\")) {\n+\t\tret = config_.saturation.read(params[\"saturation\"]);\n \t\tif (ret)\n \t\t\treturn ret;\n \t}\n \n-\tfor (auto &p : params.get_child(\"ccms\")) {\n+\tfor (auto &p : params[\"ccms\"].asList()) {\n+\t\tauto value = p[\"ct\"].get<double>();\n+\t\tif (!value)\n+\t\t\treturn -EINVAL;\n+\n \t\tCtCcm ctCcm;\n-\t\tctCcm.ct = p.second.get<double>(\"ct\");\n-\t\tret = ctCcm.ccm.read(p.second.get_child(\"ccm\"));\n+\t\tctCcm.ct = *value;\n+\t\tret = ctCcm.ccm.read(p[\"ccm\"]);\n \t\tif (ret)\n \t\t\treturn ret;\n-\t\tif (!config_.ccms.empty() &&\n-\t\t ctCcm.ct <= config_.ccms.back().ct) {\n-\t\t\tLOG(RPiCcm, Error) << \"CCM not in increasing colour temperature order\";\n+\n+\t\tif (!config_.ccms.empty() && ctCcm.ct <= config_.ccms.back().ct) {\n+\t\t\tLOG(RPiCcm, Error)\n+\t\t\t\t<< \"CCM not in increasing colour temperature order\";\n \t\t\treturn -EINVAL;\n \t\t}\n+\n \t\tconfig_.ccms.push_back(std::move(ctCcm));\n \t}\n \ndiff --git a/src/ipa/raspberrypi/controller/rpi/ccm.h b/src/ipa/raspberrypi/controller/rpi/ccm.h\nindex 6b65c7aea8a6..286d0b33e72f 100644\n--- a/src/ipa/raspberrypi/controller/rpi/ccm.h\n+++ b/src/ipa/raspberrypi/controller/rpi/ccm.h\n@@ -20,7 +20,7 @@ struct Matrix {\n \t double m6, double m7, double m8);\n \tMatrix();\n \tdouble m[3][3];\n-\tint read(boost::property_tree::ptree const ¶ms);\n+\tint read(const libcamera::YamlObject ¶ms);\n };\n static inline Matrix operator*(double d, Matrix const &m)\n {\n@@ -62,7 +62,7 @@ class Ccm : public CcmAlgorithm\n public:\n \tCcm(Controller *controller = NULL);\n \tchar const *name() const override;\n-\tint read(boost::property_tree::ptree const ¶ms) override;\n+\tint read(const libcamera::YamlObject ¶ms) override;\n \tvoid setSaturation(double saturation) override;\n \tvoid initialise() override;\n \tvoid prepare(Metadata *imageMetadata) override;\ndiff --git a/src/ipa/raspberrypi/controller/rpi/contrast.cpp b/src/ipa/raspberrypi/controller/rpi/contrast.cpp\nindex d76dc43b837f..5b37edcbd46a 100644\n--- a/src/ipa/raspberrypi/controller/rpi/contrast.cpp\n+++ b/src/ipa/raspberrypi/controller/rpi/contrast.cpp\n@@ -38,21 +38,21 @@ char const *Contrast::name() const\n \treturn NAME;\n }\n \n-int Contrast::read(boost::property_tree::ptree const ¶ms)\n+int Contrast::read(const libcamera::YamlObject ¶ms)\n {\n-\t/* enable adaptive enhancement by default */\n-\tconfig_.ceEnable = params.get<int>(\"ce_enable\", 1);\n-\t/* the point near the bottom of the histogram to move */\n-\tconfig_.loHistogram = params.get<double>(\"lo_histogram\", 0.01);\n-\t/* where in the range to try and move it to */\n-\tconfig_.loLevel = params.get<double>(\"lo_level\", 0.015);\n-\t/* but don't move by more than this */\n-\tconfig_.loMax = params.get<double>(\"lo_max\", 500);\n-\t/* equivalent values for the top of the histogram... */\n-\tconfig_.hiHistogram = params.get<double>(\"hi_histogram\", 0.95);\n-\tconfig_.hiLevel = params.get<double>(\"hi_level\", 0.95);\n-\tconfig_.hiMax = params.get<double>(\"hi_max\", 2000);\n-\treturn config_.gammaCurve.read(params.get_child(\"gamma_curve\"));\n+\t// enable adaptive enhancement by default\n+\tconfig_.ceEnable = params[\"ce_enable\"].get<int>(1);\n+\t// the point near the bottom of the histogram to move\n+\tconfig_.loHistogram = params[\"lo_histogram\"].get<double>(0.01);\n+\t// where in the range to try and move it to\n+\tconfig_.loLevel = params[\"lo_level\"].get<double>(0.015);\n+\t// but don't move by more than this\n+\tconfig_.loMax = params[\"lo_max\"].get<double>(500);\n+\t// equivalent values for the top of the histogram...\n+\tconfig_.hiHistogram = params[\"hi_histogram\"].get<double>(0.95);\n+\tconfig_.hiLevel = params[\"hi_level\"].get<double>(0.95);\n+\tconfig_.hiMax = params[\"hi_max\"].get<double>(2000);\n+\treturn config_.gammaCurve.read(params[\"gamma_curve\"]);\n }\n \n void Contrast::setBrightness(double brightness)\ndiff --git a/src/ipa/raspberrypi/controller/rpi/contrast.h b/src/ipa/raspberrypi/controller/rpi/contrast.h\nindex 5c3d2f56b310..c68adbc9e463 100644\n--- a/src/ipa/raspberrypi/controller/rpi/contrast.h\n+++ b/src/ipa/raspberrypi/controller/rpi/contrast.h\n@@ -34,7 +34,7 @@ class Contrast : public ContrastAlgorithm\n public:\n \tContrast(Controller *controller = NULL);\n \tchar const *name() const override;\n-\tint read(boost::property_tree::ptree const ¶ms) override;\n+\tint read(const libcamera::YamlObject ¶ms) override;\n \tvoid setBrightness(double brightness) override;\n \tvoid setContrast(double contrast) override;\n \tvoid initialise() override;\ndiff --git a/src/ipa/raspberrypi/controller/rpi/dpc.cpp b/src/ipa/raspberrypi/controller/rpi/dpc.cpp\nindex def39bb7416a..be3871dffe28 100644\n--- a/src/ipa/raspberrypi/controller/rpi/dpc.cpp\n+++ b/src/ipa/raspberrypi/controller/rpi/dpc.cpp\n@@ -31,13 +31,14 @@ char const *Dpc::name() const\n \treturn NAME;\n }\n \n-int Dpc::read(boost::property_tree::ptree const ¶ms)\n+int Dpc::read(const libcamera::YamlObject ¶ms)\n {\n-\tconfig_.strength = params.get<int>(\"strength\", 1);\n+\tconfig_.strength = params[\"strength\"].get<int>(1);\n \tif (config_.strength < 0 || config_.strength > 2) {\n-\t\tLOG(RPiDpc, Error) << \"bad strength value\";\n+\t\tLOG(RPiDpc, Error) << \"Bad strength value\";\n \t\treturn -EINVAL;\n \t}\n+\n \treturn 0;\n }\n \ndiff --git a/src/ipa/raspberrypi/controller/rpi/dpc.h b/src/ipa/raspberrypi/controller/rpi/dpc.h\nindex 2bb6cef565a7..84a05604394d 100644\n--- a/src/ipa/raspberrypi/controller/rpi/dpc.h\n+++ b/src/ipa/raspberrypi/controller/rpi/dpc.h\n@@ -22,7 +22,7 @@ class Dpc : public Algorithm\n public:\n \tDpc(Controller *controller);\n \tchar const *name() const override;\n-\tint read(boost::property_tree::ptree const ¶ms) override;\n+\tint read(const libcamera::YamlObject ¶ms) override;\n \tvoid prepare(Metadata *imageMetadata) override;\n \n private:\ndiff --git a/src/ipa/raspberrypi/controller/rpi/geq.cpp b/src/ipa/raspberrypi/controller/rpi/geq.cpp\nindex 106f0a40dfc1..510870e9edbf 100644\n--- a/src/ipa/raspberrypi/controller/rpi/geq.cpp\n+++ b/src/ipa/raspberrypi/controller/rpi/geq.cpp\n@@ -35,17 +35,17 @@ char const *Geq::name() const\n \treturn NAME;\n }\n \n-int Geq::read(boost::property_tree::ptree const ¶ms)\n+int Geq::read(const libcamera::YamlObject ¶ms)\n {\n-\tconfig_.offset = params.get<uint16_t>(\"offset\", 0);\n-\tconfig_.slope = params.get<double>(\"slope\", 0.0);\n+\tconfig_.offset = params[\"offset\"].get<uint16_t>(0);\n+\tconfig_.slope = params[\"slope\"].get<double>(0.0);\n \tif (config_.slope < 0.0 || config_.slope >= 1.0) {\n \t\tLOG(RPiGeq, Error) << \"Bad slope value\";\n \t\treturn -EINVAL;\n \t}\n \n-\tif (params.get_child_optional(\"strength\")) {\n-\t\tint ret = config_.strength.read(params.get_child(\"strength\"));\n+\tif (params.contains(\"strength\")) {\n+\t\tint ret = config_.strength.read(params[\"strength\"]);\n \t\tif (ret)\n \t\t\treturn ret;\n \t}\ndiff --git a/src/ipa/raspberrypi/controller/rpi/geq.h b/src/ipa/raspberrypi/controller/rpi/geq.h\nindex 677a0510c6ac..ee3a52ff50f5 100644\n--- a/src/ipa/raspberrypi/controller/rpi/geq.h\n+++ b/src/ipa/raspberrypi/controller/rpi/geq.h\n@@ -24,7 +24,7 @@ class Geq : public Algorithm\n public:\n \tGeq(Controller *controller);\n \tchar const *name() const override;\n-\tint read(boost::property_tree::ptree const ¶ms) override;\n+\tint read(const libcamera::YamlObject ¶ms) override;\n \tvoid prepare(Metadata *imageMetadata) override;\n \n private:\ndiff --git a/src/ipa/raspberrypi/controller/rpi/lux.cpp b/src/ipa/raspberrypi/controller/rpi/lux.cpp\nindex ca1e827191fd..ea1623dda345 100644\n--- a/src/ipa/raspberrypi/controller/rpi/lux.cpp\n+++ b/src/ipa/raspberrypi/controller/rpi/lux.cpp\n@@ -38,14 +38,30 @@ char const *Lux::name() const\n \treturn NAME;\n }\n \n-int Lux::read(boost::property_tree::ptree const ¶ms)\n+int Lux::read(const libcamera::YamlObject ¶ms)\n {\n-\treferenceShutterSpeed_ =\n-\t\tparams.get<double>(\"reference_shutter_speed\") * 1.0us;\n-\treferenceGain_ = params.get<double>(\"reference_gain\");\n-\treferenceAperture_ = params.get<double>(\"reference_aperture\", 1.0);\n-\treferenceY_ = params.get<double>(\"reference_Y\");\n-\treferenceLux_ = params.get<double>(\"reference_lux\");\n+\tauto value = params[\"reference_shutter_speed\"].get<double>();\n+\tif (!value)\n+\t\treturn -EINVAL;\n+\treferenceShutterSpeed_ = *value * 1.0us;\n+\n+\tvalue = params[\"reference_gain\"].get<double>();\n+\tif (!value)\n+\t\treturn -EINVAL;\n+\treferenceGain_ = *value;\n+\n+\treferenceAperture_ = params[\"reference_aperture\"].get<double>(1.0);\n+\n+\tvalue = params[\"reference_Y\"].get<double>(0.0);\n+\tif (!value)\n+\t\treturn -EINVAL;\n+\treferenceY_ = *value;\n+\n+\tvalue = params[\"reference_lux\"].get<double>(0.0);\n+\tif (!value)\n+\t\treturn -EINVAL;\n+\treferenceLux_ = *value;\n+\n \tcurrentAperture_ = referenceAperture_;\n \treturn 0;\n }\ndiff --git a/src/ipa/raspberrypi/controller/rpi/lux.h b/src/ipa/raspberrypi/controller/rpi/lux.h\nindex 6416dfb52553..89411a5432b4 100644\n--- a/src/ipa/raspberrypi/controller/rpi/lux.h\n+++ b/src/ipa/raspberrypi/controller/rpi/lux.h\n@@ -22,7 +22,7 @@ class Lux : public Algorithm\n public:\n \tLux(Controller *controller);\n \tchar const *name() const override;\n-\tint read(boost::property_tree::ptree const ¶ms) override;\n+\tint read(const libcamera::YamlObject ¶ms) override;\n \tvoid prepare(Metadata *imageMetadata) override;\n \tvoid process(StatisticsPtr &stats, Metadata *imageMetadata) override;\n \tvoid setCurrentAperture(double aperture);\ndiff --git a/src/ipa/raspberrypi/controller/rpi/noise.cpp b/src/ipa/raspberrypi/controller/rpi/noise.cpp\nindex 74fa99bafe48..bcd8b9edaebe 100644\n--- a/src/ipa/raspberrypi/controller/rpi/noise.cpp\n+++ b/src/ipa/raspberrypi/controller/rpi/noise.cpp\n@@ -41,10 +41,18 @@ void Noise::switchMode(CameraMode const &cameraMode,\n \tmodeFactor_ = std::max(1.0, cameraMode.noiseFactor);\n }\n \n-int Noise::read(boost::property_tree::ptree const ¶ms)\n+int Noise::read(const libcamera::YamlObject ¶ms)\n {\n-\treferenceConstant_ = params.get<double>(\"reference_constant\");\n-\treferenceSlope_ = params.get<double>(\"reference_slope\");\n+\tauto value = params[\"reference_constant\"].get<double>();\n+\tif (!value)\n+\t\treturn -EINVAL;\n+\treferenceConstant_ = *value;\n+\n+\tvalue = params[\"reference_slope\"].get<double>();\n+\tif (!value)\n+\t\treturn -EINVAL;\n+\treferenceSlope_ = *value;\n+\n \treturn 0;\n }\n \ndiff --git a/src/ipa/raspberrypi/controller/rpi/noise.h b/src/ipa/raspberrypi/controller/rpi/noise.h\nindex b33a5fc75ec7..74c31e640c3f 100644\n--- a/src/ipa/raspberrypi/controller/rpi/noise.h\n+++ b/src/ipa/raspberrypi/controller/rpi/noise.h\n@@ -19,7 +19,7 @@ public:\n \tNoise(Controller *controller);\n \tchar const *name() const override;\n \tvoid switchMode(CameraMode const &cameraMode, Metadata *metadata) override;\n-\tint read(boost::property_tree::ptree const ¶ms) override;\n+\tint read(const libcamera::YamlObject ¶ms) override;\n \tvoid prepare(Metadata *imageMetadata) override;\n \n private:\ndiff --git a/src/ipa/raspberrypi/controller/rpi/sdn.cpp b/src/ipa/raspberrypi/controller/rpi/sdn.cpp\nindex 03d9f119a338..b6b662518f2c 100644\n--- a/src/ipa/raspberrypi/controller/rpi/sdn.cpp\n+++ b/src/ipa/raspberrypi/controller/rpi/sdn.cpp\n@@ -34,10 +34,10 @@ char const *Sdn::name() const\n \treturn NAME;\n }\n \n-int Sdn::read(boost::property_tree::ptree const ¶ms)\n+int Sdn::read(const libcamera::YamlObject ¶ms)\n {\n-\tdeviation_ = params.get<double>(\"deviation\", 3.2);\n-\tstrength_ = params.get<double>(\"strength\", 0.75);\n+\tdeviation_ = params[\"deviation\"].get<double>(3.2);\n+\tstrength_ = params[\"strength\"].get<double>(0.75);\n \treturn 0;\n }\n \ndiff --git a/src/ipa/raspberrypi/controller/rpi/sdn.h b/src/ipa/raspberrypi/controller/rpi/sdn.h\nindex 4287ef08a79f..9dd73c388edb 100644\n--- a/src/ipa/raspberrypi/controller/rpi/sdn.h\n+++ b/src/ipa/raspberrypi/controller/rpi/sdn.h\n@@ -18,7 +18,7 @@ class Sdn : public DenoiseAlgorithm\n public:\n \tSdn(Controller *controller = NULL);\n \tchar const *name() const override;\n-\tint read(boost::property_tree::ptree const ¶ms) override;\n+\tint read(const libcamera::YamlObject ¶ms) override;\n \tvoid initialise() override;\n \tvoid prepare(Metadata *imageMetadata) override;\n \tvoid setMode(DenoiseMode mode) override;\ndiff --git a/src/ipa/raspberrypi/controller/rpi/sharpen.cpp b/src/ipa/raspberrypi/controller/rpi/sharpen.cpp\nindex 9c4cffa4128c..4f6f020a417b 100644\n--- a/src/ipa/raspberrypi/controller/rpi/sharpen.cpp\n+++ b/src/ipa/raspberrypi/controller/rpi/sharpen.cpp\n@@ -37,11 +37,11 @@ void Sharpen::switchMode(CameraMode const &cameraMode,\n \tmodeFactor_ = std::max(1.0, cameraMode.noiseFactor);\n }\n \n-int Sharpen::read(boost::property_tree::ptree const ¶ms)\n+int Sharpen::read(const libcamera::YamlObject ¶ms)\n {\n-\tthreshold_ = params.get<double>(\"threshold\", 1.0);\n-\tstrength_ = params.get<double>(\"strength\", 1.0);\n-\tlimit_ = params.get<double>(\"limit\", 1.0);\n+\tthreshold_ = params[\"threshold\"].get<double>(1.0);\n+\tstrength_ = params[\"strength\"].get<double>(1.0);\n+\tlimit_ = params[\"limit\"].get<double>(1.0);\n \tLOG(RPiSharpen, Debug)\n \t\t<< \"Read threshold \" << threshold_\n \t\t<< \" strength \" << strength_\ndiff --git a/src/ipa/raspberrypi/controller/rpi/sharpen.h b/src/ipa/raspberrypi/controller/rpi/sharpen.h\nindex 0cd8b92f2224..8bb7631e916b 100644\n--- a/src/ipa/raspberrypi/controller/rpi/sharpen.h\n+++ b/src/ipa/raspberrypi/controller/rpi/sharpen.h\n@@ -19,7 +19,7 @@ public:\n \tSharpen(Controller *controller);\n \tchar const *name() const override;\n \tvoid switchMode(CameraMode const &cameraMode, Metadata *metadata) override;\n-\tint read(boost::property_tree::ptree const ¶ms) override;\n+\tint read(const libcamera::YamlObject ¶ms) override;\n \tvoid setStrength(double strength) override;\n \tvoid prepare(Metadata *imageMetadata) override;\n \ndiff --git a/src/ipa/raspberrypi/meson.build b/src/ipa/raspberrypi/meson.build\nindex 32897e07dad9..517d815bb98c 100644\n--- a/src/ipa/raspberrypi/meson.build\n+++ b/src/ipa/raspberrypi/meson.build\n@@ -4,7 +4,6 @@ ipa_name = 'ipa_rpi'\n \n rpi_ipa_deps = [\n libcamera_private,\n- dependency('boost'),\n libatomic,\n ]\n \ndiff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp\nindex b9e9b814e886..6befdd71433d 100644\n--- a/src/ipa/raspberrypi/raspberrypi.cpp\n+++ b/src/ipa/raspberrypi/raspberrypi.cpp\n@@ -7,6 +7,7 @@\n \n #include <algorithm>\n #include <array>\n+#include <cstring>\n #include <fcntl.h>\n #include <math.h>\n #include <stdint.h>\n", "prefixes": [ "libcamera-devel", "v7", "08/14" ] }