视频监控—uvc驱动框架分析
- 硬件平台:韦东山嵌入式Linxu开发板(S3C2440.v3)
- 软件平台:运行于VMware Workstation 12 Player下UbuntuLTS16.04_x64 系统
- 参考资料:USB_Video_Example 1.5、UVC 1.5 Class specification
- 开发环境:Linux-3.4.2内核、arm-linux-gcc-4.3.2工具链、源码分析版本为:Linux-2.6.31.14
- 源码仓库:https://gitee.com/d_1254436976/Embedded-Linux-Phase-3
目录
-
视频监控—uvc驱动框架分析 -
- 一、UVC
- 二、以usb摄像头为例分析uvc框架
-
- 1、usb摄像头的拓扑结构
- 2、uvc_v4l2.c源码分析
-
- 2.1 打开驱动`open`
- 2.2 获取该设备的类型 VIDIOC_QUERYCAP
- 2.3 列举摄像头的数据格式 VIDIOC_ENUM_FMT
- 2.4 获得摄像头的数据格式 VIDIOC_G_FMT
- 2.5 测试是否支持该摄像头的数据格式 VIDIOC_TRY_FMT
- 2.6 设置参数VIDIOC_S_FMT
- 2.7 请求系统分配缓冲区VIDIOC_REQBUFS
- 2.8 查询所分配的缓冲区的信息 VIDIOC_QUERYBUF
- 2.9 映射缓冲区mmap
- 2.10 把缓冲区放入队列 VIDIOC_QBUF
- 2.11 启动摄像头 VIDIOC_STREAMON
- 2.12 采用poll机制等待数据
- 2.13 有数据后从队列里取出缓冲区VIDIOC_DQBUF
- 2.14 若此时需要关闭摄像头 VIDIOC_STREAMOFF
- 3、总结
- 4、修改usb摄像头数据
- 三、总结
一、UVC
UVC全称为USB Video Class,即:USB视频类,是一种为USB视频捕获设备定义的协议标准,在不需要安装任何的驱动程序下即插即用。
视频设备的USB设备类定义适用于用于操作视频和视频相关功能的复合设备中的所有设备或函数。包括桌面摄像机(或“网络摄像机”)、数字摄像机、模拟视频转换器、模拟和数字电视调谐器以及支持视频流的静态图像摄像机,也适用于使用时间编码器压缩视频的视频设备。
二、以usb摄像头为例分析uvc框架
1、usb摄像头的拓扑结构
整个拓扑结构主要分为两大部分:
-
VideoControl Interface(视频控制接口):控制特定视频功能的功能行为,主机可以操作Unit(单元)和Terminal(终端)内部的视频功能。
在这个部分中,有一个Video Function
部分,有以下的Unit(单元)和Terminal(终端)组成: -
- Input Terminal(输入终端):作为视频功能的“外部世界”和视频功能内部其他单元之间的接口。它充当数据流进视频功能的容器。
功能:在从数据源中提取数据之后表示传入数据的来源。数据可以包括音频和与视频流相关联的元数据。
- Input Terminal(输入终端):作为视频功能的“外部世界”和视频功能内部其他单元之间的接口。它充当数据流进视频功能的容器。
-
- Output Terminal(输出终端):作为视频功能内部单元与“外部世界”之间的接口。它作为视频信息的出口,流出视频功能。
功能:表示传出数据的接收器。
- Output Terminal(输出终端):作为视频功能内部单元与“外部世界”之间的接口。它作为视频信息的出口,流出视频功能。
-
- Camera Terminal(摄像头终端):控制传输视频流的设备组件的机械(或等效的数字)特征。因此,它只适用于具有可控制镜头或传感器特性的视频捕捉设备。
-
- Selector Unit(选择单元):从n个输入数据流中选择,并将它们不改变地路由到单个输出流(类似多路选择器)。它表示一个源选择器,能够在许多源中进行选择。