summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJacopo Mondi <jacopo.mondi@ideasonboard.com>2023-12-21 11:12:33 +0100
committerJacopo Mondi <jacopo.mondi@ideasonboard.com>2023-12-29 11:33:29 +0100
commita4e6a5085b465216546b802e6bb9d55ecf278c63 (patch)
treed884cbe4c584d4f09626c3b0ba4359eefc333216 /src
parent89289ceeb487fa305025802277222a0f21e9307e (diff)
libcamera: Add 'required' property to controls
Add to the ControlId class a 'required' boolean flag that determine if the control (or property) is mandatory to be supported by a Camera in order to comply with the libcamera API specification. Add support for a 'required' field to the controls and properties yaml file definition and control generation scripts. Also plumb support for the flag in the control serializer component to allow pass the information across IPC borders. Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
Diffstat (limited to 'src')
-rw-r--r--src/libcamera/control_serializer.cpp4
-rw-r--r--src/libcamera/controls.cpp24
-rw-r--r--src/libcamera/ipa_controls.cpp2
-rw-r--r--src/libcamera/v4l2_device.cpp2
4 files changed, 24 insertions, 8 deletions
diff --git a/src/libcamera/control_serializer.cpp b/src/libcamera/control_serializer.cpp
index 0cf719bd..b9ed1eea 100644
--- a/src/libcamera/control_serializer.cpp
+++ b/src/libcamera/control_serializer.cpp
@@ -281,6 +281,7 @@ int ControlSerializer::serialize(const ControlInfoMap &infoMap,
entry.id = id->id();
entry.type = id->type();
entry.offset = values.offset();
+ entry.required = id->required();
entries.write(&entry);
store(info, values);
@@ -498,7 +499,8 @@ ControlInfoMap ControlSerializer::deserialize<ControlInfoMap>(ByteStreamBuffer &
* debugging purpose.
*/
controlIds_.emplace_back(std::make_unique<ControlId>(entry->id,
- "", type));
+ "", type,
+ entry->required));
(*localIdMap)[entry->id] = controlIds_.back().get();
}
diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp
index b808116c..25f30953 100644
--- a/src/libcamera/controls.cpp
+++ b/src/libcamera/controls.cpp
@@ -378,18 +378,19 @@ void ControlValue::reserve(ControlType type, bool isArray, std::size_t numElemen
* \class ControlId
* \brief Control static metadata
*
- * The ControlId class stores a control ID, name and data type. It provides
- * unique identification of a control, but without support for compile-time
- * type deduction that the derived template Control class supports. See the
- * Control class for more information.
+ * The ControlId class stores a control ID, name, data type and a boolean
+ * 'required' flag. It provides unique identification of a control, but without
+ * support for compile-time type deduction that the derived template Control
+ * class supports. See the Control class for more information.
*/
/**
- * \fn ControlId::ControlId(unsigned int id, const std::string &name, ControlType type)
+ * \fn ControlId::ControlId(unsigned int id, const std::string &name, ControlType type, bool required)
* \brief Construct a ControlId instance
* \param[in] id The control numerical ID
* \param[in] name The control name
* \param[in] type The control data type
+ * \param[in] required Boolean flag that determine if the control is required
*/
/**
@@ -411,6 +412,16 @@ void ControlValue::reserve(ControlType type, bool isArray, std::size_t numElemen
*/
/**
+ * \fn bool ControlId::required() const
+ * \brief Determine if the control is required or not
+ *
+ * A control is 'required' if it is mandatory for a Camera to support it to
+ * comply with the libcamera API specification.
+ *
+ * \return True if the control is required, false otherwise
+ */
+
+/**
* \fn bool operator==(unsigned int lhs, const ControlId &rhs)
* \brief Compare a ControlId with a control numerical ID
* \param[in] lhs Left-hand side numerical ID
@@ -456,10 +467,11 @@ void ControlValue::reserve(ControlType type, bool isArray, std::size_t numElemen
*/
/**
- * \fn Control::Control(unsigned int id, const char *name)
+ * \fn Control::Control(unsigned int id, const char *name, bool required)
* \brief Construct a Control instance
* \param[in] id The control numerical ID
* \param[in] name The control name
+ * \param[in] required Boolean flag that determine if a control is required
*
* The control data type is automatically deduced from the template type T.
*/
diff --git a/src/libcamera/ipa_controls.cpp b/src/libcamera/ipa_controls.cpp
index 870a443b..2376cbd9 100644
--- a/src/libcamera/ipa_controls.cpp
+++ b/src/libcamera/ipa_controls.cpp
@@ -220,6 +220,8 @@ static_assert(sizeof(ipa_control_value_entry) == 16,
* \var ipa_control_info_entry::offset
* The offset in bytes from the beginning of the data section to the control
* info data (shall be a multiple of 8 bytes)
+ * \var ipa_control_info_entry::required
+ * Boolean flag that determines if the controls is required or not
* \var ipa_control_info_entry::padding
* Padding bytes (shall be set to 0)
*/
diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp
index 24d208ef..b055d14c 100644
--- a/src/libcamera/v4l2_device.cpp
+++ b/src/libcamera/v4l2_device.cpp
@@ -522,7 +522,7 @@ std::unique_ptr<ControlId> V4L2Device::v4l2ControlId(const v4l2_query_ext_ctrl &
const std::string name(static_cast<const char *>(ctrl.name), len);
const ControlType type = v4l2CtrlType(ctrl.type);
- return std::make_unique<ControlId>(ctrl.id, name, type);
+ return std::make_unique<ControlId>(ctrl.id, name, type, false);
}
/**