主题 : Video For Linux Two(V4L2) 摄像头数据LCD显示问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 31246
精华: 0
发帖: 2
金钱: 10 两
威望: 2 点
综合积分: 4 分
注册时间: 2010-10-28
最后登录: 2017-09-13
楼主  发表于: 2010-10-28 13:02

 Video For Linux Two(V4L2) 摄像头数据LCD显示问题

初学Linux,在网上找了些V4L2资料,说到:
“一共有三种视频采集方式:使用read、write方式;内存映射方式和用户指针模式。read、write方式,在用户空间和内核空间不断拷贝数据,占用了大量用户内存空间,效率不高。
内存映射方式:把设备里的内存映射到应用程序中的内存控件,直接处理设备内存,这是一种有效的方式。上面的mmap函数就是使用这种方式。用户指针模式:内存片段由应用程序自己分配。这点需要在v4l2_requestbuffers里将memory字段设置成V4L2_MEMORY_USERPTR。”
通常应该是使用第二种也就是内存映射方式
我想问下大家:
1.内存映射方式最后得到的是参数buffers[numBufs].start和buffers[numBufs].length,然后使用的时候用fwrite将这段内存中的数据写入LCD文件进行显示,或者将LCD文件也映射到内存,使用memcpy,还有其他方式吗?这两种方式哪个效率更高?这里使用的fwrite和三种采集方式中的read、write方式如何比较?

2.可否将LCD映射进内存的时候,映射到buffers[numBufs].start,也就是LCD和V4L2映射同一段内存,这样V4L2的数据直接连通到LCD,LCD的刷新不需要我们自己调用函数来完成。Linux允许这样做吗?
[ 此帖被xforce在2010-10-28 13:11重新编辑 ]
级别: 新手上路
UID: 16042
精华: 0
发帖: 47
金钱: 245 两
威望: 49 点
综合积分: 94 分
注册时间: 2010-03-13
最后登录: 2012-03-23
1楼  发表于: 2010-10-30 21:21
理论上把两个模块映射到同一区域应该是可以,不过再仔细考虑下会有不少问题。
1、访问冲突的控制。
2、V4L2拿到的图像数据往往和LCD可直接接受的数据格式差别很大。
3、采取直接共享同一块物理存储区的方式会给图像处理带来很大麻烦。此时不但V4L2要和Framebuffer争资源,
   用户的图像处理进程也会参与进来,这就给问题1的解决提出了更大麻烦。
考虑以上几点,似乎并不是很吸引人。
[ 此帖被gdglacier在2010-10-30 21:28重新编辑 ]
级别: 新手上路
UID: 31246
精华: 0
发帖: 2
金钱: 10 两
威望: 2 点
综合积分: 4 分
注册时间: 2010-10-28
最后登录: 2017-09-13
2楼  发表于: 2010-11-01 00:42
引用第1楼gdglacier于2010-10-30 21:21发表的  :
理论上把两个模块映射到同一区域应该是可以,不过再仔细考虑下会有不少问题。
1、访问冲突的控制。
2、V4L2拿到的图像数据往往和LCD可直接接受的数据格式差别很大。
3、采取直接共享同一块物理存储区的方式会给图像处理带来很大麻烦。此时不但V4L2要和Framebuffer争资源,
   用户的图像处理进程也会参与进来,这就给问题1的解决提出了更大麻烦。
.......


非常感谢啊!
后来看到V4L2好像有个Video Output Overlay Interface能直接给数据给LCD,http://v4l2spec.bytesex.org/spec/x6909.htm
不过还没怎么看懂。

通常的显示方式是不是fwrite将V4L2映射的内存数据写入LCD文件?
级别: 新手上路
UID: 32057
精华: 0
发帖: 21
金钱: 105 两
威望: 21 点
综合积分: 42 分
注册时间: 2010-11-09
最后登录: 2017-09-13
3楼  发表于: 2011-05-03 16:36
楼主 显示成功了嘛?
采集的图像 格式是怎么转换的?