首页 理论教育深入剖析Linux内核与设备驱动:视频驱动应用操作及框架适配

深入剖析Linux内核与设备驱动:视频驱动应用操作及框架适配

【摘要】:对视频应用来说,主要就是获取视频流的操作。设备的适配同样需要实现HAL层,相应的HAL层实体初始化的操作如下:Android框架加载了相应的HAL模块后,就会通过相应的camera_ops来操作,而这些操作都是适配操作,实际上是调用V4L2CameraHardware中的实际为CameraHardware的函数。Android的适配在使用流程上与应用的实例是相同的,只是在操作上封装成不同的接口,而且将参数与数据流控制分离,这样方便了管理,也易于与其他模块交互。

对视频应用来说,主要就是获取视频流的操作。下面以操作顺序来了解应用层是如何使用视频设备的。该实例是采集设备到显示设备的回显例子,这里简化了代码,只列出采集设备相关的操作。

首先是打开视频设备:

接下来是对数据格式的控制:

设置帧率等信息:

检查设备是否可以streaming:

对buffer进行设置:

获得buffer并进行相关操作:

最后就是释放的相关操作,基本就是之前操作的逆操作,就不详述了。由代码可见,通过用户分配buffer的方式实现输入输出共用相同的buffer空间,从而实现无缝连接,并节省内存。视频设备框架的设计是灵活的,可以实现各种复杂的功能。

视频设备在Android的适配涉及很多方面,包括Surface Flinger、HW Composer以及Camera等,这里主要以Camera设备的适配进行说明,因为其他部分涉及太多框架的信息。(www.chuimin.cn)

设备的适配同样需要实现HAL层,相应的HAL层实体初始化的操作如下:

Android框架加载了相应的HAL模块后,就会通过相应的camera_ops来操作,而这些操作都是适配操作,实际上是调用V4L2CameraHardware中的实际为CameraHardware的函数。

接下来以preview为例,来看看具体的适配操作的流程:

而在真正的preview线程中会通过如下操作将采集的frame经过转换进行显示:

视频设备的实际操作都是通过V4L2Camera中的标准V4L2接口进行的,例如配置接口。

可见就是通过VIDIOC_S_FMT实现具体的操作。

Android的适配在使用流程上与应用的实例是相同的,只是在操作上封装成不同的接口,而且将参数与数据流控制分离,这样方便了管理,也易于与其他模块交互。