Commit 583aa3a9 authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab

[media] V4L2: Add per-device-node capabilities

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: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 93596ef7
...@@ -2393,6 +2393,10 @@ details.</para> ...@@ -2393,6 +2393,10 @@ details.</para>
to the <link linkend="control">User controls class</link>. to the <link linkend="control">User controls class</link>.
</para> </para>
</listitem> </listitem>
<listitem>
<para>Added the device_caps field to struct v4l2_capabilities and added the new
V4L2_CAP_DEVICE_CAPS capability.</para>
</listitem>
</orderedlist> </orderedlist>
</section> </section>
......
...@@ -127,6 +127,13 @@ structs, ioctls) must be noted in more detail in the history chapter ...@@ -127,6 +127,13 @@ structs, ioctls) must be noted in more detail in the history chapter
(compat.xml), along with the possible impact on existing drivers and (compat.xml), along with the possible impact on existing drivers and
applications. --> 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> <revision>
<revnumber>3.2</revnumber> <revnumber>3.2</revnumber>
<date>2011-08-26</date> <date>2011-08-26</date>
...@@ -417,7 +424,7 @@ and discussions on the V4L mailing list.</revremark> ...@@ -417,7 +424,7 @@ and discussions on the V4L mailing list.</revremark>
</partinfo> </partinfo>
<title>Video for Linux Two API Specification</title> <title>Video for Linux Two API Specification</title>
<subtitle>Revision 3.2</subtitle> <subtitle>Revision 3.3</subtitle>
<chapter id="common"> <chapter id="common">
&sub-common; &sub-common;
......
...@@ -124,12 +124,35 @@ printf ("Version: %u.%u.%u\n", ...@@ -124,12 +124,35 @@ printf ("Version: %u.%u.%u\n",
<row> <row>
<entry>__u32</entry> <entry>__u32</entry>
<entry><structfield>capabilities</structfield></entry> <entry><structfield>capabilities</structfield></entry>
<entry>Device capabilities, see <xref <entry>Available capabilities of the physical device as a whole, see <xref
linkend="device-capabilities" />.</entry> 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>
<row> <row>
<entry>__u32</entry> <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 <entry>Reserved for future extensions. Drivers must set
this array to zero.</entry> this array to zero.</entry>
</row> </row>
...@@ -276,6 +299,13 @@ linkend="async">asynchronous</link> I/O methods.</entry> ...@@ -276,6 +299,13 @@ linkend="async">asynchronous</link> I/O methods.</entry>
<entry>The device supports the <link <entry>The device supports the <link
linkend="mmap">streaming</link> I/O method.</entry> linkend="mmap">streaming</link> I/O method.</entry>
</row> </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> </tbody>
</tgroup> </tgroup>
</table> </table>
......
...@@ -1686,7 +1686,6 @@ static struct v4l2_capability pvr_capability = { ...@@ -1686,7 +1686,6 @@ static struct v4l2_capability pvr_capability = {
.capabilities = (V4L2_CAP_VIDEO_CAPTURE | .capabilities = (V4L2_CAP_VIDEO_CAPTURE |
V4L2_CAP_TUNER | V4L2_CAP_AUDIO | V4L2_CAP_RADIO | V4L2_CAP_TUNER | V4L2_CAP_AUDIO | V4L2_CAP_RADIO |
V4L2_CAP_STREAMING | V4L2_CAP_READWRITE), V4L2_CAP_STREAMING | V4L2_CAP_READWRITE),
.reserved = {0, 0, 0, 0}
}; };
static int vidioc_querycap(struct file *file, void *priv, static int vidioc_querycap(struct file *file, void *priv,
struct v4l2_capability *cap) struct v4l2_capability *cap)
......
...@@ -96,7 +96,6 @@ static struct v4l2_capability pvr_capability ={ ...@@ -96,7 +96,6 @@ static struct v4l2_capability pvr_capability ={
.capabilities = (V4L2_CAP_VIDEO_CAPTURE | .capabilities = (V4L2_CAP_VIDEO_CAPTURE |
V4L2_CAP_TUNER | V4L2_CAP_AUDIO | V4L2_CAP_RADIO | V4L2_CAP_TUNER | V4L2_CAP_AUDIO | V4L2_CAP_RADIO |
V4L2_CAP_READWRITE), V4L2_CAP_READWRITE),
.reserved = {0,0,0,0}
}; };
static struct v4l2_fmtdesc pvr_fmtdesc [] = { static struct v4l2_fmtdesc pvr_fmtdesc [] = {
......
...@@ -540,10 +540,12 @@ static long __video_do_ioctl(struct file *file, ...@@ -540,10 +540,12 @@ static long __video_do_ioctl(struct file *file,
if (!ret) if (!ret)
dbgarg(cmd, "driver=%s, card=%s, bus=%s, " dbgarg(cmd, "driver=%s, card=%s, bus=%s, "
"version=0x%08x, " "version=0x%08x, "
"capabilities=0x%08x\n", "capabilities=0x%08x, "
"device_caps=0x%08x\n",
cap->driver, cap->card, cap->bus_info, cap->driver, cap->card, cap->bus_info,
cap->version, cap->version,
cap->capabilities); cap->capabilities,
cap->device_caps);
break; break;
} }
......
...@@ -235,16 +235,25 @@ struct v4l2_fract { ...@@ -235,16 +235,25 @@ struct v4l2_fract {
__u32 denominator; __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 { struct v4l2_capability {
__u8 driver[16]; /* i.e. "bttv" */ __u8 driver[16];
__u8 card[32]; /* i.e. "Hauppauge WinTV" */ __u8 card[32];
__u8 bus_info[32]; /* "PCI:" + pci_name(pci_dev) */ __u8 bus_info[32];
__u32 version; /* should use KERNEL_VERSION() */ __u32 version;
__u32 capabilities; /* Device capabilities */ __u32 capabilities;
__u32 reserved[4]; __u32 device_caps;
__u32 reserved[3];
}; };
/* Values for 'capabilities' field */ /* Values for 'capabilities' field */
...@@ -274,6 +283,8 @@ struct v4l2_capability { ...@@ -274,6 +283,8 @@ struct v4l2_capability {
#define V4L2_CAP_ASYNCIO 0x02000000 /* async I/O */ #define V4L2_CAP_ASYNCIO 0x02000000 /* async I/O */
#define V4L2_CAP_STREAMING 0x04000000 /* streaming I/O ioctls */ #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 * V I D E O I M A G E F O R M A T
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment