发布: 01_V4L2应用程序开发_数据采集流程

This commit is contained in:
weidongshan
2023-06-18 00:37:21 +08:00
parent 2bfcdb51e1
commit 05bc350b45
23 changed files with 603 additions and 3 deletions

View File

@@ -36,7 +36,7 @@ GIC V2有3种中断
![image-20220124122926019](pic/10_PCI_PCIe/120_gicv2_with_dedicate_signal.png)
在复杂系统中有成上千的中断时,就需要成上千的中断信号线,这太复杂了。
在复杂系统中有成上千的中断时,就需要成上千的中断信号线,这太复杂了。
于是在GICv3中引入MSI("message-based interrupts"),设备往某个地址写入数值,即可触发中断。

View File

@@ -5,7 +5,7 @@
GIT仓库
```shell
https://e.coding.net/weidongshan/projects/doc_and_source_for_projects.git
https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git
```
注意上述链接无法用浏览器打开必须使用GIT命令来克隆。

View File

@@ -0,0 +1,73 @@
# V4L2应用程序开发 #
参考资料:
* mjpg-streamerhttps://github.com/jacksonliam/mjpg-streamer
* video2lcd这是百问网编写的APP它可以在LCD上直接显示摄像头的图像
* 这2个源码都放在GIT仓库里
![image-20230617173258521](pic/04_demo.png)
## 1. 数据采集流程
可以参考这些文件:
* mjpg-streamer\mjpg-streamer-experimental\plugins\input_control\input_uvc.c
* video2lcd\video\v4l2.c
Video for Linux two(Video4Linux2)简称V4L2是V4L的改进版。V4L2支持三种方式来采集图像内存映射方式(mmap)、直接读取方式(read)和用户指针。内存映射的方式采集速度较快,一般用于连续视频数据的采集,实际工作中的应用概率更高;直接读取的方式相对速度慢一些,所以常用于静态图片数据的采集;用户指针使用较少,如有兴趣可自行研究。
### 1.1 buffer的管理
使用摄像头时,核心是"获得数据"。所以先讲如何获取数据即如何得到buffer。
摄像头采集数据时是一帧又一帧地连续采集。所以需要申请若干个buffer驱动程序把数据放入bufferAPP从buffer得到数据。这些buffer可以使用链表来管理。
驱动程序周而复始地做如下事情:
* 从硬件采集到数据
* 把"空闲链表"取出buffer把数据存入buffer
* 把含有数据的buffer放入"完成链表"
APP也会周而复始地做如下事情
* 监测"完成链表"等待它含有buffer
* 从"完成链表"中取出buffer
* 处理数据
* 把buffer放入"空闲链表"
链表操作示意图如下:
![image-20230617171816630](pic/05_buffers.png)
### 1.2 完整的使用流程
参考mjpg-streamer和video2lcd总结了摄像头的使用流程如下
* open打开设备节点/dev/videoX
* ioctl VIDIOC_QUERYCAPQuery Capbility查询能力比如
* 确认它是否是"捕获设备",因为有些节点是输出设备
* 确认它是否支持mmap操作还是仅支持read/write操作
* ioctl VIDIOC_ENUM_FMT枚举它支持的格式
* ioctl VIDIOC_S_FMT在上面枚举出来的格式里选择一个来设置格式
* ioctl VIDIOC_REQBUFS申请bufferAPP可以申请很多个buffer但是驱动程序不一定能申请到
* ioctl VIDIOC_QUERYBUF和mmap查询buffer信息、映射
* 如果申请到了N个buffer这个ioctl就应该执行N次
* 执行mmap后APP就可以直接读写这些buffer
* ioctl VIDIOC_QBUF把buffer放入"空闲链表"
* 如果申请到了N个buffer这个ioctl就应该执行N次
* ioctl VIDIOC_STREAMON启动摄像头
* 这里是一个循环使用poll/select监测buffer然后从"完成链表"中取出buffer处理后再放入"空闲链表"
* poll/select
* ioctl VIDIOC_DQBUF从"完成链表"中取出buffer
* 处理前面使用mmap映射了每个buffer的地址处理时就可以直接使用地址来访问buffer
* ioclt VIDIOC_QBUF把buffer放入"空闲链表"
* ioctl VIDIOC_STREAMOFF停止摄像头
## 2. 控制流程

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

View File

@@ -0,0 +1,227 @@
# V4L2视频介绍及资料下载 #
## 1. 资料下载
GIT仓库
```shell
https://e.coding.net/weidongshan/projects/doc_and_source_for_projects.git
```
注意上述链接无法用浏览器打开必须使用GIT命令来克隆。
GIT简明教程http://download.100ask.org/tools/Software/git/how_to_use_git.html
下载到GIT仓库后V4L2资料在里面
![image-20230331142343509](pic/01_git.png)
## 2. 收到的建议
subdev, media control, media framework, vb2 buffer的分配怎么轮转怎么跟硬件打交道然后图像给应用层用
有的摄像头有控制接口iic,spi还有没有控制接口的我们怎么处理
串行和解串包括cphy和dphy
![image-20230331141937497](pic/02_subjection.png)
现在sensor一般都是mipi输出iic做控制丢到ISPISP处理完了就拿到一帧数据后面还可能有裁剪和编码等。@韦东山 会有ISP部分讲解吗最终视频输出是屏幕还是通过网络做IPC或者USB做UVC?
MIPI资料网上也挺多的啊把协议啃一啃
https://www.mipi.org/
![image-20230331144736277](pic/03_mipi_file.png)
现在汽车上面都是sensor通过串行/解串器然后通过mipi接口连接到soc
sensor---串行器---GSML---->解串器---->socmipi接口这一条路也涉及一下自动驾驶基本都涉及这个
## 3. 学习笔记
Linux V4L2子系统分析: https://blog.csdn.net/u011037593/article/details/115415136
Linux V3H 平台开发系列讲解摄像头2.1 MAX9296 GMSL链路配置: https://blog.csdn.net/xian18809311584/article/details/131182605
https://github.com/GStreamer/gstreamer
麦兜<chenchengwudi@sina.com> 14:55:33
我也正在看V4L2也参考了上面提到的Linux设备驱动开发还有内核文档基于5.4内核的,大家可以参考下
麦兜<chenchengwudi@sina.com> 14:55:42
https://lvxfuhal9l.feishu.cn/docx/Cyssdr8BVonDnnx3YjUc4O9xngg
麦兜<chenchengwudi@sina.com> 14:55:49
https://lvxfuhal9l.feishu.cn/docx/MYYndrVvPolMA4xhBCNczE4WnWf
麦兜<chenchengwudi@sina.com> 14:56:32
准备写一组笔记目前完成了1.5篇
颜色空间总结 https://blog.51cto.com/u_15471597/4927811
https://zhuanlan.zhihu.com/p/159148034
sRGB和RGB的转换
https://www.zhangxinxu.com/wordpress/2017/12/linear-rgb-srgb-js-convert/
YUV(有程序)
https://www.cnblogs.com/a4234613/p/15497724.html
浅谈YUV444、YUV422、YUV420
http://www.pjtime.com/2021/4/192828404475.shtml
YUV与RGB 以及之间的转换
https://blog.csdn.net/WANGYONGZIXUE/article/details/127971015
YUV 4:4:4 每一个Y对应一组UV
YUV 4:2:2 每两个Y共用一组UV
YUV 4:2:0 每四个Y共用一组UV
480i、576i是什么意思
SDTV、EDTV、HDTV
* SDTV
* 采样频率13.5MHz
* 每行扫描线包含858个采样点480i系统或864个采样点576i系统
* 有效线周期内都是720个采样点
* 后来支持16:9宽高比采样率为18MHz有效分辨率为960x480i和960x576i有效线内960个采样点
* EDTV
* 480p、576p
* 采样频率4:3宽高比27MHz16:9宽高比36MHz
* HDTV
* 720p、1080i、1080p
* 每线的有效采样点数量、每帧的有效线数目:都是恒定的,无论帧率如何
* 每种帧率都使用不同的采样时钟频率
* 480i和480p系统
* 480i属于SDTV
* 480p属于EDTV
* 隔行模拟分量视频
* 每帧525线有效扫描线为480在23~262和286~525线上显示有效视频
* 帧率29.97Hz30/1.001
* 隔行数字分量视频
*
* 逐行模拟分量视频
* 帧率59.94Hz60/1.001
* 每帧525线有效扫描线为480在45~524线上显示有效视频
* 576i和576p系统
* 隔行模拟复合视频单一信号线每帧625线
* 隔行模拟分量视频三种信号线帧率25Hz每帧625线在23~310和336~623线上显示有效视频
* 逐行模拟分量视频三种信号帧率50Hz每帧625线在45`620线上显示有效视频
* 隔行数字分量视频
* 逐行数字分量视频
SDTV、EDTV、HDTV是数字电视的三种标准分别是标清电视、增强型标清电视和高清电视。它们的区别在于分辨率、画质和声音的质量。
1. SDTVStandard Definition Television标清电视分辨率为720×576或720×480采用4:3的屏幕比例通常是普通的电视机或DVD播放机所使用的基本分辨率。在播放高清节目时会有黑边或画面拉伸等显示不完整的情况。
2. EDTVEnhanced Definition Television增强型标清电视分辨率为1280×720或960×540采用16:9的屏幕比例。比标清电视分辨率更高但仍不达到高清的标准适用于播放分辨率较高的电影或游戏。在播放高清节目时会有黑边或画面拉伸等显示不完整的情况。
3. HDTVHigh Definition Television高清电视分辨率为1920×1080或1280×720采用16:9的屏幕比例画面质量高声音也更为清晰。是当前数字电视的最高标准适用于播放高清电影、游戏、体育赛事和其他节目。在播放标清节目时电视会对其进行升频会用比标清分辨率更高的分辨率去显示从而提高画质体验。
YUV420P(YU12和YV12)格式 https://blog.csdn.net/lz0499/article/details/101029783
色彩校正中的 gamma 值是什么
https://www.jianshu.com/p/52fc2192ae7b
https://www.zhihu.com/question/27467127
https://blog.csdn.net/weixin_42203498/article/details/126753239
https://blog.csdn.net/m0_61737429/article/details/129782000
https://blog.csdn.net/seiyaaa/article/details/120199720
Linux多媒体子系统01从用户空间使用V4L2子系统 https://blog.csdn.net/chenchengwudi/article/details/129176862
Video Demystified
https://www.zhihu.com/column/videodemystified
摄像头:
https://mp.weixin.qq.com/s?__biz=MzUxMjEyNDgyNw==&mid=2247510675&idx=1&sn=66fcc83a95974add9d25a6e9b925c43b&chksm=f96bd867ce1c5171976838ddf995fc6f68e7e839c797bfa6f690c94b577d359939ad1a816cd1&cur_album_id=2583789151490113538&scene=189#wechat_redirect
UI 设计知识库 [01] 色彩 · 理论 https://www.jianshu.com/p/34e9660f00f4
UI 设计知识库 [02] 色彩 · 理论 常见问题 https://www.jianshu.com/p/7f652ae75142
UI 设计知识库 [03] 色彩 · 配色 https://www.jianshu.com/p/b56acefc66ed
sRGB https://en.wikipedia.org/wiki/SRGB https://zh.wikipedia.org/wiki/SRGB%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4
色彩空间是什么? https://www.pantonecn.com/articles/technical/what-are-your-color-spaces
Gamma、Linear、sRGB 和Unity Color Space你真懂了吗 https://zhuanlan.zhihu.com/p/66558476
https://baike.baidu.com/tashuo/browse/content?id=9167c87c2cd4f1c2f4d1c173&lemmaId=2147136&fromLemmaModule=pcRight
A Standard Default Color Space for the Internet - sRGB https://www.w3.org/Graphics/Color/sRGB
术语:
colorspace SMPTE-170M、 REC-709 (CEA-861 timings) 、 sRGB (VESA DMT timings)
NTSC TV 、PAL
HDMI EDID
progressive、interlaced、
HDMI、webcam TV、S-Video
S-Video and TV inputs
Y'CbCr、RGB、
YUYV 4:4:4, 4:2:2 and 4:2:0
V4L2 capture overlay

Binary file not shown.

View File

@@ -5,7 +5,7 @@
GIT仓库
```shell
https://e.coding.net/weidongshan/projects/doc_and_source_for_projects.git
https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git
```
注意上述链接无法用浏览器打开必须使用GIT命令来克隆。

View File

@@ -0,0 +1,73 @@
# V4L2应用程序开发 #
参考资料:
* mjpg-streamerhttps://github.com/jacksonliam/mjpg-streamer
* video2lcd这是百问网编写的APP它可以在LCD上直接显示摄像头的图像
* 这2个源码都放在GIT仓库里
![image-20230617173258521](pic/04_demo.png)
## 1. 数据采集流程
可以参考这些文件:
* mjpg-streamer\mjpg-streamer-experimental\plugins\input_control\input_uvc.c
* video2lcd\video\v4l2.c
Video for Linux two(Video4Linux2)简称V4L2是V4L的改进版。V4L2支持三种方式来采集图像内存映射方式(mmap)、直接读取方式(read)和用户指针。内存映射的方式采集速度较快,一般用于连续视频数据的采集,实际工作中的应用概率更高;直接读取的方式相对速度慢一些,所以常用于静态图片数据的采集;用户指针使用较少,如有兴趣可自行研究。
### 1.1 buffer的管理
使用摄像头时,核心是"获得数据"。所以先讲如何获取数据即如何得到buffer。
摄像头采集数据时是一帧又一帧地连续采集。所以需要申请若干个buffer驱动程序把数据放入bufferAPP从buffer得到数据。这些buffer可以使用链表来管理。
驱动程序周而复始地做如下事情:
* 从硬件采集到数据
* 把"空闲链表"取出buffer把数据存入buffer
* 把含有数据的buffer放入"完成链表"
APP也会周而复始地做如下事情
* 监测"完成链表"等待它含有buffer
* 从"完成链表"中取出buffer
* 处理数据
* 把buffer放入"空闲链表"
链表操作示意图如下:
![image-20230617171816630](pic/05_buffers.png)
### 1.2 完整的使用流程
参考mjpg-streamer和video2lcd总结了摄像头的使用流程如下
* open打开设备节点/dev/videoX
* ioctl VIDIOC_QUERYCAPQuery Capbility查询能力比如
* 确认它是否是"捕获设备",因为有些节点是输出设备
* 确认它是否支持mmap操作还是仅支持read/write操作
* ioctl VIDIOC_ENUM_FMT枚举它支持的格式
* ioctl VIDIOC_S_FMT在上面枚举出来的格式里选择一个来设置格式
* ioctl VIDIOC_REQBUFS申请bufferAPP可以申请很多个buffer但是驱动程序不一定能申请到
* ioctl VIDIOC_QUERYBUF和mmap查询buffer信息、映射
* 如果申请到了N个buffer这个ioctl就应该执行N次
* 执行mmap后APP就可以直接读写这些buffer
* ioctl VIDIOC_QBUF把buffer放入"空闲链表"
* 如果申请到了N个buffer这个ioctl就应该执行N次
* ioctl VIDIOC_STREAMON启动摄像头
* 这里是一个循环使用poll/select监测buffer然后从"完成链表"中取出buffer处理后再放入"空闲链表"
* poll/select
* ioctl VIDIOC_DQBUF从"完成链表"中取出buffer
* 处理前面使用mmap映射了每个buffer的地址处理时就可以直接使用地址来访问buffer
* ioclt VIDIOC_QBUF把buffer放入"空闲链表"
* ioctl VIDIOC_STREAMOFF停止摄像头
## 2. 控制流程

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

View File

@@ -0,0 +1,227 @@
# V4L2视频介绍及资料下载 #
## 1. 资料下载
GIT仓库
```shell
https://e.coding.net/weidongshan/projects/doc_and_source_for_projects.git
```
注意上述链接无法用浏览器打开必须使用GIT命令来克隆。
GIT简明教程http://download.100ask.org/tools/Software/git/how_to_use_git.html
下载到GIT仓库后V4L2资料在里面
![image-20230331142343509](pic/01_git.png)
## 2. 收到的建议
subdev, media control, media framework, vb2 buffer的分配怎么轮转怎么跟硬件打交道然后图像给应用层用
有的摄像头有控制接口iic,spi还有没有控制接口的我们怎么处理
串行和解串包括cphy和dphy
![image-20230331141937497](pic/02_subjection.png)
现在sensor一般都是mipi输出iic做控制丢到ISPISP处理完了就拿到一帧数据后面还可能有裁剪和编码等。@韦东山 会有ISP部分讲解吗最终视频输出是屏幕还是通过网络做IPC或者USB做UVC?
MIPI资料网上也挺多的啊把协议啃一啃
https://www.mipi.org/
![image-20230331144736277](pic/03_mipi_file.png)
现在汽车上面都是sensor通过串行/解串器然后通过mipi接口连接到soc
sensor---串行器---GSML---->解串器---->socmipi接口这一条路也涉及一下自动驾驶基本都涉及这个
## 3. 学习笔记
Linux V4L2子系统分析: https://blog.csdn.net/u011037593/article/details/115415136
Linux V3H 平台开发系列讲解摄像头2.1 MAX9296 GMSL链路配置: https://blog.csdn.net/xian18809311584/article/details/131182605
https://github.com/GStreamer/gstreamer
麦兜<chenchengwudi@sina.com> 14:55:33
我也正在看V4L2也参考了上面提到的Linux设备驱动开发还有内核文档基于5.4内核的,大家可以参考下
麦兜<chenchengwudi@sina.com> 14:55:42
https://lvxfuhal9l.feishu.cn/docx/Cyssdr8BVonDnnx3YjUc4O9xngg
麦兜<chenchengwudi@sina.com> 14:55:49
https://lvxfuhal9l.feishu.cn/docx/MYYndrVvPolMA4xhBCNczE4WnWf
麦兜<chenchengwudi@sina.com> 14:56:32
准备写一组笔记目前完成了1.5篇
颜色空间总结 https://blog.51cto.com/u_15471597/4927811
https://zhuanlan.zhihu.com/p/159148034
sRGB和RGB的转换
https://www.zhangxinxu.com/wordpress/2017/12/linear-rgb-srgb-js-convert/
YUV(有程序)
https://www.cnblogs.com/a4234613/p/15497724.html
浅谈YUV444、YUV422、YUV420
http://www.pjtime.com/2021/4/192828404475.shtml
YUV与RGB 以及之间的转换
https://blog.csdn.net/WANGYONGZIXUE/article/details/127971015
YUV 4:4:4 每一个Y对应一组UV
YUV 4:2:2 每两个Y共用一组UV
YUV 4:2:0 每四个Y共用一组UV
480i、576i是什么意思
SDTV、EDTV、HDTV
* SDTV
* 采样频率13.5MHz
* 每行扫描线包含858个采样点480i系统或864个采样点576i系统
* 有效线周期内都是720个采样点
* 后来支持16:9宽高比采样率为18MHz有效分辨率为960x480i和960x576i有效线内960个采样点
* EDTV
* 480p、576p
* 采样频率4:3宽高比27MHz16:9宽高比36MHz
* HDTV
* 720p、1080i、1080p
* 每线的有效采样点数量、每帧的有效线数目:都是恒定的,无论帧率如何
* 每种帧率都使用不同的采样时钟频率
* 480i和480p系统
* 480i属于SDTV
* 480p属于EDTV
* 隔行模拟分量视频
* 每帧525线有效扫描线为480在23~262和286~525线上显示有效视频
* 帧率29.97Hz30/1.001
* 隔行数字分量视频
*
* 逐行模拟分量视频
* 帧率59.94Hz60/1.001
* 每帧525线有效扫描线为480在45~524线上显示有效视频
* 576i和576p系统
* 隔行模拟复合视频单一信号线每帧625线
* 隔行模拟分量视频三种信号线帧率25Hz每帧625线在23~310和336~623线上显示有效视频
* 逐行模拟分量视频三种信号帧率50Hz每帧625线在45`620线上显示有效视频
* 隔行数字分量视频
* 逐行数字分量视频
SDTV、EDTV、HDTV是数字电视的三种标准分别是标清电视、增强型标清电视和高清电视。它们的区别在于分辨率、画质和声音的质量。
1. SDTVStandard Definition Television标清电视分辨率为720×576或720×480采用4:3的屏幕比例通常是普通的电视机或DVD播放机所使用的基本分辨率。在播放高清节目时会有黑边或画面拉伸等显示不完整的情况。
2. EDTVEnhanced Definition Television增强型标清电视分辨率为1280×720或960×540采用16:9的屏幕比例。比标清电视分辨率更高但仍不达到高清的标准适用于播放分辨率较高的电影或游戏。在播放高清节目时会有黑边或画面拉伸等显示不完整的情况。
3. HDTVHigh Definition Television高清电视分辨率为1920×1080或1280×720采用16:9的屏幕比例画面质量高声音也更为清晰。是当前数字电视的最高标准适用于播放高清电影、游戏、体育赛事和其他节目。在播放标清节目时电视会对其进行升频会用比标清分辨率更高的分辨率去显示从而提高画质体验。
YUV420P(YU12和YV12)格式 https://blog.csdn.net/lz0499/article/details/101029783
色彩校正中的 gamma 值是什么
https://www.jianshu.com/p/52fc2192ae7b
https://www.zhihu.com/question/27467127
https://blog.csdn.net/weixin_42203498/article/details/126753239
https://blog.csdn.net/m0_61737429/article/details/129782000
https://blog.csdn.net/seiyaaa/article/details/120199720
Linux多媒体子系统01从用户空间使用V4L2子系统 https://blog.csdn.net/chenchengwudi/article/details/129176862
Video Demystified
https://www.zhihu.com/column/videodemystified
摄像头:
https://mp.weixin.qq.com/s?__biz=MzUxMjEyNDgyNw==&mid=2247510675&idx=1&sn=66fcc83a95974add9d25a6e9b925c43b&chksm=f96bd867ce1c5171976838ddf995fc6f68e7e839c797bfa6f690c94b577d359939ad1a816cd1&cur_album_id=2583789151490113538&scene=189#wechat_redirect
UI 设计知识库 [01] 色彩 · 理论 https://www.jianshu.com/p/34e9660f00f4
UI 设计知识库 [02] 色彩 · 理论 常见问题 https://www.jianshu.com/p/7f652ae75142
UI 设计知识库 [03] 色彩 · 配色 https://www.jianshu.com/p/b56acefc66ed
sRGB https://en.wikipedia.org/wiki/SRGB https://zh.wikipedia.org/wiki/SRGB%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4
色彩空间是什么? https://www.pantonecn.com/articles/technical/what-are-your-color-spaces
Gamma、Linear、sRGB 和Unity Color Space你真懂了吗 https://zhuanlan.zhihu.com/p/66558476
https://baike.baidu.com/tashuo/browse/content?id=9167c87c2cd4f1c2f4d1c173&lemmaId=2147136&fromLemmaModule=pcRight
A Standard Default Color Space for the Internet - sRGB https://www.w3.org/Graphics/Color/sRGB
术语:
colorspace SMPTE-170M、 REC-709 (CEA-861 timings) 、 sRGB (VESA DMT timings)
NTSC TV 、PAL
HDMI EDID
progressive、interlaced、
HDMI、webcam TV、S-Video
S-Video and TV inputs
Y'CbCr、RGB、
YUYV 4:4:4, 4:2:2 and 4:2:0
V4L2 capture overlay

Binary file not shown.