[libcamera-devel] [PATCH v4 6/8] libcamera: ipa_manager: use proxy

Paul Elder paul.elder at ideasonboard.com
Thu Jul 11 20:50:45 CEST 2019


Make IPAManager isolate an IPA in a Proxy if the IPA's license is not
open source, before returning the IPA to the caller. For now, only use
the default Linux IPA proxy, and only LGPL 2.1+ is considered open
source.

Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>
---
Changes in v4:
- move IPAModule open source verification to IPAModule::isOpenSource()

Changes in v3:
- license checking is done with SPDX license strings, and only LGPL 2.1+
  is accepted for now

New in v2
- replaces adding shims
- since Proxies are not external shared objects like the shims in v1
  were, there is no longer a list of shims that is treated like
  IPAModules
- instead the matching is done by searching the list of proxy factories

 src/libcamera/ipa_manager.cpp | 34 ++++++++++++++++++++++++++++++++--
 1 file changed, 32 insertions(+), 2 deletions(-)

diff --git a/src/libcamera/ipa_manager.cpp b/src/libcamera/ipa_manager.cpp
index 532b77d..4276d99 100644
--- a/src/libcamera/ipa_manager.cpp
+++ b/src/libcamera/ipa_manager.cpp
@@ -12,6 +12,7 @@
 #include <sys/types.h>
 
 #include "ipa_module.h"
+#include "ipa_proxy.h"
 #include "log.h"
 #include "pipeline_handler.h"
 #include "utils.h"
@@ -129,7 +130,7 @@ int IPAManager::addDir(const char *libDir)
  * \param[in] maxVersion Maximum acceptable version of IPA module
  *
  * \return A newly created IPA interface, or nullptr if no matching
- * IPA module is found
+ * IPA module is found or if the IPA interface fails to initialize
  */
 std::unique_ptr<IPAInterface> IPAManager::createIPA(PipelineHandler *pipe,
 						    uint32_t maxVersion,
@@ -144,7 +145,36 @@ std::unique_ptr<IPAInterface> IPAManager::createIPA(PipelineHandler *pipe,
 		}
 	}
 
-	if (!m || !m->load())
+	if (!m)
+		return nullptr;
+
+	if (!m->isOpenSource()) {
+		IPAProxyFactory *pf = nullptr;
+		std::vector<IPAProxyFactory *> &factories = IPAProxyFactory::factories();
+
+		for (IPAProxyFactory *factory : factories) {
+			/* TODO: Better matching */
+			if (!strcmp(factory->name().c_str(), "IPAProxyLinux")) {
+				pf = factory;
+				break;
+			}
+		}
+
+		if (!pf) {
+			LOG(IPAManager, Error) << "Failed to get proxy factory";
+			return nullptr;
+		}
+
+		std::unique_ptr<IPAProxy> proxy = pf->create(m);
+		if (!proxy->isValid()) {
+			LOG(IPAManager, Error) << "Failed to load proxy";
+			return nullptr;
+		}
+
+		return proxy;
+	}
+
+	if (!m->load())
 		return nullptr;
 
 	return m->createInstance();
-- 
2.20.1



More information about the libcamera-devel mailing list