[libcamera-devel] [RFC PATCH v2 5/7] libcamera: ipa_manager: use proxy
Paul Elder
paul.elder at ideasonboard.com
Wed Jul 3 10:00:05 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 proxy, and only GPL and LGPL are considered open
source.
Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>
---
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 | 48 +++++++++++++++++++++++++++++++++--
1 file changed, 46 insertions(+), 2 deletions(-)
diff --git a/src/libcamera/ipa_manager.cpp b/src/libcamera/ipa_manager.cpp
index 532b77d..60cd84d 100644
--- a/src/libcamera/ipa_manager.cpp
+++ b/src/libcamera/ipa_manager.cpp
@@ -14,6 +14,7 @@
#include "ipa_module.h"
#include "log.h"
#include "pipeline_handler.h"
+#include "ipa_proxy.h"
#include "utils.h"
/**
@@ -25,6 +26,20 @@ namespace libcamera {
LOG_DEFINE_CATEGORY(IPAManager)
+namespace {
+
+bool isOpenSource(const char *license)
+{
+ if (!strncmp(license, "GPL", 3))
+ return true;
+ if (!strncmp(license, "LGPL", 4))
+ return true;
+
+ return false;
+}
+
+} /* namespace */
+
/**
* \class IPAManager
* \brief Manager for IPA modules
@@ -129,7 +144,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 +159,36 @@ std::unique_ptr<IPAInterface> IPAManager::createIPA(PipelineHandler *pipe,
}
}
- if (!m || !m->load())
+ if (!m)
+ return nullptr;
+
+ if (!isOpenSource(m->info().license)) {
+ ProxyFactory *pf = nullptr;
+ std::vector<ProxyFactory *> &factories = ProxyFactory::factories();
+
+ for (ProxyFactory *factory : factories) {
+ /* TODO: Better matching */
+ if (!strcmp(factory->name().c_str(), "ProxyLinuxDefault")) {
+ pf = factory;
+ break;
+ }
+ }
+
+ if (!pf) {
+ LOG(IPAManager, Error) << "Failed to get proxy factory";
+ return nullptr;
+ }
+
+ std::unique_ptr<Proxy> 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