[libcamera-devel] [RFC PATCH v2 1/3] android: Add helpers for setting android metadata from libcamera controls
Hirokazu Honda
hiroh at chromium.org
Fri Jun 25 06:43:39 CEST 2021
Hi Paul,
On Thu, Jun 24, 2021 at 9:40 PM Laurent Pinchart
<laurent.pinchart at ideasonboard.com> wrote:
>
> 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 {
nit: enum class
> > + Min,
> > + Def,
> > + Max,
> > +};
> > +
> > +template<typename T,
> > + std::enable_if_t<std::is_arithmetic_v<T>> * = nullptr>
Perhaps std::enable_if_t<std::is_arithmetic_v<T>::value, bool> = true?
> > +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)
nit: I would put defaultValue to the last argument.
> > +{
> > + 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