[{"id":38409,"web_url":"https://patchwork.libcamera.org/comment/38409/","msgid":"<acQRccb-1WFVyDCd@zed>","date":"2026-03-25T16:50:53","subject":"Re: [PATCH v1 3/4] libcamera: v4l2_device: Use `bool` for boolean\n\tcontrols","submitter":{"id":143,"url":"https://patchwork.libcamera.org/api/people/143/","name":"Jacopo Mondi","email":"jacopo.mondi@ideasonboard.com"},"content":"Hi Barnabás\n\nOn Wed, Mar 25, 2026 at 10:26:58AM +0100, Barnabás Pőcze wrote:\n> The `ControlInfo` generated by `V4L2Device::v4l2ControlInfo()` already\n> uses the `bool` type, and there is no reason to disallow setting proper\n> \"bool\" values.\n>\n> So adjust `updateControls()` and `setControls()` accordingly, and also\n> do the necessary adjustments wrt. `V4L2_CID_{V,H}FLIP`.\n>\n> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n> ---\n>  src/libcamera/sensor/camera_sensor_legacy.cpp | 10 ++++------\n>  src/libcamera/sensor/camera_sensor_raw.cpp    |  6 ++----\n>  src/libcamera/v4l2_device.cpp                 | 14 ++++++++++++++\n>  3 files changed, 20 insertions(+), 10 deletions(-)\n>\n> diff --git a/src/libcamera/sensor/camera_sensor_legacy.cpp b/src/libcamera/sensor/camera_sensor_legacy.cpp\n> index 6a683821f..99ce7ffb0 100644\n> --- a/src/libcamera/sensor/camera_sensor_legacy.cpp\n> +++ b/src/libcamera/sensor/camera_sensor_legacy.cpp\n> @@ -212,9 +212,9 @@ int CameraSensorLegacy::init()\n>  \t */\n>  \tControlList ctrls(subdev_->controls());\n>  \tif (subdev_->controls().find(V4L2_CID_HFLIP) != subdev_->controls().end())\n> -\t\tctrls.set(V4L2_CID_HFLIP, 0);\n> +\t\tctrls.set(V4L2_CID_HFLIP, false);\n>  \tif (subdev_->controls().find(V4L2_CID_VFLIP) != subdev_->controls().end())\n> -\t\tctrls.set(V4L2_CID_VFLIP, 0);\n> +\t\tctrls.set(V4L2_CID_VFLIP, false);\n>  \tsubdev_->setControls(&ctrls);\n>\n>  \t/* Enumerate, sort and cache media bus codes and sizes. */\n> @@ -762,10 +762,8 @@ int CameraSensorLegacy::setFormat(V4L2SubdeviceFormat *format, Transform transfo\n>  \tif (supportFlips_) {\n>  \t\tControlList flipCtrls(subdev_->controls());\n>\n> -\t\tflipCtrls.set(V4L2_CID_HFLIP,\n> -\t\t\t      static_cast<int32_t>(!!(transform & Transform::HFlip)));\n> -\t\tflipCtrls.set(V4L2_CID_VFLIP,\n> -\t\t\t      static_cast<int32_t>(!!(transform & Transform::VFlip)));\n> +\t\tflipCtrls.set(V4L2_CID_HFLIP, !!(transform & Transform::HFlip));\n> +\t\tflipCtrls.set(V4L2_CID_VFLIP, !!(transform & Transform::VFlip));\n>\n>  \t\tint ret = subdev_->setControls(&flipCtrls);\n>  \t\tif (ret)\n> diff --git a/src/libcamera/sensor/camera_sensor_raw.cpp b/src/libcamera/sensor/camera_sensor_raw.cpp\n> index 10eba0331..882c1cc1a 100644\n> --- a/src/libcamera/sensor/camera_sensor_raw.cpp\n> +++ b/src/libcamera/sensor/camera_sensor_raw.cpp\n> @@ -822,10 +822,8 @@ int CameraSensorRaw::setFormat(V4L2SubdeviceFormat *format, Transform transform)\n>  \tif (supportFlips_) {\n>  \t\tControlList flipCtrls(subdev_->controls());\n>\n> -\t\tflipCtrls.set(V4L2_CID_HFLIP,\n> -\t\t\t      static_cast<int32_t>(!!(transform & Transform::HFlip)));\n> -\t\tflipCtrls.set(V4L2_CID_VFLIP,\n> -\t\t\t      static_cast<int32_t>(!!(transform & Transform::VFlip)));\n> +\t\tflipCtrls.set(V4L2_CID_HFLIP, !!(transform & Transform::HFlip));\n> +\t\tflipCtrls.set(V4L2_CID_VFLIP, !!(transform & Transform::VFlip));\n>\n>  \t\tint ret = subdev_->setControls(&flipCtrls);\n>  \t\tif (ret)\n\nAgain, I'm not sure if the below changes are required to fix these as\nthe control type of V4L2_CID_VFLIP and V4L2_CID_HFLIP is V4L2_CTRL_TYPE_BOOLEAN\nalready\n\n> diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp\n> index db1eb70e4..426664b83 100644\n> --- a/src/libcamera/v4l2_device.cpp\n> +++ b/src/libcamera/v4l2_device.cpp\n> @@ -327,6 +327,17 @@ int V4L2Device::setControls(ControlList *ctrls, const V4L2Request *request)\n>  \t\t/* Set the v4l2_ext_control value for the write operation. */\n>  \t\tControlValue &value = ctrl->second;\n>  \t\tswitch (iter->first->type()) {\n> +\t\tcase ControlTypeBool: {\n> +\t\t\tif (value.isArray()) {\n> +\t\t\t\tLOG(V4L2, Error)\n> +\t\t\t\t\t<< \"Array of bool not supported for control \" << utils::hex(id);\n> +\t\t\t\treturn -ENOTSUP;\n> +\t\t\t}\n> +\n> +\t\t\tv4l2Ctrl.value = value.get<bool>();\n> +\t\t\tbreak;\n> +\t\t}\n> +\n>  \t\tcase ControlTypeUnsigned16: {\n>  \t\t\tif (value.isArray()) {\n>  \t\t\t\tSpan<uint8_t> data = value.data();\n> @@ -824,6 +835,9 @@ void V4L2Device::updateControls(ControlList *ctrls,\n>  \t\tASSERT(iter != controls_.end());\n>\n>  \t\tswitch (iter->first->type()) {\n> +\t\tcase ControlTypeBool:\n> +\t\t\tvalue.set<bool>(v4l2Ctrl.value);\n> +\t\t\tbreak;\n\nbut this is certainly more correct\n\nReviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n\nThanks\n  j\n\n>  \t\tcase ControlTypeByte:\n>  \t\t\tvalue.set<uint8_t>(v4l2Ctrl.value);\n>  \t\t\tbreak;\n> --\n> 2.53.0\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 3C0D5BE086\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 25 Mar 2026 16:50:58 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 64F9A62842;\n\tWed, 25 Mar 2026 17:50:57 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 42A786274D\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 25 Mar 2026 17:50:56 +0100 (CET)","from ideasonboard.com (net-93-65-100-155.cust.vodafonedsl.it\n\t[93.65.100.155])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 2923410BE;\n\tWed, 25 Mar 2026 17:49:38 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"gMrHAez8\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1774457378;\n\tbh=q2HfODLKk9F0o+UTQaTbPzqPET1UwimveqAwIwm8Xns=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=gMrHAez8S+sziGph1D/aAPhMFUAW9m3ndhUtRqu6nu5wMtDvrVK9TBiElGiKQ91wm\n\tYgFfmm3YoKI/YLrWxYDqeyTjz/YXoWiACFun5xslZ66hH1Oj4UXC1oBSr50ZoJS3Ko\n\tjG8LDJWuixoLNa1LMzdBnzV2Nd9M1hgoSNq2N6PA=","Date":"Wed, 25 Mar 2026 17:50:53 +0100","From":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH v1 3/4] libcamera: v4l2_device: Use `bool` for boolean\n\tcontrols","Message-ID":"<acQRccb-1WFVyDCd@zed>","References":"<20260325092659.79453-1-barnabas.pocze@ideasonboard.com>\n\t<20260325092659.79453-3-barnabas.pocze@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20260325092659.79453-3-barnabas.pocze@ideasonboard.com>","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":38427,"web_url":"https://patchwork.libcamera.org/comment/38427/","msgid":"<c1123c87-0586-49d5-8320-2f1669f63cd8@ideasonboard.com>","date":"2026-03-27T07:47:26","subject":"Re: [PATCH v1 3/4] libcamera: v4l2_device: Use `bool` for boolean\n\tcontrols","submitter":{"id":216,"url":"https://patchwork.libcamera.org/api/people/216/","name":"Barnabás Pőcze","email":"barnabas.pocze@ideasonboard.com"},"content":"2026. 03. 25. 17:50 keltezéssel, Jacopo Mondi írta:\n> Hi Barnabás\n> \n> On Wed, Mar 25, 2026 at 10:26:58AM +0100, Barnabás Pőcze wrote:\n>> The `ControlInfo` generated by `V4L2Device::v4l2ControlInfo()` already\n>> uses the `bool` type, and there is no reason to disallow setting proper\n>> \"bool\" values.\n>>\n>> So adjust `updateControls()` and `setControls()` accordingly, and also\n>> do the necessary adjustments wrt. `V4L2_CID_{V,H}FLIP`.\n>>\n>> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n>> ---\n>>   src/libcamera/sensor/camera_sensor_legacy.cpp | 10 ++++------\n>>   src/libcamera/sensor/camera_sensor_raw.cpp    |  6 ++----\n>>   src/libcamera/v4l2_device.cpp                 | 14 ++++++++++++++\n>>   3 files changed, 20 insertions(+), 10 deletions(-)\n>>\n>> diff --git a/src/libcamera/sensor/camera_sensor_legacy.cpp b/src/libcamera/sensor/camera_sensor_legacy.cpp\n>> index 6a683821f..99ce7ffb0 100644\n>> --- a/src/libcamera/sensor/camera_sensor_legacy.cpp\n>> +++ b/src/libcamera/sensor/camera_sensor_legacy.cpp\n>> @@ -212,9 +212,9 @@ int CameraSensorLegacy::init()\n>>   \t */\n>>   \tControlList ctrls(subdev_->controls());\n>>   \tif (subdev_->controls().find(V4L2_CID_HFLIP) != subdev_->controls().end())\n>> -\t\tctrls.set(V4L2_CID_HFLIP, 0);\n>> +\t\tctrls.set(V4L2_CID_HFLIP, false);\n>>   \tif (subdev_->controls().find(V4L2_CID_VFLIP) != subdev_->controls().end())\n>> -\t\tctrls.set(V4L2_CID_VFLIP, 0);\n>> +\t\tctrls.set(V4L2_CID_VFLIP, false);\n>>   \tsubdev_->setControls(&ctrls);\n>>\n>>   \t/* Enumerate, sort and cache media bus codes and sizes. */\n>> @@ -762,10 +762,8 @@ int CameraSensorLegacy::setFormat(V4L2SubdeviceFormat *format, Transform transfo\n>>   \tif (supportFlips_) {\n>>   \t\tControlList flipCtrls(subdev_->controls());\n>>\n>> -\t\tflipCtrls.set(V4L2_CID_HFLIP,\n>> -\t\t\t      static_cast<int32_t>(!!(transform & Transform::HFlip)));\n>> -\t\tflipCtrls.set(V4L2_CID_VFLIP,\n>> -\t\t\t      static_cast<int32_t>(!!(transform & Transform::VFlip)));\n>> +\t\tflipCtrls.set(V4L2_CID_HFLIP, !!(transform & Transform::HFlip));\n>> +\t\tflipCtrls.set(V4L2_CID_VFLIP, !!(transform & Transform::VFlip));\n>>\n>>   \t\tint ret = subdev_->setControls(&flipCtrls);\n>>   \t\tif (ret)\n>> diff --git a/src/libcamera/sensor/camera_sensor_raw.cpp b/src/libcamera/sensor/camera_sensor_raw.cpp\n>> index 10eba0331..882c1cc1a 100644\n>> --- a/src/libcamera/sensor/camera_sensor_raw.cpp\n>> +++ b/src/libcamera/sensor/camera_sensor_raw.cpp\n>> @@ -822,10 +822,8 @@ int CameraSensorRaw::setFormat(V4L2SubdeviceFormat *format, Transform transform)\n>>   \tif (supportFlips_) {\n>>   \t\tControlList flipCtrls(subdev_->controls());\n>>\n>> -\t\tflipCtrls.set(V4L2_CID_HFLIP,\n>> -\t\t\t      static_cast<int32_t>(!!(transform & Transform::HFlip)));\n>> -\t\tflipCtrls.set(V4L2_CID_VFLIP,\n>> -\t\t\t      static_cast<int32_t>(!!(transform & Transform::VFlip)));\n>> +\t\tflipCtrls.set(V4L2_CID_HFLIP, !!(transform & Transform::HFlip));\n>> +\t\tflipCtrls.set(V4L2_CID_VFLIP, !!(transform & Transform::VFlip));\n>>\n>>   \t\tint ret = subdev_->setControls(&flipCtrls);\n>>   \t\tif (ret)\n> \n> Again, I'm not sure if the below changes are required to fix these as\n> the control type of V4L2_CID_VFLIP and V4L2_CID_HFLIP is V4L2_CTRL_TYPE_BOOLEAN\n> already\n\nThat's true, but in libcamera bool controls are handled as V4L2_CTRL_TYPE_INTEGER,\nand v4l2 controls don't have `Control<...>` objects, so the types are\nentirely deduced from the argument used in `ControlList::set()`, so they\nmust be adjusted from int to bool.\n\n\n> \n>> diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp\n>> index db1eb70e4..426664b83 100644\n>> --- a/src/libcamera/v4l2_device.cpp\n>> +++ b/src/libcamera/v4l2_device.cpp\n>> @@ -327,6 +327,17 @@ int V4L2Device::setControls(ControlList *ctrls, const V4L2Request *request)\n>>   \t\t/* Set the v4l2_ext_control value for the write operation. */\n>>   \t\tControlValue &value = ctrl->second;\n>>   \t\tswitch (iter->first->type()) {\n>> +\t\tcase ControlTypeBool: {\n>> +\t\t\tif (value.isArray()) {\n>> +\t\t\t\tLOG(V4L2, Error)\n>> +\t\t\t\t\t<< \"Array of bool not supported for control \" << utils::hex(id);\n>> +\t\t\t\treturn -ENOTSUP;\n>> +\t\t\t}\n>> +\n>> +\t\t\tv4l2Ctrl.value = value.get<bool>();\n>> +\t\t\tbreak;\n>> +\t\t}\n>> +\n>>   \t\tcase ControlTypeUnsigned16: {\n>>   \t\t\tif (value.isArray()) {\n>>   \t\t\t\tSpan<uint8_t> data = value.data();\n>> @@ -824,6 +835,9 @@ void V4L2Device::updateControls(ControlList *ctrls,\n>>   \t\tASSERT(iter != controls_.end());\n>>\n>>   \t\tswitch (iter->first->type()) {\n>> +\t\tcase ControlTypeBool:\n>> +\t\t\tvalue.set<bool>(v4l2Ctrl.value);\n>> +\t\t\tbreak;\n> \n> but this is certainly more correct\n> \n> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n> \n> Thanks\n>    j\n> \n>>   \t\tcase ControlTypeByte:\n>>   \t\t\tvalue.set<uint8_t>(v4l2Ctrl.value);\n>>   \t\t\tbreak;\n>> --\n>> 2.53.0\n>>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 60178BDCBD\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 27 Mar 2026 07:47:31 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 123CF62C57;\n\tFri, 27 Mar 2026 08:47:31 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 4C29D6274D\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 27 Mar 2026 08:47:29 +0100 (CET)","from [192.168.33.24] (185.221.143.129.nat.pool.zt.hu\n\t[185.221.143.129])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 18CA61783;\n\tFri, 27 Mar 2026 08:46:10 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"iMQUVQWw\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1774597570;\n\tbh=fYnmrp0pctgoMyLMNUy0w0bcxdWtQKKniAdUB9u2XMg=;\n\th=Date:Subject:To:Cc:References:From:In-Reply-To:From;\n\tb=iMQUVQWw4t3WcxSJ6gA1FLZ9vlPWEJbbsPuqfFyaPdt3wzd38r34LPU5ID0GiIXGv\n\tBcRZTykDAG8HpBgmQCrGhLggAONAeWkbZFY/oqv8dZVaetS//EnoC9cxIxagFBPKZt\n\ti/RTifp4BGEX8gzW0HhlLrDeC2OJZ1ZoO1rcAkg4=","Message-ID":"<c1123c87-0586-49d5-8320-2f1669f63cd8@ideasonboard.com>","Date":"Fri, 27 Mar 2026 08:47:26 +0100","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH v1 3/4] libcamera: v4l2_device: Use `bool` for boolean\n\tcontrols","To":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","References":"<20260325092659.79453-1-barnabas.pocze@ideasonboard.com>\n\t<20260325092659.79453-3-barnabas.pocze@ideasonboard.com>\n\t<acQRccb-1WFVyDCd@zed>","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Content-Language":"en-US, hu-HU","In-Reply-To":"<acQRccb-1WFVyDCd@zed>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"8bit","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]