summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Elder <paul.elder@ideasonboard.com>2021-06-24 18:50:13 +0900
committerPaul Elder <paul.elder@ideasonboard.com>2021-08-02 18:07:30 +0900
commit6b444acf465062a4bdd10fca3a16768880ddd225 (patch)
tree9fef6207f6737682d50b24531ddf9a9e2a9a0a8d
parent1c8140ba020d1e1b01a48c147f4253046e2567df (diff)
android: Add helpers for setting android metadata from libcamera controls
Add helpers for setting android metadata from libcamera controls. There are two versions, for scalars and collections, both of which take a default value to fill in the android control if the libcamera control is not found. They both return the value that was set. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r--src/android/camera_capabilities.cpp88
1 files changed, 88 insertions, 0 deletions
diff --git a/src/android/camera_capabilities.cpp b/src/android/camera_capabilities.cpp
index 92525436..75888954 100644
--- a/src/android/camera_capabilities.cpp
+++ b/src/android/camera_capabilities.cpp
@@ -11,6 +11,7 @@
#include <array>
#include <cmath>
#include <map>
+#include <type_traits>
#include <hardware/camera3.h>
@@ -125,6 +126,93 @@ hwLevelStrings = {
{ ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_EXTERNAL, "EXTERNAL" },
};
+enum class ControlRange {
+ Min,
+ Def,
+ Max,
+};
+
+/**
+ * \brief Set Android metadata from libcamera ControlInfo or a default value
+ * \tparam T Type of the control in libcamera
+ * \tparam U Type of the metadata in Android
+ * \param[in] metadata Android metadata pack to add the control value to
+ * \param[in] tag Android metadata tag
+ * \param[in] controlsInfo libcamera ControlInfoMap from which to find the control info
+ * \param[in] control libcamera ControlId to find from \a controlsInfo
+ * \param[in] controlRange Whether to use the min, def, or max value from the control info
+ * \param[in] defaultValue The value to set in \a metadata if \a control is not found
+ *
+ * Set the Android metadata entry in \a metadata with tag \a tag based on the
+ * control info found for the libcamera control \a control in the libcamera
+ * ControlInfoMap \a controlsInfo. If no libcamera ControlInfo is found, then
+ * the Android metadata entry is set to \a defaultValue.
+ *
+ * This function is for scalar values.
+ */
+template<typename T, typename U>
+U setMetadata(CameraMetadata *metadata, uint32_t tag,
+ const ControlInfoMap &controlsInfo, const Control<T> &control,
+ enum ControlRange controlRange, const U defaultValue)
+{
+ U value = defaultValue;
+
+ const auto &info = controlsInfo.find(&control);
+ if (info != controlsInfo.end()) {
+ switch (controlRange) {
+ case ControlRange::Min:
+ value = static_cast<U>(info->second.min().template get<T>());
+ break;
+ case ControlRange::Def:
+ value = static_cast<U>(info->second.def().template get<T>());
+ break;
+ case ControlRange::Max:
+ value = static_cast<U>(info->second.max().template get<T>());
+ break;
+ }
+ }
+
+ metadata->addEntry(tag, value);
+ return value;
+}
+
+/**
+ * \brief Set Android metadata from libcamera ControlInfo or a default value
+ * \tparam T Type of the control in libcamera
+ * \tparam U Type of the metadata in Android
+ * \param[in] metadata Android metadata pack to add the control value to
+ * \param[in] tag Android metadata tag
+ * \param[in] controlsInfo libcamera ControlInfoMap from which to find the control info
+ * \param[in] control libcamera ControlId to find from \a controlsInfo
+ * \param[in] defaultVector The value to set in \a metadata if \a control is not found
+ *
+ * Set the Android metadata entry in \a metadata with tag \a tag based on the
+ * control info found for the libcamera control \a control in the libcamera
+ * ControlInfoMap \a controlsInfo. If no libcamera ControlInfo is found, then
+ * the Android metadata entry is set to \a defaultVector.
+ *
+ * This function is for vector values.
+ */
+template<typename T, typename U>
+std::vector<U> setMetadata(CameraMetadata *metadata, uint32_t tag,
+ const ControlInfoMap &controlsInfo,
+ const Control<T> &control,
+ const std::vector<U> &defaultVector)
+{
+ const auto &info = controlsInfo.find(&control);
+ if (info == controlsInfo.end()) {
+ metadata->addEntry(tag, defaultVector);
+ return defaultVector;
+ }
+
+ std::vector<U> values(info->second.values().size());
+ for (const auto &value : info->second.values())
+ values.push_back(static_cast<U>(value.template get<T>()));
+ metadata->addEntry(tag, values);
+
+ return values;
+}
+
} /* namespace */
bool CameraCapabilities::validateManualSensorCapability()