summaryrefslogtreecommitdiff
path: root/src/libcamera/control_serializer.cpp
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2020-02-28 17:01:43 +0200
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2020-03-23 16:45:16 +0200
commit8daf20485b90af2065e3db0e3fd0cd5b72fd7ac4 (patch)
tree7d01521858283e8da927f2b429e3ea5b7d4f6bb9 /src/libcamera/control_serializer.cpp
parent9ab024f7c27d9b6b3ab433502eab02d4a29a3da4 (diff)
libcamera: controls: Add zero-copy set API for ControlValue
Extend the ControlValue class with a reserve() function to set the value without actually copying data, and a non-const data() function that allows writing data directly to the ControlValue storage. This allows allocating memory directly in ControlValue, potentially removing a data copy. Note that this change was implemented before ByteStreamBuffer gained the zero-copy read() variant, and doesn't actually save a copy in the control serializer. It however still simplifies ControlSerializer::loadControlValue(). Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Diffstat (limited to 'src/libcamera/control_serializer.cpp')
-rw-r--r--src/libcamera/control_serializer.cpp61
1 files changed, 4 insertions, 57 deletions
diff --git a/src/libcamera/control_serializer.cpp b/src/libcamera/control_serializer.cpp
index 808419f2..fcff5e56 100644
--- a/src/libcamera/control_serializer.cpp
+++ b/src/libcamera/control_serializer.cpp
@@ -295,70 +295,17 @@ int ControlSerializer::serialize(const ControlList &list,
return 0;
}
-template<typename T>
-ControlValue ControlSerializer::loadControlValue(ByteStreamBuffer &buffer,
- bool isArray,
- unsigned int count)
-{
- ControlValue value;
-
- const T *data = buffer.read<T>(count);
- if (!data)
- return value;
-
- if (isArray)
- value.set(Span<const T>{ data, count });
- else
- value.set(*data);
-
- return value;
-}
-
-template<>
-ControlValue ControlSerializer::loadControlValue<std::string>(ByteStreamBuffer &buffer,
- bool isArray,
- unsigned int count)
-{
- ControlValue value;
-
- const char *data = buffer.read<char>(count);
- if (!data)
- return value;
-
- value.set(std::string{ data, count });
-
- return value;
-}
-
ControlValue ControlSerializer::loadControlValue(ControlType type,
ByteStreamBuffer &buffer,
bool isArray,
unsigned int count)
{
- switch (type) {
- case ControlTypeBool:
- return loadControlValue<bool>(buffer, isArray, count);
-
- case ControlTypeByte:
- return loadControlValue<uint8_t>(buffer, isArray, count);
-
- case ControlTypeInteger32:
- return loadControlValue<int32_t>(buffer, isArray, count);
-
- case ControlTypeInteger64:
- return loadControlValue<int64_t>(buffer, isArray, count);
-
- case ControlTypeFloat:
- return loadControlValue<float>(buffer, isArray, count);
-
- case ControlTypeString:
- return loadControlValue<std::string>(buffer, isArray, count);
+ ControlValue value;
- case ControlTypeNone:
- return ControlValue();
- }
+ value.reserve(type, isArray, count);
+ buffer.read(value.data());
- return ControlValue();
+ return value;
}
ControlInfo ControlSerializer::loadControlInfo(ControlType type,