[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: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
Родитель
93596ef7db
Коммит
583aa3a9b5
|
@ -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>
|
||||
|
||||
|
|
|
@ -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
|
||||
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>
|
||||
|
@ -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;
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 [] = {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
Загрузка…
Ссылка в новой задаче