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