本节书摘来自异步社区《精通Android 5 多媒体开发》一书中的第6章,第6.1节视频系统结构,作者 王石磊,更多章节内容可以访问云栖社区“异步社区”公众号查看
6.1 视频系统结构
精通Android 5 多媒体开发
在Android系统中,视频输出系统对应的是Overlay子系统,此系统是Android的一个可选系统,用于加速显示输出视频数据。视频输出系统的硬件通常叠加在主显示区之上的额外的叠加显示区。这个额外的叠加显示区和主显示区使用独立的显示内存。在通常情况下,主显示区用于输出图形系统,通常是RGB颜色空间。额外显示区用于输出视频,通常是YUV颜色空间。主显示区和叠加显示区通过Blending(硬件混淆)自动显示在屏幕上。在软件部分我们无需关心叠加的实现过程,但是可以控制叠加的层次顺序和叠加层的大小等内容。
Overlay系统的基本层次结构如图6-1所示。
Android中的Overlay系统没有Java部分,在里面只包含了视频输出的驱动程序、硬件抽象层和本地框架等。Overlay系统的结构如图6-2所示。
在图6-2所示的系统结构中,各个构成部分的具体说明如下所示。
(1)Overlay驱动程序:通常是基于FrameBuffer或V4L2的驱动程序。在此文件中主要定义了两种结构,分别是data device和control device,这两个结构体分别针对data device和control device的函数open()和函数close()。这两个函数是注册到device_module里面的函数。
(2)Overlay硬件抽象层:代码路径如下所示。
hardware/qcom/display/liboverlay/overlay.h
Overlay硬件抽象层是一个Android中标准的硬件模块,其接口只有一个头文件。
(3)Overlay服务部分:代码路径如下所示。
frameworks/native/services/surfaceflinger/
由此可见,Overlay系统的服务部分包含在SurfaceFlinger中,此层次的内容比较简单,主要功能是通过类LayerBuffer实现的。首先要明确的是SurfaceFlinger只是负责控制merge Surface,比如说计算出两个Surface重叠的区域,至于Surface需要显示的内容,则通过Skia、Opengl和Pixflinger来计算。所以我们在介绍SurfaceFlinger之前先忽略里面存储的内容究竟是什么,先弄清楚它对merge的一系列控制的过程,然后再结合2D、3D引擎来看它的处理过程。
(4)本地框架代码。
在Overlay系统中,本地框架的头文件路径如下所示。
frameworks/native/include/ui
源代码路径如下所示。
frameworks/native/libs/ui
Overlay系统只是整个框架的一部分,主要功能是通过类Ioverlay和Overlay实现的,源代码被编译成libui.so,它提供的API主要在视频输出和照相机取景模块中使用。