2018-08-30 10:15:26 -04:00
.. Permission is granted to copy, distribute and/or modify this
.. document under the terms of the GNU Free Documentation License,
.. Version 1.1 or any later version published by the Free Software
.. Foundation, with no Invariant Sections, no Front-Cover Texts
.. and no Back-Cover Texts. A copy of the license is included at
2020-03-04 10:21:39 +01:00
.. Documentation/userspace-api/media/fdl-appendix.rst.
2018-08-30 10:15:26 -04:00
..
.. TODO: replace it to GFDL-1.1-or-later WITH no-invariant-sections
2016-07-01 13:42:29 -03:00
.. _VIDIOC_CREATE_BUFS:
2016-06-30 15:18:56 +02:00
***** ***** ***** ***** *** *
ioctl VIDIOC_CREATE_BUFS
***** ***** ***** ***** *** *
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_CREATE_BUFS - Create buffers for Memory Mapped or User Pointer or DMA Buffer I/O
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
========
2016-08-19 16:53:38 -03:00
.. c:function :: int ioctl( int fd, VIDIOC_CREATE_BUFS, struct v4l2_create_buffers *argp )
:name: VIDIOC_CREATE_BUFS
2016-06-30 15:18:56 +02:00
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 ``
File descriptor returned by :ref: `open() <func-open>` .
`` argp ``
2017-09-02 09:54:48 -04:00
Pointer to struct :c:type: `v4l2_create_buffers` .
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
===========
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 13:58:44 -03:00
:ref: `VIDIOC_REQBUFS` ioctl, when a tighter control
2016-06-30 15:18:56 +02: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 05:43:01 -03:00
fields of the struct :c:type: `v4l2_create_buffers` structure. The
2016-06-30 15:18:56 +02: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 17:37:59 -03:00
:c:type: `v4l2_format` . Usually this will be done using the
2016-07-01 13:42:29 -03:00
:ref: `VIDIOC_TRY_FMT <VIDIOC_G_FMT>` or
2016-07-03 10:02:29 -03:00
:ref: `VIDIOC_G_FMT <VIDIOC_G_FMT>` ioctls to ensure that the
2016-06-30 15:18:56 +02: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 17:37:59 -03:00
.. c:type :: v4l2_create_buffers
2016-06-30 15:18:56 +02: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 08:14:19 -03:00
.. tabularcolumns :: |p{4.4cm}|p{4.4cm}|p{8.7cm}|
2016-06-30 15:18:56 +02: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 08:44:34 -03: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 09:56:22 -04: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 14:57:38 +02:00
other :c:type: `v4l2_memory` types. It will not support any other
2018-08-23 09:56:22 -04: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.
* - __u32
2020-05-14 18:01:45 +02:00
- `` flags ``
- Specifies additional buffer management attributes.
See :ref: `memory-flags` .
* - __u32
- `` reserved ` ` \ [6]
[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
- A place holder for future extensions. Drivers and applications
must set the array to zero.
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.
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.