[media] uvcvideo: Set device_caps in VIDIOC_QUERYCAP
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Tue, 28 Aug 2012 21:38:58 +0000 (18:38 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 28 Nov 2012 12:28:13 +0000 (10:28 -0200)
Set the capabilities field to global capabilities, and the device_caps
field to the video node capabilities.
This issue was found by the v4l2-compliance tool.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Acked-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/usb/uvc/uvc_driver.c
drivers/media/usb/uvc/uvc_v4l2.c
drivers/media/usb/uvc/uvcvideo.h

index 5967081747ceb974814a5818ad8cccb43aacf64a..ae24f7d70b036e3315a5cfd614558995419f2f9c 100644 (file)
@@ -1741,6 +1741,11 @@ static int uvc_register_video(struct uvc_device *dev,
                return ret;
        }
 
+       if (stream->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
+               stream->chain->caps |= V4L2_CAP_VIDEO_CAPTURE;
+       else
+               stream->chain->caps |= V4L2_CAP_VIDEO_OUTPUT;
+
        atomic_inc(&dev->nstreams);
        return 0;
 }
index 3bd93736a82affc55385ac8b32d94a759111da3a..b1aa55fb89840e99ba079a80cf84a1ff08c0d4a4 100644 (file)
@@ -565,12 +565,14 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg)
                usb_make_path(stream->dev->udev,
                              cap->bus_info, sizeof(cap->bus_info));
                cap->version = LINUX_VERSION_CODE;
+               cap->capabilities = V4L2_CAP_DEVICE_CAPS | V4L2_CAP_STREAMING
+                                 | chain->caps;
                if (stream->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
-                       cap->capabilities = V4L2_CAP_VIDEO_CAPTURE
-                                         | V4L2_CAP_STREAMING;
+                       cap->device_caps = V4L2_CAP_VIDEO_CAPTURE
+                                        | V4L2_CAP_STREAMING;
                else
-                       cap->capabilities = V4L2_CAP_VIDEO_OUTPUT
-                                         | V4L2_CAP_STREAMING;
+                       cap->device_caps = V4L2_CAP_VIDEO_OUTPUT
+                                        | V4L2_CAP_STREAMING;
                break;
        }
 
index d83b6baf703a8bce448369311834d350e4593db0..a6c561f631a0ab772ed8e4932be8b7f6f8a6d304 100644 (file)
@@ -371,6 +371,8 @@ struct uvc_video_chain {
        struct uvc_entity *selector;            /* Selector unit */
 
        struct mutex ctrl_mutex;                /* Protects ctrl.info */
+
+       u32 caps;                               /* V4L2 chain-wide caps */
 };
 
 struct uvc_stats_frame {