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,深入理解linux内核v4l2框架之videobuf2【转】相关推荐

  1. linux基于文本的配置工具,Linux基本配置和管理 3 ---- Linux命令行文本处理工具

    1 文件浏览(简单回顾) 1 cat 查看文件的内容 2 more 以翻页的形式查看,但是只能向下翻页 3 less 以翻页的形式查看,但是能够支持向上和向下翻页 4 head 默认是查看前10行,但 ...

  2. Linux内核配置选项的说明,Linux内核配置选项翻译

    Linux内核配置选项翻译 Linux内核配置选项翻译2.6.19.1(转) 内容目录 1. Code maturity level options 2 2. General setup 常规安装选项 ...

  3. Linux/Centos7系统管理之深入理解Linux文件系统与日志分析

    前言:inode(文件节点)与block(数据块)硬链接与软连接恢复误删除的文件 (即rm-rf 的操作,可以先进行备份的操作,然后可以进行恢复ext4和xfs文件系统皆可)日志文件的分类用户日志与程 ...

  4. centos sudo不能运行_如何在 Linux 中配置 sudo 访问权限 | Linux 中国

    Linux 系统中 root 用户拥有 Linux 中全部控制权力.Linux 系统中 root 是拥有最高权力的用户,可以在系统中实施任意的行为.-- Magesh Maruthamuthu Lin ...

  5. php内核函数手册,深入理解PHP内核(五)函数的内部结构,深入理解内部结构

    深入理解PHP内核(五)函数的内部结构,深入理解内部结构 php的函数包括用户定义的函数.内部函数(print_r count...).匿名函数.变量函数($func = 'print_r'; $fu ...

  6. php内核总结_深入理解PHP内核(一)

    PHP作为一门简单而强大的语言,能够提供很多Web适用的语言特性.从实践出发,继弱类型变量原理探究后,本文继续带领大家深入理解php内核. 最近,和一个网友交流的时候,给我提了一个非常奇怪的问题.那就 ...

  7. linux文件i节点,深入理解linux中i节点(inode)

    对于Unix系列的操作系统,大多都有v节点.但是对于linux来说,只有通用的i节点,却没有v节点. 下面来探讨一下,linux下的i节点. linux中,文件查找不是通过文件名称来查找的.实际上是通 ...

  8. linux安全配置技术论文,基于linux平台的web安全技术研究apache安全大学论文.doc

    基于linux平台的web安全技术研究apache安全大学论文 广州大学华软软件学院 --毕业论文 题目-Apache安全 学生姓名: 指导教师2015-5-10 摘 要 随着网络通信技术的不断发展, ...

  9. linux硬件配置软件,快速洞悉Linux系统软硬件配置

    官方网址:http://aspersa.googlecode.com/svn/html/summary.html summary是纯bash编写的脚本,能快速帮你洞悉你的LINUX软硬件配置,如果你正 ...

最新文章

  1. 报名 | 首届!Apache Flink 极客挑战赛强势来袭,重磅奖项等你拿,快来组队报名啦!...
  2. iOS swift lazy loading
  3. 【Spring-Boot】【入门 01】第一个 Spring Boot 程序
  4. 在机器学习、大数据等领域工作,该学Hadoop还是Spark?
  5. C/C++[codeup 1927]字符串内排序
  6. 【软件教程】Spring Tool Suite(STS)
  7. 密码学Cryptology
  8. python获取无忧网的招聘数据
  9. 小新黑苹果声卡ID注入
  10. 危害移动数据安全的风险有哪些?
  11. java 存根,使用mockito使用三个参数对方法进行存根
  12. 6个Vlookup查找函数用法,总有你想用的!
  13. java语言就业方向_Java的就业方向有哪些?
  14. android关机动画
  15. 大数据学习系列(九)Hadoop1.X痛点分析及Hadoop2.X提出的解决方案
  16. [视频编码] 色彩空间
  17. Spring Boot 自动加载指定包下的拦截器
  18. 凤凰os可以运行linux软件吗,把凤凰系统装进U盘里,打造PC上的可移动android系统...
  19. 数字+E的科学计数表示方法
  20. 微信小程序消息推送服务器接入

热门文章

  1. 根据×××号码识别性别年龄生日的JS代码
  2. 一种增强的md5加密算法
  3. [BZOJ4521][Cqoi2016]手机号码 (数位dp)
  4. [No0000F9]C# 运算符重载
  5. [LeetCode] Remove Element 分析
  6. tablix“Tablix1”有一个具有内部成员的详细信息成员
  7. ASP.NET基础之HttpContext学习
  8. MFC UI库知多少
  9. python_开发环境介绍_交互模式使用_IDE介绍和使用---python工作笔记010
  10. AndroidStudio_使用gradle编译代码_打包apk_以及各种打包配置---Android原生开发工作笔记79