Patch Detail
Show a patch.
GET /api/1.1/patches/9737/?format=api
{ "id": 9737, "url": "https://patchwork.libcamera.org/api/1.1/patches/9737/?format=api", "web_url": "https://patchwork.libcamera.org/patch/9737/", "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": "<20200922133537.258098-34-paul.elder@ideasonboard.com>", "date": "2020-09-22T13:35:32", "name": "[libcamera-devel,33/38] libcamera: IPAManager: Make createIPA return proxy directly", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "ab67d1f5a9619a9ce9330e8379442a008a9f6885", "submitter": { "id": 17, "url": "https://patchwork.libcamera.org/api/1.1/people/17/?format=api", "name": "Paul Elder", "email": "paul.elder@ideasonboard.com" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/9737/mbox/", "series": [ { "id": 1309, "url": "https://patchwork.libcamera.org/api/1.1/series/1309/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=1309", "date": "2020-09-22T13:34:59", "name": "IPA isolation implementation", "version": 1, "mbox": "https://patchwork.libcamera.org/series/1309/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/9737/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/9737/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 38DECBF01C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 22 Sep 2020 13:39:55 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 03CB662FF4;\n\tTue, 22 Sep 2020 15:39:55 +0200 (CEST)", "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 3750F62FD6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 22 Sep 2020 15:39:54 +0200 (CEST)", "from pyrite.rasen.tech (unknown\n\t[IPv6:2400:4051:61:600:2c71:1b79:d06d:5032])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id B2937555;\n\tTue, 22 Sep 2020 15:39:46 +0200 (CEST)" ], "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=\"SXHipOwe\"; dkim-atps=neutral", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1600781988;\n\tbh=Dfh5u5cmmjKLnFzBWT7atq0ibZN2flDk8PgGc3g35G8=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=SXHipOwePUqNT0ZQgxp0uqm/9aNC+liAWhFNohrjeOIomwnAdT5AXlJ3BHCuqfXya\n\tXb7hJ6sqQ4NxJUAQXh/8Yz06S0asPq0fv57hZwR1/nvQi72QgFlwOd2+FiXqFCeg8f\n\t2/Bu9nQ1KW+6ndD42cTO4IicchXCOOcfTgC6OZ5Q=", "From": "Paul Elder <paul.elder@ideasonboard.com>", "To": "libcamera-devel@lists.libcamera.org", "Date": "Tue, 22 Sep 2020 22:35:32 +0900", "Message-Id": "<20200922133537.258098-34-paul.elder@ideasonboard.com>", "X-Mailer": "git-send-email 2.27.0", "In-Reply-To": "<20200922133537.258098-1-paul.elder@ideasonboard.com>", "References": "<20200922133537.258098-1-paul.elder@ideasonboard.com>", "MIME-Version": "1.0", "Subject": "[libcamera-devel] [PATCH 33/38] libcamera: IPAManager: Make\n\tcreateIPA return proxy directly", "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=\"utf-8\"", "Content-Transfer-Encoding": "base64", "Errors-To": "libcamera-devel-bounces@lists.libcamera.org", "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>" }, "content": "Since every pipeline knows the type of the proxy that it needs, and\nsince all IPAs are to be wrapped in a proxy, IPAManager no longer needs\nto search in the factory list to fetch the proxy factory to construct a\nfactory. Instead, we define createIPA as a template function, and the\npipeline handler can declare the proxy type when it calls createIPA.\n\nSigned-off-by: Paul Elder <paul.elder@ideasonboard.com>\nReviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n\n---\nNo change in v2\n---\n include/libcamera/internal/ipa_manager.h | 31 ++++++++++--\n src/libcamera/ipa_manager.cpp | 48 +------------------\n .../pipeline/raspberrypi/raspberrypi.cpp | 3 +-\n 3 files changed, 30 insertions(+), 52 deletions(-)", "diff": "diff --git a/include/libcamera/internal/ipa_manager.h b/include/libcamera/internal/ipa_manager.h\nindex 4a143b6a..297a8a58 100644\n--- a/include/libcamera/internal/ipa_manager.h\n+++ b/include/libcamera/internal/ipa_manager.h\n@@ -14,20 +14,45 @@\n #include <libcamera/ipa/ipa_module_info.h>\n \n #include \"libcamera/internal/ipa_module.h\"\n+#include \"libcamera/internal/log.h\"\n #include \"libcamera/internal/pipeline_handler.h\"\n #include \"libcamera/internal/pub_key.h\"\n \n namespace libcamera {\n \n+LOG_DECLARE_CATEGORY(IPAManager)\n+\n class IPAManager\n {\n public:\n \tIPAManager();\n \t~IPAManager();\n \n-\tstatic std::unique_ptr<IPAProxy> createIPA(PipelineHandler *pipe,\n-\t\t\t\t\t\t uint32_t maxVersion,\n-\t\t\t\t\t\t uint32_t minVersion);\n+\ttemplate<class P>\n+\tstatic std::unique_ptr<P> createIPA(PipelineHandler *pipe,\n+\t\t\t\t\t uint32_t maxVersion,\n+\t\t\t\t\t uint32_t minVersion)\n+\t{\n+\t\tIPAModule *m = nullptr;\n+\n+\t\tfor (IPAModule *module : self_->modules_) {\n+\t\t\tif (module->match(pipe, minVersion, maxVersion)) {\n+\t\t\t\tm = module;\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t}\n+\n+\t\tif (!m)\n+\t\t\treturn nullptr;\n+\n+\t\tstd::unique_ptr<P> proxy = std::make_unique<P>(m, !self_->isSignatureValid(m));\n+\t\tif (!proxy->isValid()) {\n+\t\t\tLOG(IPAManager, Error) << \"Failed to load proxy\";\n+\t\t\treturn nullptr;\n+\t\t}\n+\n+\t\treturn proxy;\n+\t}\n \n private:\n \tstatic IPAManager *self_;\ndiff --git a/src/libcamera/ipa_manager.cpp b/src/libcamera/ipa_manager.cpp\nindex 26458153..0d518443 100644\n--- a/src/libcamera/ipa_manager.cpp\n+++ b/src/libcamera/ipa_manager.cpp\n@@ -245,6 +245,7 @@ unsigned int IPAManager::addDir(const char *libDir, unsigned int maxDepth)\n }\n \n /**\n+ * \\fn IPAManager::createIPA()\n * \\brief Create an IPA proxy that matches a given pipeline handler\n * \\param[in] pipe The pipeline handler that wants a matching IPA proxy\n * \\param[in] minVersion Minimum acceptable version of IPA module\n@@ -253,53 +254,6 @@ unsigned int IPAManager::addDir(const char *libDir, unsigned int maxDepth)\n * \\return A newly created IPA proxy, or nullptr if no matching IPA module is\n * found or if the IPA proxy fails to initialize\n */\n-std::unique_ptr<IPAProxy> IPAManager::createIPA(PipelineHandler *pipe,\n-\t\t\t\t\t\tuint32_t maxVersion,\n-\t\t\t\t\t\tuint32_t minVersion)\n-{\n-\tIPAModule *m = nullptr;\n-\n-\tfor (IPAModule *module : self_->modules_) {\n-\t\tif (module->match(pipe, minVersion, maxVersion)) {\n-\t\t\tm = module;\n-\t\t\tbreak;\n-\t\t}\n-\t}\n-\n-\tif (!m)\n-\t\treturn nullptr;\n-\n-\t/*\n-\t * Load and run the IPA module in a thread if it has a valid signature,\n-\t * or isolate it in a separate process otherwise.\n-\t *\n-\t * \\todo Implement a better proxy selection\n-\t */\n-\tstd::string pipeName(pipe->name());\n-\tconst char *proxyName = pipeName.replace(0, 15, \"IPAProxy\").c_str();\n-\tIPAProxyFactory *pf = nullptr;\n-\n-\tfor (IPAProxyFactory *factory : IPAProxyFactory::factories()) {\n-\t\tif (!strcmp(factory->name().c_str(), proxyName)) {\n-\t\t\tpf = factory;\n-\t\t\tbreak;\n-\t\t}\n-\t}\n-\n-\tif (!pf) {\n-\t\tLOG(IPAManager, Error) << \"Failed to get proxy factory\";\n-\t\treturn nullptr;\n-\t}\n-\n-\tstd::unique_ptr<IPAProxy> proxy =\n-\t\tpf->create(m, !self_->isSignatureValid(m));\n-\tif (!proxy->isValid()) {\n-\t\tLOG(IPAManager, Error) << \"Failed to load proxy\";\n-\t\treturn nullptr;\n-\t}\n-\n-\treturn proxy;\n-}\n \n bool IPAManager::isSignatureValid([[maybe_unused]] IPAModule *ipa) const\n {\ndiff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\nindex 49e28e0c..8c52f0c1 100644\n--- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n+++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n@@ -983,8 +983,7 @@ void RPiCameraData::frameStarted(uint32_t sequence)\n \n int RPiCameraData::loadIPA()\n {\n-\tstd::unique_ptr<IPAProxy> ptr = IPAManager::createIPA(pipe_, 1, 1);\n-\tipa_ = std::unique_ptr<IPAProxyRPi>{static_cast<IPAProxyRPi*>(std::move(ptr).release())};\n+\tipa_ = IPAManager::createIPA<IPAProxyRPi>(pipe_, 1, 1);\n \n \tif (!ipa_)\n \t\treturn -ENOENT;\n", "prefixes": [ "libcamera-devel", "33/38" ] }