Merge tag 'net-6.12-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
[linux-2.6-block.git] / Documentation / userspace-api / media / v4l / libv4l-introduction.rst
CommitLineData
059b1c5b 1.. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later
407e84cd 2.. c:namespace:: V4L
82559ac0 3
5377d91f
MH
4.. _libv4l-introduction:
5
6************
7Introduction
8************
9
10libv4l is a collection of libraries which adds a thin abstraction layer
11on top of video4linux2 devices. The purpose of this (thin) layer is to
12make it easy for application writers to support a wide variety of
13devices without having to write separate code for different devices in
14the same class.
15
16An example of using libv4l is provided by
17:ref:`v4l2grab <v4l2grab-example>`.
18
19libv4l consists of 3 different libraries:
20
5377d91f
MH
21libv4lconvert
22=============
23
24libv4lconvert is a library that converts several different pixelformats
25found in V4L2 drivers into a few common RGB and YUY formats.
26
27It currently accepts the following V4L2 driver formats:
28:ref:`V4L2_PIX_FMT_BGR24 <V4L2-PIX-FMT-BGR24>`,
be25b043 29:ref:`V4L2_PIX_FMT_NV12_16L16 <V4L2-PIX-FMT-NV12-16L16>`,
5377d91f
MH
30:ref:`V4L2_PIX_FMT_JPEG <V4L2-PIX-FMT-JPEG>`,
31:ref:`V4L2_PIX_FMT_MJPEG <V4L2-PIX-FMT-MJPEG>`,
32:ref:`V4L2_PIX_FMT_MR97310A <V4L2-PIX-FMT-MR97310A>`,
33:ref:`V4L2_PIX_FMT_OV511 <V4L2-PIX-FMT-OV511>`,
34:ref:`V4L2_PIX_FMT_OV518 <V4L2-PIX-FMT-OV518>`,
35:ref:`V4L2_PIX_FMT_PAC207 <V4L2-PIX-FMT-PAC207>`,
36:ref:`V4L2_PIX_FMT_PJPG <V4L2-PIX-FMT-PJPG>`,
37:ref:`V4L2_PIX_FMT_RGB24 <V4L2-PIX-FMT-RGB24>`,
38:ref:`V4L2_PIX_FMT_SBGGR8 <V4L2-PIX-FMT-SBGGR8>`,
39:ref:`V4L2_PIX_FMT_SGBRG8 <V4L2-PIX-FMT-SGBRG8>`,
40:ref:`V4L2_PIX_FMT_SGRBG8 <V4L2-PIX-FMT-SGRBG8>`,
41:ref:`V4L2_PIX_FMT_SN9C10X <V4L2-PIX-FMT-SN9C10X>`,
42:ref:`V4L2_PIX_FMT_SN9C20X_I420 <V4L2-PIX-FMT-SN9C20X-I420>`,
43:ref:`V4L2_PIX_FMT_SPCA501 <V4L2-PIX-FMT-SPCA501>`,
44:ref:`V4L2_PIX_FMT_SPCA505 <V4L2-PIX-FMT-SPCA505>`,
45:ref:`V4L2_PIX_FMT_SPCA508 <V4L2-PIX-FMT-SPCA508>`,
46:ref:`V4L2_PIX_FMT_SPCA561 <V4L2-PIX-FMT-SPCA561>`,
47:ref:`V4L2_PIX_FMT_SQ905C <V4L2-PIX-FMT-SQ905C>`,
bb2ade02 48:ref:`V4L2_PIX_FMT_SRGGB8 <V4L2-PIX-FMT-SRGGB8>`,
5377d91f
MH
49:ref:`V4L2_PIX_FMT_UYVY <V4L2-PIX-FMT-UYVY>`,
50:ref:`V4L2_PIX_FMT_YUV420 <V4L2-PIX-FMT-YUV420>`,
51:ref:`V4L2_PIX_FMT_YUYV <V4L2-PIX-FMT-YUYV>`,
52:ref:`V4L2_PIX_FMT_YVU420 <V4L2-PIX-FMT-YVU420>`, and
53:ref:`V4L2_PIX_FMT_YVYU <V4L2-PIX-FMT-YVYU>`.
54
55Later on libv4lconvert was expanded to also be able to do various video
56processing functions to improve webcam video quality. The video
57processing is split in to 2 parts: libv4lconvert/control and
58libv4lconvert/processing.
59
60The control part is used to offer video controls which can be used to
61control the video processing functions made available by
62libv4lconvert/processing. These controls are stored application wide
63(until reboot) by using a persistent shared memory object.
64
65libv4lconvert/processing offers the actual video processing
66functionality.
67
5377d91f
MH
68libv4l1
69=======
70
71This library offers functions that can be used to quickly make v4l1
72applications work with v4l2 devices. These functions work exactly like
73the normal open/close/etc, except that libv4l1 does full emulation of
74the v4l1 api on top of v4l2 drivers, in case of v4l1 drivers it will
75just pass calls through.
76
77Since those functions are emulations of the old V4L1 API, it shouldn't
78be used for new applications.
79
5377d91f
MH
80libv4l2
81=======
82
83This library should be used for all modern V4L2 applications.
84
85It provides handles to call V4L2 open/ioctl/close/poll methods. Instead
86of just providing the raw output of the device, it enhances the calls in
87the sense that it will use libv4lconvert to provide more video formats
88and to enhance the image quality.
89
90In most cases, libv4l2 just passes the calls directly through to the
91v4l2 driver, intercepting the calls to
af4a4d0d 92:ref:`VIDIOC_TRY_FMT <VIDIOC_G_FMT>`,
bb2ade02
MCC
93:ref:`VIDIOC_G_FMT <VIDIOC_G_FMT>`,
94:ref:`VIDIOC_S_FMT <VIDIOC_G_FMT>`,
95:ref:`VIDIOC_ENUM_FRAMESIZES <VIDIOC_ENUM_FRAMESIZES>` and
96:ref:`VIDIOC_ENUM_FRAMEINTERVALS <VIDIOC_ENUM_FRAMEINTERVALS>` in
5377d91f
MH
97order to emulate the formats
98:ref:`V4L2_PIX_FMT_BGR24 <V4L2-PIX-FMT-BGR24>`,
99:ref:`V4L2_PIX_FMT_RGB24 <V4L2-PIX-FMT-RGB24>`,
100:ref:`V4L2_PIX_FMT_YUV420 <V4L2-PIX-FMT-YUV420>`, and
101:ref:`V4L2_PIX_FMT_YVU420 <V4L2-PIX-FMT-YVU420>`, if they aren't
bb2ade02 102available in the driver. :ref:`VIDIOC_ENUM_FMT <VIDIOC_ENUM_FMT>`
5377d91f
MH
103keeps enumerating the hardware supported formats, plus the emulated
104formats offered by libv4l at the end.
105
5377d91f
MH
106.. _libv4l-ops:
107
108Libv4l device control functions
109-------------------------------
110
111The common file operation methods are provided by libv4l.
112
e452134c
MCC
113Those functions operate just like the gcc function ``dup()`` and
114V4L2 functions
407e84cd
MCC
115:c:func:`open()`, :c:func:`close()`,
116:c:func:`ioctl()`, :c:func:`read()`,
117:c:func:`mmap()` and :c:func:`munmap()`:
5377d91f 118
9281f251 119.. c:function:: int v4l2_open(const char *file, int oflag, ...)
5377d91f 120
407e84cd 121 operates like the :c:func:`open()` function.
5377d91f 122
9281f251 123.. c:function:: int v4l2_close(int fd)
5377d91f 124
407e84cd 125 operates like the :c:func:`close()` function.
5377d91f 126
9281f251 127.. c:function:: int v4l2_dup(int fd)
5377d91f 128
e452134c 129 operates like the libc ``dup()`` function, duplicating a file handler.
5377d91f 130
9281f251
MCC
131.. c:function:: int v4l2_ioctl (int fd, unsigned long int request, ...)
132
407e84cd 133 operates like the :c:func:`ioctl()` function.
9281f251
MCC
134
135.. c:function:: int v4l2_read (int fd, void* buffer, size_t n)
136
407e84cd 137 operates like the :c:func:`read()` function.
9281f251 138
5cd5f134 139.. c:function:: void *v4l2_mmap(void *start, size_t length, int prot, int flags, int fd, int64_t offset);
9281f251 140
5cd5f134 141 operates like the :c:func:`mmap()` function.
9281f251
MCC
142
143.. c:function:: int v4l2_munmap(void *_start, size_t length);
e452134c 144
407e84cd 145 operates like the :c:func:`munmap()` function.
5377d91f
MH
146
147Those functions provide additional control:
148
9281f251
MCC
149.. c:function:: int v4l2_fd_open(int fd, int v4l2_flags)
150
151 opens an already opened fd for further use through v4l2lib and possibly
e452134c
MCC
152 modify libv4l2's default behavior through the ``v4l2_flags`` argument.
153 Currently, ``v4l2_flags`` can be ``V4L2_DISABLE_CONVERSION``, to disable
9281f251 154 format conversion.
5377d91f 155
9281f251
MCC
156.. c:function:: int v4l2_set_control(int fd, int cid, int value)
157
158 This function takes a value of 0 - 65535, and then scales that range to the
159 actual range of the given v4l control id, and then if the cid exists and is
5377d91f
MH
160 not locked sets the cid to the scaled value.
161
9281f251
MCC
162.. c:function:: int v4l2_get_control(int fd, int cid)
163
164 This function returns a value of 0 - 65535, scaled to from the actual range
165 of the given v4l control id. when the cid does not exist, could not be
166 accessed for some reason, or some error occurred 0 is returned.
5377d91f 167
5377d91f
MH
168v4l1compat.so wrapper library
169=============================
170
e452134c 171This library intercepts calls to
407e84cd
MCC
172:c:func:`open()`, :c:func:`close()`,
173:c:func:`ioctl()`, :c:func:`mmap()` and
174:c:func:`munmap()`
5377d91f 175operations and redirects them to the libv4l counterparts, by using
e452134c 176``LD_PRELOAD=/usr/lib/v4l1compat.so``. It also emulates V4L1 calls via V4L2
5377d91f
MH
177API.
178
179It allows usage of binary legacy applications that still don't use
180libv4l.