From patchwork Thu Jun 24 10:50:52 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 12698 X-Patchwork-Delegate: paul.elder@ideasonboard.com Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id DD0AFC321C for ; Thu, 24 Jun 2021 10:51:09 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id C449A68937; Thu, 24 Jun 2021 12:51:08 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="eJDpZmu7"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 74FB36050B for ; Thu, 24 Jun 2021 12:51:07 +0200 (CEST) Received: from pyrite.rasen.tech (unknown [IPv6:2400:4051:61:600:2c71:1b79:d06d:5032]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 69CB32C51; Thu, 24 Jun 2021 12:51:05 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1624531866; bh=vKjntS2wrnhYN9pjrJQJW38winROU1gCwEmPf4H5Po4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=eJDpZmu79k/fnqkE2lks4/Jqcz/yaDehvvPH3YBU/U1PDlQ0gLEh5Zieox0n6NCJW KQbbbmpqIopl/OGd/+ylMoCkSn5FAQLN0NfUIIwbv+/dWHGB1N/SaQlDYjDEiciLH0 2OMJVmfbe8+y+Kb2Z3xyacPCYti1adBUMKlmlD9w= From: Paul Elder 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 Subject: [libcamera-devel] [RFC PATCH v2 1/3] android: Add helpers for setting android metadata from libcamera controls X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" 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. A version for scalars exists for no default, to not set the android control at all if it is not found in libcamera. The last one requires the type to be specified, but the other two do not. The versions that take a default value return the value that was set in the android metadata. Signed-off-by: Paul Elder --- New in v2 TODO: make ControlList versions so that we can use them in result metadata --- src/android/camera_capabilities.cpp | 81 +++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/src/android/camera_capabilities.cpp b/src/android/camera_capabilities.cpp index 00224a6d..7d795bf5 100644 --- a/src/android/camera_capabilities.cpp +++ b/src/android/camera_capabilities.cpp @@ -113,6 +113,87 @@ const std::map camera3FormatsMap = { }, }; +enum ControlRange { + Min, + Def, + Max, +}; + +template> * = nullptr> +void setMetadata(CameraMetadata *metadata, uint32_t tag, + const ControlInfoMap &controlsInfo, const ControlId *control, + enum ControlRange controlRange) +{ + const auto &info = controlsInfo.find(control); + if (info == controlsInfo.end()) + return; + + T ret; + switch (controlRange) { + case Min: + ret = info->second.min().get(); + break; + case Def: + ret = info->second.def().get(); + break; + case Max: + ret = info->second.max().get(); + break; + } + + metadata->addEntry(tag, ret); + return; +} + +template> * = nullptr> +T setMetadata(CameraMetadata *metadata, uint32_t tag, + const ControlInfoMap &controlsInfo, const ControlId *control, + const T defaultValue, enum ControlRange controlRange) +{ + T ret = defaultValue; + + const auto &info = controlsInfo.find(control); + if (info != controlsInfo.end()) { + switch (controlRange) { + case Min: + ret = info->second.min().get(); + break; + case Def: + ret = info->second.def().get(); + break; + case Max: + ret = info->second.max().get(); + break; + } + } + + metadata->addEntry(tag, ret); + return ret; +} + +template +S setMetadata(CameraMetadata *metadata, uint32_t tag, + const ControlInfoMap &controlsInfo, const ControlId *control, + const S &defaultVector) +{ + S ret = {}; + + const auto &info = controlsInfo.find(control); + if (info != controlsInfo.end()) { + ret.reserve(info->second.values().size()); + for (const auto &value : info->second.values()) + ret.push_back(value.get()); + } else { + ret = defaultVector; + } + + metadata->addEntry(tag, ret); + return ret; +} + } /* namespace */ int CameraCapabilities::initialize(std::shared_ptr camera,