libcamera: ipa_manager: use proxy

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@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Paul Elder 2019-06-05 17:09:05 -04:00
parent 131a88795e
commit 47a81cb9f6

View file

@ -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();