[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