standard.rst 5.7 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13
.. -*- coding: utf-8; mode: rst -*-

.. _standard:

***************
Video Standards
***************

Video devices typically support one or more different video standards or
variations of standards. Each video input and output may support another
set of standards. This set is reported by the ``std`` field of struct
:ref:`v4l2_input <v4l2-input>` and struct
:ref:`v4l2_output <v4l2-output>` returned by the
14 15
:ref:`VIDIOC_ENUMINPUT` and
:ref:`VIDIOC_ENUMOUTPUT` ioctls, respectively.
16 17 18 19 20 21 22

V4L2 defines one bit for each analog video standard currently in use
worldwide, and sets aside bits for driver defined standards, e. g.
hybrid standards to watch NTSC video tapes on PAL TVs and vice versa.
Applications can use the predefined bits to select a particular
standard, although presenting the user a menu of supported standards is
preferred. To enumerate and query the attributes of the supported
23
standards applications use the :ref:`VIDIOC_ENUMSTD`
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
ioctl.

Many of the defined standards are actually just variations of a few
major standards. The hardware may in fact not distinguish between them,
or do so internal and switch automatically. Therefore enumerated
standards also contain sets of one or more standard bits.

Assume a hypothetic tuner capable of demodulating B/PAL, G/PAL and I/PAL
signals. The first enumerated standard is a set of B and G/PAL, switched
automatically depending on the selected radio frequency in UHF or VHF
band. Enumeration gives a "PAL-B/G" or "PAL-I" choice. Similar a
Composite input may collapse standards, enumerating "PAL-B/G/H/I",
"NTSC-M" and "SECAM-D/K". [1]_

To query and select the standard used by the current video input or
39
output applications call the :ref:`VIDIOC_G_STD <VIDIOC_G_STD>` and
40
:ref:`VIDIOC_S_STD <VIDIOC_G_STD>` ioctl, respectively. The
41
*received* standard can be sensed with the
42
:ref:`VIDIOC_QUERYSTD` ioctl. Note that the
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
parameter of all these ioctls is a pointer to a
:ref:`v4l2_std_id <v4l2-std-id>` type (a standard set), *not* an
index into the standard enumeration. Drivers must implement all video
standard ioctls when the device has one or more video inputs or outputs.

Special rules apply to devices such as USB cameras where the notion of
video standards makes little sense. More generally for any capture or
output device which is:

-  incapable of capturing fields or frames at the nominal rate of the
   video standard, or

-  that does not support the video standard formats at all.

Here the driver shall set the ``std`` field of struct
:ref:`v4l2_input <v4l2-input>` and struct
59
:ref:`v4l2_output <v4l2-output>` to zero and the :ref:`VIDIOC_G_STD <VIDIOC_G_STD>`,
60
:ref:`VIDIOC_S_STD <VIDIOC_G_STD>`, :ref:`VIDIOC_QUERYSTD` and :ref:`VIDIOC_ENUMSTD` ioctls
61
shall return the ``ENOTTY`` error code or the ``EINVAL`` error code.
62 63 64 65 66 67 68

Applications can make use of the :ref:`input-capabilities` and
:ref:`output-capabilities` flags to determine whether the video
standard ioctls can be used with the given input or output.


.. code-block:: c
69
    :caption: Example 1.5. Information about the current video standard
70 71 72 73 74

    v4l2_std_id std_id;
    struct v4l2_standard standard;

    if (-1 == ioctl(fd, VIDIOC_G_STD, &std_id)) {
75 76 77
	/* Note when VIDIOC_ENUMSTD always returns ENOTTY this
	   is no video device or it falls under the USB exception,
	   and VIDIOC_G_STD returning ENOTTY is no error. */
78

79 80
	perror("VIDIOC_G_STD");
	exit(EXIT_FAILURE);
81 82 83 84 85 86
    }

    memset(&standard, 0, sizeof(standard));
    standard.index = 0;

    while (0 == ioctl(fd, VIDIOC_ENUMSTD, &standard)) {
87 88 89 90
	if (standard.id & std_id) {
	       printf("Current video standard: %s\\n", standard.name);
	       exit(EXIT_SUCCESS);
	}
91

92
	standard.index++;
93 94 95 96 97 98
    }

    /* EINVAL indicates the end of the enumeration, which cannot be
       empty unless this device falls under the USB exception. */

    if (errno == EINVAL || standard.index == 0) {
99 100
	perror("VIDIOC_ENUMSTD");
	exit(EXIT_FAILURE);
101 102 103 104
    }


.. code-block:: c
105
    :caption: Example 1.6. Listing the video standards supported by the current input
106 107 108 109 110 111 112

    struct v4l2_input input;
    struct v4l2_standard standard;

    memset(&input, 0, sizeof(input));

    if (-1 == ioctl(fd, VIDIOC_G_INPUT, &input.index)) {
113 114
	perror("VIDIOC_G_INPUT");
	exit(EXIT_FAILURE);
115 116 117
    }

    if (-1 == ioctl(fd, VIDIOC_ENUMINPUT, &input)) {
118 119
	perror("VIDIOC_ENUM_INPUT");
	exit(EXIT_FAILURE);
120 121 122 123 124 125 126 127
    }

    printf("Current input %s supports:\\n", input.name);

    memset(&standard, 0, sizeof(standard));
    standard.index = 0;

    while (0 == ioctl(fd, VIDIOC_ENUMSTD, &standard)) {
128 129
	if (standard.id & input.std)
	    printf("%s\\n", standard.name);
130

131
	standard.index++;
132 133 134 135 136 137
    }

    /* EINVAL indicates the end of the enumeration, which cannot be
       empty unless this device falls under the USB exception. */

    if (errno != EINVAL || standard.index == 0) {
138 139
	perror("VIDIOC_ENUMSTD");
	exit(EXIT_FAILURE);
140 141 142 143
    }


.. code-block:: c
144
    :caption: Example 1.7. Selecting a new video standard
145 146 147 148 149 150 151

    struct v4l2_input input;
    v4l2_std_id std_id;

    memset(&input, 0, sizeof(input));

    if (-1 == ioctl(fd, VIDIOC_G_INPUT, &input.index)) {
152 153
	perror("VIDIOC_G_INPUT");
	exit(EXIT_FAILURE);
154 155 156
    }

    if (-1 == ioctl(fd, VIDIOC_ENUMINPUT, &input)) {
157 158
	perror("VIDIOC_ENUM_INPUT");
	exit(EXIT_FAILURE);
159 160 161
    }

    if (0 == (input.std & V4L2_STD_PAL_BG)) {
162 163
	fprintf(stderr, "Oops. B/G PAL is not supported.\\n");
	exit(EXIT_FAILURE);
164 165 166 167 168 169 170 171
    }

    /* Note this is also supposed to work when only B
       or G/PAL is supported. */

    std_id = V4L2_STD_PAL_BG;

    if (-1 == ioctl(fd, VIDIOC_S_STD, &std_id)) {
172 173
	perror("VIDIOC_S_STD");
	exit(EXIT_FAILURE);
174 175 176 177 178 179
    }

.. [1]
   Some users are already confused by technical terms PAL, NTSC and
   SECAM. There is no point asking them to distinguish between B, G, D,
   or K when the software or hardware can do that automatically.