Show a patch.

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

{
    "id": 11346,
    "url": "https://patchwork.libcamera.org/api/patches/11346/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/11346/",
    "project": {
        "id": 1,
        "url": "https://patchwork.libcamera.org/api/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": "<20210219172224.69862-2-jeanmichel.hautbois@ideasonboard.com>",
    "date": "2021-02-19T17:22:23",
    "name": "[libcamera-devel,RFC,1/2] WIP: ipa: Add Controller and Algorithm skeleton",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "2148afcde1d8367f305d9c4201b498f9d132b156",
    "submitter": {
        "id": 75,
        "url": "https://patchwork.libcamera.org/api/people/75/?format=api",
        "name": "Jean-Michel Hautbois",
        "email": "jeanmichel.hautbois@ideasonboard.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/11346/mbox/",
    "series": [
        {
            "id": 1711,
            "url": "https://patchwork.libcamera.org/api/series/1711/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=1711",
            "date": "2021-02-19T17:22:22",
            "name": "Implement IPA algorithms and demo with IPU3",
            "version": 1,
            "mbox": "https://patchwork.libcamera.org/series/1711/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/11346/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/11346/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 8D7C9BD1F6\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 19 Feb 2021 17:22:29 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5BDA4689E2;\n\tFri, 19 Feb 2021 18:22:29 +0100 (CET)",
            "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 4976C689DC\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 19 Feb 2021 18:22:27 +0100 (CET)",
            "from localhost.localdomain (unknown\n\t[IPv6:2a01:e0a:169:7140:e9be:2a73:b117:75b1])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id A82FA879;\n\tFri, 19 Feb 2021 18:22:25 +0100 (CET)"
        ],
        "Authentication-Results": "lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"Vuc7rExO\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1613755345;\n\tbh=smpJF0r+ABg5KBioHkwRWdRiJSeSxoS98FvuUwR+lBQ=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=Vuc7rExOdWMUkjGRE8O56B/bnyLO+ITjGHPNdJFNvyeUCylUWjnwzLAqTogZ1bAPO\n\ta60uVCkQfaXeWuq2Fzqu8/xkddp1weWYLvx8uROjcJ3zVigisZ8TAsm8pZ12opULBO\n\tyDqQQHhlr4CcTOaRuGqZx5+netPQCpH3QpT9Z0wc=",
        "From": "Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Date": "Fri, 19 Feb 2021 18:22:23 +0100",
        "Message-Id": "<20210219172224.69862-2-jeanmichel.hautbois@ideasonboard.com>",
        "X-Mailer": "git-send-email 2.27.0",
        "In-Reply-To": "<20210219172224.69862-1-jeanmichel.hautbois@ideasonboard.com>",
        "References": "<20210219172224.69862-1-jeanmichel.hautbois@ideasonboard.com>",
        "MIME-Version": "1.0",
        "Subject": "[libcamera-devel] [RFC PATCH 1/2] WIP: ipa: Add Controller and\n\tAlgorithm skeleton",
        "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>",
        "Content-Type": "text/plain; charset=\"us-ascii\"",
        "Content-Transfer-Encoding": "7bit",
        "Errors-To": "libcamera-devel-bounces@lists.libcamera.org",
        "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"
    },
    "content": "In order to instanciate and control IPA algorithms (AWB, AGC, etc.)\nthere is a need for an IPA algorithm class to define mandatory methods,\nand an IPA controller class to operate algorithms together.\n\nInstead of reinventing the wheel, reuse what Raspberry Pi has done and\nadapt to the minimum requirements expected.\n\nSigned-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>\n---\n include/libcamera/ipa/agc_algorithm.h  | 32 ++++++++++++++++++\n include/libcamera/ipa/awb_algorithm.h  | 27 +++++++++++++++\n include/libcamera/ipa/ipa_algorithm.h  | 46 ++++++++++++++++++++++++++\n include/libcamera/ipa/ipa_controller.h | 39 ++++++++++++++++++++++\n include/libcamera/ipa/meson.build      |  4 +++\n src/ipa/libipa/ipa_algorithm.cpp       | 20 +++++++++++\n src/ipa/libipa/ipa_controller.cpp      | 45 +++++++++++++++++++++++++\n src/ipa/libipa/meson.build             |  2 ++\n 8 files changed, 215 insertions(+)\n create mode 100644 include/libcamera/ipa/agc_algorithm.h\n create mode 100644 include/libcamera/ipa/awb_algorithm.h\n create mode 100644 include/libcamera/ipa/ipa_algorithm.h\n create mode 100644 include/libcamera/ipa/ipa_controller.h\n create mode 100644 src/ipa/libipa/ipa_algorithm.cpp\n create mode 100644 src/ipa/libipa/ipa_controller.cpp",
    "diff": "diff --git a/include/libcamera/ipa/agc_algorithm.h b/include/libcamera/ipa/agc_algorithm.h\nnew file mode 100644\nindex 00000000..4dd17103\n--- /dev/null\n+++ b/include/libcamera/ipa/agc_algorithm.h\n@@ -0,0 +1,32 @@\n+/* SPDX-License-Identifier: BSD-2-Clause */\n+/*\n+ * Copyright (C) 2019, Raspberry Pi (Trading) Limited\n+ *\n+ * agc_algorithm.h - AGC/AEC control algorithm interface\n+ */\n+#ifndef __LIBCAMERA_AGC_ALGORITHM_H__\n+#define __LIBCAMERA_AGC_ALGORITHM_H__\n+\n+#include <libcamera/ipa/ipa_algorithm.h>\n+\n+namespace libcamera {\n+\n+class AgcAlgorithm : public IPAAlgorithm\n+{\n+public:\n+\tAgcAlgorithm(IPAController *controller)\n+\t\t: IPAAlgorithm(controller) {}\n+\t/* An AGC algorithm must provide the following: */\n+\tvirtual unsigned int GetConvergenceFrames() const = 0;\n+\tvirtual void SetEv(double ev) = 0;\n+\tvirtual void SetFlickerPeriod(double flicker_period) = 0;\n+\tvirtual void SetFixedShutter(double fixed_shutter) = 0; // microseconds\n+\tvirtual void SetMaxShutter(double max_shutter) = 0; // microseconds\n+\tvirtual void SetFixedAnalogueGain(double fixed_analogue_gain) = 0;\n+\tvirtual void SetMeteringMode(std::string const &metering_mode_name) = 0;\n+\tvirtual void SetExposureMode(std::string const &exposure_mode_name) = 0;\n+};\n+\n+} /* namespace libcamera */\n+\n+#endif /* __LIBCAMERA_AGC_ALGORITHM_H__ */\ndiff --git a/include/libcamera/ipa/awb_algorithm.h b/include/libcamera/ipa/awb_algorithm.h\nnew file mode 100644\nindex 00000000..37464d12\n--- /dev/null\n+++ b/include/libcamera/ipa/awb_algorithm.h\n@@ -0,0 +1,27 @@\n+/* SPDX-License-Identifier: BSD-2-Clause */\n+/*\n+ * Copyright (C) 2019, Raspberry Pi (Trading) Limited\n+ *\n+ * awb_algorithm.h - AWB control algorithm interface\n+ */\n+#ifndef __LIBCAMERA_AWB_ALGORITHM_H__\n+#define __LIBCAMERA_AWB_ALGORITHM_H__\n+\n+#include <libcamera/ipa/ipa_algorithm.h>\n+\n+namespace libcamera {\n+\n+class AwbAlgorithm : public IPAAlgorithm\n+{\n+public:\n+\tAwbAlgorithm(IPAController *controller)\n+\t\t: IPAAlgorithm(controller) {}\n+\t/* An AWB algorithm must provide the following: */\n+\tvirtual unsigned int GetConvergenceFrames() const = 0;\n+\tvirtual void SetMode(std::string const &mode_name) = 0;\n+\tvirtual void SetManualGains(double manual_r, double manual_b) = 0;\n+};\n+\n+} /* namespace libcamera */\n+\n+#endif /* __LIBCAMERA_AWB_ALGORITHM_H__ */\ndiff --git a/include/libcamera/ipa/ipa_algorithm.h b/include/libcamera/ipa/ipa_algorithm.h\nnew file mode 100644\nindex 00000000..e48b99a6\n--- /dev/null\n+++ b/include/libcamera/ipa/ipa_algorithm.h\n@@ -0,0 +1,46 @@\n+/* SPDX-License-Identifier: LGPL-2.1-or-later */\n+/*\n+ * Copyright (C) 2019, Raspberry Pi (Trading) Limited\n+ *\n+ * ipa_algorithm.h - ISP control algorithm interface\n+ */\n+#ifndef __LIBCAMERA_IPA_ALGORITHM_H__\n+#define __LIBCAMERA_IPA_ALGORITHM_H__\n+\n+/* All algorithms should be derived from this class and made available to the\n+ * Controller. */\n+\n+#include <map>\n+#include <memory>\n+#include <string>\n+\n+#include \"ipa_controller.h\"\n+\n+namespace libcamera {\n+\n+/* This defines the basic interface for all control algorithms. */\n+\n+class IPAAlgorithm\n+{\n+public:\n+\tIPAAlgorithm(IPAController *controller)\n+\t\t: controller_(controller), paused_(false)\n+\t{\n+\t}\n+\tvirtual ~IPAAlgorithm() = default;\n+\tvirtual char const *Name() const = 0;\n+\tvirtual bool IsPaused() const { return paused_; }\n+\tvirtual void Pause() { paused_ = true; }\n+\tvirtual void Resume() { paused_ = false; }\n+\tvirtual void Initialise();\n+\tvirtual void Prepare();\n+\tvirtual void Process();\n+\n+private:\n+\t[[maybe_unused]] IPAController *controller_;\n+\tbool paused_;\n+};\n+\n+} /* namespace libcamera */\n+\n+#endif /* __LIBCAMERA_IPA_ALGORITHM_H__ */\ndiff --git a/include/libcamera/ipa/ipa_controller.h b/include/libcamera/ipa/ipa_controller.h\nnew file mode 100644\nindex 00000000..953cad4a\n--- /dev/null\n+++ b/include/libcamera/ipa/ipa_controller.h\n@@ -0,0 +1,39 @@\n+/* SPDX-License-Identifier: LGPL-2.1-or-later */\n+/*\n+ * Copyright (C) 2019, Raspberry Pi (Trading) Limited\n+ *\n+ * ipa_controller.h - ISP controller interface\n+ */\n+#ifndef __LIBCAMERA_IPA_CONTROLLER_H__\n+#define __LIBCAMERA_IPA_CONTROLLER_H__\n+\n+// The Controller is simply a container for a collecting together a number of\n+// \"control algorithms\" (such as AWB etc.) and for running them all in a\n+// convenient manner.\n+\n+#include <string>\n+#include <vector>\n+\n+namespace libcamera {\n+\n+class IPAAlgorithm;\n+typedef std::unique_ptr<IPAAlgorithm> IPAAlgorithmPtr;\n+\n+class IPAController\n+{\n+public:\n+\tIPAController();\n+\t~IPAController();\n+\tIPAAlgorithm *CreateAlgorithm(char const *name);\n+\tvoid Initialise();\n+\tvoid Prepare();\n+\tvoid Process();\n+\tIPAAlgorithm *GetAlgorithm(std::string const &name) const;\n+\n+protected:\n+\tstd::vector<IPAAlgorithmPtr> algorithms_;\n+};\n+\n+} /* namespace libcamera */\n+\n+#endif /* __LIBCAMERA_IPA_CONTROLLER_H__ */\ndiff --git a/include/libcamera/ipa/meson.build b/include/libcamera/ipa/meson.build\nindex a4d3f868..e56d8b00 100644\n--- a/include/libcamera/ipa/meson.build\n+++ b/include/libcamera/ipa/meson.build\n@@ -1,6 +1,10 @@\n # SPDX-License-Identifier: CC0-1.0\n \n libcamera_ipa_headers = files([\n+    'agc_algorithm.h',\n+    'awb_algorithm.h',\n+    'ipa_algorithm.h',\n+    'ipa_controller.h',\n     'ipa_controls.h',\n     'ipa_interface.h',\n     'ipa_module_info.h',\ndiff --git a/src/ipa/libipa/ipa_algorithm.cpp b/src/ipa/libipa/ipa_algorithm.cpp\nnew file mode 100644\nindex 00000000..16fb29ce\n--- /dev/null\n+++ b/src/ipa/libipa/ipa_algorithm.cpp\n@@ -0,0 +1,20 @@\n+/* SPDX-License-Identifier: BSD-2-Clause */\n+/*\n+ * Copyright (C) 2019, Raspberry Pi (Trading) Limited\n+ *\n+ * ipa_algorithm.cpp - ISP control algorithms\n+ */\n+#include <iostream>\n+\n+#include <libcamera/ipa/ipa_algorithm.h>\n+\n+using namespace libcamera;\n+\n+void IPAAlgorithm::Initialise()\n+{\n+\tstd::cout << \"Entering: \" << __func__ << std::endl;\n+}\n+\n+void IPAAlgorithm::Prepare() {}\n+\n+void IPAAlgorithm::Process() {}\ndiff --git a/src/ipa/libipa/ipa_controller.cpp b/src/ipa/libipa/ipa_controller.cpp\nnew file mode 100644\nindex 00000000..e2cde8ce\n--- /dev/null\n+++ b/src/ipa/libipa/ipa_controller.cpp\n@@ -0,0 +1,45 @@\n+/* SPDX-License-Identifier: BSD-2-Clause */\n+/*\n+ * Copyright (C) 2019, Raspberry Pi (Trading) Limited\n+ *\n+ * ipa_controller.cpp - ISP controller\n+ */\n+\n+#include \"libcamera/internal/log.h\"\n+\n+#include <libcamera/ipa/ipa_algorithm.h>\n+#include <libcamera/ipa/ipa_controller.h>\n+\n+using namespace libcamera;\n+\n+LOG_DEFINE_CATEGORY(IPAController)\n+\n+IPAController::IPAController() {}\n+\n+IPAController::~IPAController() {}\n+\n+IPAAlgorithm *IPAController::CreateAlgorithm(char const *name)\n+{\n+\tLOG(IPAController, Error) << \"Create algorithm \" << name;\n+\treturn nullptr;\n+}\n+\n+void IPAController::Initialise()\n+{\n+\tfor (auto &algo : algorithms_)\n+\t\talgo->Initialise();\n+}\n+\n+void IPAController::Prepare()\n+{\n+\tfor (auto &algo : algorithms_)\n+\t\tif (!algo->IsPaused())\n+\t\t\talgo->Prepare();\n+}\n+\n+void IPAController::Process()\n+{\n+\tfor (auto &algo : algorithms_)\n+\t\tif (!algo->IsPaused())\n+\t\t\talgo->Process();\n+}\ndiff --git a/src/ipa/libipa/meson.build b/src/ipa/libipa/meson.build\nindex b29ef0f4..1693e489 100644\n--- a/src/ipa/libipa/meson.build\n+++ b/src/ipa/libipa/meson.build\n@@ -4,6 +4,8 @@ libipa_headers = files([\n ])\n \n libipa_sources = files([\n+    'ipa_algorithm.cpp',\n+    'ipa_controller.cpp',\n ])\n \n libipa_includes = include_directories('..')\n",
    "prefixes": [
        "libcamera-devel",
        "RFC",
        "1/2"
    ]
}