V4l2 capture时 USERPTR和MMAP的区别
2016-05-18 16:58
197 查看
视频应用可以通过两种方式从V4L2驱动申请buffer
1. USERPTR, 顾名思义是用户空间指针的意思,应用层负责分配需要的内存空间,然后以指针的形式传递给V4L2驱动层,V4L2驱动会把capture的内容保存到指针所指的空间
一般来说,应用层需要确保这个内存空间物理上是连续的(IPU处理单元的需求),在Android系统可以通过PMEM驱动来分配大块的连续物理内存。应用层在不需要的时候要负责释放申请的PMEM内存。
2. MMAP方式,内存映射模式,应用调用VIDIOC_REQBUFS ioctl分配设备buffers,参数标识需要的数目和类型。这个ioctl也可以用来改变buffers的数据以及释放分配的内存,当然这个内存空间一般也是连续的。在应用空间能够访问这些物理地址之前,必须调用mmap函数把这些物理空间映射为用户虚拟地址空间。
虚拟地址空间是通过munmap函数释放的; 而物理内存的释放是通过VIDIOC_REQBUFS来实现的(设置参数buf count为(0)),物理内存的释放是实现特定的,mx51 v4l2是在关闭设备时进行释放的。
所以二者都是申请连续的物理内存,只是申请和释放的方式不同。
本文转自:http://blog.csdn.net/kickxxx/article/details/8051263
1. USERPTR, 顾名思义是用户空间指针的意思,应用层负责分配需要的内存空间,然后以指针的形式传递给V4L2驱动层,V4L2驱动会把capture的内容保存到指针所指的空间
一般来说,应用层需要确保这个内存空间物理上是连续的(IPU处理单元的需求),在Android系统可以通过PMEM驱动来分配大块的连续物理内存。应用层在不需要的时候要负责释放申请的PMEM内存。
2. MMAP方式,内存映射模式,应用调用VIDIOC_REQBUFS ioctl分配设备buffers,参数标识需要的数目和类型。这个ioctl也可以用来改变buffers的数据以及释放分配的内存,当然这个内存空间一般也是连续的。在应用空间能够访问这些物理地址之前,必须调用mmap函数把这些物理空间映射为用户虚拟地址空间。
虚拟地址空间是通过munmap函数释放的; 而物理内存的释放是通过VIDIOC_REQBUFS来实现的(设置参数buf count为(0)),物理内存的释放是实现特定的,mx51 v4l2是在关闭设备时进行释放的。
所以二者都是申请连续的物理内存,只是申请和释放的方式不同。
本文转自:http://blog.csdn.net/kickxxx/article/details/8051263
相关文章推荐
- JAVA温习:Spring Web 处理请求的流程 核心架构图
- 漫谈递归——一步一步算法篇
- 【leetcode】237. Delete Node in a Linked List
- 二维数组和指针
- leetcode 10. Regular Expression Matching
- ASP.Net Core MVC6 RC2 启动过程分析[偏源码分析]
- ip更换
- redis命中率计算
- mybatis mapper接口要不要抛出异常
- XmlPullParser
- MATLAB句柄图形对象的创建函数与函数描述
- 剑指Offer——判断平衡二叉树
- 在windows编译MariaDB
- Shell中调用、引用、包含另一个脚本文件的三种方法
- sdut 3253 Game! 博弈
- windows server 2008 R2服务搭建
- MXE (M cross environment) Requirements
- 《Spring技术内幕》学习笔记1——IoC容器体系结构
- SQL_Server_2005_函数大全
- Linux 目录结构