[libcamera-devel] [RFC PATCH v2 4/7] libcamera: proxy: add default linux proxy
Paul Elder
paul.elder at ideasonboard.com
Wed Jul 3 10:00:04 CEST 2019
Add a default linux proxy.
Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>
---
New in v2
- replaces the dummy/linux default shim
src/libcamera/meson.build | 7 +-
src/libcamera/proxy/meson.build | 3 +
src/libcamera/proxy/proxy_linux_default.cpp | 90 +++++++++++++++++++
src/libcamera/proxy_worker/meson.build | 18 ++++
.../proxy_linux_default_worker.cpp | 46 ++++++++++
5 files changed, 160 insertions(+), 4 deletions(-)
create mode 100644 src/libcamera/proxy/meson.build
create mode 100644 src/libcamera/proxy/proxy_linux_default.cpp
create mode 100644 src/libcamera/proxy_worker/meson.build
create mode 100644 src/libcamera/proxy_worker/proxy_linux_default_worker.cpp
diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
index 412564f..e470fe7 100644
--- a/src/libcamera/meson.build
+++ b/src/libcamera/meson.build
@@ -65,10 +65,7 @@ includes = [
]
subdir('pipeline')
-
-proxy_install_dir = join_paths(get_option('libdir'), 'libcamera', 'proxy')
-config_h.set('IPA_PROXY_DIR',
- '"' + join_paths(get_option('prefix'), proxy_install_dir) + '"')
+subdir('proxy')
libudev = dependency('libudev', required : false)
@@ -103,3 +100,5 @@ libcamera = shared_library('camera',
libcamera_dep = declare_dependency(sources : [libcamera_api, libcamera_h],
include_directories : libcamera_includes,
link_with : libcamera)
+
+subdir('proxy_worker')
diff --git a/src/libcamera/proxy/meson.build b/src/libcamera/proxy/meson.build
new file mode 100644
index 0000000..508ed5f
--- /dev/null
+++ b/src/libcamera/proxy/meson.build
@@ -0,0 +1,3 @@
+libcamera_sources += files([
+ 'proxy_linux_default.cpp',
+])
diff --git a/src/libcamera/proxy/proxy_linux_default.cpp b/src/libcamera/proxy/proxy_linux_default.cpp
new file mode 100644
index 0000000..1de028a
--- /dev/null
+++ b/src/libcamera/proxy/proxy_linux_default.cpp
@@ -0,0 +1,90 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * proxy_linux_default.cpp - Default Image Processing Algorithm proxy for Linux
+ */
+
+#include <iostream>
+#include <memory>
+#include <vector>
+
+#include <sched.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include <libcamera/ipa/ipa_interface.h>
+#include <libcamera/ipa/ipa_module_info.h>
+
+#include "ipa_module.h"
+#include "ipa_proxy.h"
+#include "ipc_unixsocket.h"
+#include "log.h"
+#include "process.h"
+#include "process_manager.h"
+
+namespace libcamera {
+
+LOG_DEFINE_CATEGORY(ProxyLinuxDefault)
+
+class ProxyLinuxDefault : public Proxy
+{
+public:
+ ProxyLinuxDefault(IPAModule *ipam);
+ ~ProxyLinuxDefault();
+
+ int init();
+
+private:
+ Process *proc_;
+
+ IPCUnixSocket *socket_;
+};
+
+int ProxyLinuxDefault::init()
+{
+ std::cout << "initializing IPA via dummy proxy!" << std::endl;
+
+ return 0;
+}
+
+ProxyLinuxDefault::ProxyLinuxDefault(IPAModule *ipam)
+ : Proxy(ipam)
+{
+ std::cout << "initializing dummy proxy: loading IPA from "
+ << ipam->path() << std::endl;
+
+ std::vector<int> fds;
+ std::vector<std::string> args;
+ args.push_back(ipam->path());
+ const std::string path = resolvePath("proxy_linux_default");
+ if (path.empty())
+ return;
+
+ socket_ = new IPCUnixSocket();
+ int fd = socket_->create();
+ if (fd < 0)
+ return;
+ args.push_back(std::to_string(fd));
+
+ proc_ = new Process();
+ proc_->exec(path, args, fds);
+
+ valid_ = true;
+ return;
+}
+
+ProxyLinuxDefault::~ProxyLinuxDefault()
+{
+ if (proc_)
+ delete proc_;
+ if (socket_)
+ delete socket_;
+}
+
+REGISTER_IPA_PROXY(ProxyLinuxDefault)
+
+}; /* namespace libcamera */
diff --git a/src/libcamera/proxy_worker/meson.build b/src/libcamera/proxy_worker/meson.build
new file mode 100644
index 0000000..6f927c5
--- /dev/null
+++ b/src/libcamera/proxy_worker/meson.build
@@ -0,0 +1,18 @@
+ipa_proxy_sources = [
+ ['proxy_linux_default', 'proxy_linux_default_worker.cpp']
+]
+
+proxy_install_dir = join_paths(get_option('libdir'), 'libcamera', 'proxy')
+
+foreach t : ipa_proxy_sources
+ proxy = executable(t[0],
+ t[1],
+ name_prefix : '',
+ include_directories : includes,
+ install : true,
+ install_dir : proxy_install_dir,
+ link_with : libcamera)
+endforeach
+
+config_h.set('IPA_PROXY_DIR',
+ '"' + join_paths(get_option('prefix'), proxy_install_dir) + '"')
diff --git a/src/libcamera/proxy_worker/proxy_linux_default_worker.cpp b/src/libcamera/proxy_worker/proxy_linux_default_worker.cpp
new file mode 100644
index 0000000..86b7689
--- /dev/null
+++ b/src/libcamera/proxy_worker/proxy_linux_default_worker.cpp
@@ -0,0 +1,46 @@
+#include <iostream>
+
+#include <unistd.h>
+
+#include <libcamera/ipa/ipa_interface.h>
+
+#include "ipa_module.h"
+#include "ipc_unixsocket.h"
+#include "utils.h"
+
+using namespace libcamera;
+
+int main(int argc, char **argv)
+{
+ if (argc < 3) {
+ std::cout << "hello world! no args" << std::endl;
+ return 0;
+ }
+
+ int fd = std::stoi(argv[2]);
+ std::cout << "hello world! we're starting! fd = " << fd << ", path = " << argv[1] << std::endl;
+
+ std::unique_ptr<IPAModule> ipam = utils::make_unique<IPAModule>(argv[1]);
+ if (!ipam->isValid() || !ipam->load()) {
+ std::cerr << "Houston, we have a problem: IPAModule should be valid but isn't" << std::endl;
+ return -1;
+ }
+
+ IPCUnixSocket socket;
+ if (socket.bind(fd) < 0) {
+ std::cerr << "IPC socket binding failed" << std::endl;
+ return -1;
+ }
+
+ std::unique_ptr<IPAInterface> ipa = ipam->createInstance();
+ if (!ipa) {
+ std::cerr << "Failed to create IPA interface" << std::endl;
+ return -1;
+ }
+
+ std::cout << "hello world from the proxy worker!" << std::endl;
+
+ /* TODO IPC listening loop */
+
+ return 0;
+}
--
2.20.1
More information about the libcamera-devel
mailing list