5.1. 引言¶
libv4l 是一组库的集合,它在 video4linux2 设备之上添加了一个薄抽象层。这个(薄)层的目的是使应用程序编写者能够轻松支持各种设备,而无需为同一类中的不同设备编写单独的代码。
v4l2grab 提供了一个使用 libv4l 的示例。
libv4l 由 3 个不同的库组成
5.1.1. libv4lconvert¶
libv4lconvert 是一个库,它将 V4L2 驱动程序中发现的几种不同的像素格式转换为一些常见的 RGB 和 YUY 格式。
它目前接受以下 V4L2 驱动程序格式: V4L2_PIX_FMT_BGR24, V4L2_PIX_FMT_NV12_16L16, V4L2_PIX_FMT_JPEG, V4L2_PIX_FMT_MJPEG, V4L2_PIX_FMT_MR97310A, V4L2_PIX_FMT_OV511, V4L2_PIX_FMT_OV518, V4L2_PIX_FMT_PAC207, V4L2_PIX_FMT_PJPG, V4L2_PIX_FMT_RGB24, V4L2_PIX_FMT_SBGGR8, V4L2_PIX_FMT_SGBRG8, V4L2_PIX_FMT_SGRBG8, V4L2_PIX_FMT_SN9C10X, V4L2_PIX_FMT_SN9C20X_I420, V4L2_PIX_FMT_SPCA501, V4L2_PIX_FMT_SPCA505, V4L2_PIX_FMT_SPCA508, V4L2_PIX_FMT_SPCA561, V4L2_PIX_FMT_SQ905C, V4L2_PIX_FMT_SRGGB8, V4L2_PIX_FMT_UYVY, V4L2_PIX_FMT_YUV420, V4L2_PIX_FMT_YUYV, V4L2_PIX_FMT_YVU420, 和 V4L2_PIX_FMT_YVYU。
后来,libv4lconvert 扩展为也能够执行各种视频处理功能,以提高网络摄像头视频质量。视频处理分为两个部分:libv4lconvert/control 和 libv4lconvert/processing。
控制部分用于提供视频控制,这些控制可用于控制 libv4lconvert/processing 提供的视频处理功能。这些控制通过使用持久共享内存对象存储在整个应用程序中(直到重新启动)。
libv4lconvert/processing 提供实际的视频处理功能。
5.1.2. libv4l1¶
此库提供一些函数,这些函数可用于快速使 v4l1 应用程序与 v4l2 设备一起工作。这些函数的工作方式与正常的 open/close/etc 完全相同,只是 libv4l1 在 v4l2 驱动程序之上完全模拟 v4l1 API,如果是 v4l1 驱动程序,它将直接传递调用。
由于这些函数是旧的 V4L1 API 的模拟,因此不应将其用于新应用程序。
5.1.3. libv4l2¶
此库应适用于所有现代 V4L2 应用程序。
它提供句柄来调用 V4L2 open/ioctl/close/poll 方法。它不仅提供设备的原始输出,而且还增强了调用,因为会使用 libv4lconvert 来提供更多的视频格式并提高图像质量。
在大多数情况下,libv4l2 只是将调用直接传递给 v4l2 驱动程序,拦截对 VIDIOC_TRY_FMT, VIDIOC_G_FMT, VIDIOC_S_FMT, VIDIOC_ENUM_FRAMESIZES 和 VIDIOC_ENUM_FRAMEINTERVALS 的调用,以便模拟格式 V4L2_PIX_FMT_BGR24, V4L2_PIX_FMT_RGB24, V4L2_PIX_FMT_YUV420, 和 V4L2_PIX_FMT_YVU420,如果这些格式在驱动程序中不可用的话。VIDIOC_ENUM_FMT 继续枚举硬件支持的格式,以及 libv4l 在最后提供的模拟格式。
5.1.3.1. Libv4l 设备控制函数¶
libv4l 提供了常见的 文件操作方法。
这些函数的操作方式与 gcc 函数 dup()
和 V4L2 函数 open()
, close()
, ioctl()
, read()
, mmap()
和 munmap()
相同
-
int v4l2_dup(int fd)¶
操作方式与 libc
dup()
函数相同,复制文件句柄。
-
int v4l2_ioctl(int fd, unsigned long int request, ...)¶
操作方式与
ioctl()
函数相同。
-
void *v4l2_mmap(void *start, size_t length, int prot, int flags, int fd, int64_t offset);¶
其操作类似于
mmap()
函数。
这些函数提供了额外的控制功能。
-
int v4l2_fd_open(int fd, int v4l2_flags)¶
打开一个已经打开的 fd,以便通过 v4l2lib 进一步使用,并且可以通过
v4l2_flags
参数修改 libv4l2 的默认行为。目前,v4l2_flags
可以是V4L2_DISABLE_CONVERSION
,用于禁用格式转换。
-
int v4l2_set_control(int fd, int cid, int value)¶
此函数接收一个 0-65535 的值,然后将该范围缩放到给定 v4l 控制 ID 的实际范围,然后如果 cid 存在且未被锁定,则将 cid 设置为缩放后的值。
-
int v4l2_get_control(int fd, int cid)¶
此函数返回一个 0 - 65535 的值,该值是从给定的 v4l 控制 ID 的实际范围缩放而来的。当 cid 不存在、由于某些原因无法访问或发生某些错误时,将返回 0。
5.1.4. v4l1compat.so 包装库¶
此库拦截对 open()
、 close()
、ioctl()
、 mmap()
和 munmap()
操作的调用,并通过使用 LD_PRELOAD=/usr/lib/v4l1compat.so
将它们重定向到 libv4l 的对应项。 它还通过 V4L2 API 模拟 V4L1 调用。
它允许使用仍然不使用 libv4l 的二进制旧应用程序。