diff options
Diffstat (limited to 'src/ipa/vimc')
-rw-r--r-- | src/ipa/vimc/data/meson.build | 9 | ||||
-rw-r--r-- | src/ipa/vimc/data/vimc.conf | 3 | ||||
-rw-r--r-- | src/ipa/vimc/meson.build | 38 | ||||
-rw-r--r-- | src/ipa/vimc/vimc.cpp | 149 |
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(); } } |