[{"id":37309,"web_url":"https://patchwork.libcamera.org/comment/37309/","msgid":"<den7ny2pse7ut6bbhijv2577yld5c5kksbdp2q4flbms7s2bx7@d4ed3fjwu5rl>","date":"2025-12-11T14:20:50","subject":"Re: [PATCH v4 1/7] ipa: rkisp1: algorithms: dpf: refactor DPF\n\tparsing and initialization","submitter":{"id":143,"url":"https://patchwork.libcamera.org/api/people/143/","name":"Jacopo Mondi","email":"jacopo.mondi@ideasonboard.com"},"content":"Hi Rui\n\nsubject is a bit long, it could be\n\nipa: rkisp1: dpf: refactor DPF parsing and initialization\n\n\nOn Sun, Dec 07, 2025 at 07:48:02PM -0500, Rui Wang wrote:\n> -Split DPF configuration parsing and initialization into clearer,\n> self-contained helpers and modernized initialization patterns.\n>\n> -Introduce parseSingleConfig() as DPF tuning file parser helper\n> make future extensions and maintenance easier\n>\n> -Change strengthconfig.r/g/b parser from uint16 to uint8\n> to match rkisp1_cif_isp_dpf_strength_config defination\n\ns/defination/definition\n\nIf you end with a '.' one of the entries, please add it to the other\nones as well. Actually I would not make this a list at all but a\nsimpler:\n\nSplit DPF configuration parsing and initialization into clearer,\nself-contained helpers and modernized initialization patterns.\n\nIntroduce parseSingleConfig() as DPF tuning file parser helper\nin order to make future extensions and maintenance easier\n\nWhile at it, change strengthconfig.r/g/b parser from uint16 to uint8\nto match rkisp1_cif_isp_dpf_strength_config definition\n\n\n>\n> Signed-off-by: Rui Wang <rui.wang@ideasonboard.com>\n> ---\n> Changelog in v4:\n>  -Split V3 one patch into 6 patches\n\nThanks, way easier to review\n\n>  -The first patch only focus on code reorgnization, no new logic added\n>  -Delete Makefile from  V3 patch\n>\n>  src/ipa/rkisp1/algorithms/dpf.cpp | 61 +++++++++++++++++++++----------\n>  src/ipa/rkisp1/algorithms/dpf.h   |  5 +++\n>  2 files changed, 46 insertions(+), 20 deletions(-)\n>\n> diff --git a/src/ipa/rkisp1/algorithms/dpf.cpp b/src/ipa/rkisp1/algorithms/dpf.cpp\n> index 39f3e461..cd0a7d9d 100644\n> --- a/src/ipa/rkisp1/algorithms/dpf.cpp\n> +++ b/src/ipa/rkisp1/algorithms/dpf.cpp\n> @@ -46,6 +46,27 @@ Dpf::Dpf()\n>   */\n>  int Dpf::init([[maybe_unused]] IPAContext &context,\n>  \t      const YamlObject &tuningData)\n> +{\n> +\t/* Parse tuning block. */\n> +\tif (!parseConfig(tuningData)) {\n> +\t\treturn -EINVAL;\n> +\t}\n\nPlease, this is a tiny thing but it has been repeated multiple times:\nno curly braces for single line statements\n\n> +\n> +\treturn 0;\n> +}\n> +\n> +bool Dpf::parseConfig(const YamlObject &tuningData)\n> +{\n> +\t/* Parse base config. */\n> +\tif (!parseSingleConfig(tuningData, config_, strengthConfig_)) {\n> +\t\treturn false;\n> +\t}\n\nditto\n\nthis could just be\n\n        return parseSingleConfig(tuningData, config_, strengthConfig_);\n\n> +\treturn true;\n> +}\n> +\n> +bool Dpf::parseSingleConfig(const YamlObject &tuningData,\n> +\t\t\t    rkisp1_cif_isp_dpf_config &config,\n> +\t\t\t    rkisp1_cif_isp_dpf_strength_config &strengthConfig)\n>  {\n>  \tstd::vector<uint8_t> values;\n>\n> @@ -78,14 +99,14 @@ int Dpf::init([[maybe_unused]] IPAContext &context,\n>  \t\t\t<< \"Invalid 'DomainFilter:g': expected \"\n>  \t\t\t<< RKISP1_CIF_ISP_DPF_MAX_SPATIAL_COEFFS\n>  \t\t\t<< \" elements, got \" << values.size();\n> -\t\treturn -EINVAL;\n> +\t\treturn false;\n\nI would propagated the errors up and return an int from\nDpf::parseSingleConfig() and Dpf::parseConfig(), but since\nDpf::init() returns -EINVAL unconditionally, it doesn't matter much.\n\nPreferably I would have changed Dpf::init() to return the error code\nfrom parseConfig() so that different error codes could be propagated\nup eventually\n\n>  \t}\n>\n>  \tstd::copy_n(values.begin(), values.size(),\n> -\t\t    std::begin(config_.g_flt.spatial_coeff));\n> +\t\t    std::begin(config.g_flt.spatial_coeff));\n>\n> -\tconfig_.g_flt.gr_enable = true;\n> -\tconfig_.g_flt.gb_enable = true;\n> +\tconfig.g_flt.gr_enable = true;\n> +\tconfig.g_flt.gb_enable = true;\n>\n>  \t/*\n>  \t * For the red and blue components, we have the 13x9 kernel specified\n> @@ -116,18 +137,18 @@ int Dpf::init([[maybe_unused]] IPAContext &context,\n>  \t\t\t<< RKISP1_CIF_ISP_DPF_MAX_SPATIAL_COEFFS - 1\n>  \t\t\t<< \" or \" << RKISP1_CIF_ISP_DPF_MAX_SPATIAL_COEFFS\n>  \t\t\t<< \" elements, got \" << values.size();\n> -\t\treturn -EINVAL;\n> +\t\treturn false;\n>  \t}\n>\n> -\tconfig_.rb_flt.fltsize = values.size() == RKISP1_CIF_ISP_DPF_MAX_SPATIAL_COEFFS\n> -\t\t\t       ? RKISP1_CIF_ISP_DPF_RB_FILTERSIZE_13x9\n> -\t\t\t       : RKISP1_CIF_ISP_DPF_RB_FILTERSIZE_9x9;\n> +\tconfig.rb_flt.fltsize = values.size() == RKISP1_CIF_ISP_DPF_MAX_SPATIAL_COEFFS\n> +\t\t\t\t\t? RKISP1_CIF_ISP_DPF_RB_FILTERSIZE_13x9\n> +\t\t\t\t\t: RKISP1_CIF_ISP_DPF_RB_FILTERSIZE_9x9;\n>\n>  \tstd::copy_n(values.begin(), values.size(),\n> -\t\t    std::begin(config_.rb_flt.spatial_coeff));\n> +\t\t    std::begin(config.rb_flt.spatial_coeff));\n>\n> -\tconfig_.rb_flt.r_enable = true;\n> -\tconfig_.rb_flt.b_enable = true;\n> +\tconfig.rb_flt.r_enable = true;\n> +\tconfig.rb_flt.b_enable = true;\n>\n>  \t/*\n>  \t * The range kernel is configured with a noise level lookup table (NLL)\n> @@ -143,32 +164,32 @@ int Dpf::init([[maybe_unused]] IPAContext &context,\n>  \t\t\t<< \"Invalid 'RangeFilter:coeff': expected \"\n>  \t\t\t<< RKISP1_CIF_ISP_DPF_MAX_NLF_COEFFS\n>  \t\t\t<< \" elements, got \" << nllValues.size();\n> -\t\treturn -EINVAL;\n> +\t\treturn false;\n>  \t}\n>\n>  \tstd::copy_n(nllValues.begin(), nllValues.size(),\n> -\t\t    std::begin(config_.nll.coeff));\n> +\t\t    std::begin(config.nll.coeff));\n>\n>  \tstd::string scaleMode = rFObject[\"scale-mode\"].get<std::string>(\"\");\n>  \tif (scaleMode == \"linear\") {\n> -\t\tconfig_.nll.scale_mode = RKISP1_CIF_ISP_NLL_SCALE_LINEAR;\n> +\t\tconfig.nll.scale_mode = RKISP1_CIF_ISP_NLL_SCALE_LINEAR;\n>  \t} else if (scaleMode == \"logarithmic\") {\n> -\t\tconfig_.nll.scale_mode = RKISP1_CIF_ISP_NLL_SCALE_LOGARITHMIC;\n> +\t\tconfig.nll.scale_mode = RKISP1_CIF_ISP_NLL_SCALE_LOGARITHMIC;\n>  \t} else {\n>  \t\tLOG(RkISP1Dpf, Error)\n>  \t\t\t<< \"Invalid 'RangeFilter:scale-mode': expected \"\n>  \t\t\t<< \"'linear' or 'logarithmic' value, got \"\n>  \t\t\t<< scaleMode;\n> -\t\treturn -EINVAL;\n> +\t\treturn false;\n>  \t}\n>\n>  \tconst YamlObject &fSObject = tuningData[\"FilterStrength\"];\n>\n> -\tstrengthConfig_.r = fSObject[\"r\"].get<uint16_t>(64);\n> -\tstrengthConfig_.g = fSObject[\"g\"].get<uint16_t>(64);\n> -\tstrengthConfig_.b = fSObject[\"b\"].get<uint16_t>(64);\n> +\tstrengthConfig.r = fSObject[\"r\"].get<uint8_t>().value_or(64);\n> +\tstrengthConfig.g = fSObject[\"g\"].get<uint8_t>().value_or(64);\n> +\tstrengthConfig.b = fSObject[\"b\"].get<uint8_t>().value_or(64);\n>\n> -\treturn 0;\n> +\treturn true;\n>  }\n>\n>  /**\n> diff --git a/src/ipa/rkisp1/algorithms/dpf.h b/src/ipa/rkisp1/algorithms/dpf.h\n> index 2dd8cd36..bee6fc9b 100644\n> --- a/src/ipa/rkisp1/algorithms/dpf.h\n> +++ b/src/ipa/rkisp1/algorithms/dpf.h\n> @@ -30,6 +30,11 @@ public:\n>  \t\t     RkISP1Params *params) override;\n>\n>  private:\n> +\tbool parseConfig(const YamlObject &tuningData);\n> +\tbool parseSingleConfig(const YamlObject &tuningData,\n> +\t\t\t       rkisp1_cif_isp_dpf_config &config,\n> +\t\t\t       rkisp1_cif_isp_dpf_strength_config &strengthConfig);\n> +\n\nThanks\n\nWith the above issues addressed\nReviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n\nThanks\n  j\n\n>  \tstruct rkisp1_cif_isp_dpf_config config_;\n>  \tstruct rkisp1_cif_isp_dpf_strength_config strengthConfig_;\n>  };\n> --\n> 2.43.0\n>","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 4AAF5BD1F1\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 11 Dec 2025 14:20:55 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 6E76D61603;\n\tThu, 11 Dec 2025 15:20:54 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 7CDB1609D8\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 11 Dec 2025 15:20:53 +0100 (CET)","from ideasonboard.com (93-46-82-201.ip106.fastwebnet.it\n\t[93.46.82.201])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 5BEFC1352;\n\tThu, 11 Dec 2025 15:20:51 +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=\"oGDh9PjP\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1765462851;\n\tbh=Ybzbtt9oq1vEr/8VWQyXmmAlVBacx1HOBJ7o9awLsww=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=oGDh9PjPGFqeYoXr9Dc+ymXQDAqbQXrHOHxigsDgF96XPVe2SU+kk+OzxaB+3jEWL\n\txMSwvLOL75nM4Ewt4KcE6qu4ORcAwOSiavRDXbQEuC1hIb5jj6shS8REb4u6mw1efY\n\tTRhhRuz9i8lcbgYNmpLUOX1hsMKZz53leb4ptzHs=","Date":"Thu, 11 Dec 2025 15:20:50 +0100","From":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","To":"Rui Wang <rui.wang@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH v4 1/7] ipa: rkisp1: algorithms: dpf: refactor DPF\n\tparsing and initialization","Message-ID":"<den7ny2pse7ut6bbhijv2577yld5c5kksbdp2q4flbms7s2bx7@d4ed3fjwu5rl>","References":"<20251208004808.1274417-1-rui.wang@ideasonboard.com>\n\t<20251208004808.1274417-2-rui.wang@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20251208004808.1274417-2-rui.wang@ideasonboard.com>","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>"}},{"id":37360,"web_url":"https://patchwork.libcamera.org/comment/37360/","msgid":"<c2516cc8966c09082264f067ce602757.rui.wang@ideasonboard.com>","date":"2025-12-13T21:09:52","subject":"Re: [PATCH v4 1/7] ipa: rkisp1: algorithms: dpf: refactor DPF\n\tparsing and initialization","submitter":{"id":241,"url":"https://patchwork.libcamera.org/api/people/241/","name":"Rui Wang","email":"rui.wang@ideasonboard.com"},"content":"Jacopo Mondi wrote:\n> Hi Rui\n> \n> subject is a bit long, it could be\n> \n> ipa: rkisp1: dpf: refactor DPF parsing and initialization\n> \n> \n> On Sun, Dec 07, 2025 at 07:48:02PM -0500, Rui Wang wrote:\n> > -Split DPF configuration parsing and initialization into clearer,\n> > self-contained helpers and modernized initialization patterns.\n> >\n> > -Introduce parseSingleConfig() as DPF tuning file parser helper\n> > make future extensions and maintenance easier\n> >\n> > -Change strengthconfig.r/g/b parser from uint16 to uint8\n> > to match rkisp1_cif_isp_dpf_strength_config defination\n> \n> s/defination/definition\n> \n> If you end with a '.' one of the entries, please add it to the other\n> ones as well. Actually I would not make this a list at all but a\n> simpler:\n> \n> Split DPF configuration parsing and initialization into clearer,\n> self-contained helpers and modernized initialization patterns.\n> \n> Introduce parseSingleConfig() as DPF tuning file parser helper\n> in order to make future extensions and maintenance easier\n> \n> While at it, change strengthconfig.r/g/b parser from uint16 to uint8\n> to match rkisp1_cif_isp_dpf_strength_config definition\n> \n> \n> >\n> > Signed-off-by: Rui Wang <rui.wang@ideasonboard.com>\n> > ---\n> > Changelog in v4:\n> >  -Split V3 one patch into 6 patches\n> \n> Thanks, way easier to review\n> \n> >  -The first patch only focus on code reorgnization, no new logic added\n> >  -Delete Makefile from  V3 patch\n> >\n> >  src/ipa/rkisp1/algorithms/dpf.cpp | 61 +++++++++++++++++++++----------\n> >  src/ipa/rkisp1/algorithms/dpf.h   |  5 +++\n> >  2 files changed, 46 insertions(+), 20 deletions(-)\n> >\n> > diff --git a/src/ipa/rkisp1/algorithms/dpf.cpp b/src/ipa/rkisp1/algorithms/dpf.cpp\n> > index 39f3e461..cd0a7d9d 100644\n> > --- a/src/ipa/rkisp1/algorithms/dpf.cpp\n> > +++ b/src/ipa/rkisp1/algorithms/dpf.cpp\n> > @@ -46,6 +46,27 @@ Dpf::Dpf()\n> >   */\n> >  int Dpf::init([[maybe_unused]] IPAContext &context,\n> >  \t      const YamlObject &tuningData)\n> > +{\n> > +\t/* Parse tuning block. */\n> > +\tif (!parseConfig(tuningData)) {\n> > +\t\treturn -EINVAL;\n> > +\t}\n> \n> Please, this is a tiny thing but it has been repeated multiple times:\n> no curly braces for single line statements\n> \nyes I will remove all those braces to quick return.\n\n> > +\n> > +\treturn 0;\n> > +}\n> > +\n> > +bool Dpf::parseConfig(const YamlObject &tuningData)\n> > +{\n> > +\t/* Parse base config. */\n> > +\tif (!parseSingleConfig(tuningData, config_, strengthConfig_)) {\n> > +\t\treturn false;\n> > +\t}\n> \n> ditto\n> \n> this could just be\n> \n>         return parseSingleConfig(tuningData, config_, strengthConfig_);\n\n yes , if the return value chagne from boolean to int , it can return directly\n but I would prefer to use ret  = parseSingleConfig,\n in that case , the following patch can reuse ret for checking .\n> \n> > +\treturn true;\n> > +}\n> > +\n> > +bool Dpf::parseSingleConfig(const YamlObject &tuningData,\n> > +\t\t\t    rkisp1_cif_isp_dpf_config &config,\n> > +\t\t\t    rkisp1_cif_isp_dpf_strength_config &strengthConfig)\n> >  {\n> >  \tstd::vector<uint8_t> values;\n> >\n> > @@ -78,14 +99,14 @@ int Dpf::init([[maybe_unused]] IPAContext &context,\n> >  \t\t\t<< \"Invalid 'DomainFilter:g': expected \"\n> >  \t\t\t<< RKISP1_CIF_ISP_DPF_MAX_SPATIAL_COEFFS\n> >  \t\t\t<< \" elements, got \" << values.size();\n> > -\t\treturn -EINVAL;\n> > +\t\treturn false;\n> \n> I would propagated the errors up and return an int from\n> Dpf::parseSingleConfig() and Dpf::parseConfig(), but since\n> Dpf::init() returns -EINVAL unconditionally, it doesn't matter much.\n> \n> Preferably I would have changed Dpf::init() to return the error code\n> from parseConfig() so that different error codes could be propagated\n> up eventually\n> \n> >  \t}\nyes , If all parse* function follow same return value, the ERROR code can back tracking to init function\nwill update into next series\n> >\n> >  \tstd::copy_n(values.begin(), values.size(),\n> > -\t\t    std::begin(config_.g_flt.spatial_coeff));\n> > +\t\t    std::begin(config.g_flt.spatial_coeff));\n> >\n> > -\tconfig_.g_flt.gr_enable = true;\n> > -\tconfig_.g_flt.gb_enable = true;\n> > +\tconfig.g_flt.gr_enable = true;\n> > +\tconfig.g_flt.gb_enable = true;\n> >\n> >  \t/*\n> >  \t * For the red and blue components, we have the 13x9 kernel specified\n> > @@ -116,18 +137,18 @@ int Dpf::init([[maybe_unused]] IPAContext &context,\n> >  \t\t\t<< RKISP1_CIF_ISP_DPF_MAX_SPATIAL_COEFFS - 1\n> >  \t\t\t<< \" or \" << RKISP1_CIF_ISP_DPF_MAX_SPATIAL_COEFFS\n> >  \t\t\t<< \" elements, got \" << values.size();\n> > -\t\treturn -EINVAL;\n> > +\t\treturn false;\n> >  \t}\n> >\n> > -\tconfig_.rb_flt.fltsize = values.size() == RKISP1_CIF_ISP_DPF_MAX_SPATIAL_COEFFS\n> > -\t\t\t       ? RKISP1_CIF_ISP_DPF_RB_FILTERSIZE_13x9\n> > -\t\t\t       : RKISP1_CIF_ISP_DPF_RB_FILTERSIZE_9x9;\n> > +\tconfig.rb_flt.fltsize = values.size() == RKISP1_CIF_ISP_DPF_MAX_SPATIAL_COEFFS\n> > +\t\t\t\t\t? RKISP1_CIF_ISP_DPF_RB_FILTERSIZE_13x9\n> > +\t\t\t\t\t: RKISP1_CIF_ISP_DPF_RB_FILTERSIZE_9x9;\n> >\n> >  \tstd::copy_n(values.begin(), values.size(),\n> > -\t\t    std::begin(config_.rb_flt.spatial_coeff));\n> > +\t\t    std::begin(config.rb_flt.spatial_coeff));\n> >\n> > -\tconfig_.rb_flt.r_enable = true;\n> > -\tconfig_.rb_flt.b_enable = true;\n> > +\tconfig.rb_flt.r_enable = true;\n> > +\tconfig.rb_flt.b_enable = true;\n> >\n> >  \t/*\n> >  \t * The range kernel is configured with a noise level lookup table (NLL)\n> > @@ -143,32 +164,32 @@ int Dpf::init([[maybe_unused]] IPAContext &context,\n> >  \t\t\t<< \"Invalid 'RangeFilter:coeff': expected \"\n> >  \t\t\t<< RKISP1_CIF_ISP_DPF_MAX_NLF_COEFFS\n> >  \t\t\t<< \" elements, got \" << nllValues.size();\n> > -\t\treturn -EINVAL;\n> > +\t\treturn false;\n> >  \t}\n> >\n> >  \tstd::copy_n(nllValues.begin(), nllValues.size(),\n> > -\t\t    std::begin(config_.nll.coeff));\n> > +\t\t    std::begin(config.nll.coeff));\n> >\n> >  \tstd::string scaleMode = rFObject[\"scale-mode\"].get<std::string>(\"\");\n> >  \tif (scaleMode == \"linear\") {\n> > -\t\tconfig_.nll.scale_mode = RKISP1_CIF_ISP_NLL_SCALE_LINEAR;\n> > +\t\tconfig.nll.scale_mode = RKISP1_CIF_ISP_NLL_SCALE_LINEAR;\n> >  \t} else if (scaleMode == \"logarithmic\") {\n> > -\t\tconfig_.nll.scale_mode = RKISP1_CIF_ISP_NLL_SCALE_LOGARITHMIC;\n> > +\t\tconfig.nll.scale_mode = RKISP1_CIF_ISP_NLL_SCALE_LOGARITHMIC;\n> >  \t} else {\n> >  \t\tLOG(RkISP1Dpf, Error)\n> >  \t\t\t<< \"Invalid 'RangeFilter:scale-mode': expected \"\n> >  \t\t\t<< \"'linear' or 'logarithmic' value, got \"\n> >  \t\t\t<< scaleMode;\n> > -\t\treturn -EINVAL;\n> > +\t\treturn false;\n> >  \t}\n> >\n> >  \tconst YamlObject &fSObject = tuningData[\"FilterStrength\"];\n> >\n> > -\tstrengthConfig_.r = fSObject[\"r\"].get<uint16_t>(64);\n> > -\tstrengthConfig_.g = fSObject[\"g\"].get<uint16_t>(64);\n> > -\tstrengthConfig_.b = fSObject[\"b\"].get<uint16_t>(64);\n> > +\tstrengthConfig.r = fSObject[\"r\"].get<uint8_t>().value_or(64);\n> > +\tstrengthConfig.g = fSObject[\"g\"].get<uint8_t>().value_or(64);\n> > +\tstrengthConfig.b = fSObject[\"b\"].get<uint8_t>().value_or(64);\n> >\n> > -\treturn 0;\n> > +\treturn true;\n> >  }\n> >\n> >  /**\n> > diff --git a/src/ipa/rkisp1/algorithms/dpf.h b/src/ipa/rkisp1/algorithms/dpf.h\n> > index 2dd8cd36..bee6fc9b 100644\n> > --- a/src/ipa/rkisp1/algorithms/dpf.h\n> > +++ b/src/ipa/rkisp1/algorithms/dpf.h\n> > @@ -30,6 +30,11 @@ public:\n> >  \t\t     RkISP1Params *params) override;\n> >\n> >  private:\n> > +\tbool parseConfig(const YamlObject &tuningData);\n> > +\tbool parseSingleConfig(const YamlObject &tuningData,\n> > +\t\t\t       rkisp1_cif_isp_dpf_config &config,\n> > +\t\t\t       rkisp1_cif_isp_dpf_strength_config &strengthConfig);\n> > +\n> \n> Thanks\n> \n> With the above issues addressed\n> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n> \n> Thanks\n>   j\n> \n> >  \tstruct rkisp1_cif_isp_dpf_config config_;\n> >  \tstruct rkisp1_cif_isp_dpf_strength_config strengthConfig_;\n> >  };\n> > --\n> > 2.43.0\n> >","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 E3A30BD1F1\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSat, 13 Dec 2025 21:10:08 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id A667161934;\n\tSat, 13 Dec 2025 22:10:07 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 5E326610A6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat, 13 Dec 2025 22:10:06 +0100 (CET)","from pyrite.rasen.tech (unknown [209.216.103.65])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 24AD61196;\n\tSat, 13 Dec 2025 22:10:02 +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=\"PVtv1w/F\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1765660202;\n\tbh=HPawpciLvZxTIEOPEeudwEw1QVFiQYaS7OmAVd29UHA=;\n\th=Date:From:To:Cc:In-Reply-To:References:Subject:From;\n\tb=PVtv1w/FoX9A+0f+rjsZcv3UvEAQ/emVF+TjXneCgtUWJ1JBP+VarY9wSWD4OZaAC\n\t3xjTszR4D8qW93bIXGEQPd6QeBPEqrothfunGMgmmMs2Vl05937oEZm9DUhn6x6B9T\n\t/OCjiq13fvrNSV1thF57wlPiBmIpcLv3rUVwt6q0=","Date":"Sat, 13 Dec 2025 16:09:52 -0500","Message-ID":"<c2516cc8966c09082264f067ce602757.rui.wang@ideasonboard.com>","From":"Rui Wang <rui.wang@ideasonboard.com>","To":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>,\n\tRui Wang <rui.wang@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","In-Reply-To":"<den7ny2pse7ut6bbhijv2577yld5c5kksbdp2q4flbms7s2bx7@d4ed3fjwu5rl>","References":"<20251208004808.1274417-1-rui.wang@ideasonboard.com>\n\t<20251208004808.1274417-2-rui.wang@ideasonboard.com>\n\t<den7ny2pse7ut6bbhijv2577yld5c5kksbdp2q4flbms7s2bx7@d4ed3fjwu5rl>","Subject":"Re: [PATCH v4 1/7] ipa: rkisp1: algorithms: dpf: refactor DPF\n\tparsing and initialization","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>"}}]