summaryrefslogtreecommitdiff
path: root/src/ipa/vimc
diff options
context:
space:
mode:
Diffstat (limited to 'src/ipa/vimc')
-rw-r--r--src/ipa/vimc/meson.build15
-rw-r--r--src/ipa/vimc/vimc.cpp119
2 files changed, 134 insertions, 0 deletions
diff --git a/src/ipa/vimc/meson.build b/src/ipa/vimc/meson.build
new file mode 100644
index 00000000..435c7d31
--- /dev/null
+++ b/src/ipa/vimc/meson.build
@@ -0,0 +1,15 @@
+ipa_vimc_sources = [
+ ['ipa_vimc', 'LGPL-2.1-or-later'],
+ ['ipa_vimc_isolate', 'Proprietary'],
+]
+
+foreach t : ipa_vimc_sources
+ ipa = shared_module(t[0], 'vimc.cpp',
+ name_prefix : '',
+ include_directories : [ipa_includes, libipa_includes],
+ dependencies : libcamera_dep,
+ link_with : libipa,
+ install : true,
+ install_dir : ipa_install_dir,
+ cpp_args : '-DLICENSE="' + t[1] + '"')
+endforeach
diff --git a/src/ipa/vimc/vimc.cpp b/src/ipa/vimc/vimc.cpp
new file mode 100644
index 00000000..6e2095b5
--- /dev/null
+++ b/src/ipa/vimc/vimc.cpp
@@ -0,0 +1,119 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * ipa_vimc.cpp - Vimc Image Processing Algorithm module
+ */
+
+#include <ipa/ipa_vimc.h>
+
+#include <fcntl.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include <iostream>
+
+#include <ipa/ipa_interface.h>
+#include <ipa/ipa_module_info.h>
+
+#include <libipa/ipa_interface_wrapper.h>
+
+#include "log.h"
+
+namespace libcamera {
+
+LOG_DEFINE_CATEGORY(IPAVimc)
+
+class IPAVimc : public IPAInterface
+{
+public:
+ IPAVimc();
+ ~IPAVimc();
+
+ int init() 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 initTrace();
+ void trace(enum IPAOperationCode operation);
+
+ int fd_;
+};
+
+IPAVimc::IPAVimc()
+ : fd_(-1)
+{
+ initTrace();
+}
+
+IPAVimc::~IPAVimc()
+{
+ if (fd_)
+ ::close(fd_);
+}
+
+int IPAVimc::init()
+{
+ trace(IPAOperationInit);
+
+ LOG(IPAVimc, Debug) << "initializing vimc IPA!";
+
+ return 0;
+}
+
+void IPAVimc::initTrace()
+{
+ struct stat fifoStat;
+ int ret = stat(VIMC_IPA_FIFO_PATH, &fifoStat);
+ if (ret)
+ return;
+
+ ret = ::open(VIMC_IPA_FIFO_PATH, O_WRONLY);
+ if (ret < 0) {
+ ret = errno;
+ LOG(IPAVimc, Error) << "Failed to open vimc IPA test FIFO: "
+ << strerror(ret);
+ return;
+ }
+
+ fd_ = ret;
+}
+
+void IPAVimc::trace(enum IPAOperationCode operation)
+{
+ if (fd_ < 0)
+ return;
+
+ int ret = ::write(fd_, &operation, sizeof(operation));
+ if (ret < 0) {
+ ret = errno;
+ LOG(IPAVimc, Error) << "Failed to write to vimc IPA test FIFO: "
+ << strerror(ret);
+ }
+}
+
+/*
+ * External IPA module interface
+ */
+
+extern "C" {
+const struct IPAModuleInfo ipaModuleInfo = {
+ IPA_MODULE_API_VERSION,
+ 0,
+ "PipelineHandlerVimc",
+ "Dummy IPA for Vimc",
+ LICENSE,
+};
+
+struct ipa_context *ipaCreate()
+{
+ return new IPAInterfaceWrapper(std::make_unique<IPAVimc>());
+}
+}
+
+} /* namespace libcamera */