xref: /openbmc/linux/Documentation/userspace-api/media/v4l/libv4l-introduction.rst (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
1059b1c5bSMauro Carvalho Chehab.. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later
2407e84cdSMauro Carvalho Chehab.. c:namespace:: V4L
354f38fcaSMauro Carvalho Chehab
454f38fcaSMauro Carvalho Chehab.. _libv4l-introduction:
554f38fcaSMauro Carvalho Chehab
654f38fcaSMauro Carvalho Chehab************
754f38fcaSMauro Carvalho ChehabIntroduction
854f38fcaSMauro Carvalho Chehab************
954f38fcaSMauro Carvalho Chehab
1054f38fcaSMauro Carvalho Chehablibv4l is a collection of libraries which adds a thin abstraction layer
1154f38fcaSMauro Carvalho Chehabon top of video4linux2 devices. The purpose of this (thin) layer is to
1254f38fcaSMauro Carvalho Chehabmake it easy for application writers to support a wide variety of
1354f38fcaSMauro Carvalho Chehabdevices without having to write separate code for different devices in
1454f38fcaSMauro Carvalho Chehabthe same class.
1554f38fcaSMauro Carvalho Chehab
1654f38fcaSMauro Carvalho ChehabAn example of using libv4l is provided by
1754f38fcaSMauro Carvalho Chehab:ref:`v4l2grab <v4l2grab-example>`.
1854f38fcaSMauro Carvalho Chehab
1954f38fcaSMauro Carvalho Chehablibv4l consists of 3 different libraries:
2054f38fcaSMauro Carvalho Chehab
2154f38fcaSMauro Carvalho Chehablibv4lconvert
2254f38fcaSMauro Carvalho Chehab=============
2354f38fcaSMauro Carvalho Chehab
2454f38fcaSMauro Carvalho Chehablibv4lconvert is a library that converts several different pixelformats
2554f38fcaSMauro Carvalho Chehabfound in V4L2 drivers into a few common RGB and YUY formats.
2654f38fcaSMauro Carvalho Chehab
2754f38fcaSMauro Carvalho ChehabIt currently accepts the following V4L2 driver formats:
2854f38fcaSMauro Carvalho Chehab:ref:`V4L2_PIX_FMT_BGR24 <V4L2-PIX-FMT-BGR24>`,
29be25b043SHans Verkuil:ref:`V4L2_PIX_FMT_NV12_16L16 <V4L2-PIX-FMT-NV12-16L16>`,
3054f38fcaSMauro Carvalho Chehab:ref:`V4L2_PIX_FMT_JPEG <V4L2-PIX-FMT-JPEG>`,
3154f38fcaSMauro Carvalho Chehab:ref:`V4L2_PIX_FMT_MJPEG <V4L2-PIX-FMT-MJPEG>`,
3254f38fcaSMauro Carvalho Chehab:ref:`V4L2_PIX_FMT_MR97310A <V4L2-PIX-FMT-MR97310A>`,
3354f38fcaSMauro Carvalho Chehab:ref:`V4L2_PIX_FMT_OV511 <V4L2-PIX-FMT-OV511>`,
3454f38fcaSMauro Carvalho Chehab:ref:`V4L2_PIX_FMT_OV518 <V4L2-PIX-FMT-OV518>`,
3554f38fcaSMauro Carvalho Chehab:ref:`V4L2_PIX_FMT_PAC207 <V4L2-PIX-FMT-PAC207>`,
3654f38fcaSMauro Carvalho Chehab:ref:`V4L2_PIX_FMT_PJPG <V4L2-PIX-FMT-PJPG>`,
3754f38fcaSMauro Carvalho Chehab:ref:`V4L2_PIX_FMT_RGB24 <V4L2-PIX-FMT-RGB24>`,
3854f38fcaSMauro Carvalho Chehab:ref:`V4L2_PIX_FMT_SBGGR8 <V4L2-PIX-FMT-SBGGR8>`,
3954f38fcaSMauro Carvalho Chehab:ref:`V4L2_PIX_FMT_SGBRG8 <V4L2-PIX-FMT-SGBRG8>`,
4054f38fcaSMauro Carvalho Chehab:ref:`V4L2_PIX_FMT_SGRBG8 <V4L2-PIX-FMT-SGRBG8>`,
4154f38fcaSMauro Carvalho Chehab:ref:`V4L2_PIX_FMT_SN9C10X <V4L2-PIX-FMT-SN9C10X>`,
4254f38fcaSMauro Carvalho Chehab:ref:`V4L2_PIX_FMT_SN9C20X_I420 <V4L2-PIX-FMT-SN9C20X-I420>`,
4354f38fcaSMauro Carvalho Chehab:ref:`V4L2_PIX_FMT_SPCA501 <V4L2-PIX-FMT-SPCA501>`,
4454f38fcaSMauro Carvalho Chehab:ref:`V4L2_PIX_FMT_SPCA505 <V4L2-PIX-FMT-SPCA505>`,
4554f38fcaSMauro Carvalho Chehab:ref:`V4L2_PIX_FMT_SPCA508 <V4L2-PIX-FMT-SPCA508>`,
4654f38fcaSMauro Carvalho Chehab:ref:`V4L2_PIX_FMT_SPCA561 <V4L2-PIX-FMT-SPCA561>`,
4754f38fcaSMauro Carvalho Chehab:ref:`V4L2_PIX_FMT_SQ905C <V4L2-PIX-FMT-SQ905C>`,
4854f38fcaSMauro Carvalho Chehab:ref:`V4L2_PIX_FMT_SRGGB8 <V4L2-PIX-FMT-SRGGB8>`,
4954f38fcaSMauro Carvalho Chehab:ref:`V4L2_PIX_FMT_UYVY <V4L2-PIX-FMT-UYVY>`,
5054f38fcaSMauro Carvalho Chehab:ref:`V4L2_PIX_FMT_YUV420 <V4L2-PIX-FMT-YUV420>`,
5154f38fcaSMauro Carvalho Chehab:ref:`V4L2_PIX_FMT_YUYV <V4L2-PIX-FMT-YUYV>`,
5254f38fcaSMauro Carvalho Chehab:ref:`V4L2_PIX_FMT_YVU420 <V4L2-PIX-FMT-YVU420>`, and
5354f38fcaSMauro Carvalho Chehab:ref:`V4L2_PIX_FMT_YVYU <V4L2-PIX-FMT-YVYU>`.
5454f38fcaSMauro Carvalho Chehab
5554f38fcaSMauro Carvalho ChehabLater on libv4lconvert was expanded to also be able to do various video
5654f38fcaSMauro Carvalho Chehabprocessing functions to improve webcam video quality. The video
5754f38fcaSMauro Carvalho Chehabprocessing is split in to 2 parts: libv4lconvert/control and
5854f38fcaSMauro Carvalho Chehablibv4lconvert/processing.
5954f38fcaSMauro Carvalho Chehab
6054f38fcaSMauro Carvalho ChehabThe control part is used to offer video controls which can be used to
6154f38fcaSMauro Carvalho Chehabcontrol the video processing functions made available by
6254f38fcaSMauro Carvalho Chehablibv4lconvert/processing. These controls are stored application wide
6354f38fcaSMauro Carvalho Chehab(until reboot) by using a persistent shared memory object.
6454f38fcaSMauro Carvalho Chehab
6554f38fcaSMauro Carvalho Chehablibv4lconvert/processing offers the actual video processing
6654f38fcaSMauro Carvalho Chehabfunctionality.
6754f38fcaSMauro Carvalho Chehab
6854f38fcaSMauro Carvalho Chehablibv4l1
6954f38fcaSMauro Carvalho Chehab=======
7054f38fcaSMauro Carvalho Chehab
7154f38fcaSMauro Carvalho ChehabThis library offers functions that can be used to quickly make v4l1
7254f38fcaSMauro Carvalho Chehabapplications work with v4l2 devices. These functions work exactly like
7354f38fcaSMauro Carvalho Chehabthe normal open/close/etc, except that libv4l1 does full emulation of
7454f38fcaSMauro Carvalho Chehabthe v4l1 api on top of v4l2 drivers, in case of v4l1 drivers it will
7554f38fcaSMauro Carvalho Chehabjust pass calls through.
7654f38fcaSMauro Carvalho Chehab
7754f38fcaSMauro Carvalho ChehabSince those functions are emulations of the old V4L1 API, it shouldn't
7854f38fcaSMauro Carvalho Chehabbe used for new applications.
7954f38fcaSMauro Carvalho Chehab
8054f38fcaSMauro Carvalho Chehablibv4l2
8154f38fcaSMauro Carvalho Chehab=======
8254f38fcaSMauro Carvalho Chehab
8354f38fcaSMauro Carvalho ChehabThis library should be used for all modern V4L2 applications.
8454f38fcaSMauro Carvalho Chehab
8554f38fcaSMauro Carvalho ChehabIt provides handles to call V4L2 open/ioctl/close/poll methods. Instead
8654f38fcaSMauro Carvalho Chehabof just providing the raw output of the device, it enhances the calls in
8754f38fcaSMauro Carvalho Chehabthe sense that it will use libv4lconvert to provide more video formats
8854f38fcaSMauro Carvalho Chehaband to enhance the image quality.
8954f38fcaSMauro Carvalho Chehab
9054f38fcaSMauro Carvalho ChehabIn most cases, libv4l2 just passes the calls directly through to the
9154f38fcaSMauro Carvalho Chehabv4l2 driver, intercepting the calls to
9254f38fcaSMauro Carvalho Chehab:ref:`VIDIOC_TRY_FMT <VIDIOC_G_FMT>`,
9354f38fcaSMauro Carvalho Chehab:ref:`VIDIOC_G_FMT <VIDIOC_G_FMT>`,
9454f38fcaSMauro Carvalho Chehab:ref:`VIDIOC_S_FMT <VIDIOC_G_FMT>`,
9554f38fcaSMauro Carvalho Chehab:ref:`VIDIOC_ENUM_FRAMESIZES <VIDIOC_ENUM_FRAMESIZES>` and
9654f38fcaSMauro Carvalho Chehab:ref:`VIDIOC_ENUM_FRAMEINTERVALS <VIDIOC_ENUM_FRAMEINTERVALS>` in
9754f38fcaSMauro Carvalho Chehaborder to emulate the formats
9854f38fcaSMauro Carvalho Chehab:ref:`V4L2_PIX_FMT_BGR24 <V4L2-PIX-FMT-BGR24>`,
9954f38fcaSMauro Carvalho Chehab:ref:`V4L2_PIX_FMT_RGB24 <V4L2-PIX-FMT-RGB24>`,
10054f38fcaSMauro Carvalho Chehab:ref:`V4L2_PIX_FMT_YUV420 <V4L2-PIX-FMT-YUV420>`, and
10154f38fcaSMauro Carvalho Chehab:ref:`V4L2_PIX_FMT_YVU420 <V4L2-PIX-FMT-YVU420>`, if they aren't
10254f38fcaSMauro Carvalho Chehabavailable in the driver. :ref:`VIDIOC_ENUM_FMT <VIDIOC_ENUM_FMT>`
10354f38fcaSMauro Carvalho Chehabkeeps enumerating the hardware supported formats, plus the emulated
10454f38fcaSMauro Carvalho Chehabformats offered by libv4l at the end.
10554f38fcaSMauro Carvalho Chehab
10654f38fcaSMauro Carvalho Chehab.. _libv4l-ops:
10754f38fcaSMauro Carvalho Chehab
10854f38fcaSMauro Carvalho ChehabLibv4l device control functions
10954f38fcaSMauro Carvalho Chehab-------------------------------
11054f38fcaSMauro Carvalho Chehab
11154f38fcaSMauro Carvalho ChehabThe common file operation methods are provided by libv4l.
11254f38fcaSMauro Carvalho Chehab
11354f38fcaSMauro Carvalho ChehabThose functions operate just like the gcc function ``dup()`` and
11454f38fcaSMauro Carvalho ChehabV4L2 functions
115407e84cdSMauro Carvalho Chehab:c:func:`open()`, :c:func:`close()`,
116407e84cdSMauro Carvalho Chehab:c:func:`ioctl()`, :c:func:`read()`,
117407e84cdSMauro Carvalho Chehab:c:func:`mmap()` and :c:func:`munmap()`:
11854f38fcaSMauro Carvalho Chehab
11954f38fcaSMauro Carvalho Chehab.. c:function:: int v4l2_open(const char *file, int oflag, ...)
12054f38fcaSMauro Carvalho Chehab
121407e84cdSMauro Carvalho Chehab   operates like the :c:func:`open()` function.
12254f38fcaSMauro Carvalho Chehab
12354f38fcaSMauro Carvalho Chehab.. c:function:: int v4l2_close(int fd)
12454f38fcaSMauro Carvalho Chehab
125407e84cdSMauro Carvalho Chehab   operates like the :c:func:`close()` function.
12654f38fcaSMauro Carvalho Chehab
12754f38fcaSMauro Carvalho Chehab.. c:function:: int v4l2_dup(int fd)
12854f38fcaSMauro Carvalho Chehab
12954f38fcaSMauro Carvalho Chehab   operates like the libc ``dup()`` function, duplicating a file handler.
13054f38fcaSMauro Carvalho Chehab
13154f38fcaSMauro Carvalho Chehab.. c:function:: int v4l2_ioctl (int fd, unsigned long int request, ...)
13254f38fcaSMauro Carvalho Chehab
133407e84cdSMauro Carvalho Chehab   operates like the :c:func:`ioctl()` function.
13454f38fcaSMauro Carvalho Chehab
13554f38fcaSMauro Carvalho Chehab.. c:function:: int v4l2_read (int fd, void* buffer, size_t n)
13654f38fcaSMauro Carvalho Chehab
137407e84cdSMauro Carvalho Chehab   operates like the :c:func:`read()` function.
13854f38fcaSMauro Carvalho Chehab
139*5cd5f134SDaniel Lundberg Pedersen.. c:function:: void *v4l2_mmap(void *start, size_t length, int prot, int flags, int fd, int64_t offset);
14054f38fcaSMauro Carvalho Chehab
141*5cd5f134SDaniel Lundberg Pedersen   operates like the :c:func:`mmap()` function.
14254f38fcaSMauro Carvalho Chehab
14354f38fcaSMauro Carvalho Chehab.. c:function:: int v4l2_munmap(void *_start, size_t length);
14454f38fcaSMauro Carvalho Chehab
145407e84cdSMauro Carvalho Chehab   operates like the :c:func:`munmap()` function.
14654f38fcaSMauro Carvalho Chehab
14754f38fcaSMauro Carvalho ChehabThose functions provide additional control:
14854f38fcaSMauro Carvalho Chehab
14954f38fcaSMauro Carvalho Chehab.. c:function:: int v4l2_fd_open(int fd, int v4l2_flags)
15054f38fcaSMauro Carvalho Chehab
15154f38fcaSMauro Carvalho Chehab   opens an already opened fd for further use through v4l2lib and possibly
15254f38fcaSMauro Carvalho Chehab   modify libv4l2's default behavior through the ``v4l2_flags`` argument.
15354f38fcaSMauro Carvalho Chehab   Currently, ``v4l2_flags`` can be ``V4L2_DISABLE_CONVERSION``, to disable
15454f38fcaSMauro Carvalho Chehab   format conversion.
15554f38fcaSMauro Carvalho Chehab
15654f38fcaSMauro Carvalho Chehab.. c:function:: int v4l2_set_control(int fd, int cid, int value)
15754f38fcaSMauro Carvalho Chehab
15854f38fcaSMauro Carvalho Chehab   This function takes a value of 0 - 65535, and then scales that range to the
15954f38fcaSMauro Carvalho Chehab   actual range of the given v4l control id, and then if the cid exists and is
16054f38fcaSMauro Carvalho Chehab   not locked sets the cid to the scaled value.
16154f38fcaSMauro Carvalho Chehab
16254f38fcaSMauro Carvalho Chehab.. c:function:: int v4l2_get_control(int fd, int cid)
16354f38fcaSMauro Carvalho Chehab
16454f38fcaSMauro Carvalho Chehab   This function returns a value of 0 - 65535, scaled to from the actual range
16554f38fcaSMauro Carvalho Chehab   of the given v4l control id. when the cid does not exist, could not be
16654f38fcaSMauro Carvalho Chehab   accessed for some reason, or some error occurred 0 is returned.
16754f38fcaSMauro Carvalho Chehab
16854f38fcaSMauro Carvalho Chehabv4l1compat.so wrapper library
16954f38fcaSMauro Carvalho Chehab=============================
17054f38fcaSMauro Carvalho Chehab
17154f38fcaSMauro Carvalho ChehabThis library intercepts calls to
172407e84cdSMauro Carvalho Chehab:c:func:`open()`, :c:func:`close()`,
173407e84cdSMauro Carvalho Chehab:c:func:`ioctl()`, :c:func:`mmap()` and
174407e84cdSMauro Carvalho Chehab:c:func:`munmap()`
17554f38fcaSMauro Carvalho Chehaboperations and redirects them to the libv4l counterparts, by using
17654f38fcaSMauro Carvalho Chehab``LD_PRELOAD=/usr/lib/v4l1compat.so``. It also emulates V4L1 calls via V4L2
17754f38fcaSMauro Carvalho ChehabAPI.
17854f38fcaSMauro Carvalho Chehab
17954f38fcaSMauro Carvalho ChehabIt allows usage of binary legacy applications that still don't use
18054f38fcaSMauro Carvalho Chehablibv4l.
181