[libcamera-devel] [PATCH v2 20/32] libcamera: controls: Add support for byte controls

Laurent Pinchart laurent.pinchart at ideasonboard.com
Fri Mar 6 16:59:50 CET 2020


From: Jacopo Mondi <jacopo at jmondi.org>

Add support for byte values to the control framework and to the control
serializer.

Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
---
Changes since v1:

- Renamed Integer8 to Byte
- Turned the underlying type to uint8_t
---
 include/libcamera/controls.h         |  6 ++++++
 src/libcamera/control_serializer.cpp | 12 ++++++++++++
 src/libcamera/controls.cpp           | 14 +++++++++++---
 3 files changed, 29 insertions(+), 3 deletions(-)

diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h
index 0ad442b9e192..4767e2d3fc8c 100644
--- a/include/libcamera/controls.h
+++ b/include/libcamera/controls.h
@@ -22,6 +22,7 @@ class ControlValidator;
 enum ControlType {
 	ControlTypeNone,
 	ControlTypeBool,
+	ControlTypeByte,
 	ControlTypeInteger32,
 	ControlTypeInteger64,
 	ControlTypeFloat,
@@ -43,6 +44,11 @@ struct control_type<bool> {
 	static constexpr ControlType value = ControlTypeBool;
 };
 
+template<>
+struct control_type<uint8_t> {
+	static constexpr ControlType value = ControlTypeByte;
+};
+
 template<>
 struct control_type<int32_t> {
 	static constexpr ControlType value = ControlTypeInteger32;
diff --git a/src/libcamera/control_serializer.cpp b/src/libcamera/control_serializer.cpp
index 5feaaa965cc5..6c676811ebf3 100644
--- a/src/libcamera/control_serializer.cpp
+++ b/src/libcamera/control_serializer.cpp
@@ -153,6 +153,12 @@ void ControlSerializer::store(const ControlValue &value,
 		break;
 	}
 
+	case ControlTypeByte: {
+		uint8_t data = value.get<uint8_t>();
+		buffer.write(&data);
+		break;
+	}
+
 	case ControlTypeInteger32: {
 		int32_t data = value.get<int32_t>();
 		buffer.write(&data);
@@ -331,6 +337,12 @@ ControlValue ControlSerializer::load<ControlValue>(ControlType type,
 		return ControlValue(value);
 	}
 
+	case ControlTypeByte: {
+		uint8_t value;
+		b.read(&value);
+		return ControlValue(value);
+	}
+
 	case ControlTypeInteger32: {
 		int32_t value;
 		b.read(&value);
diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp
index d095efd45b91..0663a2201609 100644
--- a/src/libcamera/controls.cpp
+++ b/src/libcamera/controls.cpp
@@ -53,6 +53,7 @@ namespace {
 static constexpr size_t ControlValueSize[] = {
 	[ControlTypeNone]		= 0,
 	[ControlTypeBool]		= sizeof(bool),
+	[ControlTypeByte]		= sizeof(uint8_t),
 	[ControlTypeInteger32]		= sizeof(int32_t),
 	[ControlTypeInteger64]		= sizeof(int64_t),
 	[ControlTypeFloat]		= sizeof(float),
@@ -67,6 +68,8 @@ static constexpr size_t ControlValueSize[] = {
  * Invalid type, for empty values
  * \var ControlTypeBool
  * The control stores a boolean value
+ * \var ControlTypeByte
+ * The control stores a byte value as an unsigned 8-bit integer
  * \var ControlTypeInteger32
  * The control stores a 32-bit integer value
  * \var ControlTypeInteger64
@@ -198,6 +201,11 @@ std::string ControlValue::toString() const
 			str += *value ? "True" : "False";
 			break;
 		}
+		case ControlTypeByte: {
+			const uint8_t *value = reinterpret_cast<const uint8_t *>(data);
+			str += std::to_string(*value);
+			break;
+		}
 		case ControlTypeInteger32: {
 			const int32_t *value = reinterpret_cast<const int32_t *>(data);
 			str += std::to_string(*value);
@@ -382,9 +390,9 @@ void ControlValue::set(ControlType type, bool isArray, const void *data,
  * instead of Control.
  *
  * Controls of any type can be defined through template specialisation, but
- * libcamera only supports the bool, int32_t, int64_t and float types natively
- * (this includes types that are equivalent to the supported types, such as int
- * and long int).
+ * libcamera only supports the bool, uint8_t, int32_t, int64_t and float types
+ * natively (this includes types that are equivalent to the supported types,
+ * such as int and long int).
  *
  * Controls IDs shall be unique. While nothing prevents multiple instances of
  * the Control class to be created with the same ID for the same object, doing
-- 
Regards,

Laurent Pinchart



More information about the libcamera-devel mailing list