vidioc-create-bufs.rst 4.7 KB
Newer Older
1 2
.. -*- coding: utf-8; mode: rst -*-

3
.. _VIDIOC_CREATE_BUFS:
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

************************
ioctl VIDIOC_CREATE_BUFS
************************

*man VIDIOC_CREATE_BUFS(2)*

Create buffers for Memory Mapped or User Pointer or DMA Buffer I/O


Synopsis
========

.. c:function:: int ioctl( int fd, int request, struct v4l2_create_buffers *argp )

Arguments
=========

``fd``
    File descriptor returned by :ref:`open() <func-open>`.

``request``
    VIDIOC_CREATE_BUFS

``argp``


Description
===========

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
37
:ref:`VIDIOC_REQBUFS` ioctl, when a tighter control
38 39 40 41 42 43 44 45 46 47 48 49
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
fields of the :c:type:`struct v4l2_create_buffers` structure. The
``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
:ref:`v4l2_format <v4l2-format>`. Usually this will be done using the
50
:ref:`VIDIOC_TRY_FMT <VIDIOC_G_FMT>` or
51
:ref:`VIDIOC_G_FMT` ioctls to ensure that the
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
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.


.. _v4l2-create-buffers:

.. flat-table:: struct v4l2_create_buffers
    :header-rows:  0
    :stub-columns: 0
    :widths:       1 1 2


    -  .. row 1

       -  __u32

       -  ``index``

       -  The starting buffer index, returned by the driver.

    -  .. row 2

       -  __u32

       -  ``count``

       -  The number of buffers requested or granted. If count == 0, then
97
          :ref:`VIDIOC_CREATE_BUFS` will set ``index`` to the current number of
98 99
          created buffers, and it will check the validity of ``memory`` and
          ``format.type``. If those are invalid -1 is returned and errno is
100
          set to EINVAL error code, otherwise :ref:`VIDIOC_CREATE_BUFS` returns
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
          0. It will never set errno to EBUSY error code in this particular
          case.

    -  .. row 3

       -  __u32

       -  ``memory``

       -  Applications set this field to ``V4L2_MEMORY_MMAP``,
          ``V4L2_MEMORY_DMABUF`` or ``V4L2_MEMORY_USERPTR``. See
          :ref:`v4l2-memory`

    -  .. row 4

       -  struct :ref:`v4l2_format <v4l2-format>`

       -  ``format``

       -  Filled in by the application, preserved by the driver.

    -  .. row 5

       -  __u32

       -  ``reserved``\ [8]

       -  A place holder for future extensions. Drivers and applications
          must set the array to zero.



Return Value
============

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.


.. ------------------------------------------------------------------------------
.. This file was automatically converted from DocBook-XML with the dbxml
.. library (https://github.com/return42/sphkerneldoc). The origin XML comes
.. from the linux kernel, refer to:
..
.. * https://github.com/torvalds/linux/tree/master/Documentation/DocBook
.. ------------------------------------------------------------------------------