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>
This commit is contained in:
David Plowman 2022-01-05 15:55:38 +00:00 committed by Laurent Pinchart
parent aa45336399
commit d7bdfd3111

View file

@ -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.
*/