16#include <unordered_map>
19#include <libcamera/base/class.h>
21#include <libcamera/base/span.h>
27class ControlValidator;
46template<
typename T,
typename = std::
void_t<>>
51struct control_type<void> {
53 static constexpr std::size_t size = 0;
57struct control_type<bool> {
59 static constexpr std::size_t size = 0;
63struct control_type<uint8_t> {
65 static constexpr std::size_t size = 0;
69struct control_type<uint16_t> {
71 static constexpr std::size_t size = 0;
75struct control_type<uint32_t> {
77 static constexpr std::size_t size = 0;
81struct control_type<int32_t> {
83 static constexpr std::size_t size = 0;
87struct control_type<int64_t> {
89 static constexpr std::size_t size = 0;
93struct control_type<float> {
95 static constexpr std::size_t size = 0;
99struct control_type<std::string> {
101 static constexpr std::size_t size = 0;
105struct control_type<Rectangle> {
106 static constexpr ControlType value = ControlTypeRectangle;
107 static constexpr std::size_t size = 0;
111struct control_type<Size> {
112 static constexpr ControlType value = ControlTypeSize;
113 static constexpr std::size_t size = 0;
117struct control_type<Point> {
118 static constexpr ControlType value = ControlTypePoint;
119 static constexpr std::size_t size = 0;
122template<
typename T, std::
size_t N>
123struct control_type<Span<T, N>> :
public control_type<std::remove_cv_t<T>> {
124 static constexpr std::size_t size = N;
128struct control_type<T, std::enable_if_t<std::is_enum_v<T>>> :
public control_type<int32_t> {
140 details::control_type<T>::value &&
141 !std::is_same<std::string, std::remove_cv_t<T>>::value,
142 std::nullptr_t> =
nullptr>
146 set(details::control_type<std::remove_cv_t<T>>::value,
false,
147 &value, 1,
sizeof(
T));
151 std::is_same<std::string, std::remove_cv_t<T>>::value,
152 std::nullptr_t> =
nullptr>
159 set(details::control_type<std::remove_cv_t<T>>::value,
true,
160 value.data(), value.size(),
sizeof(
typename T::value_type));
180 return !(*
this ==
other);
185 !std::is_same<std::string, std::remove_cv_t<T>>::value,
186 std::nullptr_t> =
nullptr>
189 assert(type_ == details::control_type<std::remove_cv_t<T>>::value);
192 return *
reinterpret_cast<const T *
>(
data().data());
196 std::is_same<std::string, std::remove_cv_t<T>>::value,
197 std::nullptr_t> =
nullptr>
203 assert(type_ == details::control_type<std::remove_cv_t<T>>::value);
206 using V =
typename T::value_type;
207 const V *value =
reinterpret_cast<const V *
>(
data().data());
208 return T{ value, numElements_ };
213 !std::is_same<std::string, std::remove_cv_t<T>>::value,
214 std::nullptr_t> =
nullptr>
215 void set(
const T &value)
217 set(details::control_type<std::remove_cv_t<T>>::value,
false,
218 reinterpret_cast<const void *
>(&value), 1,
sizeof(
T));
222 std::is_same<std::string, std::remove_cv_t<T>>::value,
223 std::nullptr_t> =
nullptr>
229 set(details::control_type<std::remove_cv_t<T>>::value,
true,
230 value.data(), value.size(),
sizeof(
typename T::value_type));
239 std::size_t numElements_ : 32;
262 std::size_t
size = 0,
263 const std::map<std::string, int32_t> &enumStrMap = {});
265 unsigned int id()
const {
return id_; }
266 const std::string &
name()
const {
return name_; }
267 const std::string &
vendor()
const {
return vendor_; }
273 std::size_t
size()
const {
return size_; }
274 const std::map<int32_t, std::string> &
enumerators()
const {
return reverseMap_; }
277 LIBCAMERA_DISABLE_COPY_AND_MOVE(
ControlId)
285 std::map<std::string, int32_t> enumStrMap_;
286 std::map<int32_t, std::string> reverseMap_;
291static inline bool operator==(
unsigned int lhs,
const ControlId &rhs)
293 return lhs == rhs.id();
296static inline bool operator!=(
unsigned int lhs,
const ControlId &rhs)
298 return !(lhs == rhs);
301static inline bool operator==(
const ControlId &lhs,
unsigned int rhs)
303 return lhs.id() == rhs;
306static inline bool operator!=(
const ControlId &lhs,
unsigned int rhs)
308 return !(lhs == rhs);
319 const std::map<std::string, int32_t> &enumStrMap = {})
321 direction, details::control_type<std::remove_cv_t<T>>::
size, enumStrMap)
326 LIBCAMERA_DISABLE_COPY_AND_MOVE(Control)
343 const std::vector<ControlValue> &
values()
const {
return values_; }
349 return min_ == other.min_ && max_ == other.max_;
354 return !(*
this == other);
361 std::vector<ControlValue> values_;
364using ControlIdMap = std::unordered_map<unsigned int, const ControlId *>;
369 using Map = std::unordered_map<const ControlId *, ControlInfo>;
380 using Map::mapped_type;
381 using Map::value_type;
382 using Map::size_type;
384 using Map::const_iterator;
396 mapped_type &
at(
unsigned int key);
397 const mapped_type &
at(
unsigned int key)
const;
398 size_type
count(
unsigned int key)
const;
399 iterator
find(
unsigned int key);
400 const_iterator
find(
unsigned int key)
const;
413 using ControlListMap = std::unordered_map<unsigned int, ControlValue>;
433 bool empty()
const {
return controls_.empty(); }
434 std::size_t
size()
const {
return controls_.size(); }
439 bool contains(
unsigned int id)
const;
444 const auto entry = controls_.find(
ctrl.id());
445 if (
entry == controls_.end())
452 template<
typename T,
typename V>
462 template<
typename T,
typename V,
size_t Size>
469 val->set(
Span<
const typename std::remove_cv_t<V>,
Size>{ value.begin(), value.size() });
486 ControlListMap controls_;
Control static metadata.
Definition controls.h:251
const std::map< int32_t, std::string > & enumerators() const
Retrieve the map of enum values to enum names.
Definition controls.h:274
ControlType type() const
Retrieve the control data type.
Definition controls.h:268
bool isOutput() const
Determine if the control is available to be used in output metadata.
Definition controls.h:271
bool isInput() const
Determine if the control is available to be used as an input control.
Definition controls.h:270
Flags< Direction > DirectionFlags
A wrapper for ControlId::Direction so that it can be used as flags.
Definition controls.h:258
Direction
The direction the control is capable of being passed from/to.
Definition controls.h:253
@ Out
The control can be returned as output in metadata.
@ In
The control can be passed as input in controls.
const std::string & vendor() const
Retrieve the vendor name.
Definition controls.h:267
bool isArray() const
Determine if the control is an array control.
Definition controls.h:272
DirectionFlags direction() const
Return the direction that the control can be used in.
Definition controls.h:269
const std::string & name() const
Retrieve the control name.
Definition controls.h:266
std::size_t size() const
Retrieve the size of the control if it is an array control.
Definition controls.h:273
unsigned int id() const
Retrieve the control numerical ID.
Definition controls.h:265
A map of ControlId to ControlInfo.
Definition controls.h:367
mapped_type & at(unsigned int key)
Access specified element by numerical ID.
Definition controls.cpp:834
const ControlIdMap & idmap() const
Retrieve the ControlId map.
Definition controls.h:402
ControlInfoMap & operator=(const ControlInfoMap &other)=default
Copy assignment operator, replace the contents with a copy of other.
std::unordered_map< const ControlId *, ControlInfo > Map
The base std::unsorted_map<> container.
Definition controls.h:369
iterator find(unsigned int key)
Find the element matching a numerical ID.
Definition controls.cpp:877
ControlInfoMap(const ControlInfoMap &other)=default
Copy constructor, construct a ControlInfoMap from a copy of other.
size_type count(unsigned int key) const
Count the number of elements matching a numerical ID.
Definition controls.cpp:858
Describe the limits of valid values for a Control.
Definition controls.h:330
const std::vector< ControlValue > & values() const
Retrieve the list of valid values.
Definition controls.h:343
std::string toString() const
Provide a string representation of the ControlInfo.
Definition controls.cpp:699
bool operator==(const ControlInfo &other) const
Compare ControlInfo instances for equality.
Definition controls.h:347
bool operator!=(const ControlInfo &other) const
Compare ControlInfo instances for non equality.
Definition controls.h:352
const ControlValue & max() const
Retrieve the maximum value of the control.
Definition controls.h:341
const ControlValue & def() const
Retrieve the default value of the control.
Definition controls.h:342
const ControlValue & min() const
Retrieve the minimum value of the control.
Definition controls.h:340
Associate a list of ControlId with their values for an object.
Definition controls.h:411
void merge(const ControlList &source, MergePolicy policy=MergePolicy::KeepExisting)
Merge the source into the ControlList.
Definition controls.cpp:1049
void clear()
Removes all controls from the list.
Definition controls.h:436
const ControlInfoMap * infoMap() const
Retrieve the ControlInfoMap used to construct the ControlList.
Definition controls.h:475
const ControlIdMap * idMap() const
Retrieve the ControlId map used to construct the ControlList.
Definition controls.h:476
void set(const Control< Span< T, Size > > &ctrl, const std::initializer_list< V > &value)
Set the control ctrl value to value.
Definition controls.h:463
ControlListMap::const_iterator const_iterator
Const iterator for the controls contained within the list.
Definition controls.h:426
iterator end()
Retrieve an iterator pointing to the past-the-end control in the list.
Definition controls.h:429
MergePolicy
The policy used by the merge function.
Definition controls.h:416
@ OverwriteExisting
Existing controls in the target list are updated.
@ KeepExisting
Existing controls in the target list are kept.
std::size_t size() const
Retrieve the number of controls in the list.
Definition controls.h:434
ControlListMap::iterator iterator
Iterator for the controls contained within the list.
Definition controls.h:425
std::optional< T > get(const Control< T > &ctrl) const
Get the value of control ctrl.
Definition controls.h:442
bool empty() const
Identify if the list is empty.
Definition controls.h:433
void set(const Control< T > &ctrl, const V &value)
Set the control ctrl value to value.
Definition controls.h:453
iterator begin()
Retrieve an iterator to the first Control in the list.
Definition controls.h:428
bool contains(unsigned int id) const
Check if the list contains a control with the specified id.
Definition controls.cpp:1081
const_iterator begin() const
Retrieve a const_iterator to the first Control in the list.
Definition controls.h:430
ControlList()
Construct a ControlList not associated with any object.
Definition controls.cpp:937
const_iterator end() const
Retrieve a const iterator pointing to the past-the-end control in the list.
Definition controls.h:431
Abstract type representing the value of a control.
Definition controls.h:134
T get() const
Get the control value.
Definition controls.h:201
bool isArray() const
Determine if the value stores an array.
Definition controls.h:170
ControlValue & operator=(const ControlValue &other)
Replace the content of the ControlValue with a copy of the content of other.
Definition controls.cpp:152
void reserve(ControlType type, bool isArray=false, std::size_t numElements=1)
Set the control type and reserve memory.
Definition controls.cpp:376
bool operator==(const ControlValue &other) const
Compare ControlValue instances for equality.
Definition controls.cpp:300
void set(const T &value)
Set the control value to value.
Definition controls.h:227
ControlValue()
Construct an empty ControlValue.
Definition controls.cpp:104
bool operator!=(const ControlValue &other) const
Compare ControlValue instances for non equality.
Definition controls.h:178
ControlValue(const T &value)
Construct a ControlValue of type T.
Definition controls.h:156
ControlType type() const
Retrieve the data type of the value.
Definition controls.h:168
std::string toString() const
Assemble and return a string describing the value.
Definition controls.cpp:214
bool isNone() const
Determine if the value is not initialised.
Definition controls.h:169
std::size_t numElements() const
Retrieve the number of elements stored in the ControlValue.
Definition controls.h:171
Span< const uint8_t > data() const
Retrieve the raw data of a control value.
Definition controls.cpp:192
Describe a control and its intrinsic properties.
Definition controls.h:313
Control(unsigned int id, const char *name, const char *vendor, ControlId::DirectionFlags direction, const std::map< std::string, int32_t > &enumStrMap={})
Construct a Control instance.
Definition controls.h:317
T type
The Control template type T.
Definition controls.h:315
Describe a two-dimensional size.
Definition geometry.h:53
#define LIBCAMERA_FLAGS_ENABLE_OPERATORS(_enum)
Enable bitwise operations on the enum enumeration.
Definition flags.h:189
Data structures related to geometric objects.
Top-level libcamera namespace.
Definition bound_method.h:15
ControlType
Define the data type of a Control.
Definition controls.h:29
@ ControlTypeNone
Definition controls.h:30
@ ControlTypeFloat
Definition controls.h:37
@ ControlTypeUnsigned16
Definition controls.h:33
@ ControlTypeBool
Definition controls.h:31
@ ControlTypeUnsigned32
Definition controls.h:34
@ ControlTypeInteger32
Definition controls.h:35
@ ControlTypeString
Definition controls.h:38
@ ControlTypeInteger64
Definition controls.h:36
@ ControlTypeByte
Definition controls.h:32
std::unordered_map< unsigned int, const ControlId * > ControlIdMap
A map of numerical control ID to ControlId.
Definition controls.h:364
bool operator==(const ColorSpace &lhs, const ColorSpace &rhs)
Compare color spaces for equality.
Definition color_space.cpp:506