summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacopo Mondi <jacopo@jmondi.org>2019-06-26 12:05:02 +0200
committerJacopo Mondi <jacopo@jmondi.org>2019-06-27 10:16:10 +0200
commit6948ec44c7f77fbd34283bfef7a661bd0d3c991d (patch)
tree6c92b3dd9002db5b86e6d34dc6097617c8289c5b
parentcaf25dc5cfd11b965316f02610d49ae3d886716b (diff)
libcamera: v4l2_device: Fix control enumeration bug
When enumerating the available V4L2 controls at video device open time set the V4L2_CTRL_FLAG_NEXT_CTRL flag if an unsupported control type is encountered to prevent infinite loops. While at it, downgrade the message reporting the unsupported control type to Debug, as it is not an error worth being reported unconditionally. Fixes: 030ce6491ed3 ("libcamera: v4l2_device: List valid controls at open") Signed-off-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r--src/libcamera/v4l2_device.cpp14
1 files changed, 7 insertions, 7 deletions
diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp
index 84758a81..f1821a7b 100644
--- a/src/libcamera/v4l2_device.cpp
+++ b/src/libcamera/v4l2_device.cpp
@@ -321,13 +321,14 @@ void V4L2Device::listControls()
struct v4l2_query_ext_ctrl ctrl = {};
/* \todo Add support for menu and compound controls. */
- ctrl.id = V4L2_CTRL_FLAG_NEXT_CTRL;
- while (ioctl(VIDIOC_QUERY_EXT_CTRL, &ctrl) == 0) {
+ while (1) {
+ ctrl.id |= V4L2_CTRL_FLAG_NEXT_CTRL;
+ if (ioctl(VIDIOC_QUERY_EXT_CTRL, &ctrl))
+ break;
+
if (ctrl.type == V4L2_CTRL_TYPE_CTRL_CLASS ||
- ctrl.flags & V4L2_CTRL_FLAG_DISABLED) {
- ctrl.id |= V4L2_CTRL_FLAG_NEXT_CTRL;
+ ctrl.flags & V4L2_CTRL_FLAG_DISABLED)
continue;
- }
V4L2ControlInfo info(ctrl);
switch (info.type()) {
@@ -341,13 +342,12 @@ void V4L2Device::listControls()
break;
/* \todo Support compound controls. */
default:
- LOG(V4L2, Error) << "Control type '" << info.type()
+ LOG(V4L2, Debug) << "Control type '" << info.type()
<< "' not supported";
continue;
}
controls_.emplace(ctrl.id, info);
- ctrl.id |= V4L2_CTRL_FLAG_NEXT_CTRL;
}
}