summaryrefslogtreecommitdiff
path: root/src/libcamera/v4l2_device.cpp
diff options
context:
space:
mode:
authorDavid Plowman <david.plowman@raspberrypi.com>2022-01-05 15:55:38 +0000
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2022-01-08 15:48:59 +0200
commitd7bdfd311190c2ce5f1390501ce93b1d66be6d25 (patch)
tree042076da4f2d85a77c3a9dd59e3f219d488700ae /src/libcamera/v4l2_device.cpp
parentaa4533639971d772ce35cf5f39bee4c4a3628b7d (diff)
libcamera: v4l2_device: Add support for integer array controls
V4L2Device::setControl and V4L2Device::updateControl are both updated to handle ControlTypeInteger32 array controls. Signed-off-by: David Plowman <david.plowman@raspberrypi.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'src/libcamera/v4l2_device.cpp')
-rw-r--r--src/libcamera/v4l2_device.cpp33
1 files changed, 22 insertions, 11 deletions
diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp
index 62c91779..3fc8438f 100644
--- a/src/libcamera/v4l2_device.cpp
+++ b/src/libcamera/v4l2_device.cpp
@@ -297,6 +297,18 @@ int V4L2Device::setControls(ControlList *ctrls)
/* Set the v4l2_ext_control value for the write operation. */
ControlValue &value = ctrl->second;
switch (iter->first->type()) {
+ case ControlTypeInteger32: {
+ if (value.isArray()) {
+ Span<uint8_t> data = value.data();
+ v4l2Ctrl.p_u32 = reinterpret_cast<uint32_t *>(data.data());
+ v4l2Ctrl.size = data.size();
+ } else {
+ v4l2Ctrl.value = value.get<int32_t>();
+ }
+
+ break;
+ }
+
case ControlTypeInteger64:
v4l2Ctrl.value64 = value.get<int64_t>();
break;
@@ -671,6 +683,14 @@ void V4L2Device::updateControls(ControlList *ctrls,
const unsigned int id = v4l2Ctrl.id;
ControlValue value = ctrls->get(id);
+ if (value.isArray()) {
+ /*
+ * No action required, the VIDIOC_[GS]_EXT_CTRLS ioctl
+ * accessed the ControlValue storage directly for array
+ * controls.
+ */
+ continue;
+ }
const auto iter = controls_.find(id);
ASSERT(iter != controls_.end());
@@ -680,19 +700,10 @@ void V4L2Device::updateControls(ControlList *ctrls,
value.set<int64_t>(v4l2Ctrl.value64);
break;
- case ControlTypeInteger32:
- value.set<int32_t>(v4l2Ctrl.value);
- break;
-
- case ControlTypeByte:
- /*
- * No action required, the VIDIOC_[GS]_EXT_CTRLS ioctl
- * accessed the ControlValue storage directly.
- */
- break;
-
default:
/*
+ * Note: this catches the ControlTypeInteger32 case.
+ *
* \todo To be changed when support for string controls
* will be added.
*/