在 Linux 内核媒体子系统(Media Subsystem)中,V4L2 Core、Media Framework 和 VideoBuf2 (VB2) 是三个紧密协作但职责分明的核心组件。它们共同构成了现代 Linux 视频驱动(如摄像头、编码器、显示器)的基础架构。
1.V4l2-Core子模块
V4L2-Core是v4l2子系统的骨架,它提供了以下功能:
1.向上层应用暴露标准的字符设备接口/dev/VideoX,提供控制底层硬件的ioctl命令,屏蔽硬件驱动的差异
2.定义核心数据结构,struct v4l2_device代表一个主设备,struct video_device代表一个设备节点,并负责它们的注册与管理
3.内置了一套控制框架v4l2_ctrl_handler,用于标准化的管理亮度,对比度,饱和度等设备参数
2.VideoBuf2
VideoBuf2简称vb2是缓冲队列管理层,它专门负责视频数据缓冲区的管理,提供以下功能:
1.负责视频缓冲区的申请、释放、队列管理和状态跟踪
2.支持多种I/O模式,比如MMAP、USERPTR、DMABUF等多种内存访问方式,为驱动提供灵活的零拷贝支持
3.驱动通过调用vb2的API来入队(vb2_queue)和出队(vb2_dequeue)缓冲区,以高效的处理视频数据流
详细分析见:https://blog.csdn.net/qq_38089448/article/details/160133999
3.Media Controller
Media Controller负责管理v4l2子系统的设备拓扑,为了管理复杂的多组件视频设备,提供以下功能:
1.现代摄像头模组通常由sensor,isp,csi等都多个子设备串联而成,Media Controller负责将这些组件抽象成媒体实体media_entity,媒体焊盘media_pad和媒体链路(media_link),形成一个完整的媒体图(Media Graph)
2.定义了数据再复杂硬件内部的流动路径,可以配置数据流从Sensor流向ISP,再流向最终的/dev/videoX节点
3.支持在运行时动态地启用、禁用或重配数据链路,以适应不同的应用场景,比如多路camera同时进行视频录制和预览
4.协同工作
当一个视频采集任务到来时,V4L2 Core 接收请求,根据 Media Controller 规划的路线,指挥各个硬件子设备开始工作,而整个过程中产生的海量视频数据,则由 Videobuf2 负责高效地搬运和管理。