{"id":12698,"url":"https://patchwork.libcamera.org/api/patches/12698/?format=json","web_url":"https://patchwork.libcamera.org/patch/12698/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/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":"<20210624105054.51700-2-paul.elder@ideasonboard.com>","date":"2021-06-24T10:50:52","name":"[libcamera-devel,RFC,v2,1/3] android: Add helpers for setting android metadata from libcamera controls","commit_ref":null,"pull_url":null,"state":"superseded","archived":false,"hash":"36e7a37b89f6938efe2c3ff494c79d6da94785ad","submitter":{"id":17,"url":"https://patchwork.libcamera.org/api/people/17/?format=json","name":"Paul Elder","email":"paul.elder@ideasonboard.com"},"delegate":{"id":17,"url":"https://patchwork.libcamera.org/api/users/17/?format=json","username":"epaul","first_name":"Paul","last_name":"Elder","email":"paul.elder@ideasonboard.com"},"mbox":"https://patchwork.libcamera.org/patch/12698/mbox/","series":[{"id":2172,"url":"https://patchwork.libcamera.org/api/series/2172/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=2172","date":"2021-06-24T10:50:51","name":"Static metadata helpers","version":2,"mbox":"https://patchwork.libcamera.org/series/2172/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/12698/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/12698/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 DD0AFC321C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 24 Jun 2021 10:51:09 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id C449A68937;\n\tThu, 24 Jun 2021 12:51:08 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 74FB36050B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 24 Jun 2021 12:51:07 +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 69CB32C51;\n\tThu, 24 Jun 2021 12:51:05 +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=\"eJDpZmu7\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1624531866;\n\tbh=vKjntS2wrnhYN9pjrJQJW38winROU1gCwEmPf4H5Po4=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=eJDpZmu79k/fnqkE2lks4/Jqcz/yaDehvvPH3YBU/U1PDlQ0gLEh5Zieox0n6NCJW\n\tKQbbbmpqIopl/OGd/+ylMoCkSn5FAQLN0NfUIIwbv+/dWHGB1N/SaQlDYjDEiciLH0\n\t2OMJVmfbe8+y+Kb2Z3xyacPCYti1adBUMKlmlD9w=","From":"Paul Elder <paul.elder@ideasonboard.com>","To":"libcamera-devel@lists.libcamera.org","Date":"Thu, 24 Jun 2021 19:50:52 +0900","Message-Id":"<20210624105054.51700-2-paul.elder@ideasonboard.com>","X-Mailer":"git-send-email 2.27.0","In-Reply-To":"<20210624105054.51700-1-paul.elder@ideasonboard.com>","References":"<20210624105054.51700-1-paul.elder@ideasonboard.com>","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","Subject":"[libcamera-devel] [RFC PATCH v2 1/3] android: Add helpers for\n\tsetting android 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. A version for scalars exists for no default, to not set\nthe android control at all if it is not found in libcamera. The last one\nrequires the type to be specified, but the other two do not.\n\nThe versions that take a default value return the value that was set in\nthe android metadata.\n\nSigned-off-by: Paul Elder <paul.elder@ideasonboard.com>\n\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 | 81 +++++++++++++++++++++++++++++\n 1 file changed, 81 insertions(+)","diff":"diff --git a/src/android/camera_capabilities.cpp b/src/android/camera_capabilities.cpp\nindex 00224a6d..7d795bf5 100644\n--- a/src/android/camera_capabilities.cpp\n+++ b/src/android/camera_capabilities.cpp\n@@ -113,6 +113,87 @@ const std::map<int, const Camera3Format> camera3FormatsMap = {\n \t},\n };\n \n+enum ControlRange {\n+\tMin,\n+\tDef,\n+\tMax,\n+};\n+\n+template<typename T,\n+\t std::enable_if_t<std::is_arithmetic_v<T>> * = nullptr>\n+void setMetadata(CameraMetadata *metadata, uint32_t tag,\n+\t\t const ControlInfoMap &controlsInfo, const ControlId *control,\n+\t\t enum ControlRange controlRange)\n+{\n+\tconst auto &info = controlsInfo.find(control);\n+\tif (info == controlsInfo.end())\n+\t\treturn;\n+\n+\tT ret;\n+\tswitch (controlRange) {\n+\tcase Min:\n+\t\tret = info->second.min().get<T>();\n+\t\tbreak;\n+\tcase Def:\n+\t\tret = info->second.def().get<T>();\n+\t\tbreak;\n+\tcase Max:\n+\t\tret = info->second.max().get<T>();\n+\t\tbreak;\n+\t}\n+\n+\tmetadata->addEntry(tag, ret);\n+\treturn;\n+}\n+\n+template<typename T,\n+\t std::enable_if_t<std::is_arithmetic_v<T>> * = nullptr>\n+T setMetadata(CameraMetadata *metadata, uint32_t tag,\n+\t      const ControlInfoMap &controlsInfo, const ControlId *control,\n+\t      const T defaultValue, enum ControlRange controlRange)\n+{\n+\tT ret = defaultValue;\n+\n+\tconst auto &info = controlsInfo.find(control);\n+\tif (info != controlsInfo.end()) {\n+\t\tswitch (controlRange) {\n+\t\tcase Min:\n+\t\t\tret = info->second.min().get<T>();\n+\t\t\tbreak;\n+\t\tcase Def:\n+\t\t\tret = info->second.def().get<T>();\n+\t\t\tbreak;\n+\t\tcase Max:\n+\t\t\tret = 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+template<typename S,\n+\t typename T = typename S::value_type>\n+S setMetadata(CameraMetadata *metadata, uint32_t tag,\n+\t      const ControlInfoMap &controlsInfo, const ControlId *control,\n+\t      const S &defaultVector)\n+{\n+\tS ret = {};\n+\n+\tconst auto &info = controlsInfo.find(control);\n+\tif (info != controlsInfo.end()) {\n+\t\tret.reserve(info->second.values().size());\n+\t\tfor (const auto &value : info->second.values())\n+\t\t\tret.push_back(value.get<T>());\n+\t} else {\n+\t\tret = defaultVector;\n+\t}\n+\n+\tmetadata->addEntry(tag, ret);\n+\treturn ret;\n+}\n+\n } /* namespace */\n \n int CameraCapabilities::initialize(std::shared_ptr<libcamera::Camera> camera,\n","prefixes":["libcamera-devel","RFC","v2","1/3"]}