xref: /openbmc/linux/Documentation/userspace-api/media/v4l/standard.rst (revision cbecf716ca618fd44feda6bd9a64a8179d031fc5)
1*059b1c5bSMauro Carvalho Chehab.. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later
254f38fcaSMauro Carvalho Chehab
354f38fcaSMauro Carvalho Chehab.. _standard:
454f38fcaSMauro Carvalho Chehab
554f38fcaSMauro Carvalho Chehab***************
654f38fcaSMauro Carvalho ChehabVideo Standards
754f38fcaSMauro Carvalho Chehab***************
854f38fcaSMauro Carvalho Chehab
954f38fcaSMauro Carvalho ChehabVideo devices typically support one or more different video standards or
1054f38fcaSMauro Carvalho Chehabvariations of standards. Each video input and output may support another
1154f38fcaSMauro Carvalho Chehabset of standards. This set is reported by the ``std`` field of struct
1254f38fcaSMauro Carvalho Chehab:c:type:`v4l2_input` and struct
1354f38fcaSMauro Carvalho Chehab:c:type:`v4l2_output` returned by the
1454f38fcaSMauro Carvalho Chehab:ref:`VIDIOC_ENUMINPUT` and
1554f38fcaSMauro Carvalho Chehab:ref:`VIDIOC_ENUMOUTPUT` ioctls, respectively.
1654f38fcaSMauro Carvalho Chehab
1754f38fcaSMauro Carvalho ChehabV4L2 defines one bit for each analog video standard currently in use
1854f38fcaSMauro Carvalho Chehabworldwide, and sets aside bits for driver defined standards, e. g.
1954f38fcaSMauro Carvalho Chehabhybrid standards to watch NTSC video tapes on PAL TVs and vice versa.
2054f38fcaSMauro Carvalho ChehabApplications can use the predefined bits to select a particular
2154f38fcaSMauro Carvalho Chehabstandard, although presenting the user a menu of supported standards is
2254f38fcaSMauro Carvalho Chehabpreferred. To enumerate and query the attributes of the supported
2354f38fcaSMauro Carvalho Chehabstandards applications use the :ref:`VIDIOC_ENUMSTD`
2454f38fcaSMauro Carvalho Chehabioctl.
2554f38fcaSMauro Carvalho Chehab
2654f38fcaSMauro Carvalho ChehabMany of the defined standards are actually just variations of a few
2754f38fcaSMauro Carvalho Chehabmajor standards. The hardware may in fact not distinguish between them,
2854f38fcaSMauro Carvalho Chehabor do so internal and switch automatically. Therefore enumerated
2954f38fcaSMauro Carvalho Chehabstandards also contain sets of one or more standard bits.
3054f38fcaSMauro Carvalho Chehab
3154f38fcaSMauro Carvalho ChehabAssume a hypothetic tuner capable of demodulating B/PAL, G/PAL and I/PAL
3254f38fcaSMauro Carvalho Chehabsignals. The first enumerated standard is a set of B and G/PAL, switched
3354f38fcaSMauro Carvalho Chehabautomatically depending on the selected radio frequency in UHF or VHF
3454f38fcaSMauro Carvalho Chehabband. Enumeration gives a "PAL-B/G" or "PAL-I" choice. Similar a
3554f38fcaSMauro Carvalho ChehabComposite input may collapse standards, enumerating "PAL-B/G/H/I",
3654f38fcaSMauro Carvalho Chehab"NTSC-M" and "SECAM-D/K". [#f1]_
3754f38fcaSMauro Carvalho Chehab
3854f38fcaSMauro Carvalho ChehabTo query and select the standard used by the current video input or
3954f38fcaSMauro Carvalho Chehaboutput applications call the :ref:`VIDIOC_G_STD <VIDIOC_G_STD>` and
4054f38fcaSMauro Carvalho Chehab:ref:`VIDIOC_S_STD <VIDIOC_G_STD>` ioctl, respectively. The
4154f38fcaSMauro Carvalho Chehab*received* standard can be sensed with the
4254f38fcaSMauro Carvalho Chehab:ref:`VIDIOC_QUERYSTD` ioctl.
4354f38fcaSMauro Carvalho Chehab
4454f38fcaSMauro Carvalho Chehab.. note::
4554f38fcaSMauro Carvalho Chehab
4654f38fcaSMauro Carvalho Chehab   The parameter of all these ioctls is a pointer to a
4754f38fcaSMauro Carvalho Chehab   :ref:`v4l2_std_id <v4l2-std-id>` type (a standard set), *not* an
4854f38fcaSMauro Carvalho Chehab   index into the standard enumeration. Drivers must implement all video
4954f38fcaSMauro Carvalho Chehab   standard ioctls when the device has one or more video inputs or outputs.
5054f38fcaSMauro Carvalho Chehab
5154f38fcaSMauro Carvalho ChehabSpecial rules apply to devices such as USB cameras where the notion of
5254f38fcaSMauro Carvalho Chehabvideo standards makes little sense. More generally for any capture or
5354f38fcaSMauro Carvalho Chehaboutput device which is:
5454f38fcaSMauro Carvalho Chehab
5554f38fcaSMauro Carvalho Chehab-  incapable of capturing fields or frames at the nominal rate of the
5654f38fcaSMauro Carvalho Chehab   video standard, or
5754f38fcaSMauro Carvalho Chehab
5854f38fcaSMauro Carvalho Chehab-  that does not support the video standard formats at all.
5954f38fcaSMauro Carvalho Chehab
6054f38fcaSMauro Carvalho ChehabHere the driver shall set the ``std`` field of struct
6154f38fcaSMauro Carvalho Chehab:c:type:`v4l2_input` and struct
6254f38fcaSMauro Carvalho Chehab:c:type:`v4l2_output` to zero and the :ref:`VIDIOC_G_STD <VIDIOC_G_STD>`,
6354f38fcaSMauro Carvalho Chehab:ref:`VIDIOC_S_STD <VIDIOC_G_STD>`, :ref:`VIDIOC_QUERYSTD` and :ref:`VIDIOC_ENUMSTD` ioctls
6454f38fcaSMauro Carvalho Chehabshall return the ``ENOTTY`` error code or the ``EINVAL`` error code.
6554f38fcaSMauro Carvalho Chehab
6654f38fcaSMauro Carvalho ChehabApplications can make use of the :ref:`input-capabilities` and
6754f38fcaSMauro Carvalho Chehab:ref:`output-capabilities` flags to determine whether the video
6854f38fcaSMauro Carvalho Chehabstandard ioctls can be used with the given input or output.
6954f38fcaSMauro Carvalho Chehab
7054f38fcaSMauro Carvalho ChehabExample: Information about the current video standard
7154f38fcaSMauro Carvalho Chehab=====================================================
7254f38fcaSMauro Carvalho Chehab
7354f38fcaSMauro Carvalho Chehab.. code-block:: c
7454f38fcaSMauro Carvalho Chehab
7554f38fcaSMauro Carvalho Chehab    v4l2_std_id std_id;
7654f38fcaSMauro Carvalho Chehab    struct v4l2_standard standard;
7754f38fcaSMauro Carvalho Chehab
7854f38fcaSMauro Carvalho Chehab    if (-1 == ioctl(fd, VIDIOC_G_STD, &std_id)) {
7954f38fcaSMauro Carvalho Chehab	/* Note when VIDIOC_ENUMSTD always returns ENOTTY this
8054f38fcaSMauro Carvalho Chehab	   is no video device or it falls under the USB exception,
8154f38fcaSMauro Carvalho Chehab	   and VIDIOC_G_STD returning ENOTTY is no error. */
8254f38fcaSMauro Carvalho Chehab
8354f38fcaSMauro Carvalho Chehab	perror("VIDIOC_G_STD");
8454f38fcaSMauro Carvalho Chehab	exit(EXIT_FAILURE);
8554f38fcaSMauro Carvalho Chehab    }
8654f38fcaSMauro Carvalho Chehab
8754f38fcaSMauro Carvalho Chehab    memset(&standard, 0, sizeof(standard));
8854f38fcaSMauro Carvalho Chehab    standard.index = 0;
8954f38fcaSMauro Carvalho Chehab
9054f38fcaSMauro Carvalho Chehab    while (0 == ioctl(fd, VIDIOC_ENUMSTD, &standard)) {
9154f38fcaSMauro Carvalho Chehab	if (standard.id & std_id) {
9254f38fcaSMauro Carvalho Chehab	       printf("Current video standard: %s\\n", standard.name);
9354f38fcaSMauro Carvalho Chehab	       exit(EXIT_SUCCESS);
9454f38fcaSMauro Carvalho Chehab	}
9554f38fcaSMauro Carvalho Chehab
9654f38fcaSMauro Carvalho Chehab	standard.index++;
9754f38fcaSMauro Carvalho Chehab    }
9854f38fcaSMauro Carvalho Chehab
9954f38fcaSMauro Carvalho Chehab    /* EINVAL indicates the end of the enumeration, which cannot be
10054f38fcaSMauro Carvalho Chehab       empty unless this device falls under the USB exception. */
10154f38fcaSMauro Carvalho Chehab
10254f38fcaSMauro Carvalho Chehab    if (errno == EINVAL || standard.index == 0) {
10354f38fcaSMauro Carvalho Chehab	perror("VIDIOC_ENUMSTD");
10454f38fcaSMauro Carvalho Chehab	exit(EXIT_FAILURE);
10554f38fcaSMauro Carvalho Chehab    }
10654f38fcaSMauro Carvalho Chehab
10754f38fcaSMauro Carvalho ChehabExample: Listing the video standards supported by the current input
10854f38fcaSMauro Carvalho Chehab===================================================================
10954f38fcaSMauro Carvalho Chehab
11054f38fcaSMauro Carvalho Chehab.. code-block:: c
11154f38fcaSMauro Carvalho Chehab
11254f38fcaSMauro Carvalho Chehab    struct v4l2_input input;
11354f38fcaSMauro Carvalho Chehab    struct v4l2_standard standard;
11454f38fcaSMauro Carvalho Chehab
11554f38fcaSMauro Carvalho Chehab    memset(&input, 0, sizeof(input));
11654f38fcaSMauro Carvalho Chehab
11754f38fcaSMauro Carvalho Chehab    if (-1 == ioctl(fd, VIDIOC_G_INPUT, &input.index)) {
11854f38fcaSMauro Carvalho Chehab	perror("VIDIOC_G_INPUT");
11954f38fcaSMauro Carvalho Chehab	exit(EXIT_FAILURE);
12054f38fcaSMauro Carvalho Chehab    }
12154f38fcaSMauro Carvalho Chehab
12254f38fcaSMauro Carvalho Chehab    if (-1 == ioctl(fd, VIDIOC_ENUMINPUT, &input)) {
12354f38fcaSMauro Carvalho Chehab	perror("VIDIOC_ENUM_INPUT");
12454f38fcaSMauro Carvalho Chehab	exit(EXIT_FAILURE);
12554f38fcaSMauro Carvalho Chehab    }
12654f38fcaSMauro Carvalho Chehab
12754f38fcaSMauro Carvalho Chehab    printf("Current input %s supports:\\n", input.name);
12854f38fcaSMauro Carvalho Chehab
12954f38fcaSMauro Carvalho Chehab    memset(&standard, 0, sizeof(standard));
13054f38fcaSMauro Carvalho Chehab    standard.index = 0;
13154f38fcaSMauro Carvalho Chehab
13254f38fcaSMauro Carvalho Chehab    while (0 == ioctl(fd, VIDIOC_ENUMSTD, &standard)) {
13354f38fcaSMauro Carvalho Chehab	if (standard.id & input.std)
13454f38fcaSMauro Carvalho Chehab	    printf("%s\\n", standard.name);
13554f38fcaSMauro Carvalho Chehab
13654f38fcaSMauro Carvalho Chehab	standard.index++;
13754f38fcaSMauro Carvalho Chehab    }
13854f38fcaSMauro Carvalho Chehab
13954f38fcaSMauro Carvalho Chehab    /* EINVAL indicates the end of the enumeration, which cannot be
14054f38fcaSMauro Carvalho Chehab       empty unless this device falls under the USB exception. */
14154f38fcaSMauro Carvalho Chehab
14254f38fcaSMauro Carvalho Chehab    if (errno != EINVAL || standard.index == 0) {
14354f38fcaSMauro Carvalho Chehab	perror("VIDIOC_ENUMSTD");
14454f38fcaSMauro Carvalho Chehab	exit(EXIT_FAILURE);
14554f38fcaSMauro Carvalho Chehab    }
14654f38fcaSMauro Carvalho Chehab
14754f38fcaSMauro Carvalho ChehabExample: Selecting a new video standard
14854f38fcaSMauro Carvalho Chehab=======================================
14954f38fcaSMauro Carvalho Chehab
15054f38fcaSMauro Carvalho Chehab.. code-block:: c
15154f38fcaSMauro Carvalho Chehab
15254f38fcaSMauro Carvalho Chehab    struct v4l2_input input;
15354f38fcaSMauro Carvalho Chehab    v4l2_std_id std_id;
15454f38fcaSMauro Carvalho Chehab
15554f38fcaSMauro Carvalho Chehab    memset(&input, 0, sizeof(input));
15654f38fcaSMauro Carvalho Chehab
15754f38fcaSMauro Carvalho Chehab    if (-1 == ioctl(fd, VIDIOC_G_INPUT, &input.index)) {
15854f38fcaSMauro Carvalho Chehab	perror("VIDIOC_G_INPUT");
15954f38fcaSMauro Carvalho Chehab	exit(EXIT_FAILURE);
16054f38fcaSMauro Carvalho Chehab    }
16154f38fcaSMauro Carvalho Chehab
16254f38fcaSMauro Carvalho Chehab    if (-1 == ioctl(fd, VIDIOC_ENUMINPUT, &input)) {
16354f38fcaSMauro Carvalho Chehab	perror("VIDIOC_ENUM_INPUT");
16454f38fcaSMauro Carvalho Chehab	exit(EXIT_FAILURE);
16554f38fcaSMauro Carvalho Chehab    }
16654f38fcaSMauro Carvalho Chehab
16754f38fcaSMauro Carvalho Chehab    if (0 == (input.std & V4L2_STD_PAL_BG)) {
16854f38fcaSMauro Carvalho Chehab	fprintf(stderr, "Oops. B/G PAL is not supported.\\n");
16954f38fcaSMauro Carvalho Chehab	exit(EXIT_FAILURE);
17054f38fcaSMauro Carvalho Chehab    }
17154f38fcaSMauro Carvalho Chehab
17254f38fcaSMauro Carvalho Chehab    /* Note this is also supposed to work when only B
17354f38fcaSMauro Carvalho Chehab       or G/PAL is supported. */
17454f38fcaSMauro Carvalho Chehab
17554f38fcaSMauro Carvalho Chehab    std_id = V4L2_STD_PAL_BG;
17654f38fcaSMauro Carvalho Chehab
17754f38fcaSMauro Carvalho Chehab    if (-1 == ioctl(fd, VIDIOC_S_STD, &std_id)) {
17854f38fcaSMauro Carvalho Chehab	perror("VIDIOC_S_STD");
17954f38fcaSMauro Carvalho Chehab	exit(EXIT_FAILURE);
18054f38fcaSMauro Carvalho Chehab    }
18154f38fcaSMauro Carvalho Chehab
18254f38fcaSMauro Carvalho Chehab.. [#f1]
18354f38fcaSMauro Carvalho Chehab   Some users are already confused by technical terms PAL, NTSC and
18454f38fcaSMauro Carvalho Chehab   SECAM. There is no point asking them to distinguish between B, G, D,
18554f38fcaSMauro Carvalho Chehab   or K when the software or hardware can do that automatically.
186