Files
external_libcamera/src/libcamera/proxy/ipa_proxy_linux.cpp
Laurent Pinchart 53d3f4152a libcamera: ipa_proxy: Provide suport for IPA configuration files
IPA modules may require configuration files, which may be stored in
different locations in the file system. To standardize file locations
between all IPAs and pipeline handlers, provide a helper function to
locate a configuration file by searching in the following directories:

- All directories specified in the LIBCAMERA_IPA_CONFIG_PATH environment
  variable ; or
- In the source tree if libcamera is not installed ; otherwise
- In standard system locations (etc and share directories).

When stored in the source tree, configuration files shall be located in
a 'data' subdirectory of their respective IPA directory.

More locations, or extensions to the mechanism, may be implemented
later.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2020-04-28 01:54:41 +03:00

98 lines
2.1 KiB
C++

/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
* Copyright (C) 2019, Google Inc.
*
* ipa_proxy_linux.cpp - Default Image Processing Algorithm proxy for Linux
*/
#include <vector>
#include <ipa/ipa_interface.h>
#include <ipa/ipa_module_info.h>
#include "ipa_module.h"
#include "ipa_proxy.h"
#include "ipc_unixsocket.h"
#include "log.h"
#include "process.h"
namespace libcamera {
LOG_DECLARE_CATEGORY(IPAProxy)
class IPAProxyLinux : public IPAProxy
{
public:
IPAProxyLinux(IPAModule *ipam);
~IPAProxyLinux();
int init() override { return 0; }
int start() override { return 0; }
void stop() override {}
void configure(const std::map<unsigned int, IPAStream> &streamConfig,
const std::map<unsigned int, const ControlInfoMap &> &entityControls) override {}
void mapBuffers(const std::vector<IPABuffer> &buffers) override {}
void unmapBuffers(const std::vector<unsigned int> &ids) override {}
void processEvent(const IPAOperationData &event) override {}
private:
void readyRead(IPCUnixSocket *ipc);
Process *proc_;
IPCUnixSocket *socket_;
};
IPAProxyLinux::IPAProxyLinux(IPAModule *ipam)
: IPAProxy(ipam), proc_(nullptr), socket_(nullptr)
{
LOG(IPAProxy, Debug)
<< "initializing dummy proxy: loading IPA from "
<< ipam->path();
std::vector<int> fds;
std::vector<std::string> args;
args.push_back(ipam->path());
const std::string path = resolvePath("ipa_proxy_linux");
if (path.empty()) {
LOG(IPAProxy, Error)
<< "Failed to get proxy worker path";
return;
}
socket_ = new IPCUnixSocket();
int fd = socket_->create();
if (fd < 0) {
LOG(IPAProxy, Error)
<< "Failed to create socket";
return;
}
socket_->readyRead.connect(this, &IPAProxyLinux::readyRead);
args.push_back(std::to_string(fd));
fds.push_back(fd);
proc_ = new Process();
int ret = proc_->start(path, args, fds);
if (ret) {
LOG(IPAProxy, Error)
<< "Failed to start proxy worker process";
return;
}
valid_ = true;
}
IPAProxyLinux::~IPAProxyLinux()
{
delete proc_;
delete socket_;
}
void IPAProxyLinux::readyRead(IPCUnixSocket *ipc)
{
}
REGISTER_IPA_PROXY(IPAProxyLinux)
} /* namespace libcamera */