|
@@ -13,6 +13,19 @@ correctly with any device.</para>
|
|
|
<para>All controls are accessed using an ID value. V4L2 defines
|
|
|
several IDs for specific purposes. Drivers can also implement their
|
|
|
own custom controls using <constant>V4L2_CID_PRIVATE_BASE</constant>
|
|
|
+<footnote><para>The use of <constant>V4L2_CID_PRIVATE_BASE</constant>
|
|
|
+is problematic because different drivers may use the same
|
|
|
+<constant>V4L2_CID_PRIVATE_BASE</constant> ID for different controls.
|
|
|
+This makes it hard to programatically set such controls since the meaning
|
|
|
+of the control with that ID is driver dependent. In order to resolve this
|
|
|
+drivers use unique IDs and the <constant>V4L2_CID_PRIVATE_BASE</constant>
|
|
|
+IDs are mapped to those unique IDs by the kernel. Consider these
|
|
|
+<constant>V4L2_CID_PRIVATE_BASE</constant> IDs as aliases to the real
|
|
|
+IDs.</para>
|
|
|
+<para>Many applications today still use the <constant>V4L2_CID_PRIVATE_BASE</constant>
|
|
|
+IDs instead of using &VIDIOC-QUERYCTRL; with the <constant>V4L2_CTRL_FLAG_NEXT_CTRL</constant>
|
|
|
+flag to enumerate all IDs, so support for <constant>V4L2_CID_PRIVATE_BASE</constant>
|
|
|
+is still around.</para></footnote>
|
|
|
and higher values. The pre-defined control IDs have the prefix
|
|
|
<constant>V4L2_CID_</constant>, and are listed in <xref
|
|
|
linkend="control-id" />. The ID is used when querying the attributes of
|
|
@@ -31,25 +44,22 @@ the current video input or output, tuner or modulator, or audio input
|
|
|
or output. Different in the sense of other bounds, another default and
|
|
|
current value, step size or other menu items. A control with a certain
|
|
|
<emphasis>custom</emphasis> ID can also change name and
|
|
|
-type.<footnote>
|
|
|
- <para>It will be more convenient for applications if drivers
|
|
|
-make use of the <constant>V4L2_CTRL_FLAG_DISABLED</constant> flag, but
|
|
|
-that was never required.</para>
|
|
|
- </footnote> Control values are stored globally, they do not
|
|
|
+type.</para>
|
|
|
+
|
|
|
+ <para>If a control is not applicable to the current configuration
|
|
|
+of the device (for example, it doesn't apply to the current video input)
|
|
|
+drivers set the <constant>V4L2_CTRL_FLAG_INACTIVE</constant> flag.</para>
|
|
|
+
|
|
|
+ <para>Control values are stored globally, they do not
|
|
|
change when switching except to stay within the reported bounds. They
|
|
|
also do not change ⪚ when the device is opened or closed, when the
|
|
|
tuner radio frequency is changed or generally never without
|
|
|
-application request. Since V4L2 specifies no event mechanism, panel
|
|
|
-applications intended to cooperate with other panel applications (be
|
|
|
-they built into a larger application, as a TV viewer) may need to
|
|
|
-regularly poll control values to update their user
|
|
|
-interface.<footnote>
|
|
|
- <para>Applications could call an ioctl to request events.
|
|
|
-After another process called &VIDIOC-S-CTRL; or another ioctl changing
|
|
|
-shared properties the &func-select; function would indicate
|
|
|
-readability until any ioctl (querying the properties) is
|
|
|
-called.</para>
|
|
|
- </footnote></para>
|
|
|
+application request.</para>
|
|
|
+
|
|
|
+ <para>V4L2 specifies an event mechanism to notify applications
|
|
|
+when controls change value (see &VIDIOC-SUBSCRIBE-EVENT;, event
|
|
|
+<constant>V4L2_EVENT_CTRL</constant>), panel applications might want to make
|
|
|
+use of that in order to always reflect the correct control value.</para>
|
|
|
|
|
|
<para>
|
|
|
All controls use machine endianness.
|
|
@@ -398,14 +408,17 @@ to work.</entry>
|
|
|
<row id="v4l2-alpha-component">
|
|
|
<entry><constant>V4L2_CID_ALPHA_COMPONENT</constant></entry>
|
|
|
<entry>integer</entry>
|
|
|
- <entry> Sets the alpha color component on the capture device or on
|
|
|
- the capture buffer queue of a mem-to-mem device. When a mem-to-mem
|
|
|
- device produces frame format that includes an alpha component
|
|
|
+ <entry>Sets the alpha color component. When a capture device (or
|
|
|
+ capture queue of a mem-to-mem device) produces a frame format that
|
|
|
+ includes an alpha component
|
|
|
(e.g. <link linkend="rgb-formats">packed RGB image formats</link>)
|
|
|
- and the alpha value is not defined by the mem-to-mem input data
|
|
|
- this control lets you select the alpha component value of all
|
|
|
- pixels. It is applicable to any pixel format that contains an alpha
|
|
|
- component.
|
|
|
+ and the alpha value is not defined by the device or the mem-to-mem
|
|
|
+ input data this control lets you select the alpha component value of
|
|
|
+ all pixels. When an output device (or output queue of a mem-to-mem
|
|
|
+ device) consumes a frame format that doesn't include an alpha
|
|
|
+ component and the device supports alpha channel processing this
|
|
|
+ control lets you set the alpha component value of all pixels for
|
|
|
+ further processing in the device.
|
|
|
</entry>
|
|
|
</row>
|
|
|
<row>
|
|
@@ -434,73 +447,98 @@ Drivers must implement <constant>VIDIOC_QUERYCTRL</constant>,
|
|
|
controls, <constant>VIDIOC_QUERYMENU</constant> when it has one or
|
|
|
more menu type controls.</para>
|
|
|
|
|
|
- <example>
|
|
|
- <title>Enumerating all controls</title>
|
|
|
+ <example id="enum_all_controls">
|
|
|
+ <title>Enumerating all user controls</title>
|
|
|
|
|
|
<programlisting>
|
|
|
&v4l2-queryctrl; queryctrl;
|
|
|
&v4l2-querymenu; querymenu;
|
|
|
|
|
|
-static void
|
|
|
-enumerate_menu (void)
|
|
|
+static void enumerate_menu(void)
|
|
|
{
|
|
|
- printf (" Menu items:\n");
|
|
|
+ printf(" Menu items:\n");
|
|
|
|
|
|
- memset (&querymenu, 0, sizeof (querymenu));
|
|
|
+ memset(&querymenu, 0, sizeof(querymenu));
|
|
|
querymenu.id = queryctrl.id;
|
|
|
|
|
|
for (querymenu.index = queryctrl.minimum;
|
|
|
querymenu.index <= queryctrl.maximum;
|
|
|
- querymenu.index++) {
|
|
|
- if (0 == ioctl (fd, &VIDIOC-QUERYMENU;, &querymenu)) {
|
|
|
- printf (" %s\n", querymenu.name);
|
|
|
+ querymenu.index++) {
|
|
|
+ if (0 == ioctl(fd, &VIDIOC-QUERYMENU;, &querymenu)) {
|
|
|
+ printf(" %s\n", querymenu.name);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-memset (&queryctrl, 0, sizeof (queryctrl));
|
|
|
+memset(&queryctrl, 0, sizeof(queryctrl));
|
|
|
|
|
|
for (queryctrl.id = V4L2_CID_BASE;
|
|
|
queryctrl.id < V4L2_CID_LASTP1;
|
|
|
queryctrl.id++) {
|
|
|
- if (0 == ioctl (fd, &VIDIOC-QUERYCTRL;, &queryctrl)) {
|
|
|
+ if (0 == ioctl(fd, &VIDIOC-QUERYCTRL;, &queryctrl)) {
|
|
|
if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED)
|
|
|
continue;
|
|
|
|
|
|
- printf ("Control %s\n", queryctrl.name);
|
|
|
+ printf("Control %s\n", queryctrl.name);
|
|
|
|
|
|
if (queryctrl.type == V4L2_CTRL_TYPE_MENU)
|
|
|
- enumerate_menu ();
|
|
|
+ enumerate_menu();
|
|
|
} else {
|
|
|
if (errno == EINVAL)
|
|
|
continue;
|
|
|
|
|
|
- perror ("VIDIOC_QUERYCTRL");
|
|
|
- exit (EXIT_FAILURE);
|
|
|
+ perror("VIDIOC_QUERYCTRL");
|
|
|
+ exit(EXIT_FAILURE);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
for (queryctrl.id = V4L2_CID_PRIVATE_BASE;;
|
|
|
queryctrl.id++) {
|
|
|
- if (0 == ioctl (fd, &VIDIOC-QUERYCTRL;, &queryctrl)) {
|
|
|
+ if (0 == ioctl(fd, &VIDIOC-QUERYCTRL;, &queryctrl)) {
|
|
|
if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED)
|
|
|
continue;
|
|
|
|
|
|
- printf ("Control %s\n", queryctrl.name);
|
|
|
+ printf("Control %s\n", queryctrl.name);
|
|
|
|
|
|
if (queryctrl.type == V4L2_CTRL_TYPE_MENU)
|
|
|
- enumerate_menu ();
|
|
|
+ enumerate_menu();
|
|
|
} else {
|
|
|
if (errno == EINVAL)
|
|
|
break;
|
|
|
|
|
|
- perror ("VIDIOC_QUERYCTRL");
|
|
|
- exit (EXIT_FAILURE);
|
|
|
+ perror("VIDIOC_QUERYCTRL");
|
|
|
+ exit(EXIT_FAILURE);
|
|
|
}
|
|
|
}
|
|
|
</programlisting>
|
|
|
</example>
|
|
|
|
|
|
+ <example>
|
|
|
+ <title>Enumerating all user controls (alternative)</title>
|
|
|
+ <programlisting>
|
|
|
+memset(&queryctrl, 0, sizeof(queryctrl));
|
|
|
+
|
|
|
+queryctrl.id = V4L2_CTRL_CLASS_USER | V4L2_CTRL_FLAG_NEXT_CTRL;
|
|
|
+while (0 == ioctl(fd, &VIDIOC-QUERYCTRL;, &queryctrl)) {
|
|
|
+ if (V4L2_CTRL_ID2CLASS(queryctrl.id) != V4L2_CTRL_CLASS_USER)
|
|
|
+ break;
|
|
|
+ if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ printf("Control %s\n", queryctrl.name);
|
|
|
+
|
|
|
+ if (queryctrl.type == V4L2_CTRL_TYPE_MENU)
|
|
|
+ enumerate_menu();
|
|
|
+
|
|
|
+ queryctrl.id |= V4L2_CTRL_FLAG_NEXT_CTRL;
|
|
|
+}
|
|
|
+if (errno != EINVAL) {
|
|
|
+ perror("VIDIOC_QUERYCTRL");
|
|
|
+ exit(EXIT_FAILURE);
|
|
|
+}
|
|
|
+</programlisting>
|
|
|
+ </example>
|
|
|
+
|
|
|
<example>
|
|
|
<title>Changing controls</title>
|
|
|
|
|
@@ -508,53 +546,53 @@ for (queryctrl.id = V4L2_CID_PRIVATE_BASE;;
|
|
|
&v4l2-queryctrl; queryctrl;
|
|
|
&v4l2-control; control;
|
|
|
|
|
|
-memset (&queryctrl, 0, sizeof (queryctrl));
|
|
|
+memset(&queryctrl, 0, sizeof(queryctrl));
|
|
|
queryctrl.id = V4L2_CID_BRIGHTNESS;
|
|
|
|
|
|
-if (-1 == ioctl (fd, &VIDIOC-QUERYCTRL;, &queryctrl)) {
|
|
|
+if (-1 == ioctl(fd, &VIDIOC-QUERYCTRL;, &queryctrl)) {
|
|
|
if (errno != EINVAL) {
|
|
|
- perror ("VIDIOC_QUERYCTRL");
|
|
|
- exit (EXIT_FAILURE);
|
|
|
+ perror("VIDIOC_QUERYCTRL");
|
|
|
+ exit(EXIT_FAILURE);
|
|
|
} else {
|
|
|
- printf ("V4L2_CID_BRIGHTNESS is not supported\n");
|
|
|
+ printf("V4L2_CID_BRIGHTNESS is not supported\n");
|
|
|
}
|
|
|
} else if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED) {
|
|
|
- printf ("V4L2_CID_BRIGHTNESS is not supported\n");
|
|
|
+ printf("V4L2_CID_BRIGHTNESS is not supported\n");
|
|
|
} else {
|
|
|
- memset (&control, 0, sizeof (control));
|
|
|
+ memset(&control, 0, sizeof (control));
|
|
|
control.id = V4L2_CID_BRIGHTNESS;
|
|
|
control.value = queryctrl.default_value;
|
|
|
|
|
|
- if (-1 == ioctl (fd, &VIDIOC-S-CTRL;, &control)) {
|
|
|
- perror ("VIDIOC_S_CTRL");
|
|
|
- exit (EXIT_FAILURE);
|
|
|
+ if (-1 == ioctl(fd, &VIDIOC-S-CTRL;, &control)) {
|
|
|
+ perror("VIDIOC_S_CTRL");
|
|
|
+ exit(EXIT_FAILURE);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-memset (&control, 0, sizeof (control));
|
|
|
+memset(&control, 0, sizeof(control));
|
|
|
control.id = V4L2_CID_CONTRAST;
|
|
|
|
|
|
-if (0 == ioctl (fd, &VIDIOC-G-CTRL;, &control)) {
|
|
|
+if (0 == ioctl(fd, &VIDIOC-G-CTRL;, &control)) {
|
|
|
control.value += 1;
|
|
|
|
|
|
/* The driver may clamp the value or return ERANGE, ignored here */
|
|
|
|
|
|
- if (-1 == ioctl (fd, &VIDIOC-S-CTRL;, &control)
|
|
|
+ if (-1 == ioctl(fd, &VIDIOC-S-CTRL;, &control)
|
|
|
&& errno != ERANGE) {
|
|
|
- perror ("VIDIOC_S_CTRL");
|
|
|
- exit (EXIT_FAILURE);
|
|
|
+ perror("VIDIOC_S_CTRL");
|
|
|
+ exit(EXIT_FAILURE);
|
|
|
}
|
|
|
/* Ignore if V4L2_CID_CONTRAST is unsupported */
|
|
|
} else if (errno != EINVAL) {
|
|
|
- perror ("VIDIOC_G_CTRL");
|
|
|
- exit (EXIT_FAILURE);
|
|
|
+ perror("VIDIOC_G_CTRL");
|
|
|
+ exit(EXIT_FAILURE);
|
|
|
}
|
|
|
|
|
|
control.id = V4L2_CID_AUDIO_MUTE;
|
|
|
-control.value = TRUE; /* silence */
|
|
|
+control.value = 1; /* silence */
|
|
|
|
|
|
/* Errors ignored */
|
|
|
-ioctl (fd, VIDIOC_S_CTRL, &control);
|
|
|
+ioctl(fd, VIDIOC_S_CTRL, &control);
|
|
|
</programlisting>
|
|
|
</example>
|
|
|
</section>
|
|
@@ -625,16 +663,29 @@ supported.</para>
|
|
|
&v4l2-control;, except for the fact that it also allows for 64-bit
|
|
|
values and pointers to be passed.</para>
|
|
|
|
|
|
+ <para>Since the &v4l2-ext-control; supports pointers it is now
|
|
|
+also possible to have controls with compound types such as N-dimensional arrays
|
|
|
+and/or structures. You need to specify the <constant>V4L2_CTRL_FLAG_NEXT_COMPOUND</constant>
|
|
|
+when enumerating controls to actually be able to see such compound controls.
|
|
|
+In other words, these controls with compound types should only be used
|
|
|
+programmatically.</para>
|
|
|
+
|
|
|
+ <para>Since such compound controls need to expose more information
|
|
|
+about themselves than is possible with &VIDIOC-QUERYCTRL; the
|
|
|
+&VIDIOC-QUERY-EXT-CTRL; ioctl was added. In particular, this ioctl gives
|
|
|
+the dimensions of the N-dimensional array if this control consists of more than
|
|
|
+one element.</para>
|
|
|
+
|
|
|
<para>It is important to realize that due to the flexibility of
|
|
|
controls it is necessary to check whether the control you want to set
|
|
|
actually is supported in the driver and what the valid range of values
|
|
|
-is. So use the &VIDIOC-QUERYCTRL; and &VIDIOC-QUERYMENU; ioctls to
|
|
|
-check this. Also note that it is possible that some of the menu
|
|
|
-indices in a control of type <constant>V4L2_CTRL_TYPE_MENU</constant>
|
|
|
-may not be supported (<constant>VIDIOC_QUERYMENU</constant> will
|
|
|
-return an error). A good example is the list of supported MPEG audio
|
|
|
-bitrates. Some drivers only support one or two bitrates, others
|
|
|
-support a wider range.</para>
|
|
|
+is. So use the &VIDIOC-QUERYCTRL; (or &VIDIOC-QUERY-EXT-CTRL;) and
|
|
|
+&VIDIOC-QUERYMENU; ioctls to check this. Also note that it is possible
|
|
|
+that some of the menu indices in a control of type
|
|
|
+<constant>V4L2_CTRL_TYPE_MENU</constant> may not be supported
|
|
|
+(<constant>VIDIOC_QUERYMENU</constant> will return an error). A good
|
|
|
+example is the list of supported MPEG audio bitrates. Some drivers only
|
|
|
+support one or two bitrates, others support a wider range.</para>
|
|
|
|
|
|
<para>
|
|
|
All controls use machine endianness.
|
|
@@ -675,12 +726,12 @@ control class is found:</para>
|
|
|
<informalexample>
|
|
|
<programlisting>
|
|
|
qctrl.id = V4L2_CTRL_CLASS_MPEG | V4L2_CTRL_FLAG_NEXT_CTRL;
|
|
|
-while (0 == ioctl (fd, &VIDIOC-QUERYCTRL;, &qctrl)) {
|
|
|
- if (V4L2_CTRL_ID2CLASS (qctrl.id) != V4L2_CTRL_CLASS_MPEG)
|
|
|
+while (0 == ioctl(fd, &VIDIOC-QUERYCTRL;, &qctrl)) {
|
|
|
+ if (V4L2_CTRL_ID2CLASS(qctrl.id) != V4L2_CTRL_CLASS_MPEG)
|
|
|
break;
|
|
|
/* ... */
|
|
|
- qctrl.id |= V4L2_CTRL_FLAG_NEXT_CTRL;
|
|
|
- }
|
|
|
+ qctrl.id |= V4L2_CTRL_FLAG_NEXT_CTRL;
|
|
|
+}
|
|
|
</programlisting>
|
|
|
</informalexample>
|
|
|
|
|
@@ -700,7 +751,7 @@ ID based on a control ID.</para>
|
|
|
<constant>VIDIOC_QUERYCTRL</constant> will fail when used in
|
|
|
combination with <constant>V4L2_CTRL_FLAG_NEXT_CTRL</constant>. In
|
|
|
that case the old method of enumerating control should be used (see
|
|
|
-1.8). But if it is supported, then it is guaranteed to enumerate over
|
|
|
+<xref linkend="enum_all_controls" />). But if it is supported, then it is guaranteed to enumerate over
|
|
|
all controls, including driver-private controls.</para>
|
|
|
</section>
|
|
|
|
|
@@ -3998,6 +4049,68 @@ in Annex E of <xref linkend="iec62106" />. The length of Radio Text strings depe
|
|
|
used to transmit it, either 32 (2A block) or 64 (2B block). However, it is also possible
|
|
|
to find receivers which can scroll strings sized as 32 x N or 64 x N characters. So, this control must be configured
|
|
|
with steps of 32 or 64 characters. The result is it must always contain a string with size multiple of 32 or 64. </entry>
|
|
|
+ </row>
|
|
|
+ <row>
|
|
|
+ <entry spanname="id"><constant>V4L2_CID_RDS_TX_MONO_STEREO</constant> </entry>
|
|
|
+ <entry>boolean</entry>
|
|
|
+ </row>
|
|
|
+ <row><entry spanname="descr">Sets the Mono/Stereo bit of the Decoder Identification code. If set,
|
|
|
+then the audio was recorded as stereo.</entry>
|
|
|
+ </row>
|
|
|
+ <row>
|
|
|
+ <entry spanname="id"><constant>V4L2_CID_RDS_TX_ARTIFICIAL_HEAD</constant> </entry>
|
|
|
+ <entry>boolean</entry>
|
|
|
+ </row>
|
|
|
+ <row><entry spanname="descr">Sets the
|
|
|
+<ulink url="http://en.wikipedia.org/wiki/Artificial_head">Artificial Head</ulink> bit of the Decoder
|
|
|
+Identification code. If set, then the audio was recorded using an artificial head.</entry>
|
|
|
+ </row>
|
|
|
+ <row>
|
|
|
+ <entry spanname="id"><constant>V4L2_CID_RDS_TX_COMPRESSED</constant> </entry>
|
|
|
+ <entry>boolean</entry>
|
|
|
+ </row>
|
|
|
+ <row><entry spanname="descr">Sets the Compressed bit of the Decoder Identification code. If set,
|
|
|
+then the audio is compressed.</entry>
|
|
|
+ </row>
|
|
|
+ <row>
|
|
|
+ <entry spanname="id"><constant>V4L2_CID_RDS_TX_DYNAMIC_PTY</constant> </entry>
|
|
|
+ <entry>boolean</entry>
|
|
|
+ </row>
|
|
|
+ <row><entry spanname="descr">Sets the Dynamic PTY bit of the Decoder Identification code. If set,
|
|
|
+then the PTY code is dynamically switched.</entry>
|
|
|
+ </row>
|
|
|
+ <row>
|
|
|
+ <entry spanname="id"><constant>V4L2_CID_RDS_TX_TRAFFIC_ANNOUNCEMENT</constant> </entry>
|
|
|
+ <entry>boolean</entry>
|
|
|
+ </row>
|
|
|
+ <row><entry spanname="descr">If set, then a traffic announcement is in progress.</entry>
|
|
|
+ </row>
|
|
|
+ <row>
|
|
|
+ <entry spanname="id"><constant>V4L2_CID_RDS_TX_TRAFFIC_PROGRAM</constant> </entry>
|
|
|
+ <entry>boolean</entry>
|
|
|
+ </row>
|
|
|
+ <row><entry spanname="descr">If set, then the tuned programme carries traffic announcements.</entry>
|
|
|
+ </row>
|
|
|
+ <row>
|
|
|
+ <entry spanname="id"><constant>V4L2_CID_RDS_TX_MUSIC_SPEECH</constant> </entry>
|
|
|
+ <entry>boolean</entry>
|
|
|
+ </row>
|
|
|
+ <row><entry spanname="descr">If set, then this channel broadcasts music. If cleared, then it
|
|
|
+broadcasts speech. If the transmitter doesn't make this distinction, then it should be set.</entry>
|
|
|
+ </row>
|
|
|
+ <row>
|
|
|
+ <entry spanname="id"><constant>V4L2_CID_RDS_TX_ALT_FREQS_ENABLE</constant> </entry>
|
|
|
+ <entry>boolean</entry>
|
|
|
+ </row>
|
|
|
+ <row><entry spanname="descr">If set, then transmit alternate frequencies.</entry>
|
|
|
+ </row>
|
|
|
+ <row>
|
|
|
+ <entry spanname="id"><constant>V4L2_CID_RDS_TX_ALT_FREQS</constant> </entry>
|
|
|
+ <entry>__u32 array</entry>
|
|
|
+ </row>
|
|
|
+ <row><entry spanname="descr">The alternate frequencies in kHz units. The RDS standard allows
|
|
|
+for up to 25 frequencies to be defined. Drivers may support fewer frequencies so check
|
|
|
+the array size.</entry>
|
|
|
</row>
|
|
|
<row>
|
|
|
<entry spanname="id"><constant>V4L2_CID_AUDIO_LIMITER_ENABLED</constant> </entry>
|
|
@@ -4976,6 +5089,57 @@ description of this control class.</entry>
|
|
|
</row><row><entry spanname="descr">Enables/disables RDS
|
|
|
reception by the radio tuner</entry>
|
|
|
</row>
|
|
|
+ <row>
|
|
|
+ <entry spanname="id"><constant>V4L2_CID_RDS_RX_PTY</constant> </entry>
|
|
|
+ <entry>integer</entry>
|
|
|
+ </row>
|
|
|
+ <row><entry spanname="descr">Gets RDS Programme Type field.
|
|
|
+This encodes up to 31 pre-defined programme types.</entry>
|
|
|
+ </row>
|
|
|
+ <row>
|
|
|
+ <entry spanname="id"><constant>V4L2_CID_RDS_RX_PS_NAME</constant> </entry>
|
|
|
+ <entry>string</entry>
|
|
|
+ </row>
|
|
|
+ <row><entry spanname="descr">Gets the Programme Service name (PS_NAME).
|
|
|
+It is intended for static display on a receiver. It is the primary aid to listeners in programme service
|
|
|
+identification and selection. In Annex E of <xref linkend="iec62106" />, the RDS specification,
|
|
|
+there is a full description of the correct character encoding for Programme Service name strings.
|
|
|
+Also from RDS specification, PS is usually a single eight character text. However, it is also possible
|
|
|
+to find receivers which can scroll strings sized as 8 x N characters. So, this control must be configured
|
|
|
+with steps of 8 characters. The result is it must always contain a string with size multiple of 8.</entry>
|
|
|
+ </row>
|
|
|
+ <row>
|
|
|
+ <entry spanname="id"><constant>V4L2_CID_RDS_RX_RADIO_TEXT</constant> </entry>
|
|
|
+ <entry>string</entry>
|
|
|
+ </row>
|
|
|
+ <row><entry spanname="descr">Gets the Radio Text info. It is a textual description of
|
|
|
+what is being broadcasted. RDS Radio Text can be applied when broadcaster wishes to transmit longer PS names,
|
|
|
+programme-related information or any other text. In these cases, RadioText can be used in addition to
|
|
|
+<constant>V4L2_CID_RDS_RX_PS_NAME</constant>. The encoding for Radio Text strings is also fully described
|
|
|
+in Annex E of <xref linkend="iec62106" />. The length of Radio Text strings depends on which RDS Block is being
|
|
|
+used to transmit it, either 32 (2A block) or 64 (2B block). However, it is also possible
|
|
|
+to find receivers which can scroll strings sized as 32 x N or 64 x N characters. So, this control must be configured
|
|
|
+with steps of 32 or 64 characters. The result is it must always contain a string with size multiple of 32 or 64. </entry>
|
|
|
+ </row>
|
|
|
+ <row>
|
|
|
+ <entry spanname="id"><constant>V4L2_CID_RDS_RX_TRAFFIC_ANNOUNCEMENT</constant> </entry>
|
|
|
+ <entry>boolean</entry>
|
|
|
+ </row>
|
|
|
+ <row><entry spanname="descr">If set, then a traffic announcement is in progress.</entry>
|
|
|
+ </row>
|
|
|
+ <row>
|
|
|
+ <entry spanname="id"><constant>V4L2_CID_RDS_RX_TRAFFIC_PROGRAM</constant> </entry>
|
|
|
+ <entry>boolean</entry>
|
|
|
+ </row>
|
|
|
+ <row><entry spanname="descr">If set, then the tuned programme carries traffic announcements.</entry>
|
|
|
+ </row>
|
|
|
+ <row>
|
|
|
+ <entry spanname="id"><constant>V4L2_CID_RDS_RX_MUSIC_SPEECH</constant> </entry>
|
|
|
+ <entry>boolean</entry>
|
|
|
+ </row>
|
|
|
+ <row><entry spanname="descr">If set, then this channel broadcasts music. If cleared, then it
|
|
|
+broadcasts speech. If the transmitter doesn't make this distinction, then it will be set.</entry>
|
|
|
+ </row>
|
|
|
<row>
|
|
|
<entry spanname="id"><constant>V4L2_CID_TUNE_DEEMPHASIS</constant> </entry>
|
|
|
<entry>enum v4l2_deemphasis</entry>
|
|
@@ -5007,6 +5171,102 @@ defines possible values for de-emphasis. Here they are:</entry>
|
|
|
</tbody>
|
|
|
</tgroup>
|
|
|
</table>
|
|
|
+ </section>
|
|
|
+
|
|
|
+ <section id="detect-controls">
|
|
|
+ <title>Detect Control Reference</title>
|
|
|
+
|
|
|
+ <para>The Detect class includes controls for common features of
|
|
|
+ various motion or object detection capable devices.</para>
|
|
|
+
|
|
|
+ <table pgwide="1" frame="none" id="detect-control-id">
|
|
|
+ <title>Detect Control IDs</title>
|
|
|
+
|
|
|
+ <tgroup cols="4">
|
|
|
+ <colspec colname="c1" colwidth="1*" />
|
|
|
+ <colspec colname="c2" colwidth="6*" />
|
|
|
+ <colspec colname="c3" colwidth="2*" />
|
|
|
+ <colspec colname="c4" colwidth="6*" />
|
|
|
+ <spanspec namest="c1" nameend="c2" spanname="id" />
|
|
|
+ <spanspec namest="c2" nameend="c4" spanname="descr" />
|
|
|
+ <thead>
|
|
|
+ <row>
|
|
|
+ <entry spanname="id" align="left">ID</entry>
|
|
|
+ <entry align="left">Type</entry>
|
|
|
+ </row><row rowsep="1"><entry spanname="descr" align="left">Description</entry>
|
|
|
+ </row>
|
|
|
+ </thead>
|
|
|
+ <tbody valign="top">
|
|
|
+ <row><entry></entry></row>
|
|
|
+ <row>
|
|
|
+ <entry spanname="id"><constant>V4L2_CID_DETECT_CLASS</constant> </entry>
|
|
|
+ <entry>class</entry>
|
|
|
+ </row><row><entry spanname="descr">The Detect class
|
|
|
+descriptor. Calling &VIDIOC-QUERYCTRL; for this control will return a
|
|
|
+description of this control class.</entry>
|
|
|
+ </row>
|
|
|
+ <row>
|
|
|
+ <entry spanname="id"><constant>V4L2_CID_DETECT_MD_MODE</constant> </entry>
|
|
|
+ <entry>menu</entry>
|
|
|
+ </row><row><entry spanname="descr">Sets the motion detection mode.</entry>
|
|
|
+ </row>
|
|
|
+ <row>
|
|
|
+ <entrytbl spanname="descr" cols="2">
|
|
|
+ <tbody valign="top">
|
|
|
+ <row>
|
|
|
+ <entry><constant>V4L2_DETECT_MD_MODE_DISABLED</constant>
|
|
|
+ </entry><entry>Disable motion detection.</entry>
|
|
|
+ </row>
|
|
|
+ <row>
|
|
|
+ <entry><constant>V4L2_DETECT_MD_MODE_GLOBAL</constant>
|
|
|
+ </entry><entry>Use a single motion detection threshold.</entry>
|
|
|
+ </row>
|
|
|
+ <row>
|
|
|
+ <entry><constant>V4L2_DETECT_MD_MODE_THRESHOLD_GRID</constant>
|
|
|
+ </entry><entry>The image is divided into a grid, each cell with its own
|
|
|
+ motion detection threshold. These thresholds are set through the
|
|
|
+ <constant>V4L2_CID_DETECT_MD_THRESHOLD_GRID</constant> matrix control.</entry>
|
|
|
+ </row>
|
|
|
+ <row>
|
|
|
+ <entry><constant>V4L2_DETECT_MD_MODE_REGION_GRID</constant>
|
|
|
+ </entry><entry>The image is divided into a grid, each cell with its own
|
|
|
+ region value that specifies which per-region motion detection thresholds
|
|
|
+ should be used. Each region has its own thresholds. How these per-region
|
|
|
+ thresholds are set up is driver-specific. The region values for the grid are set
|
|
|
+ through the <constant>V4L2_CID_DETECT_MD_REGION_GRID</constant> matrix
|
|
|
+ control.</entry>
|
|
|
+ </row>
|
|
|
+ </tbody>
|
|
|
+ </entrytbl>
|
|
|
+ </row>
|
|
|
+ <row>
|
|
|
+ <entry spanname="id"><constant>V4L2_CID_DETECT_MD_GLOBAL_THRESHOLD</constant> </entry>
|
|
|
+ <entry>integer</entry>
|
|
|
+ </row>
|
|
|
+ <row><entry spanname="descr">Sets the global motion detection threshold to be
|
|
|
+ used with the <constant>V4L2_DETECT_MD_MODE_GLOBAL</constant> motion detection mode.</entry>
|
|
|
+ </row>
|
|
|
+ <row>
|
|
|
+ <entry spanname="id"><constant>V4L2_CID_DETECT_MD_THRESHOLD_GRID</constant> </entry>
|
|
|
+ <entry>__u16 matrix</entry>
|
|
|
+ </row>
|
|
|
+ <row><entry spanname="descr">Sets the motion detection thresholds for each cell in the grid.
|
|
|
+ To be used with the <constant>V4L2_DETECT_MD_MODE_THRESHOLD_GRID</constant>
|
|
|
+ motion detection mode. Matrix element (0, 0) represents the cell at the top-left of the
|
|
|
+ grid.</entry>
|
|
|
+ </row>
|
|
|
+ <row>
|
|
|
+ <entry spanname="id"><constant>V4L2_CID_DETECT_MD_REGION_GRID</constant> </entry>
|
|
|
+ <entry>__u8 matrix</entry>
|
|
|
+ </row>
|
|
|
+ <row><entry spanname="descr">Sets the motion detection region value for each cell in the grid.
|
|
|
+ To be used with the <constant>V4L2_DETECT_MD_MODE_REGION_GRID</constant>
|
|
|
+ motion detection mode. Matrix element (0, 0) represents the cell at the top-left of the
|
|
|
+ grid.</entry>
|
|
|
+ </row>
|
|
|
+ </tbody>
|
|
|
+ </tgroup>
|
|
|
+ </table>
|
|
|
|
|
|
</section>
|
|
|
|