summaryrefslogtreecommitdiff
path: root/src/ipa/vimc
diff options
context:
space:
mode:
Diffstat (limited to 'src/ipa/vimc')
-rw-r--r--src/ipa/vimc/data/meson.build9
-rw-r--r--src/ipa/vimc/data/vimc.conf3
-rw-r--r--src/ipa/vimc/meson.build38
-rw-r--r--src/ipa/vimc/vimc.cpp149
4 files changed, 157 insertions, 42 deletions
diff --git a/src/ipa/vimc/data/meson.build b/src/ipa/vimc/data/meson.build
new file mode 100644
index 00000000..628d6a29
--- /dev/null
+++ b/src/ipa/vimc/data/meson.build
@@ -0,0 +1,9 @@
+# SPDX-License-Identifier: CC0-1.0
+
+conf_files = files([
+ 'vimc.conf',
+])
+
+install_data(conf_files,
+ install_dir : ipa_data_dir / 'vimc',
+ install_tag : 'runtime')
diff --git a/src/ipa/vimc/data/vimc.conf b/src/ipa/vimc/data/vimc.conf
new file mode 100644
index 00000000..8e73b161
--- /dev/null
+++ b/src/ipa/vimc/data/vimc.conf
@@ -0,0 +1,3 @@
+# SPDX-License-Identifier: LGPL-2.1-or-later
+#
+# Dummy configuration file for the vimc IPA.
diff --git a/src/ipa/vimc/meson.build b/src/ipa/vimc/meson.build
index 435c7d31..2cc5f80b 100644
--- a/src/ipa/vimc/meson.build
+++ b/src/ipa/vimc/meson.build
@@ -1,15 +1,23 @@
-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
+# SPDX-License-Identifier: CC0-1.0
+
+ipa_name = 'ipa_vimc'
+
+mod = shared_module(ipa_name, 'vimc.cpp',
+ name_prefix : '',
+ include_directories : [ipa_includes],
+ dependencies : [libcamera_private, libipa_dep],
+ install : true,
+ install_dir : ipa_install_dir)
+
+if ipa_sign_module
+ custom_target(ipa_name + '.so.sign',
+ input : mod,
+ output : ipa_name + '.so.sign',
+ command : [ipa_sign, ipa_priv_key, '@INPUT@', '@OUTPUT@'],
+ install : false,
+ build_by_default : true)
+endif
+
+subdir('data')
+
+ipa_names += ipa_name
diff --git a/src/ipa/vimc/vimc.cpp b/src/ipa/vimc/vimc.cpp
index 6e2095b5..a1351a0f 100644
--- a/src/ipa/vimc/vimc.cpp
+++ b/src/ipa/vimc/vimc.cpp
@@ -2,10 +2,9 @@
/*
* Copyright (C) 2019, Google Inc.
*
- * ipa_vimc.cpp - Vimc Image Processing Algorithm module
+ * Vimc Image Processing Algorithm module
*/
-
-#include <ipa/ipa_vimc.h>
+#include <libcamera/ipa/vimc_ipa_interface.h>
#include <fcntl.h>
#include <string.h>
@@ -14,35 +13,49 @@
#include <iostream>
-#include <ipa/ipa_interface.h>
-#include <ipa/ipa_module_info.h>
+#include <libcamera/base/file.h>
+#include <libcamera/base/flags.h>
+#include <libcamera/base/log.h>
-#include <libipa/ipa_interface_wrapper.h>
+#include <libcamera/ipa/ipa_interface.h>
+#include <libcamera/ipa/ipa_module_info.h>
-#include "log.h"
+#include "libcamera/internal/mapped_framebuffer.h"
namespace libcamera {
LOG_DEFINE_CATEGORY(IPAVimc)
-class IPAVimc : public IPAInterface
+class IPAVimc : public ipa::vimc::IPAVimcInterface
{
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 {}
+ int init(const IPASettings &settings,
+ const ipa::vimc::IPAOperationCode code,
+ const Flags<ipa::vimc::TestFlag> inFlags,
+ Flags<ipa::vimc::TestFlag> *outFlags) override;
+
+ int start() override;
+ void stop() override;
+
+ int configure(const IPACameraSensorInfo &sensorInfo,
+ const std::map<unsigned int, IPAStream> &streamConfig,
+ const std::map<unsigned int, ControlInfoMap> &entityControls) override;
+
+ void mapBuffers(const std::vector<IPABuffer> &buffers) override;
+ void unmapBuffers(const std::vector<unsigned int> &ids) override;
+
+ void queueRequest(uint32_t frame, const ControlList &controls) override;
+ void computeParams(uint32_t frame, uint32_t bufferId) override;
private:
void initTrace();
- void trace(enum IPAOperationCode operation);
+ void trace(enum ipa::vimc::IPAOperationCode operation);
int fd_;
+ std::map<unsigned int, MappedFrameBuffer> buffers_;
};
IPAVimc::IPAVimc()
@@ -53,27 +66,110 @@ IPAVimc::IPAVimc()
IPAVimc::~IPAVimc()
{
- if (fd_)
+ if (fd_ != -1)
::close(fd_);
}
-int IPAVimc::init()
+int IPAVimc::init(const IPASettings &settings,
+ const ipa::vimc::IPAOperationCode code,
+ const Flags<ipa::vimc::TestFlag> inFlags,
+ Flags<ipa::vimc::TestFlag> *outFlags)
+{
+ trace(ipa::vimc::IPAOperationInit);
+
+ LOG(IPAVimc, Debug)
+ << "initializing vimc IPA with configuration file "
+ << settings.configurationFile;
+
+ LOG(IPAVimc, Debug) << "Got opcode " << code;
+
+ LOG(IPAVimc, Debug)
+ << "Flag 2 was "
+ << (inFlags & ipa::vimc::TestFlag::Flag2 ? "" : "not ")
+ << "set";
+
+ *outFlags |= ipa::vimc::TestFlag::Flag1;
+
+ File conf(settings.configurationFile);
+ if (!conf.open(File::OpenModeFlag::ReadOnly)) {
+ LOG(IPAVimc, Error) << "Failed to open configuration file";
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+int IPAVimc::start()
{
- trace(IPAOperationInit);
+ trace(ipa::vimc::IPAOperationStart);
- LOG(IPAVimc, Debug) << "initializing vimc IPA!";
+ LOG(IPAVimc, Debug) << "start vimc IPA!";
return 0;
}
+void IPAVimc::stop()
+{
+ trace(ipa::vimc::IPAOperationStop);
+
+ LOG(IPAVimc, Debug) << "stop vimc IPA!";
+}
+
+int IPAVimc::configure([[maybe_unused]] const IPACameraSensorInfo &sensorInfo,
+ [[maybe_unused]] const std::map<unsigned int, IPAStream> &streamConfig,
+ [[maybe_unused]] const std::map<unsigned int, ControlInfoMap> &entityControls)
+{
+ LOG(IPAVimc, Debug) << "configure()";
+
+ return 0;
+}
+
+void IPAVimc::mapBuffers(const std::vector<IPABuffer> &buffers)
+{
+ for (const IPABuffer &buffer : buffers) {
+ const FrameBuffer fb(buffer.planes);
+ buffers_.emplace(std::piecewise_construct,
+ std::forward_as_tuple(buffer.id),
+ std::forward_as_tuple(&fb, MappedFrameBuffer::MapFlag::Read));
+ }
+}
+
+void IPAVimc::unmapBuffers(const std::vector<unsigned int> &ids)
+{
+ for (unsigned int id : ids) {
+ auto it = buffers_.find(id);
+ if (it == buffers_.end())
+ continue;
+
+ buffers_.erase(it);
+ }
+}
+
+void IPAVimc::queueRequest([[maybe_unused]] uint32_t frame,
+ [[maybe_unused]] const ControlList &controls)
+{
+}
+
+void IPAVimc::computeParams([[maybe_unused]] uint32_t frame, uint32_t bufferId)
+{
+ auto it = buffers_.find(bufferId);
+ if (it == buffers_.end()) {
+ LOG(IPAVimc, Error) << "Could not find parameter buffer";
+ return;
+ }
+
+ Flags<ipa::vimc::TestFlag> flags;
+ paramsComputed.emit(bufferId, flags);
+}
+
void IPAVimc::initTrace()
{
struct stat fifoStat;
- int ret = stat(VIMC_IPA_FIFO_PATH, &fifoStat);
+ int ret = stat(ipa::vimc::VimcIPAFIFOPath.c_str(), &fifoStat);
if (ret)
return;
- ret = ::open(VIMC_IPA_FIFO_PATH, O_WRONLY);
+ ret = ::open(ipa::vimc::VimcIPAFIFOPath.c_str(), O_WRONLY | O_CLOEXEC);
if (ret < 0) {
ret = errno;
LOG(IPAVimc, Error) << "Failed to open vimc IPA test FIFO: "
@@ -84,7 +180,7 @@ void IPAVimc::initTrace()
fd_ = ret;
}
-void IPAVimc::trace(enum IPAOperationCode operation)
+void IPAVimc::trace(enum ipa::vimc::IPAOperationCode operation)
{
if (fd_ < 0)
return;
@@ -105,14 +201,13 @@ extern "C" {
const struct IPAModuleInfo ipaModuleInfo = {
IPA_MODULE_API_VERSION,
0,
- "PipelineHandlerVimc",
- "Dummy IPA for Vimc",
- LICENSE,
+ "vimc",
+ "vimc",
};
-struct ipa_context *ipaCreate()
+IPAInterface *ipaCreate()
{
- return new IPAInterfaceWrapper(std::make_unique<IPAVimc>());
+ return new IPAVimc();
}
}