Show a patch.

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

{
    "id": 16829,
    "url": "https://patchwork.libcamera.org/api/1.1/patches/16829/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/16829/",
    "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": "<20220727083819.589595-2-fsylvestre@baylibre.com>",
    "date": "2022-07-27T08:38:18",
    "name": "[libcamera-devel,v4,1/2] ipa: rkisp1: Add support of Filter control",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "44214eaed1700bce610c47f2f51f2b85c395c87d",
    "submitter": {
        "id": 123,
        "url": "https://patchwork.libcamera.org/api/1.1/people/123/?format=api",
        "name": "Florian Sylvestre",
        "email": "fsylvestre@baylibre.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/16829/mbox/",
    "series": [
        {
            "id": 3333,
            "url": "https://patchwork.libcamera.org/api/1.1/series/3333/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=3333",
            "date": "2022-07-27T08:38:17",
            "name": "Add Filter and Color Processing control for rkisp1",
            "version": 4,
            "mbox": "https://patchwork.libcamera.org/series/3333/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/16829/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/16829/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 56E7AC3275\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 27 Jul 2022 08:38:28 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 0F68C63319;\n\tWed, 27 Jul 2022 10:38:28 +0200 (CEST)",
            "from mail-wm1-x32a.google.com (mail-wm1-x32a.google.com\n\t[IPv6:2a00:1450:4864:20::32a])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id E18186330E\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 27 Jul 2022 10:38:25 +0200 (CEST)",
            "by mail-wm1-x32a.google.com with SMTP id b6so10088129wmq.5\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 27 Jul 2022 01:38:25 -0700 (PDT)",
            "from BL087.. ([2a01:e34:eea9:e630:5810:316e:87c:fc17])\n\tby smtp.gmail.com with ESMTPSA id\n\tl18-20020a05600c1d1200b003a2fb1224d9sm1745040wms.19.2022.07.27.01.38.23\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tWed, 27 Jul 2022 01:38:23 -0700 (PDT)"
        ],
        "DKIM-Signature": [
            "v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1658911108;\n\tbh=Jw/X/1xSbD9xYjfpC+uoj+s3NsRD51la7Mlj+MeOOtI=;\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=szTSwyh2J+1zYJoDlhpsXTrNY0CydMaQI9GeiM5fl2V7ESpx0SWWEkgoVhhFt9elm\n\tH38Nar3YbojB+xJj7LYgkaWUJCGF9lNNmhNYONA5PVZzcqcT5UgtxVGAvqtkJ1ZNsF\n\tHjKR3cTaALp2bQsAIex+XDXKsQzgrHF/mWxhCr3Ni7/ghfz1nZTpc61D6mbzJ2xMce\n\tvGlztk+AxDTDbU3YdYQnX/d8r2JeCUknkrr5wUrtu1gmZeIP3hEfCa2kWq8VX4ccAD\n\tE0kP9qdghp1HUy041idILojNrvc1PjuYvflEAV2OD1MQ7bvSfLK9ghLkU2rMNg+LNJ\n\tGG0hn/B78hFHA==",
            "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=baylibre-com.20210112.gappssmtp.com; s=20210112;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references\n\t:mime-version:content-transfer-encoding;\n\tbh=bLtF4fq9+3aONrH1M7FuchSGGH4uA7dDAozCTZFU6Ew=;\n\tb=X3ogbDjtUz9gwH3qCmMxwIagD7kBZi1SL5bcDUV7E9HlzLAriW4odHeE43OH6aB47X\n\tVXRnEMeOHLaUIJS+tv1qyL6jQr/nGyZPy1m5gMvACIbAxB3DER6CUbmYXbMpW5CK0Y1s\n\twKjnyor4SRUSYNik1EW4VIfmaWCrQFFRAyXidyF3IdZbAsScwpJvUe1Vlb4nx8deMLtB\n\tygj8h2/8TEO91KnfqV3RZsgJe2ZbEgX8Ev4kAmEtYx79klyLjMt3kKF5iYDRlIp+b4oK\n\tm4DjyI3+whLW80RAu1KBnWXAzcaBoxfDPQicvaLh0LgyyORD49Wz4S1sB4yZDNV8uUyG\n\t71Vg=="
        ],
        "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected)\n\theader.d=baylibre-com.20210112.gappssmtp.com\n\theader.i=@baylibre-com.20210112.gappssmtp.com header.b=\"X3ogbDjt\"; \n\tdkim-atps=neutral",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20210112;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references:mime-version:content-transfer-encoding;\n\tbh=bLtF4fq9+3aONrH1M7FuchSGGH4uA7dDAozCTZFU6Ew=;\n\tb=4o/wsZLotPJArWaPVEq9twvnPsA4M7nUlpLsVtuAgL83oe8LlD8mszR8UkaRF58JfM\n\tJdFNmbt/ESSGhjEzIGDLPuXKekqa4K3i/BNXdYVk4yun1PNgB9hCyjSvo4DkuJ0UgH0Y\n\tOiRCINK79pcjjqiZN9WxvrHk7fC/W9F8t7mpZQTHWPVXxyrHe6BQB4JiowqK9uoMXDZ2\n\tRQBKAYsAaqkqsBG0OVwDhn4qM9w4WyubT0q0VICtWXhkaqt1BqTWcDjJ976jF4+tSKTW\n\tSENC7eNnNCoNJUFJZBTpzjrbVctRunJPWKdQkK4GDeqvvW6eawmHXk0igQusOgLRShsY\n\t62HA==",
        "X-Gm-Message-State": "AJIora/UPUeezhF/jn4vX73AAin/PwkrCbVhrOnUEXWlasSAOCgY2ma/\n\trfidqYJm1w1z4ut61uuW1/t+Tz1FrK3SvExD",
        "X-Google-Smtp-Source": "AGRyM1uu8hSTRNaEtVPAkoz0E0CeRdjprCwiuwWUQeA2g5IEynk+mHCf360gCsK9n10/FdiQHm1VXA==",
        "X-Received": "by 2002:a05:600c:1d92:b0:3a3:2167:b8e5 with SMTP id\n\tp18-20020a05600c1d9200b003a32167b8e5mr2181258wms.24.1658911104829; \n\tWed, 27 Jul 2022 01:38:24 -0700 (PDT)",
        "To": "libcamera-devel@lists.libcamera.org",
        "Date": "Wed, 27 Jul 2022 10:38:18 +0200",
        "Message-Id": "<20220727083819.589595-2-fsylvestre@baylibre.com>",
        "X-Mailer": "git-send-email 2.34.1",
        "In-Reply-To": "<20220727083819.589595-1-fsylvestre@baylibre.com>",
        "References": "<20220727083819.589595-1-fsylvestre@baylibre.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[libcamera-devel] [PATCH v4 1/2] ipa: rkisp1: Add support of Filter\n\tcontrol",
        "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": "Florian Sylvestre via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>",
        "Reply-To": "Florian Sylvestre <fsylvestre@baylibre.com>",
        "Errors-To": "libcamera-devel-bounces@lists.libcamera.org",
        "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"
    },
    "content": "Denoise and Sharpness filters will be applied by RkISP1 during the\ndemosaicing step. The denoise filter is responsible for removing noise from\nthe image, while the sharpness filter will enhance its acutance.\n\nAdd filter algorithm with denoise and sharpness values based on user controls.\n\nSigned-off-by: Florian Sylvestre <fsylvestre@baylibre.com>\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n---\n src/ipa/rkisp1/algorithms/filter.cpp     | 201 +++++++++++++++++++++++\n src/ipa/rkisp1/algorithms/filter.h       |  30 ++++\n src/ipa/rkisp1/algorithms/meson.build    |   1 +\n src/ipa/rkisp1/data/ov5640.yaml          |   1 +\n src/ipa/rkisp1/ipa_context.cpp           |  14 ++\n src/ipa/rkisp1/ipa_context.h             |   6 +\n src/libcamera/pipeline/rkisp1/rkisp1.cpp |   8 +\n 7 files changed, 261 insertions(+)\n create mode 100644 src/ipa/rkisp1/algorithms/filter.cpp\n create mode 100644 src/ipa/rkisp1/algorithms/filter.h",
    "diff": "diff --git a/src/ipa/rkisp1/algorithms/filter.cpp b/src/ipa/rkisp1/algorithms/filter.cpp\nnew file mode 100644\nindex 00000000..8ca10fd1\n--- /dev/null\n+++ b/src/ipa/rkisp1/algorithms/filter.cpp\n@@ -0,0 +1,201 @@\n+/* SPDX-License-Identifier: LGPL-2.1-or-later */\n+/*\n+ * Copyright (C) 2021-2022, Ideas On Board\n+ *\n+ * filter.cpp - RkISP1 Filter control\n+ */\n+\n+#include \"filter.h\"\n+\n+#include <cmath>\n+\n+#include <libcamera/base/log.h>\n+\n+#include <libcamera/control_ids.h>\n+\n+/**\n+ * \\file filter.h\n+ */\n+\n+namespace libcamera {\n+\n+namespace ipa::rkisp1::algorithms {\n+\n+/**\n+ * \\class Filter\n+ * \\brief RkISP1 Filter control\n+ *\n+ * Denoise and Sharpness filters will be applied by RkISP1 during the\n+ * demosaicing step. The denoise filter is responsible for removing noise from\n+ * the image, while the sharpness filter will enhance its acutance.\n+ *\n+ * \\todo In current version the denoise and sharpness control is based on user\n+ * controls. In a future version it should be controlled automatically by the\n+ * algorithm.\n+ */\n+\n+LOG_DEFINE_CATEGORY(RkISP1Filter)\n+\n+static constexpr uint32_t kFiltLumWeightDefault = 0x00022040;\n+static constexpr uint32_t kFiltModeDefault = 0x000004f2;\n+\n+/**\n+ * \\copydoc libcamera::ipa::Algorithm::queueRequest\n+ */\n+void Filter::queueRequest(IPAContext &context,\n+\t\t\t  [[maybe_unused]] const uint32_t frame,\n+\t\t\t  const ControlList &controls)\n+{\n+\tauto &filter = context.frameContext.filter;\n+\n+\tconst auto &sharpness = controls.get(controls::Sharpness);\n+\tif (sharpness) {\n+\t\tfilter.sharpness = std::round(std::clamp(*sharpness, 0.0f, 10.0f));\n+\t\tfilter.updateParams = true;\n+\n+\t\tLOG(RkISP1Filter, Debug) << \"Set sharpness to \" << *sharpness;\n+\t}\n+\n+\tconst auto &denoise = controls.get(controls::draft::NoiseReductionMode);\n+\tif (denoise) {\n+\t\tLOG(RkISP1Filter, Debug) << \"Set denoise to \" << *denoise;\n+\n+\t\tswitch (*denoise) {\n+\t\tcase controls::draft::NoiseReductionModeOff:\n+\t\t\tfilter.denoise = 0;\n+\t\t\tfilter.updateParams = true;\n+\t\t\tbreak;\n+\t\tcase controls::draft::NoiseReductionModeMinimal:\n+\t\t\tfilter.denoise = 1;\n+\t\t\tfilter.updateParams = true;\n+\t\t\tbreak;\n+\t\tcase controls::draft::NoiseReductionModeHighQuality:\n+\t\tcase controls::draft::NoiseReductionModeFast:\n+\t\t\tfilter.denoise = 3;\n+\t\t\tfilter.updateParams = true;\n+\t\t\tbreak;\n+\t\tdefault:\n+\t\t\tLOG(RkISP1Filter, Error)\n+\t\t\t\t<< \"Unsupported denoise value \"\n+\t\t\t\t<< *denoise;\n+\t\t}\n+\t}\n+}\n+\n+/**\n+ * \\copydoc libcamera::ipa::Algorithm::prepare\n+ */\n+void Filter::prepare(IPAContext &context, rkisp1_params_cfg *params)\n+{\n+\tauto &filter = context.frameContext.filter;\n+\n+\t/* Check if the algorithm configuration has been updated. */\n+\tif (!filter.updateParams)\n+\t\treturn;\n+\n+\tfilter.updateParams = false;\n+\n+\tstatic constexpr uint16_t filt_fac_sh0[] = {\n+\t\t0x04, 0x07, 0x0a, 0x0c, 0x10, 0x14, 0x1a, 0x1e, 0x24, 0x2a, 0x30\n+\t};\n+\n+\tstatic constexpr uint16_t filt_fac_sh1[] = {\n+\t\t0x04, 0x08, 0x0c, 0x10, 0x16, 0x1b, 0x20, 0x26, 0x2c, 0x30, 0x3f\n+\t};\n+\n+\tstatic constexpr uint16_t filt_fac_mid[] = {\n+\t\t0x04, 0x06, 0x08, 0x0a, 0x0c, 0x10, 0x13, 0x17, 0x1d, 0x22, 0x28\n+\t};\n+\n+\tstatic constexpr uint16_t filt_fac_bl0[] = {\n+\t\t0x02, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x10, 0x15, 0x1a, 0x24\n+\t};\n+\n+\tstatic constexpr uint16_t filt_fac_bl1[] = {\n+\t\t0x00, 0x00, 0x00, 0x02, 0x04, 0x04, 0x06, 0x08, 0x0d, 0x14, 0x20\n+\t};\n+\n+\tstatic constexpr uint16_t filt_thresh_sh0[] = {\n+\t\t0, 18, 26, 36, 41, 75, 90, 120, 170, 250, 1023\n+\t};\n+\n+\tstatic constexpr uint16_t filt_thresh_sh1[] = {\n+\t\t0, 33, 44, 51, 67, 100, 120, 150, 200, 300, 1023\n+\t};\n+\n+\tstatic constexpr uint16_t filt_thresh_bl0[] = {\n+\t\t0, 8, 13, 23, 26, 50, 60, 80, 140, 180, 1023\n+\t};\n+\n+\tstatic constexpr uint16_t filt_thresh_bl1[] = {\n+\t\t0, 2, 5, 10, 15, 20, 26, 51, 100, 150, 1023\n+\t};\n+\n+\tstatic constexpr uint16_t stage1_select[] = {\n+\t\t6, 6, 4, 4, 3, 3, 2, 2, 2, 1, 0\n+\t};\n+\n+\tstatic constexpr uint16_t filt_chr_v_mode[] = {\n+\t\t1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3\n+\t};\n+\n+\tstatic constexpr uint16_t filt_chr_h_mode[] = {\n+\t\t0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3\n+\t};\n+\n+\tuint8_t denoise = filter.denoise;\n+\tuint8_t sharpness = filter.sharpness;\n+\tauto &flt_config = params->others.flt_config;\n+\n+\tflt_config.fac_sh0 = filt_fac_sh0[sharpness];\n+\tflt_config.fac_sh1 = filt_fac_sh1[sharpness];\n+\tflt_config.fac_mid = filt_fac_mid[sharpness];\n+\tflt_config.fac_bl0 = filt_fac_bl0[sharpness];\n+\tflt_config.fac_bl1 = filt_fac_bl1[sharpness];\n+\n+\tflt_config.lum_weight = kFiltLumWeightDefault;\n+\tflt_config.mode = kFiltModeDefault;\n+\tflt_config.thresh_sh0 = filt_thresh_sh0[denoise];\n+\tflt_config.thresh_sh1 = filt_thresh_sh1[denoise];\n+\tflt_config.thresh_bl0 = filt_thresh_bl0[denoise];\n+\tflt_config.thresh_bl1 = filt_thresh_bl1[denoise];\n+\tflt_config.grn_stage1 = stage1_select[denoise];\n+\tflt_config.chr_v_mode = filt_chr_v_mode[denoise];\n+\tflt_config.chr_h_mode = filt_chr_h_mode[denoise];\n+\n+\t/*\n+\t * Combined high denoising and high sharpening requires some\n+\t * adjustments to the configuration of the filters. A first stage\n+\t * filter with a lower strength must be selected, and the blur factors\n+\t * must be decreased.\n+\t */\n+\tif (denoise == 9) {\n+\t\tif (sharpness > 3)\n+\t\t\tflt_config.grn_stage1 = 2;\n+\t} else if (denoise == 10) {\n+\t\tif (sharpness > 5)\n+\t\t\tflt_config.grn_stage1 = 2;\n+\t\telse if (sharpness > 3)\n+\t\t\tflt_config.grn_stage1 = 1;\n+\t}\n+\n+\tif (denoise > 7) {\n+\t\tif (sharpness > 7) {\n+\t\t\tflt_config.fac_bl0 /= 2;\n+\t\t\tflt_config.fac_bl1 /= 4;\n+\t\t} else if (sharpness > 4) {\n+\t\t\tflt_config.fac_bl0 = flt_config.fac_bl0 * 3 / 4;\n+\t\t\tflt_config.fac_bl1 /= 2;\n+\t\t}\n+\t}\n+\n+\tparams->module_en_update |= RKISP1_CIF_ISP_MODULE_FLT;\n+\tparams->module_ens |= RKISP1_CIF_ISP_MODULE_FLT;\n+\tparams->module_cfg_update |= RKISP1_CIF_ISP_MODULE_FLT;\n+}\n+\n+REGISTER_IPA_ALGORITHM(Filter, \"Filter\")\n+\n+} /* namespace ipa::rkisp1::algorithms */\n+\n+} /* namespace libcamera */\ndiff --git a/src/ipa/rkisp1/algorithms/filter.h b/src/ipa/rkisp1/algorithms/filter.h\nnew file mode 100644\nindex 00000000..9eb170eb\n--- /dev/null\n+++ b/src/ipa/rkisp1/algorithms/filter.h\n@@ -0,0 +1,30 @@\n+/* SPDX-License-Identifier: LGPL-2.1-or-later */\n+/*\n+ * Copyright (C) 2021-2022, Ideas On Board\n+ *\n+ * filter.h - RkISP1 Filter control\n+ */\n+\n+#pragma once\n+\n+#include <sys/types.h>\n+\n+#include \"algorithm.h\"\n+\n+namespace libcamera {\n+\n+namespace ipa::rkisp1::algorithms {\n+\n+class Filter : public Algorithm\n+{\n+public:\n+\tFilter() = default;\n+\t~Filter() = default;\n+\n+\tvoid queueRequest(IPAContext &context, const uint32_t frame,\n+\t\t\t  const ControlList &controls) override;\n+\tvoid prepare(IPAContext &context, rkisp1_params_cfg *params) override;\n+};\n+\n+} /* namespace ipa::rkisp1::algorithms */\n+} /* namespace libcamera */\ndiff --git a/src/ipa/rkisp1/algorithms/meson.build b/src/ipa/rkisp1/algorithms/meson.build\nindex 87007493..dcd24fe0 100644\n--- a/src/ipa/rkisp1/algorithms/meson.build\n+++ b/src/ipa/rkisp1/algorithms/meson.build\n@@ -5,6 +5,7 @@ rkisp1_ipa_algorithms = files([\n     'awb.cpp',\n     'blc.cpp',\n     'dpcc.cpp',\n+    'filter.cpp',\n     'gsl.cpp',\n     'lsc.cpp',\n ])\ndiff --git a/src/ipa/rkisp1/data/ov5640.yaml b/src/ipa/rkisp1/data/ov5640.yaml\nindex 2315ec43..99529481 100644\n--- a/src/ipa/rkisp1/data/ov5640.yaml\n+++ b/src/ipa/rkisp1/data/ov5640.yaml\n@@ -155,4 +155,5 @@ algorithms:\n           rnd-offsets:\n             green: 2\n             red-blue: 2\n+  - Filter:\n ...\ndiff --git a/src/ipa/rkisp1/ipa_context.cpp b/src/ipa/rkisp1/ipa_context.cpp\nindex 30bb87a9..4b117186 100644\n--- a/src/ipa/rkisp1/ipa_context.cpp\n+++ b/src/ipa/rkisp1/ipa_context.cpp\n@@ -136,6 +136,20 @@ namespace libcamera::ipa::rkisp1 {\n  * \\brief Estimated color temperature\n  */\n \n+/**\n+ * \\var IPAFrameContext::filter\n+ * \\brief Context for the Filter algorithm\n+ *\n+ * \\struct IPAFrameContext::filter.denoise\n+ * \\brief Denoising level\n+ *\n+ * \\var IPAFrameContext::filter.sharpness\n+ * \\brief Sharpness level\n+ *\n+ * \\var IPAFrameContext::filter.updateParams\n+ * \\brief Indicates if ISP parameters need to be updated\n+ */\n+\n /**\n  * \\var IPAFrameContext::sensor\n  * \\brief Effective sensor values\ndiff --git a/src/ipa/rkisp1/ipa_context.h b/src/ipa/rkisp1/ipa_context.h\nindex 3bfb262c..3b2f6af1 100644\n--- a/src/ipa/rkisp1/ipa_context.h\n+++ b/src/ipa/rkisp1/ipa_context.h\n@@ -57,6 +57,12 @@ struct IPAFrameContext {\n \t\tdouble temperatureK;\n \t} awb;\n \n+\tstruct {\n+\t\tuint8_t denoise;\n+\t\tuint8_t sharpness;\n+\t\tbool updateParams;\n+\t} filter;\n+\n \tstruct {\n \t\tuint32_t exposure;\n \t\tdouble gain;\ndiff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\nindex 99eecd44..4e000d31 100644\n--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n@@ -968,6 +968,14 @@ int PipelineHandlerRkISP1::createCamera(MediaEntity *sensor)\n \t\t\t\t\t\t   hasSelfPath_ ? &selfPath_ : nullptr);\n \n \tControlInfoMap::Map ctrls;\n+\tctrls.emplace(std::piecewise_construct,\n+\t\t      std::forward_as_tuple(&controls::Sharpness),\n+\t\t      std::forward_as_tuple(0.0f, 10.0f, 1.0f));\n+\n+\tctrls.emplace(std::piecewise_construct,\n+\t\t      std::forward_as_tuple(&controls::draft::NoiseReductionMode),\n+\t\t      std::forward_as_tuple(controls::draft::NoiseReductionModeValues));\n+\n \tctrls.emplace(std::piecewise_construct,\n \t\t      std::forward_as_tuple(&controls::AeEnable),\n \t\t      std::forward_as_tuple(false, true));\n",
    "prefixes": [
        "libcamera-devel",
        "v4",
        "1/2"
    ]
}