{"id":13164,"url":"https://patchwork.libcamera.org/api/1.1/patches/13164/?format=json","web_url":"https://patchwork.libcamera.org/patch/13164/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/1.1/projects/1/?format=json","name":"libcamera","link_name":"libcamera","list_id":"libcamera_core","list_email":"libcamera-devel@lists.libcamera.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20210730103536.81117-7-paul.elder@ideasonboard.com>","date":"2021-07-30T10:35:33","name":"[libcamera-devel,v6,6/9] android: Add helpers for setting android metadata from libcamera controls","commit_ref":null,"pull_url":null,"state":"accepted","archived":false,"hash":"258ab2b0da742862edc065fe36a87f9e31aff03f","submitter":{"id":17,"url":"https://patchwork.libcamera.org/api/1.1/people/17/?format=json","name":"Paul Elder","email":"paul.elder@ideasonboard.com"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/13164/mbox/","series":[{"id":2291,"url":"https://patchwork.libcamera.org/api/1.1/series/2291/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=2291","date":"2021-07-30T10:35:27","name":"android: Support capability and hardware level detection","version":6,"mbox":"https://patchwork.libcamera.org/series/2291/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/13164/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/13164/checks/","tags":{},"headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id DE83BC322E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 30 Jul 2021 10:36:00 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id A050E687BF;\n\tFri, 30 Jul 2021 12:36:00 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 9ECB4687BE\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 30 Jul 2021 12:35:58 +0200 (CEST)","from pyrite.rasen.tech (unknown\n\t[IPv6:2400:4051:61:600:2c71:1b79:d06d:5032])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 4012989B;\n\tFri, 30 Jul 2021 12:35:57 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"WqH/O4DA\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1627641358;\n\tbh=fFlmXdrPy8LXhMxW4a6aVXc1WwUaqzU53k/LeTpNzJM=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=WqH/O4DAdxy2DwTJyPPxZ3EaAynUaQX8K/VednOqmgTcYeP9iI3dhEFUYvTF3SczR\n\tiZ7UDes6BUENneLvPi7R/abt5/zWeJXuFCNG/+6STvfYgB7hcgf3XdW9AH2kxQsHEe\n\teBiEilshlezyAo3Nhkz5Sceni+Sx0XrFuJVZS4Vo=","From":"Paul Elder <paul.elder@ideasonboard.com>","To":"libcamera-devel@lists.libcamera.org","Date":"Fri, 30 Jul 2021 19:35:33 +0900","Message-Id":"<20210730103536.81117-7-paul.elder@ideasonboard.com>","X-Mailer":"git-send-email 2.27.0","In-Reply-To":"<20210730103536.81117-1-paul.elder@ideasonboard.com>","References":"<20210730103536.81117-1-paul.elder@ideasonboard.com>","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","Subject":"[libcamera-devel] [PATCH v6 6/9] android: Add helpers for setting\n\tandroid metadata from libcamera controls","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"},"content":"Add helpers for setting android metadata from libcamera controls.\n\nThere are two versions, for scalars and collections, both of which take\na default value to fill in the android control if the libcamera control\nis not found. They both return the value that was set.\n\nSigned-off-by: Paul Elder <paul.elder@ideasonboard.com>\n\n---\nChanges in v6:\n- remove unused scalar-no-default version\n- remove explicit template parameters\n  - infer the template parameters from the Control type\n\nChanges in v4:\n- remove vector copy from the vector setter\n\nChanges in v3:\n- setMetadata for collection only works with vectors\n- change enum to enum class\n- add two template parameters for android type and libcamera type\n- add docs\n\nNew in v2\n\nTODO: make ControlList versions so that we can use them in result\nmetadata\n---\n src/android/camera_capabilities.cpp | 88 +++++++++++++++++++++++++++++\n 1 file changed, 88 insertions(+)","diff":"diff --git a/src/android/camera_capabilities.cpp b/src/android/camera_capabilities.cpp\nindex b59a854f..fa701843 100644\n--- a/src/android/camera_capabilities.cpp\n+++ b/src/android/camera_capabilities.cpp\n@@ -11,6 +11,7 @@\n #include <array>\n #include <cmath>\n #include <map>\n+#include <type_traits>\n \n #include <hardware/camera3.h>\n \n@@ -125,6 +126,93 @@ hwLevelStrings = {\n \t{ ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_EXTERNAL, \"EXTERNAL\" },\n };\n \n+enum class ControlRange {\n+\tMin,\n+\tDef,\n+\tMax,\n+};\n+\n+/**\n+ * \\brief Set android metadata from libcamera ControlInfo or a default value\n+ * \\tparam T Type of the control in libcamera\n+ * \\tparam U Type of the control in android\n+ * \\param[in] metadata Android metadata pack to add the control value to\n+ * \\param[in] tag Android metadata tag\n+ * \\param[in] controlsInfo libcamera ControlInfoMap from which to find the control info\n+ * \\param[in] control libcamera ControlId to find from \\a controlsInfo\n+ * \\param[in] controlRange Whether to use the min, def, or max value from the control info\n+ * \\param[in] defaultValue The value to set in \\a metadata if \\a control is not found\n+ *\n+ * Set the android metadata entry in \\a metadata with tag \\a tag based on the\n+ * control info found for the libcamera control \\a control in the libcamera\n+ * ControlInfoMap \\a controlsInfo. If no libcamera ControlInfo is found, then\n+ * the android metadata entry is set to \\a defaultValue.\n+ *\n+ * This function is for scalar values.\n+ */\n+template<typename T, typename U>\n+U setMetadata(CameraMetadata *metadata, uint32_t tag,\n+\t      const ControlInfoMap &controlsInfo, const Control<T> *control,\n+\t      enum ControlRange controlRange, const U defaultValue)\n+{\n+\tU ret = defaultValue;\n+\n+\tconst auto &info = controlsInfo.find(reinterpret_cast<const ControlId *>(control));\n+\tif (info != controlsInfo.end()) {\n+\t\tswitch (controlRange) {\n+\t\tcase ControlRange::Min:\n+\t\t\tret = static_cast<U>(info->second.min().get<T>());\n+\t\t\tbreak;\n+\t\tcase ControlRange::Def:\n+\t\t\tret = static_cast<U>(info->second.def().get<T>());\n+\t\t\tbreak;\n+\t\tcase ControlRange::Max:\n+\t\t\tret = static_cast<U>(info->second.max().get<T>());\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+\n+\tmetadata->addEntry(tag, ret);\n+\treturn ret;\n+}\n+\n+/**\n+ * \\brief Set android metadata from libcamera ControlInfo or a default value\n+ * \\tparam T Type of the control in libcamera\n+ * \\tparam U Type of the control in android\n+ * \\param[in] metadata Android metadata pack to add the control value to\n+ * \\param[in] tag Android metadata tag\n+ * \\param[in] controlsInfo libcamera ControlInfoMap from which to find the control info\n+ * \\param[in] control libcamera ControlId to find from \\a controlsInfo\n+ * \\param[in] defaultVector The value to set in \\a metadata if \\a control is not found\n+ *\n+ * Set the android metadata entry in \\a metadata with tag \\a tag based on the\n+ * control info found for the libcamera control \\a control in the libcamera\n+ * ControlInfoMap \\a controlsInfo. If no libcamera ControlInfo is found, then\n+ * the android metadata entry is set to \\a defaultVector.\n+ *\n+ * This function is for vector values.\n+ */\n+template<typename T, typename U>\n+std::vector<U> setMetadata(CameraMetadata *metadata, uint32_t tag,\n+\t\t\t   const ControlInfoMap &controlsInfo,\n+\t\t\t   const Control<T> *control,\n+\t\t\t   const std::vector<U> &defaultVector)\n+{\n+\tconst auto &info = controlsInfo.find(reinterpret_cast<const ControlId *>(control));\n+\tif (info == controlsInfo.end()) {\n+\t\tmetadata->addEntry(tag, defaultVector);\n+\t\treturn defaultVector;\n+\t}\n+\n+\tstd::vector<U> ret(info->second.values().size());\n+\tfor (const auto &value : info->second.values())\n+\t\tret.push_back(static_cast<U>(value.get<T>()));\n+\tmetadata->addEntry(tag, ret);\n+\n+\treturn ret;\n+}\n+\n } /* namespace */\n \n bool CameraCapabilities::validateManualSensorCapability()\n","prefixes":["libcamera-devel","v6","6/9"]}