转自:https://blog.csdn.net/ramon1892/article/details/8444193

Videobuf2框架

1. 什么是videobuf2框架?

它是一个针对多媒体设备的v4l2兼容驱动框架,是用户空间应用程序和设备驱动的中间层。它为驱动提供更为底层的模块化的内存管理功能。

它能够使得驱动开发变得简单,减少代码量,帮助合理的连续的实现驱动当中的v4l2接口。

videobuf2的内存管理是完全模块化的,这就允许在不改变更高级别缓冲管理框架的情况下可以为设备和平台定制内存管理方法。

框架提供了一下三种:

  • 实现了v4l2_ioctl的流控和文件操作

  • 高级的视频缓冲,视频队列和状态管理

  • 视频缓冲内存分配和管理

2.为什么要新开发一种框架呢?

在当前的videobuf实现当中,有很多问题,在2010年举行的赫尔欣基峰会上重点提到了这么几个:

  • V4L2 API出现异常和错误的内存管理设计

  • 不能停止stream请求,缓冲在streamoff的时候被释放

  • VIDIOC_REQBUFS 不释放内存,也不能重新分配内存

  • 视频内存在mmap,qbuf或者页错误的时候才分配

  • 每个缓冲都有一个等待队列

  • 扩展性不够强,尤其对于嵌入式多媒体设备来说支持不够

  • 很难加入定制的内存分配和管理机制

  • 不支持对缓存一致性和IOMMU设备

  • 不够灵活,只有一个包办一切的函数来处理内存锁定,缓存,sg-list的创建

  • 很多未使用的域,还有代码的重复,模糊晦涩的命名

很多驱动程序作者发布基于videobuf的基础组件.开发者也承认videobuf的功绩,也乐意使用它,但是由于灵活性不够现在不能这么做了。

3.重新设计的目的

  • 修正V4L2API的实现,修复videobuf的问题和缺陷

  • 分离缓冲队列管理和内存管理

  • 在内存的分配和管理上更加灵活,可以嵌入定制的机制

  • 更加有针对性的驱动回调函数,在不同的地方调用

  • 支持新的V4L2API扩展,例如多平面视频帧存储的支持

4. 驱动回调函数

对称的驱动回调函数设计:

  • buf_init 在内存被分配后或者一个新的USERPTR缓冲入队之后调用一次,比如用来锁定页,验证连续性,设置IOMMU映射等等。

  • buf_prepare每个QBUF都要调用,用来同步缓存,拷贝数据到buffer等

  • buf_finish每个DQBUF调用,用来同步缓存,从buffer中取回数据等

  • buf_cleanup 在free/release内存的时候调用

其余的回调函数也有重新设计:

  • queue_negotiate现在合并了多平面的扩展;驱动返回所需要的缓冲数和每个缓冲的平面数。

  • plane_setup 驱动返回平面的尺寸大小

这两个调用取代了老的buf_setup

  • buf_queue 保留了原来的功能,将buffer放入请求队列。

5. 内存分配和处理

内存处理这块设计得更加个性化,使得内存分配可以定制,定制的函数放在一个叫做v4l2_alloc_ctx的结构体当中。它的目的是给videobuf提供操作函数,并且存放一些私有数据。私有数据可以被嵌入到更大的一些结构体当中。

Struct vb2_alloc_ctx {

const struct vb2_mem_ops *mem_ops;

}

struct vb2_foo_alloc_conf {

strucdt vb2_alloc_ctx alloc_ctx;

/* private data*/

}

更重要的是引入了一个buffer上下文结构的概念,在每次分配之后,分配器返回他们自己,定制的和每个buffer的结构。这个结构可以当作cookie传递给其他的内存处理方法。

存放在分配器上下文的内存操作可以被其他的分配器取代,详细的文档可以参考videobuf2-core.h。

一个非常好的例子从三星galaxy S系列的android手机内核源码中的videbuf2-cma.c,可以看看这个例子。

深入理解linux内核v4l2框架之videobuf2【转】的更多相关文章

  1. 读书笔记之Linux系统编程与深入理解Linux内核

    前言 本人再看深入理解Linux内核的时候发现比较难懂,看了Linux系统编程一说后,觉得Linux系统编程还是简单易懂些,并且两本书都是讲Linux比较底层的东西,只不过侧重点不同,本文就以Linu ...

  2. 【读书笔记::深入理解linux内核】内存寻址【转】

    转自:http://www.cnblogs.com/likeyiyy/p/3837272.html 我对linux高端内存的错误理解都是从这篇文章得来的,这篇文章里讲的 物理地址 = 逻辑地址 – 0 ...

  3. 【读书笔记::深入理解linux内核】内存寻址

    我对linux高端内存的错误理解都是从这篇文章得来的,这篇文章里讲的 物理地址 = 逻辑地址 – 0xC0000000:这是内核地址空间的地址转换关系. 这句话瞬间让我惊呆了,根据我的CPU的知识,开 ...

  4. 《深入理解Linux内核》 读书笔记

    深入理解Linux内核 读书笔记 一.概论 操作系统基本概念 多用户系统 允许多个用户登录系统,不同用户之间的有私有的空间 用户和组 每个用于属于一个组,组的权限和其他人的权限,和拥有者的权限不一样. ...

  5. 理解Linux内核之中断控制

    乍一看下边的Linux内核代码,貌似L3389有bug,于是我就绕有兴趣地阅读了一下local_irq_save/local_irq_restore的源代码. /* linux-4.14.12/mm/ ...

  6. Linux内存管理(深入理解Linux内核)

    Linux的内存管理,实际上是借助80x86的硬件分段和分页电路,将逻辑地址转化为物理地址的. 物理内存中,有一部分是一直(Permanently)映射给内核使用的,这部分主要用于保存内核的代码,以及 ...

  7. 【深入理解Linux内核架构】第3章:内存管理

    3.1 概述 内存管理涵盖了许多领域: 内存中物理内存页的管理: 分配大块内存的伙伴系统: 分配小块内存的slab.slub.slob分配器: 分配非连续内存块的vmalloc机制: 进程的地址空间. ...

  8. 深入理解Linux内核 学习笔记(1)

    1.用户和用户组 每个用户是一个或多个用户组的一名成员,组由唯一的用户组标识符(user group ID)标识.每个文件的相关权限也恰好与一个组相对应. root为超级用户, 2.模块 为了达到微内 ...

  9. 深入理解Linux内核-信号

    信号:1.最初被引入作为用户态进程间通信2.内核也使用信号通知进程系统所发生的事件3.信号很短,发送给进程的唯一信息通常是一个数.4.名称通常以SIG为前缀5.信号时可消费资源,每个信号只能被传递一次 ...

随机推荐

  1. 自学Linux Shell16.3-函数递归+创建库

    点击返回 自学Linux命令行与Shell脚本之路 16.3-函数递归+创建库 1. 函数递归 递归调用函数是指函数调用自身进行求解. 通常,递归函数有基值,函数最终递推到达该值. 许多高级数学算法使 ...

  2. BroadcastReceiver 接收系统短信广播

    BroadcastReceiver 接收系统短信广播 /* 注册广播:    * |--静态注册  (在AndroidManifest .xml 中注册)  * <receiver androi ...

  3. cf1000D Yet Another Problem On a Subsequence (dp)

    设f[i]是以i为开头的好子序列的个数 那么有$f[i]=\sum\limits_{j=i+a[i]+1}^{N+1}{f[j]*C_{j-i-1}^{a[i]}}$(设f[N+1]=1)就是以i为开 ...

  4. Service 启动Activity

    1, 在BroadcastReceiver中启动Activity的问题  *  * 如果在BroadcastReceiver的onReceive()方法中如下启动一个Activity  * Inten ...

  5. Luogu 2540 斗地主增强版(搜索,动态规划)

    Luogu 2540 斗地主增强版(搜索,动态规划) Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游 ...

  6. 和我一起使用postcss+gulp进行vw单位的移动端的适配

    随着iphoneX的出现,新的一轮适配大法应该又出现了吧?不论是使用flex布局或者媒体查询,好似都不能完全解决新加的刘海带来的适配问题. 但是有一个单位vw就神奇的解决了这个问题.vw和vh是相对于 ...

  7. npm install 报错Unexpected end of JSON input while parsing near...

    安装node http://nodejs.cn/download/ 克隆代码 ....... 执行安装 npm install 然后就报了一坨错误 清理一下缓存 sudo npm cache veri ...

  8. cookies 不同端口 是可以共享的

    cookies 不同端口,是跨域吗? 我部署了两套系统在同一个ip上!8080,和8090! 这样.cookies,算跨域吗? 两套系统都记录了都有一个 historyItem的key的cookies ...

  9. 微软笔记工具OneNote

    闲来无事,就在网上找找记笔记的软件工具.发现了微软的OneNote. 门槛还是比较高的:需要微软账户,安装也比较慢.不过用起来体验不错.除了干净的界面,功能也不错,还能同步到云端,这样你随时随地都可以 ...

  10. 面板 JPanel,滚动面板 JScrollPane,文本域JTextArea

    容器中可以有多个JPanel面板,一个JPanel面板中可以有多个控件. 滚动面板 JScrollPane中只能有一个控件.       public class Demo extends JFram ...