天天看点

《精通Android 5 多媒体开发》——第6章,第6.2节分析硬件抽象层

本节书摘来自异步社区《精通android 5 多媒体开发》一书中的第6章,第6.2节分析硬件抽象层,作者 王石磊,更多章节内容可以访问云栖社区“异步社区”公众号查看

6.2 分析硬件抽象层

精通android 5 多媒体开发

overlay系统的硬件抽象层是一个硬件模块。在本节的内容中,将简要介绍overlay系统的硬件抽象层的基本知识,为后面的知识做好铺垫。

6.2.1 overlay系统硬件抽象层的接口

在如下文件中定义overlay系统硬件抽象层的接口。

hardware/qcom/display/liboverlay/overlay.h

在文件overlay.h中,主要定义了data device和control device两个结构。并提供针对data device和control device的函数open()和函数close()。文件overlay.h的代码结构如图6-3所示。

《精通Android 5 多媒体开发》——第6章,第6.2节分析硬件抽象层

(1)定义overlay控制设备和overlay数据设备,它们的名称被定义为如下两个字符串。

(2)定义一个枚举enum,也定义了所有支援的format,framebuffer会根据format 和width、height来决定buffer(framebuffer里面用来显示的buffer)的大小。定义enum的代码如下所示。

(3)定义和overlay系统相关的结构体。

在文件overlay.h中和overlay系统相关的结构体是overlay_t和overlay_handle_t,主要代码如下所示。

结构体overlay_handle_t是在内部使用的结构体,用于保存overlay硬件设备的句柄。在使用的过程中,需要从overlay_t获取overlay_handle_t。其中上一层的使用只实现结构体overlay_handle_t指针的传递,具体的操作是在overlay的硬件抽象层中完成的。

(4)定义结构体overlay_control_device_t。此结构体定义了一个control device,里面的成员除了common 都是函数,这些函数就是我们需要去实现的,在实现的时候我们会基于这个结构体扩展出一个关于control device的context结构体,context结构体内部会扩充一些信息并且包含control device。common 每一个device都必须有,而且必须放到第一位,目的只是为了overlay_control_ device_t和hw_device_t做匹配。overlay_control_device_t的定义代码如下所示。

(5)定义结构overlay_data_device_t。此结构和overlay_control_device_t类似。在具体使用上,overlay_control_device_t负责初始化、销毁和控制类的操作,overlay_data_device_t用于显示内存输出的数据操作。结构overlay_data_device_t的定义代码如下所示。

//重新配置显示参数 w、h。使这两个参数生效我这里需要 close,然后重新

//下面两个分别设置显示的区域和获取显示的区域,当播放的时候,需要根据坐标和宽高来定义如何显示这些数据

6.2.2 实现overlay系统的硬件抽象层

在实现overlay系统的硬件抽象层时,具体实现方法取决于硬件和驱动程序,根据设备需要进行处理。具体来说分为如下两种情况。

(1)framebuffer驱动程序方式。

在此方式下,需要先实现函数getbufferaddress(),再返回通过mmap获得framebuffer的指针即可。如果没有双缓冲的问题,不需要真正实现函数dequeuebuffer()和queuebuffer()。上述函数的实现文件是overlay.cpp,此文件被保存在如下目录中。

如果使用video for linux 2的输出驱动,函数dequeuebuffer()和queuebuffer()和调用驱动时主要ioctl是一致的,即分别调用vidioc_qbuf和vidioc_dqbuf即可直接实现。至于其他的初始化工作,可以在initialize中进行处理。因为存在视频数据队列,所以此处处理的内容比一般的帧缓冲区要复杂,但是可以实现更高的性能。

由此可见,在某一个硬件系统中,overlay的硬件层和overlay系统的调用者都是特定实现的,所以只需匹配上下层代码即可实现,并不要一一满足每一个要求,各个接口可以根据具体情况来灵活使用。

6.2.3 实现接口

在android系统中,overlay系统提供了接口overlay,此接口用于叠加在主显示层上面的另外一个显示层。此叠加的显示层经常用作视频的输出或相机取景器的预览界面。文件overlay.h的主要内部实现类是overlay和overlayref。overlayref需要和surface配合使用,通过 isurface 可以创建出overlayref。refbase的主要代码如下所示。

overlay(const sp& overlayref);

在上述代码中,通过surface来控制overlay,也可以在不使用overlay的情况下统一进行管理。此处是通过overlayref来创建overlay,一旦获取了overlay就可以通过这个overlay 来获取用来显示的address地址,向address中写入数据后就可以显示图像了。

继续阅读