@@ -212,9 +212,9 @@ int CameraSensorLegacy::init()
*/
ControlList ctrls(subdev_->controls());
if (subdev_->controls().find(V4L2_CID_HFLIP) != subdev_->controls().end())
- ctrls.set(V4L2_CID_HFLIP, 0);
+ ctrls.set(V4L2_CID_HFLIP, false);
if (subdev_->controls().find(V4L2_CID_VFLIP) != subdev_->controls().end())
- ctrls.set(V4L2_CID_VFLIP, 0);
+ ctrls.set(V4L2_CID_VFLIP, false);
subdev_->setControls(&ctrls);
/* Enumerate, sort and cache media bus codes and sizes. */
@@ -762,10 +762,8 @@ int CameraSensorLegacy::setFormat(V4L2SubdeviceFormat *format, Transform transfo
if (supportFlips_) {
ControlList flipCtrls(subdev_->controls());
- flipCtrls.set(V4L2_CID_HFLIP,
- static_cast<int32_t>(!!(transform & Transform::HFlip)));
- flipCtrls.set(V4L2_CID_VFLIP,
- static_cast<int32_t>(!!(transform & Transform::VFlip)));
+ flipCtrls.set(V4L2_CID_HFLIP, !!(transform & Transform::HFlip));
+ flipCtrls.set(V4L2_CID_VFLIP, !!(transform & Transform::VFlip));
int ret = subdev_->setControls(&flipCtrls);
if (ret)
@@ -822,10 +822,8 @@ int CameraSensorRaw::setFormat(V4L2SubdeviceFormat *format, Transform transform)
if (supportFlips_) {
ControlList flipCtrls(subdev_->controls());
- flipCtrls.set(V4L2_CID_HFLIP,
- static_cast<int32_t>(!!(transform & Transform::HFlip)));
- flipCtrls.set(V4L2_CID_VFLIP,
- static_cast<int32_t>(!!(transform & Transform::VFlip)));
+ flipCtrls.set(V4L2_CID_HFLIP, !!(transform & Transform::HFlip));
+ flipCtrls.set(V4L2_CID_VFLIP, !!(transform & Transform::VFlip));
int ret = subdev_->setControls(&flipCtrls);
if (ret)
@@ -327,6 +327,17 @@ int V4L2Device::setControls(ControlList *ctrls, const V4L2Request *request)
/* Set the v4l2_ext_control value for the write operation. */
ControlValue &value = ctrl->second;
switch (iter->first->type()) {
+ case ControlTypeBool: {
+ if (value.isArray()) {
+ LOG(V4L2, Error)
+ << "Array of bool not supported for control " << utils::hex(id);
+ return -ENOTSUP;
+ }
+
+ v4l2Ctrl.value = value.get<bool>();
+ break;
+ }
+
case ControlTypeUnsigned16: {
if (value.isArray()) {
Span<uint8_t> data = value.data();
@@ -824,6 +835,9 @@ void V4L2Device::updateControls(ControlList *ctrls,
ASSERT(iter != controls_.end());
switch (iter->first->type()) {
+ case ControlTypeBool:
+ value.set<bool>(v4l2Ctrl.value);
+ break;
case ControlTypeByte:
value.set<uint8_t>(v4l2Ctrl.value);
break;
The `ControlInfo` generated by `V4L2Device::v4l2ControlInfo()` already uses the `bool` type, and there is no reason to disallow setting proper "bool" values. So adjust `updateControls()` and `setControls()` accordingly, and also do the necessary adjustments wrt. `V4L2_CID_{V,H}FLIP`. Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com> --- src/libcamera/sensor/camera_sensor_legacy.cpp | 10 ++++------ src/libcamera/sensor/camera_sensor_raw.cpp | 6 ++---- src/libcamera/v4l2_device.cpp | 14 ++++++++++++++ 3 files changed, 20 insertions(+), 10 deletions(-)