[libcamera-devel] [RFC PATCH v2 3/9] libcamera: controls: Introduce Control structures

Laurent Pinchart laurent.pinchart at ideasonboard.com
Sun Jun 23 23:54:09 CEST 2019


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.

And the second one should return max_.

> > +
> > +	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 ? :-)

> >      '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.
> 
> > +
> > +#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.
> 
> > +
> > +/**
> > + * \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.
> 
> > + */
> > +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,

Laurent Pinchart


More information about the libcamera-devel mailing list