2020-08-26 09:03:09 +02:00
|
|
|
.. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later
|
2020-09-24 14:04:26 +02:00
|
|
|
.. c:namespace:: V4L
|
2018-08-30 10:15:26 -04:00
|
|
|
|
2016-07-01 13:42:29 -03:00
|
|
|
.. _VIDIOC_ENUM_FMT:
|
2016-06-30 15:18:56 +02:00
|
|
|
|
|
|
|
*********************
|
|
|
|
ioctl VIDIOC_ENUM_FMT
|
|
|
|
*********************
|
|
|
|
|
2016-07-05 15:14:35 -03:00
|
|
|
Name
|
2016-07-05 07:58:48 -03:00
|
|
|
====
|
2016-06-30 15:18:56 +02:00
|
|
|
|
2016-07-05 07:58:48 -03:00
|
|
|
VIDIOC_ENUM_FMT - Enumerate image formats
|
2016-06-30 15:18:56 +02:00
|
|
|
|
2016-07-05 15:14:35 -03:00
|
|
|
Synopsis
|
2016-06-30 15:18:56 +02:00
|
|
|
========
|
|
|
|
|
2020-09-24 14:04:26 +02:00
|
|
|
.. c:macro:: VIDIOC_ENUM_FMT
|
2016-06-30 15:18:56 +02:00
|
|
|
|
2020-09-24 14:04:26 +02:00
|
|
|
``int ioctl(int fd, VIDIOC_ENUM_FMT, struct v4l2_fmtdesc *argp)``
|
2016-07-05 07:58:48 -03:00
|
|
|
|
2016-07-05 15:14:35 -03:00
|
|
|
Arguments
|
2016-06-30 15:18:56 +02:00
|
|
|
=========
|
|
|
|
|
|
|
|
``fd``
|
2020-09-24 14:04:26 +02:00
|
|
|
File descriptor returned by :c:func:`open()`.
|
2016-06-30 15:18:56 +02:00
|
|
|
|
|
|
|
``argp``
|
2017-09-02 09:54:48 -04:00
|
|
|
Pointer to struct :c:type:`v4l2_fmtdesc`.
|
2016-06-30 15:18:56 +02:00
|
|
|
|
2016-07-05 15:14:35 -03:00
|
|
|
Description
|
2016-06-30 15:18:56 +02:00
|
|
|
===========
|
|
|
|
|
2020-05-06 14:16:00 +02:00
|
|
|
To enumerate image formats applications initialize the ``type``, ``mbus_code``
|
|
|
|
and ``index`` fields of struct :c:type:`v4l2_fmtdesc` and call
|
2016-07-01 14:33:56 -03:00
|
|
|
the :ref:`VIDIOC_ENUM_FMT` ioctl with a pointer to this structure. Drivers
|
2016-07-03 11:53:09 -03:00
|
|
|
fill the rest of the structure or return an ``EINVAL`` error code. All
|
2016-06-30 15:18:56 +02:00
|
|
|
formats are enumerable by beginning at index zero and incrementing by
|
2019-12-05 15:24:40 +01:00
|
|
|
one until ``EINVAL`` is returned. If applicable, drivers shall return
|
|
|
|
formats in preference order, where preferred formats are returned before
|
|
|
|
(that is, with lower ``index`` value) less-preferred formats.
|
2016-06-30 15:18:56 +02:00
|
|
|
|
2020-05-06 14:16:00 +02:00
|
|
|
Depending on the ``V4L2_CAP_IO_MC`` :ref:`capability <device-capabilities>`,
|
|
|
|
the ``mbus_code`` field is handled differently:
|
media: v4l2: Extend VIDIOC_ENUM_FMT to support MC-centric devices
The VIDIOC_ENUM_FMT ioctl enumerates all formats supported by a video
node. For MC-centric devices, its behaviour has always been ill-defined,
with drivers implementing one of the following behaviours:
- No support for VIDIOC_ENUM_FMT at all
- Enumerating all formats supported by the video node, regardless of the
configuration of the pipeline
- Enumerating formats supported by the video node for the active
configuration of the connected subdevice
The first behaviour is obviously useless for applications. The second
behaviour provides the most information, but doesn't offer a way to find
what formats are compatible with a given pipeline configuration. The
third behaviour fixes that, but with the drawback that applications
can't enumerate all supported formats anymore, and have to modify the
active configuration of the pipeline to enumerate formats.
The situation is messy as none of the implemented behaviours are ideal,
and userspace can't predict what will happen as the behaviour is
driver-specific.
To fix this, let's extend the VIDIOC_ENUM_FMT with a missing capability:
enumerating pixel formats for a given media bus code. The media bus code
is passed through the v4l2_fmtdesc structure in a new mbus_code field
(repurposed from the reserved fields). With this capability in place,
applications can enumerate pixel formats for a given media bus code
without modifying the active configuration of the device.
The current behaviour of the ioctl is preserved when the new mbus_code
field is set to 0, ensuring compatibility with existing userspace. The
API extension is documented as mandatory for MC-centric devices (as
advertised through the V4L2_CAP_IO_MC capability), allowing applications
and compliance tools to easily determine the availability of the
VIDIOC_ENUM_FMT extension.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Acked-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
2020-04-24 15:43:31 +02:00
|
|
|
|
2020-05-06 14:16:00 +02:00
|
|
|
1) ``V4L2_CAP_IO_MC`` is not set (also known as a 'video-node-centric' driver)
|
|
|
|
|
|
|
|
Applications shall initialize the ``mbus_code`` field to zero and drivers
|
|
|
|
shall ignore the value of the field.
|
|
|
|
|
|
|
|
Drivers shall enumerate all image formats.
|
|
|
|
|
|
|
|
.. note::
|
|
|
|
|
|
|
|
After switching the input or output the list of enumerated image
|
|
|
|
formats may be different.
|
|
|
|
|
|
|
|
2) ``V4L2_CAP_IO_MC`` is set (also known as an 'MC-centric' driver)
|
|
|
|
|
|
|
|
If the ``mbus_code`` field is zero, then all image formats
|
|
|
|
shall be enumerated.
|
|
|
|
|
|
|
|
If the ``mbus_code`` field is initialized to a valid (non-zero)
|
|
|
|
:ref:`media bus format code <v4l2-mbus-pixelcode>`, then drivers
|
|
|
|
shall restrict enumeration to only the image formats that can produce
|
|
|
|
(for video output devices) or be produced from (for video capture
|
|
|
|
devices) that media bus code. If the ``mbus_code`` is unsupported by
|
|
|
|
the driver, then ``EINVAL`` shall be returned.
|
|
|
|
|
|
|
|
Regardless of the value of the ``mbus_code`` field, the enumerated image
|
|
|
|
formats shall not depend on the active configuration of the video device
|
|
|
|
or device pipeline.
|
2016-06-30 15:18:56 +02:00
|
|
|
|
2016-08-29 17:37:59 -03:00
|
|
|
.. c:type:: v4l2_fmtdesc
|
2016-08-19 11:14:23 -03:00
|
|
|
|
2020-12-10 11:39:46 +01:00
|
|
|
.. cssclass:: longtable
|
|
|
|
|
|
|
|
.. tabularcolumns:: |p{4.4cm}|p{4.4cm}|p{8.5cm}|
|
|
|
|
|
2016-06-30 15:18:56 +02:00
|
|
|
.. flat-table:: struct v4l2_fmtdesc
|
|
|
|
:header-rows: 0
|
|
|
|
:stub-columns: 0
|
|
|
|
:widths: 1 1 2
|
|
|
|
|
[media] v4l: doc: Remove row numbers from tables
Shorten the tables by removing row numbers in comments, allowing for
later insertion of rows with minimal diffs.
All changes have been generated by the following script.
import io
import re
import sys
def process_table(fname, data):
if fname.endswith('hist-v4l2.rst'):
data = re.sub(u'\n{1,2}\t( ?) -( ?) ?', u'\n\t\\1 -\\2', data, flags = re.MULTILINE)
data = re.sub(u'\n(\t| )- \.\. row [0-9]+\n\t ?-( ?) ?', u'\\1* -\\2', data, flags = re.MULTILINE)
else:
data = re.sub(u'\n{1,2} -( ?) ?', u'\n -\\1', data, flags = re.MULTILINE)
data = re.sub(u'(\n?)(\n\n - \.\. row 1\n)', u'\n\\2', data, flags = re.MULTILINE)
data = re.sub(u'\n - \.\. row [0-9]+\n -( ?) ?', u' * -\\1', data, flags = re.MULTILINE)
data = re.sub(u'\n - \.\. row [0-9]+\n \.\. (_[A-Z0-9_`-]*:)', u'\n - .. \\1', data, flags = re.MULTILINE)
data = re.sub(u'\n - \.\. (_[A-Z0-9_`-]*:)\n -', u' * .. \\1\n\n -', data, flags = re.MULTILINE)
data = re.sub(u'^ - ', u' -', data, flags = re.MULTILINE)
data = re.sub(u'^(\t{1,2}) ', u'\\1', data, flags = re.MULTILINE)
return data
def process_file(fname, data):
buf = io.StringIO(data)
output = ''
in_table = False
table_separator = 0
for line in buf.readlines():
if line.find('.. flat-table::') != -1:
in_table = True
table = ''
elif in_table and not re.match('^[\t\n]|( )', line):
in_table = False
output += process_table(fname, table)
if in_table:
table += line
else:
output += line
if in_table:
in_table = False
output += process_table(fname, table)
return output
fname = sys.argv[1]
data = file(fname, 'rb').read().decode('utf-8')
data = process_file(fname, data)
file(fname, 'wb').write(data.encode('utf-8'))
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2016-09-05 08:44:34 -03:00
|
|
|
* - __u32
|
|
|
|
- ``index``
|
|
|
|
- Number of the format in the enumeration, set by the application.
|
2024-08-26 17:24:09 +00:00
|
|
|
This is in no way related to the ``pixelformat`` field.
|
|
|
|
When the index is ORed with ``V4L2_FMTDESC_FLAG_ENUM_ALL`` the
|
|
|
|
driver clears the flag and enumerates all the possible formats,
|
|
|
|
ignoring any limitations from the current configuration. Drivers
|
|
|
|
which do not support this flag always return an ``EINVAL``
|
|
|
|
error code without clearing this flag.
|
|
|
|
Formats enumerated when using ``V4L2_FMTDESC_FLAG_ENUM_ALL`` flag
|
|
|
|
shouldn't be used when calling :c:func:`VIDIOC_ENUM_FRAMESIZES`
|
|
|
|
or :c:func:`VIDIOC_ENUM_FRAMEINTERVALS`.
|
|
|
|
``V4L2_FMTDESC_FLAG_ENUM_ALL`` should only be used by drivers that
|
|
|
|
can return different format list depending on this flag.
|
[media] v4l: doc: Remove row numbers from tables
Shorten the tables by removing row numbers in comments, allowing for
later insertion of rows with minimal diffs.
All changes have been generated by the following script.
import io
import re
import sys
def process_table(fname, data):
if fname.endswith('hist-v4l2.rst'):
data = re.sub(u'\n{1,2}\t( ?) -( ?) ?', u'\n\t\\1 -\\2', data, flags = re.MULTILINE)
data = re.sub(u'\n(\t| )- \.\. row [0-9]+\n\t ?-( ?) ?', u'\\1* -\\2', data, flags = re.MULTILINE)
else:
data = re.sub(u'\n{1,2} -( ?) ?', u'\n -\\1', data, flags = re.MULTILINE)
data = re.sub(u'(\n?)(\n\n - \.\. row 1\n)', u'\n\\2', data, flags = re.MULTILINE)
data = re.sub(u'\n - \.\. row [0-9]+\n -( ?) ?', u' * -\\1', data, flags = re.MULTILINE)
data = re.sub(u'\n - \.\. row [0-9]+\n \.\. (_[A-Z0-9_`-]*:)', u'\n - .. \\1', data, flags = re.MULTILINE)
data = re.sub(u'\n - \.\. (_[A-Z0-9_`-]*:)\n -', u' * .. \\1\n\n -', data, flags = re.MULTILINE)
data = re.sub(u'^ - ', u' -', data, flags = re.MULTILINE)
data = re.sub(u'^(\t{1,2}) ', u'\\1', data, flags = re.MULTILINE)
return data
def process_file(fname, data):
buf = io.StringIO(data)
output = ''
in_table = False
table_separator = 0
for line in buf.readlines():
if line.find('.. flat-table::') != -1:
in_table = True
table = ''
elif in_table and not re.match('^[\t\n]|( )', line):
in_table = False
output += process_table(fname, table)
if in_table:
table += line
else:
output += line
if in_table:
in_table = False
output += process_table(fname, table)
return output
fname = sys.argv[1]
data = file(fname, 'rb').read().decode('utf-8')
data = process_file(fname, data)
file(fname, 'wb').write(data.encode('utf-8'))
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2016-09-05 08:44:34 -03:00
|
|
|
* - __u32
|
|
|
|
- ``type``
|
|
|
|
- Type of the data stream, set by the application. Only these types
|
|
|
|
are valid here: ``V4L2_BUF_TYPE_VIDEO_CAPTURE``,
|
|
|
|
``V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE``,
|
|
|
|
``V4L2_BUF_TYPE_VIDEO_OUTPUT``,
|
2018-11-18 05:17:07 -05:00
|
|
|
``V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE``,
|
|
|
|
``V4L2_BUF_TYPE_VIDEO_OVERLAY``,
|
|
|
|
``V4L2_BUF_TYPE_SDR_CAPTURE``,
|
2020-05-06 14:16:00 +02:00
|
|
|
``V4L2_BUF_TYPE_SDR_OUTPUT``,
|
|
|
|
``V4L2_BUF_TYPE_META_CAPTURE`` and
|
|
|
|
``V4L2_BUF_TYPE_META_OUTPUT``.
|
2018-11-18 05:17:07 -05:00
|
|
|
See :c:type:`v4l2_buf_type`.
|
[media] v4l: doc: Remove row numbers from tables
Shorten the tables by removing row numbers in comments, allowing for
later insertion of rows with minimal diffs.
All changes have been generated by the following script.
import io
import re
import sys
def process_table(fname, data):
if fname.endswith('hist-v4l2.rst'):
data = re.sub(u'\n{1,2}\t( ?) -( ?) ?', u'\n\t\\1 -\\2', data, flags = re.MULTILINE)
data = re.sub(u'\n(\t| )- \.\. row [0-9]+\n\t ?-( ?) ?', u'\\1* -\\2', data, flags = re.MULTILINE)
else:
data = re.sub(u'\n{1,2} -( ?) ?', u'\n -\\1', data, flags = re.MULTILINE)
data = re.sub(u'(\n?)(\n\n - \.\. row 1\n)', u'\n\\2', data, flags = re.MULTILINE)
data = re.sub(u'\n - \.\. row [0-9]+\n -( ?) ?', u' * -\\1', data, flags = re.MULTILINE)
data = re.sub(u'\n - \.\. row [0-9]+\n \.\. (_[A-Z0-9_`-]*:)', u'\n - .. \\1', data, flags = re.MULTILINE)
data = re.sub(u'\n - \.\. (_[A-Z0-9_`-]*:)\n -', u' * .. \\1\n\n -', data, flags = re.MULTILINE)
data = re.sub(u'^ - ', u' -', data, flags = re.MULTILINE)
data = re.sub(u'^(\t{1,2}) ', u'\\1', data, flags = re.MULTILINE)
return data
def process_file(fname, data):
buf = io.StringIO(data)
output = ''
in_table = False
table_separator = 0
for line in buf.readlines():
if line.find('.. flat-table::') != -1:
in_table = True
table = ''
elif in_table and not re.match('^[\t\n]|( )', line):
in_table = False
output += process_table(fname, table)
if in_table:
table += line
else:
output += line
if in_table:
in_table = False
output += process_table(fname, table)
return output
fname = sys.argv[1]
data = file(fname, 'rb').read().decode('utf-8')
data = process_file(fname, data)
file(fname, 'wb').write(data.encode('utf-8'))
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2016-09-05 08:44:34 -03:00
|
|
|
* - __u32
|
|
|
|
- ``flags``
|
|
|
|
- See :ref:`fmtdesc-flags`
|
|
|
|
* - __u8
|
|
|
|
- ``description``\ [32]
|
|
|
|
- Description of the format, a NUL-terminated ASCII string. This
|
|
|
|
information is intended for the user, for example: "YUV 4:2:2".
|
|
|
|
* - __u32
|
|
|
|
- ``pixelformat``
|
|
|
|
- The image format identifier. This is a four character code as
|
|
|
|
computed by the v4l2_fourcc() macro:
|
|
|
|
* - :cspan:`2`
|
|
|
|
|
|
|
|
.. _v4l2-fourcc:
|
|
|
|
|
|
|
|
``#define v4l2_fourcc(a,b,c,d)``
|
|
|
|
|
|
|
|
``(((__u32)(a)<<0)|((__u32)(b)<<8)|((__u32)(c)<<16)|((__u32)(d)<<24))``
|
|
|
|
|
|
|
|
Several image formats are already defined by this specification in
|
|
|
|
:ref:`pixfmt`.
|
|
|
|
|
|
|
|
.. attention::
|
|
|
|
|
|
|
|
These codes are not the same as those used
|
|
|
|
in the Windows world.
|
|
|
|
* - __u32
|
media: v4l2: Extend VIDIOC_ENUM_FMT to support MC-centric devices
The VIDIOC_ENUM_FMT ioctl enumerates all formats supported by a video
node. For MC-centric devices, its behaviour has always been ill-defined,
with drivers implementing one of the following behaviours:
- No support for VIDIOC_ENUM_FMT at all
- Enumerating all formats supported by the video node, regardless of the
configuration of the pipeline
- Enumerating formats supported by the video node for the active
configuration of the connected subdevice
The first behaviour is obviously useless for applications. The second
behaviour provides the most information, but doesn't offer a way to find
what formats are compatible with a given pipeline configuration. The
third behaviour fixes that, but with the drawback that applications
can't enumerate all supported formats anymore, and have to modify the
active configuration of the pipeline to enumerate formats.
The situation is messy as none of the implemented behaviours are ideal,
and userspace can't predict what will happen as the behaviour is
driver-specific.
To fix this, let's extend the VIDIOC_ENUM_FMT with a missing capability:
enumerating pixel formats for a given media bus code. The media bus code
is passed through the v4l2_fmtdesc structure in a new mbus_code field
(repurposed from the reserved fields). With this capability in place,
applications can enumerate pixel formats for a given media bus code
without modifying the active configuration of the device.
The current behaviour of the ioctl is preserved when the new mbus_code
field is set to 0, ensuring compatibility with existing userspace. The
API extension is documented as mandatory for MC-centric devices (as
advertised through the V4L2_CAP_IO_MC capability), allowing applications
and compliance tools to easily determine the availability of the
VIDIOC_ENUM_FMT extension.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Acked-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
2020-04-24 15:43:31 +02:00
|
|
|
- ``mbus_code``
|
|
|
|
- Media bus code restricting the enumerated formats, set by the
|
|
|
|
application. Only applicable to drivers that advertise the
|
|
|
|
``V4L2_CAP_IO_MC`` :ref:`capability <device-capabilities>`, shall be 0
|
|
|
|
otherwise.
|
|
|
|
* - __u32
|
|
|
|
- ``reserved``\ [3]
|
[media] v4l: doc: Remove row numbers from tables
Shorten the tables by removing row numbers in comments, allowing for
later insertion of rows with minimal diffs.
All changes have been generated by the following script.
import io
import re
import sys
def process_table(fname, data):
if fname.endswith('hist-v4l2.rst'):
data = re.sub(u'\n{1,2}\t( ?) -( ?) ?', u'\n\t\\1 -\\2', data, flags = re.MULTILINE)
data = re.sub(u'\n(\t| )- \.\. row [0-9]+\n\t ?-( ?) ?', u'\\1* -\\2', data, flags = re.MULTILINE)
else:
data = re.sub(u'\n{1,2} -( ?) ?', u'\n -\\1', data, flags = re.MULTILINE)
data = re.sub(u'(\n?)(\n\n - \.\. row 1\n)', u'\n\\2', data, flags = re.MULTILINE)
data = re.sub(u'\n - \.\. row [0-9]+\n -( ?) ?', u' * -\\1', data, flags = re.MULTILINE)
data = re.sub(u'\n - \.\. row [0-9]+\n \.\. (_[A-Z0-9_`-]*:)', u'\n - .. \\1', data, flags = re.MULTILINE)
data = re.sub(u'\n - \.\. (_[A-Z0-9_`-]*:)\n -', u' * .. \\1\n\n -', data, flags = re.MULTILINE)
data = re.sub(u'^ - ', u' -', data, flags = re.MULTILINE)
data = re.sub(u'^(\t{1,2}) ', u'\\1', data, flags = re.MULTILINE)
return data
def process_file(fname, data):
buf = io.StringIO(data)
output = ''
in_table = False
table_separator = 0
for line in buf.readlines():
if line.find('.. flat-table::') != -1:
in_table = True
table = ''
elif in_table and not re.match('^[\t\n]|( )', line):
in_table = False
output += process_table(fname, table)
if in_table:
table += line
else:
output += line
if in_table:
in_table = False
output += process_table(fname, table)
return output
fname = sys.argv[1]
data = file(fname, 'rb').read().decode('utf-8')
data = process_file(fname, data)
file(fname, 'wb').write(data.encode('utf-8'))
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2016-09-05 08:44:34 -03:00
|
|
|
- Reserved for future extensions. Drivers must set the array to
|
|
|
|
zero.
|
2016-06-30 15:18:56 +02:00
|
|
|
|
|
|
|
|
2020-12-10 11:39:46 +01:00
|
|
|
.. tabularcolumns:: |p{8.4cm}|p{1.8cm}|p{7.1cm}|
|
|
|
|
|
|
|
|
.. cssclass:: longtable
|
[media] docs-rst: add tabularcolumns to all tables
LaTeX doesn't handle too well auto-width on tables, and ReST
markup requires an special tag to give it the needed hints.
As we're using A4 paper, we have 17cm of useful spaces. As
most media tables have widths, let's use it to generate the
needed via the following perl script:
my ($line_size, $table_header, $has_cols) = (17.5, 0, 0);
my $out;
my $header = "";
my @widths = ();
sub round { $_[0] > 0 ? int($_[0] + .5) : -int(-$_[0] + .5) }
while (<>) {
if (!$table_header) {
$has_cols = 1 if (m/..\s+tabularcolumns::/);
if (m/..\s+flat-table::/) {
$table_header = 1;
$header = $_;
next;
}
$out .= $_;
next;
}
$header .= $_;
@widths = split(/ /, $1) if (m/:widths:\s+(.*)/);
if (m/^\n$/) {
if (!$has_cols && @widths) {
my ($tot, $t, $i) = (0, 0, 0);
foreach my $v(@widths) { $tot += $v; };
$out .= ".. tabularcolumns:: |";
for ($i = 0; $i < scalar @widths - 1; $i++) {
my $v = $widths[$i];
my $w = round(10 * ($v * $line_size) / $tot) / 10;
$out .= sprintf "p{%.1fcm}|", $w;
$t += $w;
}
my $w = $line_size - $t;
$out .= sprintf "p{%.1fcm}|\n\n", $w;
}
$out .= $header;
$table_header = 0;
$has_cols = 0;
$header = "";
@widths = ();
}
}
print $out;
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-08-17 08:14:19 -03:00
|
|
|
|
2016-08-19 11:14:23 -03:00
|
|
|
.. _fmtdesc-flags:
|
|
|
|
|
2016-06-30 15:18:56 +02:00
|
|
|
.. flat-table:: Image Format Description Flags
|
|
|
|
:header-rows: 0
|
|
|
|
:stub-columns: 0
|
|
|
|
:widths: 3 1 4
|
|
|
|
|
[media] v4l: doc: Remove row numbers from tables
Shorten the tables by removing row numbers in comments, allowing for
later insertion of rows with minimal diffs.
All changes have been generated by the following script.
import io
import re
import sys
def process_table(fname, data):
if fname.endswith('hist-v4l2.rst'):
data = re.sub(u'\n{1,2}\t( ?) -( ?) ?', u'\n\t\\1 -\\2', data, flags = re.MULTILINE)
data = re.sub(u'\n(\t| )- \.\. row [0-9]+\n\t ?-( ?) ?', u'\\1* -\\2', data, flags = re.MULTILINE)
else:
data = re.sub(u'\n{1,2} -( ?) ?', u'\n -\\1', data, flags = re.MULTILINE)
data = re.sub(u'(\n?)(\n\n - \.\. row 1\n)', u'\n\\2', data, flags = re.MULTILINE)
data = re.sub(u'\n - \.\. row [0-9]+\n -( ?) ?', u' * -\\1', data, flags = re.MULTILINE)
data = re.sub(u'\n - \.\. row [0-9]+\n \.\. (_[A-Z0-9_`-]*:)', u'\n - .. \\1', data, flags = re.MULTILINE)
data = re.sub(u'\n - \.\. (_[A-Z0-9_`-]*:)\n -', u' * .. \\1\n\n -', data, flags = re.MULTILINE)
data = re.sub(u'^ - ', u' -', data, flags = re.MULTILINE)
data = re.sub(u'^(\t{1,2}) ', u'\\1', data, flags = re.MULTILINE)
return data
def process_file(fname, data):
buf = io.StringIO(data)
output = ''
in_table = False
table_separator = 0
for line in buf.readlines():
if line.find('.. flat-table::') != -1:
in_table = True
table = ''
elif in_table and not re.match('^[\t\n]|( )', line):
in_table = False
output += process_table(fname, table)
if in_table:
table += line
else:
output += line
if in_table:
in_table = False
output += process_table(fname, table)
return output
fname = sys.argv[1]
data = file(fname, 'rb').read().decode('utf-8')
data = process_file(fname, data)
file(fname, 'wb').write(data.encode('utf-8'))
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2016-09-05 08:44:34 -03:00
|
|
|
* - ``V4L2_FMT_FLAG_COMPRESSED``
|
|
|
|
- 0x0001
|
|
|
|
- This is a compressed format.
|
|
|
|
* - ``V4L2_FMT_FLAG_EMULATED``
|
|
|
|
- 0x0002
|
|
|
|
- This format is not native to the device but emulated through
|
|
|
|
software (usually libv4l2), where possible try to use a native
|
|
|
|
format instead for better performance.
|
2019-08-15 11:44:45 -03:00
|
|
|
* - ``V4L2_FMT_FLAG_CONTINUOUS_BYTESTREAM``
|
|
|
|
- 0x0004
|
|
|
|
- The hardware decoder for this compressed bytestream format (aka coded
|
|
|
|
format) is capable of parsing a continuous bytestream. Applications do
|
|
|
|
not need to parse the bytestream themselves to find the boundaries
|
2020-05-26 10:59:53 +02:00
|
|
|
between frames/fields.
|
|
|
|
|
|
|
|
This flag can only be used in combination with the
|
|
|
|
``V4L2_FMT_FLAG_COMPRESSED`` flag, since this applies to compressed
|
2019-08-15 11:44:45 -03:00
|
|
|
formats only. This flag is valid for stateful decoders only.
|
2019-08-15 11:44:46 -03:00
|
|
|
* - ``V4L2_FMT_FLAG_DYN_RESOLUTION``
|
|
|
|
- 0x0008
|
|
|
|
- Dynamic resolution switching is supported by the device for this
|
|
|
|
compressed bytestream format (aka coded format). It will notify the user
|
|
|
|
via the event ``V4L2_EVENT_SOURCE_CHANGE`` when changes in the video
|
2020-05-26 10:59:53 +02:00
|
|
|
parameters are detected.
|
|
|
|
|
|
|
|
This flag can only be used in combination with the
|
|
|
|
``V4L2_FMT_FLAG_COMPRESSED`` flag, since this applies to
|
|
|
|
compressed formats only. This flag is valid for stateful codecs only.
|
|
|
|
* - ``V4L2_FMT_FLAG_ENC_CAP_FRAME_INTERVAL``
|
|
|
|
- 0x0010
|
|
|
|
- The hardware encoder supports setting the ``CAPTURE`` coded frame
|
|
|
|
interval separately from the ``OUTPUT`` raw frame interval.
|
|
|
|
Setting the ``OUTPUT`` raw frame interval with :ref:`VIDIOC_S_PARM <VIDIOC_G_PARM>`
|
|
|
|
also sets the ``CAPTURE`` coded frame interval to the same value.
|
|
|
|
If this flag is set, then the ``CAPTURE`` coded frame interval can be
|
|
|
|
set to a different value afterwards. This is typically used for
|
|
|
|
offline encoding where the ``OUTPUT`` raw frame interval is used as
|
|
|
|
a hint for reserving hardware encoder resources and the ``CAPTURE`` coded
|
|
|
|
frame interval is the actual frame rate embedded in the encoded video
|
|
|
|
stream.
|
|
|
|
|
|
|
|
This flag can only be used in combination with the
|
|
|
|
``V4L2_FMT_FLAG_COMPRESSED`` flag, since this applies to
|
|
|
|
compressed formats only. This flag is valid for stateful encoders only.
|
media: v4l2: add support for colorspace conversion API (CSC) for video capture
For video capture it is the driver that reports the colorspace,
transfer function, Y'CbCr/HSV encoding and quantization range
used by the video, and there is no way to request something
different, even though many HDTV receivers have some sort of
colorspace conversion capabilities.
For output video this feature already exists since the application
specifies this information for the video format it will send out, and
the transmitter will enable any available CSC if a format conversion has
to be performed in order to match the capabilities of the sink.
For video capture we propose adding new v4l2_pix_format flag:
V4L2_PIX_FMT_FLAG_SET_CSC. The flag is set by the application,
the driver will interpret the colorspace, xfer_func, ycbcr_enc/hsv_enc
and quantization fields as the requested colorspace information and will
attempt to do the conversion it supports.
Drivers set the flags
V4L2_FMT_FLAG_CSC_COLORSPACE,
V4L2_FMT_FLAG_CSC_XFER_FUNC,
V4L2_FMT_FLAG_CSC_YCBCR_ENC/V4L2_FMT_FLAG_CSC_HSV_ENC,
V4L2_FMT_FLAG_CSC_QUANTIZATION,
in the flags field of the struct v4l2_fmtdesc during enumeration to
indicate that they support colorspace conversion for the respective field.
Drivers do not have to actually look at the flags. If the flags are not
set, then the fields 'colorspace', 'xfer_func', 'ycbcr_enc/hsv_enc',
and 'quantization' are set to the default values by the core, i.e. just
pass on the received format without conversion.
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Signed-off-by: Dafna Hirschfeld <dafna.hirschfeld@collabora.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
2020-08-27 21:46:08 +02:00
|
|
|
* - ``V4L2_FMT_FLAG_CSC_COLORSPACE``
|
|
|
|
- 0x0020
|
|
|
|
- The driver allows the application to try to change the default
|
|
|
|
colorspace. This flag is relevant only for capture devices.
|
|
|
|
The application can ask to configure the colorspace of the capture device
|
|
|
|
when calling the :ref:`VIDIOC_S_FMT <VIDIOC_G_FMT>` ioctl with
|
|
|
|
:ref:`V4L2_PIX_FMT_FLAG_SET_CSC <v4l2-pix-fmt-flag-set-csc>` set.
|
|
|
|
* - ``V4L2_FMT_FLAG_CSC_XFER_FUNC``
|
|
|
|
- 0x0040
|
|
|
|
- The driver allows the application to try to change the default
|
|
|
|
transfer function. This flag is relevant only for capture devices.
|
|
|
|
The application can ask to configure the transfer function of the capture
|
|
|
|
device when calling the :ref:`VIDIOC_S_FMT <VIDIOC_G_FMT>` ioctl with
|
|
|
|
:ref:`V4L2_PIX_FMT_FLAG_SET_CSC <v4l2-pix-fmt-flag-set-csc>` set.
|
|
|
|
* - ``V4L2_FMT_FLAG_CSC_YCBCR_ENC``
|
|
|
|
- 0x0080
|
|
|
|
- The driver allows the application to try to change the default
|
|
|
|
Y'CbCr encoding. This flag is relevant only for capture devices.
|
|
|
|
The application can ask to configure the Y'CbCr encoding of the capture device
|
|
|
|
when calling the :ref:`VIDIOC_S_FMT <VIDIOC_G_FMT>` ioctl with
|
|
|
|
:ref:`V4L2_PIX_FMT_FLAG_SET_CSC <v4l2-pix-fmt-flag-set-csc>` set.
|
|
|
|
* - ``V4L2_FMT_FLAG_CSC_HSV_ENC``
|
|
|
|
- 0x0080
|
|
|
|
- The driver allows the application to try to change the default
|
|
|
|
HSV encoding. This flag is relevant only for capture devices.
|
|
|
|
The application can ask to configure the HSV encoding of the capture device
|
|
|
|
when calling the :ref:`VIDIOC_S_FMT <VIDIOC_G_FMT>` ioctl with
|
|
|
|
:ref:`V4L2_PIX_FMT_FLAG_SET_CSC <v4l2-pix-fmt-flag-set-csc>` set.
|
|
|
|
* - ``V4L2_FMT_FLAG_CSC_QUANTIZATION``
|
|
|
|
- 0x0100
|
|
|
|
- The driver allows the application to try to change the default
|
|
|
|
quantization. This flag is relevant only for capture devices.
|
|
|
|
The application can ask to configure the quantization of the capture
|
|
|
|
device when calling the :ref:`VIDIOC_S_FMT <VIDIOC_G_FMT>` ioctl with
|
|
|
|
:ref:`V4L2_PIX_FMT_FLAG_SET_CSC <v4l2-pix-fmt-flag-set-csc>` set.
|
2023-02-21 19:37:29 +02:00
|
|
|
* - ``V4L2_FMT_FLAG_META_LINE_BASED``
|
|
|
|
- 0x0200
|
|
|
|
- The metadata format is line-based. In this case the ``width``,
|
|
|
|
``height`` and ``bytesperline`` fields of :c:type:`v4l2_meta_format` are
|
|
|
|
valid. The buffer consists of ``height`` lines, each having ``width``
|
|
|
|
Data Units of data and the offset (in bytes) between the beginning of
|
|
|
|
each two consecutive lines is ``bytesperline``.
|
2024-08-26 17:24:09 +00:00
|
|
|
* - ``V4L2_FMTDESC_FLAG_ENUM_ALL``
|
|
|
|
- 0x80000000
|
|
|
|
- When the applications ORs ``index`` with ``V4L2_FMTDESC_FLAG_ENUM_ALL`` flag
|
|
|
|
the driver enumerates all the possible pixel formats without taking care
|
|
|
|
of any already set configuration. Drivers which do not support this flag,
|
|
|
|
always return ``EINVAL`` without clearing this flag.
|
2016-06-30 15:18:56 +02:00
|
|
|
|
2016-07-05 15:14:35 -03:00
|
|
|
Return Value
|
2016-06-30 15:18:56 +02:00
|
|
|
============
|
|
|
|
|
|
|
|
On success 0 is returned, on error -1 and the ``errno`` variable is set
|
|
|
|
appropriately. The generic error codes are described at the
|
|
|
|
:ref:`Generic Error Codes <gen-errors>` chapter.
|
|
|
|
|
|
|
|
EINVAL
|
2016-08-29 17:37:59 -03:00
|
|
|
The struct :c:type:`v4l2_fmtdesc` ``type`` is not
|
2016-06-30 15:18:56 +02:00
|
|
|
supported or the ``index`` is out of bounds.
|
2020-05-06 14:16:00 +02:00
|
|
|
|
|
|
|
If ``V4L2_CAP_IO_MC`` is set and the specified ``mbus_code``
|
|
|
|
is unsupported, then also return this error code.
|