[libcamera-devel] [PATCH 1/2] ipa: libipa: Introduce Metadata class
Jean-Michel Hautbois
jeanmichel.hautbois at ideasonboard.com
Mon Jul 12 15:16:29 CEST 2021
The Metadata class comes from RPi from which a bit has been removed
because we don't need it for now.
All functions are inlined in metadata.h because of the template usage.
Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois at ideasonboard.com>
---
src/ipa/ipu3/ipu3.cpp | 1 +
src/ipa/libipa/meson.build | 6 ++-
src/ipa/libipa/metadata.cpp | 101 ++++++++++++++++++++++++++++++++++++
src/ipa/libipa/metadata.h | 90 ++++++++++++++++++++++++++++++++
4 files changed, 196 insertions(+), 2 deletions(-)
create mode 100644 src/ipa/libipa/metadata.cpp
create mode 100644 src/ipa/libipa/metadata.h
diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp
index 71698d36..091856f5 100644
--- a/src/ipa/ipu3/ipu3.cpp
+++ b/src/ipa/ipu3/ipu3.cpp
@@ -25,6 +25,7 @@
#include "ipu3_agc.h"
#include "ipu3_awb.h"
#include "libipa/camera_sensor_helper.h"
+#include "libipa/metadata.h"
static constexpr uint32_t kMaxCellWidthPerSet = 160;
static constexpr uint32_t kMaxCellHeightPerSet = 56;
diff --git a/src/ipa/libipa/meson.build b/src/ipa/libipa/meson.build
index 3fda7c00..cc4e1cc9 100644
--- a/src/ipa/libipa/meson.build
+++ b/src/ipa/libipa/meson.build
@@ -3,13 +3,15 @@
libipa_headers = files([
'algorithm.h',
'camera_sensor_helper.h',
- 'histogram.h'
+ 'histogram.h',
+ 'metadata.h'
])
libipa_sources = files([
'algorithm.cpp',
'camera_sensor_helper.cpp',
- 'histogram.cpp'
+ 'histogram.cpp',
+ 'metadata.cpp'
])
libipa_includes = include_directories('..')
diff --git a/src/ipa/libipa/metadata.cpp b/src/ipa/libipa/metadata.cpp
new file mode 100644
index 00000000..b6aef897
--- /dev/null
+++ b/src/ipa/libipa/metadata.cpp
@@ -0,0 +1,101 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Based on the implementation from the Raspberry Pi IPA,
+ * Copyright (C) 2019-2021, Raspberry Pi (Trading) Ltd.
+ * Copyright (C) 2021, Ideas On Board
+ *
+ * metadata.cpp - libipa metadata class
+ */
+
+#include "metadata.h"
+
+/**
+ * \file metadata.h
+ * \brief A metadata class to share objects
+ */
+
+namespace libcamera {
+
+namespace ipa {
+
+/**
+ * \class Metadata
+ * \brief A simple class for carrying arbitrary metadata, for example
+ * about an image. It is used to exchange data between algorithms.
+ */
+
+/**
+ * \fn Metadata::Metadata(Metadata const &other)
+ * \param[in] other A Metadata object
+ *
+ * Stores the data from one Metadata to another one
+ */
+
+/**
+ * \fn Metadata::set(std::string const &tag, T const &value)
+ * \param[in] tag A string used as the key in a map
+ * \param[in] value The value to set into the map
+ *
+ * Sets the value in the map to the tag key. The mutex is
+ * taken for the duration of the block.
+ */
+
+/**
+ * \fn Metadata::get(std::string const &tag, T &value)
+ * \param[in] tag A string used as the key in a map
+ * \param[in] value The value to set into the map
+ *
+ * Gets the value in the map of the tag key. The mutex is
+ * taken for the duration of the block.
+ *
+ * \return 0 if value is found, -1 if not existent
+ */
+
+/**
+ * \fn Metadata::clear()
+ * Clear the Metadata map. The mutex is taken for the duration of
+ * the block.
+ */
+
+/**
+ * \fn Metadata::merge(Metadata &other)
+ * \param[in] other A metadata to merge with
+ * Merge two Metadata maps. The mutex is taken for the duration of
+ * the block.
+ */
+
+/**
+ * \fn Metadata::getLocked(std::string const &tag)
+ * \param[in] tag A string used as the key in a map
+ *
+ * Get the value of the tag key in the map.
+ * This allows in-place access to the Metadata contents,
+ * for which you should be holding the lock.
+ */
+
+/**
+ * \fn Metadata::setLocked(std::string const &tag, T const &value)
+ * \param[in] tag A string used as the key in a map
+ * \param[in] value The value to set into the map
+ *
+ * Set the value to the tag key in the map.
+ * This allows in-place access to the Metadata contents,
+ * for which you should be holding the lock.
+ */
+
+/**
+ * \fn Metadata::lock()
+ * Lock the mutex with the standard classes.
+ * e.g. std::lock_guard<RPiController::Metadata> lock(metadata)
+ */
+
+/**
+ * \fn Metadata::unlock()
+ * Unlock the mutex with the standard classes.
+ * e.g. std::lock_guard<RPiController::Metadata> lock(metadata)
+ */
+
+} /* namespace ipa */
+
+} /* namespace libcamera */
+
diff --git a/src/ipa/libipa/metadata.h b/src/ipa/libipa/metadata.h
new file mode 100644
index 00000000..9801bece
--- /dev/null
+++ b/src/ipa/libipa/metadata.h
@@ -0,0 +1,90 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Based on the implementation from the Raspberry Pi IPA,
+ * Copyright (C) 2019-2021, Raspberry Pi (Trading) Ltd.
+ * Copyright (C) 2021, Ideas On Board
+ *
+ * metadata.h - libipa metadata class
+ */
+#ifndef __LIBCAMERA_IPA_LIBIPA_METADATA_H__
+#define __LIBCAMERA_IPA_LIBIPA_METADATA_H__
+
+#include <any>
+#include <map>
+#include <memory>
+#include <mutex>
+#include <string>
+
+namespace libcamera {
+
+namespace ipa {
+
+class Metadata
+{
+public:
+ Metadata() = default;
+
+ Metadata(Metadata const &other)
+ {
+ std::scoped_lock other_lock(other.mutex_);
+ data_ = other.data_;
+ }
+
+ template<typename T>
+ void set(std::string const &tag, T const &value)
+ {
+ std::scoped_lock lock(mutex_);
+ data_[tag] = value;
+ }
+
+ template<typename T>
+ int get(std::string const &tag, T &value) const
+ {
+ std::scoped_lock lock(mutex_);
+ auto it = data_.find(tag);
+ if (it == data_.end())
+ return -1;
+ value = std::any_cast<T>(it->second);
+ return 0;
+ }
+
+ void clear()
+ {
+ std::scoped_lock lock(mutex_);
+ data_.clear();
+ }
+
+ void merge(Metadata &other)
+ {
+ std::scoped_lock lock(mutex_, other.mutex_);
+ data_.merge(other.data_);
+ }
+
+ template<typename T>
+ T *getLocked(std::string const &tag)
+ {
+ auto it = data_.find(tag);
+ if (it == data_.end())
+ return nullptr;
+ return std::any_cast<T>(&it->second);
+ }
+
+ template<typename T>
+ void setLocked(std::string const &tag, T const &value)
+ {
+ data_[tag] = value;
+ }
+
+ void lock() { mutex_.lock(); }
+ void unlock() { mutex_.unlock(); }
+
+private:
+ mutable std::mutex mutex_;
+ std::map<std::string, std::any> data_;
+};
+
+} /* namespace ipa */
+
+} /* namespace libcamera */
+
+#endif /* __LIBCAMERA_IPA_LIBIPA_METADATA_H__ */
--
2.30.2
More information about the libcamera-devel
mailing list