.. -*- coding: utf-8; mode: rst -*-

.. _vidioc-reqbufs:

********************
ioctl VIDIOC_REQBUFS
********************

*man VIDIOC_REQBUFS(2)*

Initiate Memory Mapping or User Pointer I/O


Synopsis
========

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

Arguments
=========

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

``request``
    VIDIOC_REQBUFS

``argp``


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

This ioctl is used to initiate :ref:`memory mapped <mmap>`,
:ref:`user pointer <userp>` or :ref:`DMABUF <dmabuf>` based I/O.
Memory mapped buffers are located in device memory and must be allocated
with this ioctl before they can be mapped into the application's address
space. User buffers are allocated by applications themselves, and this
ioctl is merely used to switch the driver into user pointer I/O mode and
to setup some internal structures. Similarly, DMABUF buffers are
allocated by applications through a device driver, and this ioctl only
configures the driver into DMABUF I/O mode without performing any direct
allocation.

To allocate device buffers applications initialize all fields of the
:c:type:`struct v4l2_requestbuffers` structure. They set the ``type``
field to the respective stream or buffer type, the ``count`` field to
the desired number of buffers, ``memory`` must be set to the requested
I/O method and the ``reserved`` array must be zeroed. When the ioctl is
called with a pointer to this structure the driver will attempt to
allocate the requested number of buffers and it stores the actual number
allocated in the ``count`` field. It can be smaller than the number
requested, even zero, when the driver runs out of free memory. A larger
number is also possible when the driver requires more buffers to
function correctly. For example video output requires at least two
buffers, one displayed and one filled by the application.

When the I/O method is not supported the ioctl returns an EINVAL error
code.

Applications can call ``VIDIOC_REQBUFS`` again to change the number of
buffers, however this cannot succeed when any buffers are still mapped.
A ``count`` value of zero frees all buffers, after aborting or finishing
any DMA in progress, an implicit
:ref:`VIDIOC_STREAMOFF <vidioc-streamon>`.


.. _v4l2-requestbuffers:

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


    -  .. row 1

       -  __u32

       -  ``count``

       -  The number of buffers requested or granted.

    -  .. row 2

       -  __u32

       -  ``type``

       -  Type of the stream or buffers, this is the same as the struct
          :ref:`v4l2_format <v4l2-format>` ``type`` field. See
          :ref:`v4l2-buf-type` for valid values.

    -  .. 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

       -  __u32

       -  ``reserved``\ [2]

       -  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.

EINVAL
    The buffer type (``type`` field) or the requested I/O method
    (``memory``) is not supported.


.. ------------------------------------------------------------------------------
.. 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
.. ------------------------------------------------------------------------------
