摄像头v4l2采集中的mmap

用法:
buffers[i].start = (unsigned char *)mmap(NULL,
cam->buf.length,
PROT_READ | PROT_WRITE,
MAP_SHARED,
cam->fd,
cam->buf.m.offset);
我的理解:将摄像头看做一个大一点的传感器,它能采集到值,那么我们应用层通过摄像头文件描述符可以read内核驱动层的数据,数据从内核态转为用户态有一个copy_to_user过程,使用read这样频繁、大量的读取图像数据,就会进行大量的数据拷贝,如果使用mmap,即将内核空间一段内存区域映射到用户空间,我们可以直接读取这段空间的图像数据而不必进行拷贝。
那么这个过程是摄像头是如何知道将采集的图像放到映射区域的呢?
看mmap之前调用的函数:
—请求摄像头驱动分配内存,所以内存位于内核空间
ioctl(cam->fd, VIDIOC_REQBUFS, &cam->reqbuf)
—查询已经分配的视频缓冲区的相关信息,包括视频缓冲区的使用状态、在内核空间的偏移地址、缓冲区长度等。
ioctl(cam->fd, VIDIOC_QUERYBUF, &cam->buf)
看过这两个函数的调用,一切就明朗了,先申请缓冲区,假设申请4个缓冲区,缓冲区处于内核空间,再利用4次循环,分别获取每个缓冲区的相关信息。利用获取的每个缓冲区的长度、在内核空间(内核空间、用户控件均是内存的一段)的偏移地址来进行映射到用户空间。
这里写图片描述

顺便记录一下VIDIOC_QBUF :
投放一个空的视频缓冲区到视频缓冲区输入队列中,成功,则指定的视频缓冲区进入视频输入队列,在启动视频设备拍摄图像时,相应的视频数据被保存到视频输入队列相应的视频缓冲区中。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值