doc-rst: linux_tv DocBook to reST migration (docs-next)
[deliverable/linux.git] / Documentation / linux_tv / media / v4l / userp.rst
CommitLineData
5377d91f
MH
1.. -*- coding: utf-8; mode: rst -*-
2
3.. _userp:
4
5*****************************
6Streaming I/O (User Pointers)
7*****************************
8
9Input and output devices support this I/O method when the
10``V4L2_CAP_STREAMING`` flag in the ``capabilities`` field of struct
11:ref:`v4l2_capability <v4l2-capability>` returned by the
12:ref:`VIDIOC_QUERYCAP <vidioc-querycap>` ioctl is set. If the
13particular user pointer method (not only memory mapping) is supported
14must be determined by calling the
15:ref:`VIDIOC_REQBUFS <vidioc-reqbufs>` ioctl.
16
17This I/O method combines advantages of the read/write and memory mapping
18methods. Buffers (planes) are allocated by the application itself, and
19can reside for example in virtual or shared memory. Only pointers to
20data are exchanged, these pointers and meta-information are passed in
21struct :ref:`v4l2_buffer <v4l2-buffer>` (or in struct
22:ref:`v4l2_plane <v4l2-plane>` in the multi-planar API case). The
23driver must be switched into user pointer I/O mode by calling the
24:ref:`VIDIOC_REQBUFS <vidioc-reqbufs>` with the desired buffer type.
25No buffers (planes) are allocated beforehand, consequently they are not
26indexed and cannot be queried like mapped buffers with the
27``VIDIOC_QUERYBUF`` ioctl.
28
29
30.. code-block:: c
31
32 struct v4l2_requestbuffers reqbuf;
33
34 memset (&reqbuf, 0, sizeof (reqbuf));
35 reqbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
36 reqbuf.memory = V4L2_MEMORY_USERPTR;
37
38 if (ioctl (fd, VIDIOC_REQBUFS, &reqbuf) == -1) {
39 if (errno == EINVAL)
40 printf ("Video capturing or user pointer streaming is not supported\\n");
41 else
42 perror ("VIDIOC_REQBUFS");
43
44 exit (EXIT_FAILURE);
45 }
46
47Buffer (plane) addresses and sizes are passed on the fly with the
48:ref:`VIDIOC_QBUF <vidioc-qbuf>` ioctl. Although buffers are commonly
49cycled, applications can pass different addresses and sizes at each
50``VIDIOC_QBUF`` call. If required by the hardware the driver swaps
51memory pages within physical memory to create a continuous area of
52memory. This happens transparently to the application in the virtual
53memory subsystem of the kernel. When buffer pages have been swapped out
54to disk they are brought back and finally locked in physical memory for
55DMA. [1]_
56
57Filled or displayed buffers are dequeued with the
58:ref:`VIDIOC_DQBUF <vidioc-qbuf>` ioctl. The driver can unlock the
59memory pages at any time between the completion of the DMA and this
60ioctl. The memory is also unlocked when
61:ref:`VIDIOC_STREAMOFF <vidioc-streamon>` is called,
62:ref:`VIDIOC_REQBUFS <vidioc-reqbufs>`, or when the device is closed.
63Applications must take care not to free buffers without dequeuing. For
64once, the buffers remain locked until further, wasting physical memory.
65Second the driver will not be notified when the memory is returned to
66the application's free list and subsequently reused for other purposes,
67possibly completing the requested DMA and overwriting valuable data.
68
69For capturing applications it is customary to enqueue a number of empty
70buffers, to start capturing and enter the read loop. Here the
71application waits until a filled buffer can be dequeued, and re-enqueues
72the buffer when the data is no longer needed. Output applications fill
73and enqueue buffers, when enough buffers are stacked up output is
74started. In the write loop, when the application runs out of free
75buffers it must wait until an empty buffer can be dequeued and reused.
76Two methods exist to suspend execution of the application until one or
77more buffers can be dequeued. By default ``VIDIOC_DQBUF`` blocks when no
78buffer is in the outgoing queue. When the ``O_NONBLOCK`` flag was given
79to the :ref:`open() <func-open>` function, ``VIDIOC_DQBUF`` returns
80immediately with an EAGAIN error code when no buffer is available. The
81:ref:`select() <func-select>` or :ref:`poll() <func-poll>` function
82are always available.
83
84To start and stop capturing or output applications call the
85:ref:`VIDIOC_STREAMON <vidioc-streamon>` and
86:ref:`VIDIOC_STREAMOFF <vidioc-streamon>` ioctl. Note
87``VIDIOC_STREAMOFF`` removes all buffers from both queues and unlocks
88all buffers as a side effect. Since there is no notion of doing anything
89"now" on a multitasking system, if an application needs to synchronize
90with another event it should examine the struct
91:ref:`v4l2_buffer <v4l2-buffer>` ``timestamp`` of captured or
92outputted buffers.
93
94Drivers implementing user pointer I/O must support the
95``VIDIOC_REQBUFS``, ``VIDIOC_QBUF``, ``VIDIOC_DQBUF``,
96``VIDIOC_STREAMON`` and ``VIDIOC_STREAMOFF`` ioctl, the
97:c:func:`select()` and :c:func:`poll()` function. [2]_
98
99.. [1]
100 We expect that frequently used buffers are typically not swapped out.
101 Anyway, the process of swapping, locking or generating scatter-gather
102 lists may be time consuming. The delay can be masked by the depth of
103 the incoming buffer queue, and perhaps by maintaining caches assuming
104 a buffer will be soon enqueued again. On the other hand, to optimize
105 memory usage drivers can limit the number of buffers locked in
106 advance and recycle the most recently used buffers first. Of course,
107 the pages of empty buffers in the incoming queue need not be saved to
108 disk. Output buffers must be saved on the incoming and outgoing queue
109 because an application may share them with other processes.
110
111.. [2]
112 At the driver level :c:func:`select()` and :c:func:`poll()` are
113 the same, and :c:func:`select()` is too important to be optional.
114 The rest should be evident.
115
116
117.. ------------------------------------------------------------------------------
118.. This file was automatically converted from DocBook-XML with the dbxml
119.. library (https://github.com/return42/sphkerneldoc). The origin XML comes
120.. from the linux kernel, refer to:
121..
122.. * https://github.com/torvalds/linux/tree/master/Documentation/DocBook
123.. ------------------------------------------------------------------------------
This page took 0.02755 seconds and 5 git commands to generate.