[libcamera-devel] [RFC PATCH v2 3/9] libcamera: controls: Introduce Control structures
Kieran Bingham
kieran.bingham at ideasonboard.com
Mon Jun 24 18:49:38 CEST 2019
Hi Laurent, Niklas,
On 23/06/2019 22:54, Laurent Pinchart wrote:
> On Sun, Jun 23, 2019 at 05:22:03PM +0200, Niklas Söderlund wrote:
>> On 2019-06-21 17:13:55 +0100, Kieran Bingham wrote:
>>> ControlIdentifiers declare the types of a control, and map their names,
>>> and the ControlInfo class allows runtime state to be represented.
>>>
>>> Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
>>> ---
>>> include/libcamera/controls.h | 58 ++++++++++++
>>> include/libcamera/meson.build | 1 +
>>> src/libcamera/controls.cpp | 160 ++++++++++++++++++++++++++++++++++
>>> src/libcamera/meson.build | 1 +
>>> 4 files changed, 220 insertions(+)
>>> create mode 100644 include/libcamera/controls.h
>>> create mode 100644 src/libcamera/controls.cpp
>>>
>>> diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h
>>> new file mode 100644
>>> index 000000000000..95198d41c4cf
>>> --- /dev/null
>>> +++ b/include/libcamera/controls.h
>>> @@ -0,0 +1,58 @@
>>> +/* 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 <libcamera/value.h>
>>> +
>>> +namespace libcamera {
>>> +
>>> +enum ControlId : uint32_t {
>>> + /* IPA Controls */
>>> + IpaAwbEnable,
>>> +
>>> + /* Manual Controls */
>>> + ManualBrightness,
>>> + ManualExposure,
>>> + ManualGain,
>>> +};
>>> +
>>> +struct ControlIdentifier {
>>> + ControlId id;
>>> + const char *name;
>>> + ValueType type;
>>> +};
>>> +
>>> +class ControlInfo
>>> +{
>>> +public:
>>> + ControlInfo(ControlId id, Value min = 0, Value max = 0);
>>> +
>>> + ControlId id() const { return ident_->id; }
>>> + const char *name() const { return ident_->name; }
>>> + ValueType type() const { return ident_->type; }
>>> +
>>> + const Value &min() { return min_; }
>>> + const Value &max() { return min_; }
>>
>> These can be const functions.
Done.
>
> And the second one should return max_.
Done ... eeep :-(
>
>>> +
>>> + std::string toString() const;
>>> +
>>> + bool operator==(const ControlInfo &rhs) const { return id() == rhs.id(); }
>>> + bool operator==(const ControlId rhs) const { return id() == rhs; }
>>> +
>>> +private:
>>> + struct ControlIdentifier const *ident_;
>>> + Value min_;
>>> + Value max_;
>>> +
>>> +};
>>> +
>>> +std::ostream &operator<<(std::ostream &stream, const ControlInfo &value);
>>> +
>>> +} /* namespace libcamera */
>>> +
>>> +#endif /* __LIBCAMERA_CONTROLS_H__ */
>>> diff --git a/include/libcamera/meson.build b/include/libcamera/meson.build
>>> index eb2211ae1fc3..06e3feebd23d 100644
>>> --- a/include/libcamera/meson.build
>>> +++ b/include/libcamera/meson.build
>>> @@ -1,5 +1,6 @@
>>> libcamera_api = files([
>>> 'buffer.h',
>>> + 'controls.h',
>>
>> Not inserted in alphabetical order ;-)
>
> How did *I* miss that one ? :-)
Now sorted correctly.
>
>>> 'camera.h',
>>> 'camera_manager.h',
>>> 'event_dispatcher.h',
>>> diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp
>>> new file mode 100644
>>> index 000000000000..b1be46ddb55e
>>> --- /dev/null
>>> +++ b/src/libcamera/controls.cpp
>>> @@ -0,0 +1,160 @@
>>> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
>>> +/*
>>> + * Copyright (C) 2019, Google Inc.
>>> + *
>>> + * controls.cpp - Control handling
>>> + */
>>> +
>>> +#include <limits.h>
>>> +#include <sstream>
>>> +#include <string>
>>> +
>>> +#include <libcamera/controls.h>
>>
>> You should have this as the first include statement in the file.
Fixed.
>>
>>> +
>>> +#include "log.h"
>>> +#include "utils.h"
>>> +
>>> +/**
>>> + * \file controls.h
>>> + * \brief Describes control framework and controls supported by a camera
>>> + */
>>> +
>>> +namespace libcamera {
>>> +
>>> +LOG_DEFINE_CATEGORY(Controls)
>>> +
>>> +/**
>>> + * \enum ControlId
>>> + * Control Identifiers
>>> + * \var IpaAwbEnable
>>> + * bool: Enables or disables the AWB
>>> + * \var ManualExposure
>>> + * Manually control the exposure time in milli-seconds
>>> + * \var ManualGain
>>> + * Controls the value of the manual gain setting
>>> + */
>>
>> ManualBrightness missing.
Added.
>>
>>> +
>>> +/**
>>> + * \struct ControlIdentifier
>>> + * Defines a Control with a unique ID, a name, and a type.
>>> + * \var ControlIdentifier::id
>>> + * The unique ID for a control
>>> + * \var ControlIdentifier::name
>>> + * The string representation of the control
>>> + * \var ControlIdentifier::type
>>> + * The ValueType required to represent the control value
>>> + */
>>> +
>>> +/*
>>> + * Two sets of tables are generated for the static control definitions.
>>> + *
>>> + * An enum to declare the ID (in controls.h), and a type to establish its
>>> + * representation.
>>> + *
>>> + * Todo: Automate the generation of both tables from a single input table.
>>> + * Todo: Consider if this should be a static std::map created at init instead.
>>
>> I think a static std::map (or maybe unordered_map) is a good idea.
Yes, but I think I still need to work out how to automatically generate
the tables from a single data source, and correctly populate them at
camera instantiation.
>>
>>> + */
>>> +static const struct ControlIdentifier ControlTypes[] = {
>>> +#define CONTROL_TYPE(_id, _type) { _id, #_id, _type }
>>> +
>>> + CONTROL_TYPE(IpaAwbEnable, ValueBool),
>>> + CONTROL_TYPE(ManualBrightness, ValueInteger),
>>> + CONTROL_TYPE(ManualExposure, ValueInteger),
>>> + CONTROL_TYPE(ManualGain, ValueInteger),
>>> +
>>> +#undef CONTROL_TYPE
>>> +};
>>> +
>>> +static struct ControlIdentifier const *FindControlType(ControlId id)
>>> +{
>>> + struct ControlIdentifier const *ident;
>>> +
>>> + for (ident = ControlTypes;
>>> + ident != &ControlTypes[ARRAY_SIZE(ControlTypes)];
>>> + ++ident) {
>>> + if (ident->id == id)
>>> + return ident;
>>> + }
>>> +
>>> + LOG(Controls, Fatal) << "Failed to find a ControlType.";
>>> +
>>> + /* Unreachable. */
>>> + return nullptr;
>>> +}
>>> +
>>> +/**
>>> + * \class ControlInfo
>>> + * \brief Describes the information and capabilities of a Control
>>> + */
>>> +
>>> +/**
>>> + * \brief Construct a ControlInfo with minimum and maximum range parameters.
>>> + */
>>> +ControlInfo::ControlInfo(ControlId id, Value min, Value max)
>>> + : ident_(FindControlType(id)), min_(min), max_(max)
>>> +{
>>> +}
>>> +
>>> +/**
>>> + * \fn ControlInfo::id()
>>> + * \brief Return the ID of the control information descriptor
>>> + * \return the ControlId
>>> + */
>>> +
>>> +/**
>>> + * \fn ControlInfo::name()
>>> + * \brief Return the string name of the control information descriptor
>>> + * \return A string name for the Control
>>> + */
>>> +
>>> +/**
>>> + * \fn ControlInfo::type()
>>> + * \brief Return the ValueType of the control information descriptor
>>> + * \return the ControlId
>>> + */
>>> +
>>> +/**
>>> + * \fn ControlInfo::min()
>>> + * \brief Reports the minimum value of the control
>>> + * \return a Value with the minimum setting for the control
>>> + */
>>> +
>>> +/**
>>> + * \fn ControlInfo::max()
>>> + * \brief Reports the maximum value of the control
>>> + * \return a Value with the maximum setting for the control
>>> + */
>>> +
>>> +/**
>>> + * \brief Provide a string representation of the ControlInfo
>>> + */
>>> +std::string ControlInfo::toString() const
>>> +{
>>> + std::stringstream ss;
>>> +
>>> + ss << "Control: " << name()
>>> + << " : Min(" << min_ << ") Max(" << max_ << ")";
>>> +
>>> + return ss.str();
>>> +}
>>> +
>>> +/**
>>> + * \fn ControlInfo::operator==(const ControlInfo &rhs) const
>>> + * \brief Establish equivalence of ControlInfo. Only the IDs are considered.
>>> + */
>>> +
>>> +/**
>>> + * \fn ControlInfo::operator==(const ControlId rhs) const
>>> + * \brief Establish equivalence of ControlInfo, against a ControlID.
>>> + */
>>> +
>>> +/**
>>> + * \brief Provide a string stream representation of the ControlInfo \a info to
>>> + * the \a stream.
>>> + */
>>> +std::ostream &operator<<(std::ostream &stream, const ControlInfo &info)
>>> +{
>>> + return stream << info.toString();
>>> +}
>>> +
>>> +} /* namespace libcamera */
>>> diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
>>> index 8e68373118df..e2c07d79bfb5 100644
>>> --- a/src/libcamera/meson.build
>>> +++ b/src/libcamera/meson.build
>>> @@ -3,6 +3,7 @@ libcamera_sources = files([
>>> 'camera.cpp',
>>> 'camera_manager.cpp',
>>> 'camera_sensor.cpp',
>>> + 'controls.cpp',
>>> 'device_enumerator.cpp',
>>> 'device_enumerator_sysfs.cpp',
>>> 'event_dispatcher.cpp',
>
--
Regards
--
Kieran
More information about the libcamera-devel
mailing list