V4L2应用程序开发--数据采集流程

今天呢,我们来讲一个摄像头模块,V4L2,我们先来讲讲他的应用编程先:

1.1 buffer的管理

使用摄像头时,核心是"获得数据"。所以先讲如何获取数据,即如何得到buffer。

摄像头采集数据时,是一帧又一帧地连续采集。所以需要申请若干个buffer,驱动程序把数据放入buffer,APP从buffer得到数据。这些buffer可以使用链表来管理。

驱动程序周而复始地做如下事情:

  • 从硬件采集到数据

  • 把"空闲链表"取出buffer,把数据存入buffer

  • 把含有数据的buffer放入"完成链表"

APP也会周而复始地做如下事情:

  • 监测"完成链表",等待它含有buffer

  • 从"完成链表"中取出buffer

  • 处理数据

  • 把buffer放入"空闲链表"

链表操作示意图如下:

1.2 完整的使用流程

参考mjpg-streamer和video2lcd,总结了摄像头的使用流程,如下:

  • open:打开设备节点/dev/videoX

  • ioctl VIDIOC_QUERYCAP:Query Capbility,查询能力,比如

    • 确认它是否是"捕获设备",因为有些节点是输出设备

    • 确认它是否支持mmap操作,还是仅支持read/write操作

  • ioctl VIDIOC_ENUM_FMT:枚举它支持的格式

  • ioctl VIDIOC_S_FMT:在上面枚举出来的格式里,选择一个来设置格式

  • ioctl VIDIOC_REQBUFS:申请buffer,APP可以申请很多个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:停止摄像头

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值