[media] V4L2: Add per-device-node capabilities
authorHans Verkuil <hans.verkuil@cisco.com>
Wed, 11 Jan 2012 09:45:05 +0000 (06:45 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 23 Jan 2012 18:34:27 +0000 (16:34 -0200)
If V4L2_CAP_DEVICE_CAPS is set, then the new device_caps field is filled with
the capabilities of the opened device node.

The capabilities field traditionally contains the capabilities of the physical
device, being a superset of all capabilities available at the several device
nodes. E.g., if you open /dev/video0, then if it contains VBI caps then that means
that there is a corresponding vbi node as well. And the capabilities field of
both the video and vbi nodes should contain identical caps.

However, it would be very useful to also have a capabilities field that contains
just the caps for the currently open device, hence the new CAP bit and field.

Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Documentation/DocBook/media/v4l/compat.xml
Documentation/DocBook/media/v4l/v4l2.xml
Documentation/DocBook/media/v4l/vidioc-querycap.xml
drivers/media/video/cx231xx/cx231xx-417.c
drivers/media/video/pvrusb2/pvrusb2-v4l2.c
drivers/media/video/v4l2-ioctl.c
include/linux/videodev2.h

index c736380..c93298f 100644 (file)
@@ -2393,6 +2393,10 @@ details.</para>
            to the <link linkend="control">User controls class</link>.
          </para>
         </listitem>
+        <listitem>
+         <para>Added the device_caps field to struct v4l2_capabilities and added the new
+         V4L2_CAP_DEVICE_CAPS capability.</para>
+        </listitem>
       </orderedlist>
     </section>
 
index e97c512..dce3fef 100644 (file)
@@ -128,6 +128,13 @@ structs, ioctls) must be noted in more detail in the history chapter
 applications. -->
 
       <revision>
+       <revnumber>3.3</revnumber>
+       <date>2012-01-11</date>
+       <authorinitials>hv</authorinitials>
+       <revremark>Added device_caps field to struct v4l2_capabilities.</revremark>
+      </revision>
+
+      <revision>
        <revnumber>3.2</revnumber>
        <date>2011-08-26</date>
        <authorinitials>hv</authorinitials>
@@ -417,7 +424,7 @@ and discussions on the V4L mailing list.</revremark>
 </partinfo>
 
 <title>Video for Linux Two API Specification</title>
- <subtitle>Revision 3.2</subtitle>
+ <subtitle>Revision 3.3</subtitle>
 
   <chapter id="common">
     &sub-common;
index e3664d6..4643505 100644 (file)
@@ -124,12 +124,35 @@ printf ("Version: %u.%u.%u\n",
          <row>
            <entry>__u32</entry>
            <entry><structfield>capabilities</structfield></entry>
-           <entry>Device capabilities, see <xref
-               linkend="device-capabilities" />.</entry>
+           <entry>Available capabilities of the physical device as a whole, see <xref
+               linkend="device-capabilities" />. The same physical device can export
+               multiple devices in /dev (e.g. /dev/videoX, /dev/vbiY and /dev/radioZ).
+               The <structfield>capabilities</structfield> field should contain a union
+               of all capabilities available around the several V4L2 devices exported
+               to userspace.
+               For all those devices the <structfield>capabilities</structfield> field
+               returns the same set of capabilities. This allows applications to open
+               just one of the devices (typically the video device) and discover whether
+               video, vbi and/or radio are also supported.
+           </entry>
          </row>
          <row>
            <entry>__u32</entry>
-           <entry><structfield>reserved</structfield>[4]</entry>
+           <entry><structfield>device_caps</structfield></entry>
+           <entry>Device capabilities of the opened device, see <xref
+               linkend="device-capabilities" />. Should contain the available capabilities
+               of that specific device node. So, for example, <structfield>device_caps</structfield>
+               of a radio device will only contain radio related capabilities and
+               no video or vbi capabilities. This field is only set if the <structfield>capabilities</structfield>
+               field contains the <constant>V4L2_CAP_DEVICE_CAPS</constant> capability.
+               Only the <structfield>capabilities</structfield> field can have the
+               <constant>V4L2_CAP_DEVICE_CAPS</constant> capability, <structfield>device_caps</structfield>
+               will never set <constant>V4L2_CAP_DEVICE_CAPS</constant>.
+           </entry>
+         </row>
+         <row>
+           <entry>__u32</entry>
+           <entry><structfield>reserved</structfield>[3]</entry>
            <entry>Reserved for future extensions. Drivers must set
 this array to zero.</entry>
          </row>
@@ -276,6 +299,13 @@ linkend="async">asynchronous</link> I/O methods.</entry>
            <entry>The device supports the <link
 linkend="mmap">streaming</link> I/O method.</entry>
          </row>
+         <row>
+           <entry><constant>V4L2_CAP_DEVICE_CAPS</constant></entry>
+           <entry>0x80000000</entry>
+           <entry>The driver fills the <structfield>device_caps</structfield>
+           field. This capability can only appear in the <structfield>capabilities</structfield>
+           field and never in the <structfield>device_caps</structfield> field.</entry>
+         </row>
        </tbody>
       </tgroup>
     </table>
index f8f0e59..d4327da 100644 (file)
@@ -1686,7 +1686,6 @@ static struct v4l2_capability pvr_capability = {
        .capabilities   = (V4L2_CAP_VIDEO_CAPTURE |
                           V4L2_CAP_TUNER | V4L2_CAP_AUDIO | V4L2_CAP_RADIO |
                         V4L2_CAP_STREAMING | V4L2_CAP_READWRITE),
-       .reserved       = {0, 0, 0, 0}
 };
 static int vidioc_querycap(struct file *file, void  *priv,
                                struct v4l2_capability *cap)
index 6d66617..e1111d9 100644 (file)
@@ -96,7 +96,6 @@ static struct v4l2_capability pvr_capability ={
        .capabilities   = (V4L2_CAP_VIDEO_CAPTURE |
                           V4L2_CAP_TUNER | V4L2_CAP_AUDIO | V4L2_CAP_RADIO |
                           V4L2_CAP_READWRITE),
-       .reserved       = {0,0,0,0}
 };
 
 static struct v4l2_fmtdesc pvr_fmtdesc [] = {
index 3f62385..d0d7281 100644 (file)
@@ -540,10 +540,12 @@ static long __video_do_ioctl(struct file *file,
                if (!ret)
                        dbgarg(cmd, "driver=%s, card=%s, bus=%s, "
                                        "version=0x%08x, "
-                                       "capabilities=0x%08x\n",
+                                       "capabilities=0x%08x, "
+                                       "device_caps=0x%08x\n",
                                        cap->driver, cap->card, cap->bus_info,
                                        cap->version,
-                                       cap->capabilities);
+                                       cap->capabilities,
+                                       cap->device_caps);
                break;
        }
 
index 5e11f8a..0db0503 100644 (file)
@@ -235,16 +235,25 @@ struct v4l2_fract {
        __u32   denominator;
 };
 
-/*
- *     D R I V E R   C A P A B I L I T I E S
- */
+/**
+  * struct v4l2_capability - Describes V4L2 device caps returned by VIDIOC_QUERYCAP
+  *
+  * @driver:      name of the driver module (e.g. "bttv")
+  * @card:        name of the card (e.g. "Hauppauge WinTV")
+  * @bus_info:    name of the bus (e.g. "PCI:" + pci_name(pci_dev) )
+  * @version:     KERNEL_VERSION
+  * @capabilities: capabilities of the physical device as a whole
+  * @device_caps:  capabilities accessed via this particular device (node)
+  * @reserved:    reserved fields for future extensions
+  */
 struct v4l2_capability {
-       __u8    driver[16];     /* i.e. "bttv" */
-       __u8    card[32];       /* i.e. "Hauppauge WinTV" */
-       __u8    bus_info[32];   /* "PCI:" + pci_name(pci_dev) */
-       __u32   version;        /* should use KERNEL_VERSION() */
-       __u32   capabilities;   /* Device capabilities */
-       __u32   reserved[4];
+       __u8    driver[16];
+       __u8    card[32];
+       __u8    bus_info[32];
+       __u32   version;
+       __u32   capabilities;
+       __u32   device_caps;
+       __u32   reserved[3];
 };
 
 /* Values for 'capabilities' field */
@@ -274,6 +283,8 @@ struct v4l2_capability {
 #define V4L2_CAP_ASYNCIO                0x02000000  /* async I/O */
 #define V4L2_CAP_STREAMING              0x04000000  /* streaming I/O ioctls */
 
+#define V4L2_CAP_DEVICE_CAPS            0x80000000  /* sets device capabilities field */
+
 /*
  *     V I D E O   I M A G E   F O R M A T
  */