mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-16 00:45:07 +03:00
The ControlList class implements a map from control specifier to control ID. To avoid constant lookups of ControlInfo when using the class in the libcamera core or in pipeline handlers, the map uses ControlInfo pointers instead of ControlId values. This is however not very convenient for applications or pipeline handlers, as they would be forced to first look up the ControlInfo pointers for the controls they want to access. Facilitate ease of use of ControlLists by implementing an internal lookup of the ControlInfo from the controls provided by the Camera. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
138 lines
3 KiB
C++
138 lines
3 KiB
C++
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
/*
|
|
* Copyright (C) 2019, Google Inc.
|
|
*
|
|
* controls.h - Control handling
|
|
*/
|
|
|
|
#ifndef __LIBCAMERA_CONTROLS_H__
|
|
#define __LIBCAMERA_CONTROLS_H__
|
|
|
|
#include <stdint.h>
|
|
#include <string>
|
|
#include <unordered_map>
|
|
|
|
#include <libcamera/control_ids.h>
|
|
|
|
namespace libcamera {
|
|
|
|
class Camera;
|
|
|
|
enum ControlValueType {
|
|
ControlValueNone,
|
|
ControlValueBool,
|
|
ControlValueInteger,
|
|
ControlValueInteger64,
|
|
};
|
|
|
|
class ControlValue
|
|
{
|
|
public:
|
|
ControlValue();
|
|
ControlValue(bool value);
|
|
ControlValue(int value);
|
|
ControlValue(int64_t value);
|
|
|
|
ControlValueType type() const { return type_; };
|
|
bool isNone() const { return type_ == ControlValueNone; };
|
|
|
|
void set(bool value);
|
|
void set(int value);
|
|
void set(int64_t value);
|
|
|
|
bool getBool() const;
|
|
int getInt() const;
|
|
int64_t getInt64() const;
|
|
|
|
std::string toString() const;
|
|
|
|
private:
|
|
ControlValueType type_;
|
|
|
|
union {
|
|
bool bool_;
|
|
int integer_;
|
|
int64_t integer64_;
|
|
};
|
|
};
|
|
|
|
struct ControlIdentifier {
|
|
ControlId id;
|
|
const char *name;
|
|
ControlValueType type;
|
|
};
|
|
|
|
class ControlInfo
|
|
{
|
|
public:
|
|
explicit ControlInfo(ControlId id, const ControlValue &min = 0,
|
|
const ControlValue &max = 0);
|
|
|
|
ControlId id() const { return ident_->id; }
|
|
const char *name() const { return ident_->name; }
|
|
ControlValueType type() const { return ident_->type; }
|
|
|
|
const ControlValue &min() const { return min_; }
|
|
const ControlValue &max() const { return max_; }
|
|
|
|
std::string toString() const;
|
|
|
|
private:
|
|
const struct ControlIdentifier *ident_;
|
|
ControlValue min_;
|
|
ControlValue max_;
|
|
};
|
|
|
|
bool operator==(const ControlInfo &lhs, const ControlInfo &rhs);
|
|
bool operator==(const ControlId &lhs, const ControlInfo &rhs);
|
|
bool operator==(const ControlInfo &lhs, const ControlId &rhs);
|
|
static inline bool operator!=(const ControlInfo &lhs, const ControlInfo &rhs)
|
|
{
|
|
return !(lhs == rhs);
|
|
}
|
|
static inline bool operator!=(const ControlId &lhs, const ControlInfo &rhs)
|
|
{
|
|
return !(lhs == rhs);
|
|
}
|
|
static inline bool operator!=(const ControlInfo &lhs, const ControlId &rhs)
|
|
{
|
|
return !(lhs == rhs);
|
|
}
|
|
|
|
using ControlInfoMap = std::unordered_map<ControlId, ControlInfo>;
|
|
|
|
class ControlList
|
|
{
|
|
private:
|
|
using ControlListMap = std::unordered_map<const ControlInfo *, ControlValue>;
|
|
|
|
public:
|
|
ControlList(Camera *camera);
|
|
|
|
using iterator = ControlListMap::iterator;
|
|
using const_iterator = ControlListMap::const_iterator;
|
|
|
|
iterator begin() { return controls_.begin(); }
|
|
iterator end() { return controls_.end(); }
|
|
const_iterator begin() const { return controls_.begin(); }
|
|
const_iterator end() const { return controls_.end(); }
|
|
|
|
bool contains(ControlId id) const;
|
|
bool contains(const ControlInfo *info) const;
|
|
bool empty() const { return controls_.empty(); }
|
|
std::size_t size() const { return controls_.size(); }
|
|
void clear() { controls_.clear(); }
|
|
|
|
ControlValue &operator[](ControlId id);
|
|
ControlValue &operator[](const ControlInfo *info) { return controls_[info]; }
|
|
|
|
void update(const ControlList &list);
|
|
|
|
private:
|
|
Camera *camera_;
|
|
ControlListMap controls_;
|
|
};
|
|
|
|
} /* namespace libcamera */
|
|
|
|
#endif /* __LIBCAMERA_CONTROLS_H__ */
|