[libcamera-devel] [RFC PATCH v2 1/3] android: Add helpers for setting android metadata from libcamera controls
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Thu Jun 24 14:39:41 CEST 2021
Hi Paul,
Thank you for the patch.
On Thu, Jun 24, 2021 at 07:50:52PM +0900, Paul Elder wrote:
> 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 <paul.elder at ideasonboard.com>
>
> ---
> 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<int, const Camera3Format> camera3FormatsMap = {
> },
> };
>
> +enum ControlRange {
> + Min,
> + Def,
> + Max,
> +};
> +
> +template<typename T,
> + std::enable_if_t<std::is_arithmetic_v<T>> * = 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<T>();
> + break;
> + case Def:
> + ret = info->second.def().get<T>();
> + break;
> + case Max:
> + ret = info->second.max().get<T>();
> + break;
> + }
> +
> + metadata->addEntry(tag, ret);
> + return;
> +}
> +
> +template<typename T,
> + std::enable_if_t<std::is_arithmetic_v<T>> * = 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<T>();
> + break;
> + case Def:
> + ret = info->second.def().get<T>();
> + break;
> + case Max:
> + ret = info->second.max().get<T>();
> + break;
> + }
> + }
> +
> + metadata->addEntry(tag, ret);
> + return ret;
> +}
> +
> +template<typename S,
> + typename T = typename S::value_type>
> +S setMetadata(CameraMetadata *metadata, uint32_t tag,
> + const ControlInfoMap &controlsInfo, const ControlId *control,
> + const S &defaultVector)
If S is required to be a vector, could this be
template<typename T>,
std::vector<T> setMetadata(CameraMetadata *metadata, uint32_t tag,
const ControlInfoMap &controlsInfo,
const ControlId *control,
const std::vector<T> &defaultVector)
> +{
> + std::vector<T> 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<T>());
> + } else {
> + ret = defaultVector;
> + }
> +
> + metadata->addEntry(tag, ret);
> + return ret;
> +}
> +
> } /* namespace */
>
> int CameraCapabilities::initialize(std::shared_ptr<libcamera::Camera> camera,
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list