[{"id":2230,"web_url":"https://patchwork.libcamera.org/comment/2230/","msgid":"<20190712064112.GE4831@pendragon.ideasonboard.com>","date":"2019-07-12T06:41:12","subject":"Re: [libcamera-devel] [PATCH v4 5/8] libcamera: proxy: add default\n\tlinux IPA proxy","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Paul,\n\nThank you for the patch.\n\nOn Fri, Jul 12, 2019 at 03:50:44AM +0900, Paul Elder wrote:\n> Add a skeletal default linux IPA proxy. It currently lacks the IPA proxy\n> protocol itself.\n> \n> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>\n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n> This patch depends on \"libcamera: logging: add logging API for\n> applications\"\n> \n> Changes in v4:\n> - use logging API to set the log file in the proxy worker\n> \n> Changes in v3:\n> - better logging (both main proxy and proxy worker)\n> - renamed ProxyLinuxDefault to IPAProxyLinux\n> - initialize listeners for IPC\n> \n> New in v2\n> - replaces the dummy/linux default shim\n> \n>  src/libcamera/meson.build                     |  7 +-\n>  src/libcamera/proxy/ipa_proxy_linux.cpp       | 96 +++++++++++++++++++\n>  src/libcamera/proxy/meson.build               |  3 +\n>  .../proxy/worker/ipa_proxy_linux_worker.cpp   | 86 +++++++++++++++++\n>  src/libcamera/proxy/worker/meson.build        | 16 ++++\n>  5 files changed, 204 insertions(+), 4 deletions(-)\n>  create mode 100644 src/libcamera/proxy/ipa_proxy_linux.cpp\n>  create mode 100644 src/libcamera/proxy/meson.build\n>  create mode 100644 src/libcamera/proxy/worker/ipa_proxy_linux_worker.cpp\n>  create mode 100644 src/libcamera/proxy/worker/meson.build\n> \n> diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build\n> index 3e86edb..6a9d270 100644\n> --- a/src/libcamera/meson.build\n> +++ b/src/libcamera/meson.build\n> @@ -68,10 +68,7 @@ includes = [\n>  ]\n>  \n>  subdir('pipeline')\n> -\n> -proxy_install_dir = join_paths(get_option('libdir'), 'libcamera', 'proxy')\n> -config_h.set('IPA_PROXY_DIR',\n> -             '\"' + join_paths(get_option('prefix'), proxy_install_dir) + '\"')\n> +subdir('proxy')\n>  \n>  libudev = dependency('libudev', required : false)\n>  \n> @@ -116,3 +113,5 @@ libcamera = shared_library('camera',\n>  libcamera_dep = declare_dependency(sources : [libcamera_api, libcamera_h],\n>                                     include_directories : libcamera_includes,\n>                                     link_with : libcamera)\n> +\n> +subdir('proxy/worker')\n> diff --git a/src/libcamera/proxy/ipa_proxy_linux.cpp b/src/libcamera/proxy/ipa_proxy_linux.cpp\n> new file mode 100644\n> index 0000000..2b3f187\n> --- /dev/null\n> +++ b/src/libcamera/proxy/ipa_proxy_linux.cpp\n> @@ -0,0 +1,96 @@\n> +/* SPDX-License-Identifier: LGPL-2.1-or-later */\n> +/*\n> + * Copyright (C) 2019, Google Inc.\n> + *\n> + * ipa_proxy_linux.cpp - Default Image Processing Algorithm proxy for Linux\n> + */\n> +\n> +#include <vector>\n> +\n> +#include <libcamera/ipa/ipa_interface.h>\n> +#include <libcamera/ipa/ipa_module_info.h>\n> +\n> +#include \"ipa_module.h\"\n> +#include \"ipa_proxy.h\"\n> +#include \"ipc_unixsocket.h\"\n> +#include \"log.h\"\n> +#include \"process.h\"\n> +\n> +namespace libcamera {\n> +\n> +LOG_DECLARE_CATEGORY(IPAProxy)\n> +\n> +class IPAProxyLinux : public IPAProxy\n> +{\n> +public:\n> +\tIPAProxyLinux(IPAModule *ipam);\n> +\t~IPAProxyLinux();\n> +\n> +\tint init();\n> +\n> +private:\n> +\tvoid readyRead(IPCUnixSocket *ipc);\n> +\n> +\tProcess *proc_;\n> +\n> +\tIPCUnixSocket *socket_;\n> +};\n> +\n> +int IPAProxyLinux::init()\n> +{\n> +\tLOG(IPAProxy, Debug) << \"initializing IPA via dummy proxy!\";\n> +\n> +\treturn 0;\n> +}\n> +\n> +IPAProxyLinux::IPAProxyLinux(IPAModule *ipam)\n> +{\n> +\tLOG(IPAProxy, Debug)\n> +\t\t<< \"initializing dummy proxy: loading IPA from \"\n> +\t\t<< ipam->path();\n> +\n> +\tstd::vector<int> fds;\n> +\tstd::vector<std::string> args;\n> +\targs.push_back(ipam->path());\n> +\tconst std::string path = resolvePath(\"ipa_proxy_linux\");\n> +\tif (path.empty()) {\n> +\t\tLOG(IPAProxy, Error)\n> +\t\t\t<< \"Failed to get proxy worker path\";\n> +\t\treturn;\n> +\t}\n> +\n> +\tsocket_ = new IPCUnixSocket();\n> +\tint fd = socket_->create();\n> +\tif (fd < 0) {\n> +\t\tLOG(IPAProxy, Error)\n> +\t\t\t<< \"Failed to create socket\";\n> +\t\treturn;\n> +\t}\n> +\tsocket_->readyRead.connect(this, &IPAProxyLinux::readyRead);\n> +\targs.push_back(std::to_string(fd));\n> +\tfds.push_back(fd);\n> +\n> +\tproc_ = new Process();\n> +\tint ret = proc_->start(path, args, fds);\n> +\tif (ret) {\n> +\t\tLOG(IPAProxy, Error)\n> +\t\t\t<< \"Failed to start IPAProxyLinux worker process\";\n\ns/IPAProxyLinux/proxy/\n\n> +\t\treturn;\n> +\t}\n> +\n> +\tvalid_ = true;\n> +}\n> +\n> +IPAProxyLinux::~IPAProxyLinux()\n> +{\n> +\tdelete proc_;\n> +\tdelete socket_;\n> +}\n> +\n> +void IPAProxyLinux::readyRead(IPCUnixSocket *ipc)\n> +{\n> +}\n> +\n> +REGISTER_IPA_PROXY(IPAProxyLinux)\n> +\n> +}; /* namespace libcamera */\n> diff --git a/src/libcamera/proxy/meson.build b/src/libcamera/proxy/meson.build\n> new file mode 100644\n> index 0000000..efc1132\n> --- /dev/null\n> +++ b/src/libcamera/proxy/meson.build\n> @@ -0,0 +1,3 @@\n> +libcamera_sources += files([\n> +    'ipa_proxy_linux.cpp',\n> +])\n> diff --git a/src/libcamera/proxy/worker/ipa_proxy_linux_worker.cpp b/src/libcamera/proxy/worker/ipa_proxy_linux_worker.cpp\n> new file mode 100644\n> index 0000000..8b7aa74\n> --- /dev/null\n> +++ b/src/libcamera/proxy/worker/ipa_proxy_linux_worker.cpp\n> @@ -0,0 +1,86 @@\n> +/* SPDX-License-Identifier: GPL-2.0-or-later */\n> +/*\n> + * Copyright (C) 2019, Google Inc.\n> + *\n> + * ipa_proxy_linux_worker.cpp - Default Image Processing Algorithm proxy worker for Linux\n> + */\n> +\n> +#include <iostream>\n> +#include <sys/types.h>\n> +#include <unistd.h>\n> +\n> +#include <libcamera/camera_manager.h>\n> +#include <libcamera/event_dispatcher.h>\n> +#include <libcamera/ipa/ipa_interface.h>\n> +#include <libcamera/logging.h>\n> +\n> +#include \"ipa_module.h\"\n> +#include \"ipc_unixsocket.h\"\n> +#include \"log.h\"\n> +#include \"utils.h\"\n> +\n> +using namespace libcamera;\n> +\n> +LOG_DEFINE_CATEGORY(IPAProxyLinuxWorker)\n> +\n> +void readyRead(IPCUnixSocket *ipc)\n> +{\n> +\tIPCUnixSocket::Payload message;\n> +\tint ret;\n> +\n> +\tret = ipc->receive(&message);\n> +\tif (ret) {\n> +\t\tLOG(IPAProxyLinuxWorker, Error)\n> +\t\t\t<< \"Receive message failed: \" << ret;\n> +\t\treturn;\n> +\t}\n> +\n> +\tLOG(IPAProxyLinuxWorker, Debug) << \"Received a message!\";\n> +}\n> +\n> +int main(int argc, char **argv)\n> +{\n> +\tstd::string logPath = \"/tmp/libcamera.process.\" +\n\ns/process/worker/\n\n> +\t\t\t      std::to_string(getpid()) + \".log\";\n> +\tlogSetFile(logPath.c_str());\n> +\n> +\tif (argc < 3) {\n> +\t\tLOG(IPAProxyLinuxWorker, Debug)\n> +\t\t\t<< \"Tried to start worker with no args\";\n> +\t\treturn EXIT_FAILURE;\n> +\t}\n> +\n> +\tint fd = std::stoi(argv[2]);\n> +\tLOG(IPAProxyLinuxWorker, Debug)\n> +\t\t<< \"Starting worker for IPA module \" << argv[1]\n> +\t\t<< \" with IPC fd = \" << fd;\n> +\n> +\tstd::unique_ptr<IPAModule> ipam = utils::make_unique<IPAModule>(argv[1]);\n> +\tif (!ipam->isValid() || !ipam->load()) {\n> +\t\tLOG(IPAProxyLinuxWorker, Error)\n> +\t\t\t<< \"IPAModule \" << argv[1] << \" should be valid but isn't\";\n> +\t\treturn EXIT_FAILURE;\n> +\t}\n> +\n> +\tIPCUnixSocket socket;\n> +\tif (socket.bind(fd) < 0) {\n> +\t\tLOG(IPAProxyLinuxWorker, Error) << \"IPC socket binding failed\";\n> +\t\treturn EXIT_FAILURE;\n> +\t}\n> +\tsocket.readyRead.connect(&readyRead);\n> +\n> +\tstd::unique_ptr<IPAInterface> ipa = ipam->createInstance();\n> +\tif (!ipa) {\n> +\t\tLOG(IPAProxyLinuxWorker, Error) << \"Failed to create IPA interface\";\n> +\t\treturn EXIT_FAILURE;\n> +\t}\n> +\n> +\tLOG(IPAProxyLinuxWorker, Debug) << \"Proxy worker successfully started\";\n> +\n> +\t/* \\todo upgrade listening loop */\n> +\tEventDispatcher *dispatcher = CameraManager::instance()->eventDispatcher();\n> +\twhile (1)\n> +\t\tdispatcher->processEvents();\n> +\n> +\treturn 0;\n> +}\n> diff --git a/src/libcamera/proxy/worker/meson.build b/src/libcamera/proxy/worker/meson.build\n> new file mode 100644\n> index 0000000..839156f\n> --- /dev/null\n> +++ b/src/libcamera/proxy/worker/meson.build\n> @@ -0,0 +1,16 @@\n> +ipa_proxy_sources = [\n> +    ['ipa_proxy_linux', 'ipa_proxy_linux_worker.cpp']\n> +]\n> +\n> +proxy_install_dir = join_paths(get_option('libexecdir'), 'libcamera')\n> +\n> +foreach t : ipa_proxy_sources\n> +    proxy = executable(t[0], t[1],\n> +                       include_directories : libcamera_internal_includes,\n> +                       install : true,\n> +                       install_dir : proxy_install_dir,\n> +                       dependencies : libcamera_dep)\n> +endforeach\n> +\n> +config_h.set('IPA_PROXY_DIR',\n> +             '\"' + join_paths(get_option('prefix'), proxy_install_dir) + '\"')","headers":{"Return-Path":"<laurent.pinchart@ideasonboard.com>","Received":["from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 8C9BF60BC8\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 12 Jul 2019 08:41:40 +0200 (CEST)","from pendragon.ideasonboard.com (softbank126209254147.bbtec.net\n\t[126.209.254.147])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id EEFEE2B2;\n\tFri, 12 Jul 2019 08:41:38 +0200 (CEST)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1562913700;\n\tbh=XGxtc3VuN3HmwKHftCjtbFqIt2voImjOru3d/VAPEyE=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=Q5MPSd26DEWC7DYuTQNLOJhUvdimjkCD2vel7rVtHNvPtylr8eSVhoWcktRELRXmN\n\tK70czMRzLb1AXd9DSaG6LKuWJl1mSl2t/50+g7WbMHOgTXlTcjoY5md28XlkneVN94\n\tnAfs7VCGqNY2C+FtCWNs3zhHfrkrIxeVE4hXOOj4=","Date":"Fri, 12 Jul 2019 09:41:12 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Paul Elder <paul.elder@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20190712064112.GE4831@pendragon.ideasonboard.com>","References":"<20190711185047.11671-1-paul.elder@ideasonboard.com>\n\t<20190711185047.11671-6-paul.elder@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20190711185047.11671-6-paul.elder@ideasonboard.com>","User-Agent":"Mutt/1.10.1 (2018-07-13)","Subject":"Re: [libcamera-devel] [PATCH v4 5/8] libcamera: proxy: add default\n\tlinux IPA proxy","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.23","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","X-List-Received-Date":"Fri, 12 Jul 2019 06:41:40 -0000"}}]