diff options
author | Jacopo Mondi <jacopo@jmondi.org> | 2019-06-26 12:05:02 +0200 |
---|---|---|
committer | Jacopo Mondi <jacopo@jmondi.org> | 2019-06-27 10:16:10 +0200 |
commit | 6948ec44c7f77fbd34283bfef7a661bd0d3c991d (patch) | |
tree | 6c92b3dd9002db5b86e6d34dc6097617c8289c5b | |
parent | caf25dc5cfd11b965316f02610d49ae3d886716b (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.cpp | 14 |
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; } } |