2020-08-26 07:03:09 +00:00
|
|
|
.. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later
|
2018-08-30 14:15:26 +00:00
|
|
|
|
2016-07-01 16:42:29 +00:00
|
|
|
.. _VIDIOC_CREATE_BUFS:
|
2016-06-30 13:18:56 +00:00
|
|
|
|
|
|
|
************************
|
|
|
|
ioctl VIDIOC_CREATE_BUFS
|
|
|
|
************************
|
|
|
|
|
2016-07-05 18:14:35 +00:00
|
|
|
Name
|
2016-07-05 10:58:48 +00:00
|
|
|
====
|
2016-06-30 13:18:56 +00:00
|
|
|
|
2016-07-05 10:58:48 +00:00
|
|
|
VIDIOC_CREATE_BUFS - Create buffers for Memory Mapped or User Pointer or DMA Buffer I/O
|
2016-06-30 13:18:56 +00:00
|
|
|
|
2016-07-05 18:14:35 +00:00
|
|
|
|
|
|
|
Synopsis
|
2016-06-30 13:18:56 +00:00
|
|
|
========
|
|
|
|
|
2016-08-19 19:53:38 +00:00
|
|
|
.. c:function:: int ioctl( int fd, VIDIOC_CREATE_BUFS, struct v4l2_create_buffers *argp )
|
|
|
|
:name: VIDIOC_CREATE_BUFS
|
2016-06-30 13:18:56 +00:00
|
|
|
|
2016-07-05 10:58:48 +00:00
|
|
|
|
2016-07-05 18:14:35 +00:00
|
|
|
Arguments
|
2016-06-30 13:18:56 +00:00
|
|
|
=========
|
|
|
|
|
|
|
|
``fd``
|
|
|
|
File descriptor returned by :ref:`open() <func-open>`.
|
|
|
|
|
|
|
|
``argp``
|
2017-09-02 13:54:48 +00:00
|
|
|
Pointer to struct :c:type:`v4l2_create_buffers`.
|
2016-06-30 13:18:56 +00:00
|
|
|
|
|
|
|
|
2016-07-05 18:14:35 +00:00
|
|
|
Description
|
2016-06-30 13:18:56 +00:00
|
|
|
===========
|
|
|
|
|
|
|
|
This ioctl is used to create buffers for :ref:`memory mapped <mmap>`
|
|
|
|
or :ref:`user pointer <userp>` or :ref:`DMA buffer <dmabuf>` I/O. It
|
|
|
|
can be used as an alternative or in addition to the
|
2016-07-01 16:58:44 +00:00
|
|
|
:ref:`VIDIOC_REQBUFS` ioctl, when a tighter control
|
2016-06-30 13:18:56 +00:00
|
|
|
over buffers is required. This ioctl can be called multiple times to
|
|
|
|
create buffers of different sizes.
|
|
|
|
|
|
|
|
To allocate the device buffers applications must initialize the relevant
|
2016-09-08 08:43:01 +00:00
|
|
|
fields of the struct :c:type:`v4l2_create_buffers` structure. The
|
2016-06-30 13:18:56 +00:00
|
|
|
``count`` field must be set to the number of requested buffers, the
|
|
|
|
``memory`` field specifies the requested I/O method and the ``reserved``
|
|
|
|
array must be zeroed.
|
|
|
|
|
|
|
|
The ``format`` field specifies the image format that the buffers must be
|
|
|
|
able to handle. The application has to fill in this struct
|
2016-08-29 20:37:59 +00:00
|
|
|
:c:type:`v4l2_format`. Usually this will be done using the
|
2016-07-01 16:42:29 +00:00
|
|
|
:ref:`VIDIOC_TRY_FMT <VIDIOC_G_FMT>` or
|
2016-07-03 13:02:29 +00:00
|
|
|
:ref:`VIDIOC_G_FMT <VIDIOC_G_FMT>` ioctls to ensure that the
|
2016-06-30 13:18:56 +00:00
|
|
|
requested format is supported by the driver. Based on the format's
|
|
|
|
``type`` field the requested buffer size (for single-planar) or plane
|
|
|
|
sizes (for multi-planar formats) will be used for the allocated buffers.
|
|
|
|
The driver may return an error if the size(s) are not supported by the
|
|
|
|
hardware (usually because they are too small).
|
|
|
|
|
|
|
|
The buffers created by this ioctl will have as minimum size the size
|
|
|
|
defined by the ``format.pix.sizeimage`` field (or the corresponding
|
|
|
|
fields for other format types). Usually if the ``format.pix.sizeimage``
|
|
|
|
field is less than the minimum required for the given format, then an
|
|
|
|
error will be returned since drivers will typically not allow this. If
|
|
|
|
it is larger, then the value will be used as-is. In other words, the
|
|
|
|
driver may reject the requested size, but if it is accepted the driver
|
|
|
|
will use it unchanged.
|
|
|
|
|
|
|
|
When the ioctl is called with a pointer to this structure the driver
|
|
|
|
will attempt to allocate up to the requested number of buffers and store
|
|
|
|
the actual number allocated and the starting index in the ``count`` and
|
|
|
|
the ``index`` fields respectively. On return ``count`` can be smaller
|
|
|
|
than the number requested.
|
|
|
|
|
|
|
|
|
2016-08-29 20:37:59 +00:00
|
|
|
.. c:type:: v4l2_create_buffers
|
2016-06-30 13:18:56 +00:00
|
|
|
|
[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 11:14:19 +00:00
|
|
|
.. tabularcolumns:: |p{4.4cm}|p{4.4cm}|p{8.7cm}|
|
|
|
|
|
2016-06-30 13:18:56 +00:00
|
|
|
.. flat-table:: struct v4l2_create_buffers
|
|
|
|
: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 11:44:34 +00:00
|
|
|
* - __u32
|
|
|
|
- ``index``
|
|
|
|
- The starting buffer index, returned by the driver.
|
|
|
|
* - __u32
|
|
|
|
- ``count``
|
|
|
|
- The number of buffers requested or granted. If count == 0, then
|
|
|
|
:ref:`VIDIOC_CREATE_BUFS` will set ``index`` to the current number of
|
|
|
|
created buffers, and it will check the validity of ``memory`` and
|
|
|
|
``format.type``. If those are invalid -1 is returned and errno is
|
|
|
|
set to ``EINVAL`` error code, otherwise :ref:`VIDIOC_CREATE_BUFS` returns
|
|
|
|
0. It will never set errno to ``EBUSY`` error code in this particular
|
|
|
|
case.
|
|
|
|
* - __u32
|
|
|
|
- ``memory``
|
|
|
|
- Applications set this field to ``V4L2_MEMORY_MMAP``,
|
|
|
|
``V4L2_MEMORY_DMABUF`` or ``V4L2_MEMORY_USERPTR``. See
|
|
|
|
:c:type:`v4l2_memory`
|
|
|
|
* - struct :c:type:`v4l2_format`
|
|
|
|
- ``format``
|
|
|
|
- Filled in by the application, preserved by the driver.
|
|
|
|
* - __u32
|
2018-08-23 13:56:22 +00:00
|
|
|
- ``capabilities``
|
|
|
|
- Set by the driver. If 0, then the driver doesn't support
|
|
|
|
capabilities. In that case all you know is that the driver is
|
|
|
|
guaranteed to support ``V4L2_MEMORY_MMAP`` and *might* support
|
2020-04-20 12:57:38 +00:00
|
|
|
other :c:type:`v4l2_memory` types. It will not support any other
|
2018-08-23 13:56:22 +00:00
|
|
|
capabilities. See :ref:`here <v4l2-buf-capabilities>` for a list of the
|
|
|
|
capabilities.
|
|
|
|
|
|
|
|
If you want to just query the capabilities without making any
|
|
|
|
other changes, then set ``count`` to 0, ``memory`` to
|
|
|
|
``V4L2_MEMORY_MMAP`` and ``format.type`` to the buffer type.
|
2020-05-14 16:01:45 +00:00
|
|
|
|
|
|
|
* - __u32
|
2020-09-11 03:07:58 +00:00
|
|
|
- ``reserved``\ [7]
|
[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 11:44:34 +00:00
|
|
|
- A place holder for future extensions. Drivers and applications
|
|
|
|
must set the array to zero.
|
2016-06-30 13:18:56 +00:00
|
|
|
|
|
|
|
|
2016-07-05 18:14:35 +00:00
|
|
|
Return Value
|
2016-06-30 13:18:56 +00: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.
|
|
|
|
|
|
|
|
ENOMEM
|
|
|
|
No memory to allocate buffers for :ref:`memory mapped <mmap>` I/O.
|
|
|
|
|
|
|
|
EINVAL
|
|
|
|
The buffer type (``format.type`` field), requested I/O method
|
|
|
|
(``memory``) or format (``format`` field) is not valid.
|