Linux的V4L2架构分析

news/2025/3/15 7:43:32/

V4L2全名为VideoFor Linux 2,它是针对Linux系统的视频设备处理架构。视频设备主要包括输入设备(摄像头)及输出设备(显示设备)。

一、LinuxV4L2架构介绍

V4L2的初衷是想为linux系统建立统一的视频类设备处理模型,让驱动开发者依靠其驱动模型轻松的完成video设备的驱动,让视频应用程序可以轻松的使用其接口完成应用程序开发。V4L2的整体架构如下图所示:

 video设备

视频设备按输入输出来看,输入设备常见的就是摄像头了,输出设备常见的就是显示器、电视机。

 video设备接口

◆ 摄像头接口一般有:

ITU-RBT601/656:国际电信联盟针对数字电视演播室的视频接口及数据流格式所做的标准,比较老一点的手机摄像头一般都采用这种接口。

MIPICSI:移动行业处理器接口联盟定义的摄像头数字串行接口,是当今主流的手机摄像头接口。

USBUSB摄像头一般常见在台式机上,USB协议中有专门针对video设备的接口类(interfaceclass=0x0E)。

◆ 视频显示接口一般有:

HDMI:高清晰度多媒体接口,可同时传输音频及视频信号,广泛用于数字机顶盒、个人电脑、平板电脑、高清数字电视当中。

VGA:它是一种模拟信号视频接口,广泛用于PC电脑与显示器中,几乎所有显卡都支持该接口。数字电路中使用该类接口需要用到数模视频编码器,将视频的数字信号转化为模拟信号进行传输。

TV-outTV-out只是一个泛指,指电视中常见的视频模拟接口,如AV接口,S端子,YPbPr接口等。同VGA一样,数字电路中使用该类接口需要用到TV视频编码器,将视频的数字信号转化为TV模拟信号进行传输。

 video设备接口驱动

该部分需要驱动开发者针对不同的视频设备接口,完成其接口驱动。

 video设备驱动

该部分是驱动开发者在进行视频设备驱动开发时,需要重点实现的对象。驱动开发者需要根据V4L2提供的驱动模型,完成对具体视频设备硬件控制的底层实现。Linux为开发者提供了V4L2驱动开发的示例源码:“/drivers/media/video/vivi.c”。

 V4L2核心

该部分是Linux视频设备的架构核心,它对下为驱动开发者提供统一的视频设备驱动开发模型,对上为应用开发者提供操作视频设备的统一接口。其在linux中的核心源码路径为:“/drivers/media/video/v4l2-dev.c”。

 V4L2应用接口

应用程序通过V4L2提供read()write()ioctl()编程接口,来控制操作视频设备,如:设置图像分辨率、视频数据格式、开始/结束视频捕获等等。

二、V4L2核心

  V4L2架构设计之初是只针对视频设备的,那时的V4L2被限制只能在struct video_device 结构体里面创建,并且用video_buf控制视频缓存。随着硬件的变化也越来越复杂,现在大部分设备里面包含了多个子设备IC,比较常见的子设备如编解码器、传感器、摄像头控制器等。通常这些IC一般通过i2c总线连接到主板,这些设备都统称为sub-devices
   这意味着所有的驱动创建自己的实例都将连接到自己的sub-devices,这些工作通常很复杂并经常引起错误,许多常见的代码因为缺乏一个框架而无法重构。因此V4L2 框架作了相应的优化:它有一个 v4l2_device 结构作为设备实例,一个v4l2_subdev结构作为子设备实例,video_device结构包含了v4l2_device节点,每个视频设备都采用v4l2_device结构来表示。为了提供统一的接口给这些子设备,内核将涉及到子设备控制的那部分独立了出来,用 struct v4l2_subdev 来表示以方便用户实现v4l2驱动程序。现如今的V4L2设备关系用一个比较粗糙的图来表示他们之间的关系,大致为:
      设备实例(v4l2_device)
         |______子设备实例(v4l2_subdev)
         |    |__视频设备节点(video_device)

         |______文件访问控制(v4l2_fh)    

           |______视频缓冲的处理(videobuf/videobuf2)

     在V4L2架构中,应用程序基本都是通过ioctl来控制视频设备,V4L2设备都有大量可操作的功能,所以V4L2的ioctl也是十分庞大的,ioctl功能的实现,也是V4L2的核心所在。在v4l2架构中ioctl的调用流程图如下图所示:



http://www.ppmy.cn/news/490052.html

相关文章

Android APP CC2640R2F OTA 流程

Android APP CC2640R2F OTA 流程 1.镜像(bin文件)验证 a. ffc1写入(10:00)打开通知 ffc2写入(10:00)打开通知 ffc5写入(10:00)打开通知 发送CMD 01(1byte&#xff…

全志A40i,linux v4l2驱动 ioctl的调用过程

最近在移植 A40i的红外摄像头驱动,把所研究的记录下来。 step1: v4l2-dev.c 通过v4l2_ioctl 的 ret vdev->fops->ioctl(filp, cmd, arg); 跳转到 step2 static const struct file_operations v4l2_fops {....unlocked_ioctl v4l2_ioctl,... }…

摄像头V4L2获取的YUY2格式转YUV420格式

摄像头取出格式YUY2(YUYV) Y U00Y V00Y U01Y V01Y U02Y V02Y U03Y V03YU10YV10YU11YV11YU12YV12YU13YV13YU20YV20YU21YV21YU22YV22YU23YV23YU30YV30YU31YV31YU32YV32YU33YV33 转为 NV12(YUV420) 这里的转化主要是我的电脑软件pyuv 只支持yuv420格式的预览…

正点原子imx6ull开发板视频监控项目实战系列5: 摄像头(V4L2)和声卡(ALSA)接口简介

1、摄像头: 1)、对于不同的摄像头,有不同的接口方式,eg:USB,CMOS等,但是他们都遵循同样的标准-V4L2. 所以,不同的APP可以使用同样的API访问不同硬件接口的摄像头。 2)、摄像头参数:…

Linux V4L2 源码分析

Linux V4L2 源码分析 前言层次必要的数据结构源码分析ov2640.c 前言 Video For Linux 2真的是一个很复杂的框架,抽象倒不是它复杂的原因,是因为耦合了其他框架的内容,导致要掌握V4L2必须得需要一个非常广的内核层知识面,以及Linu…

使用Linux的V4L2读取摄像头数据+Opencv图像处理

一、前言:对于Linux系统的V4L2的使用和JPEG软件解码库解码过程,大家可以另行查找和阅读相关的博文。 二、正题:使用Linux系统的V4L2接口读取USB摄像头数据,图像格式一般为MJPEG,使用JPEG软件解码库解码成RGB格式的数据…

一些新技术学习心得

实战为主: 看再多的文章不如敲几行代码。 推进度: 学新东西,遇到不懂的不要死磕,直接跳过去。 对应阶段:从0到入门,从啥都不懂到会的过程不要以原理为借口,长时间进度停滞。 关于原理&#…

我们如何实现业务操作日志功能?

1. 需求 我们经常会有这样的需求,需要对关键的业务功能做操作日志记录,也就是用户在指定的时间操作了哪个功能,操作前后的数据记录,必要的时候可以一键回退,今天我就为大家实现这个的功能,让大家可以直接拿…