最近看了一篇International Symposium on Consumer Electronics会议上的文章,标题是Google’s Android as an application environment for DTV decoder system。做一下简单的记录。
文章主要讲述如何使用ANDROID系统作为DTV的软件环境。包括移植ANDROID系统至文中提到的DTV平台,以及怎么在ANDROID系统上实现DTV电视搜索,回放记录等功能。
Android移植
移植Android系统到大端MIPS平台需要三个步骤:
- 给平台支持的LINUX内核打PATCH,加入Android框架需要的一些系统驱动。
- 扩展Android编译环境支持大端MIPS平台。
- 声音驱动集成和DFB支持。
Linux内核移植:
如下驱动必须被集成:
ASHMEM(匿名共享内存)同POSIX SHM 但是有不痛的行为,它支持简单的基于文件映射的API
BINDER 类似CORBA的IPC通信机制。
Android event logger LINUX 用于在内核中记录DEBUG消息的LINUX驱动
Android 环境修改
Android系统已经成功移植到小端MIPS平台上(如8655)。但是由于大端小段的区别,修改也是很多的。
- 涉及到本地和一些使用C/C++的开源库需要修改Android.mk支持大端变量和定义。
- 编译工具的一些特定代码不是大小端都支持(in-code endian awareness)。这些BUGS会导致Android编译失败,或者启动失败。受到影响的程序包括Android pre-linker Apriori, stripping application Soslim, resource manager aapt (Android Asset Packaging Tool)等
- 增加对一些在ANDROID系统上跑的程序和库的in-code endian awareness支持。例如Dalvik VM(显式支持大端系统)使用一些数据类型的指针分配在小段系统工作正常,但是很难移植到大端系统。(具体略),其他的一些修改包括矫正颜色等
Android DFB支持
DFB是基于FB的轻量级图形库,提供图形加速及输入设备支持。
Android 支持标准的FB。DTV SOC提供商实现了DFB的硬件加速。ANDROID系统对DFB的支持实现遍及系统不同层次。首先支持UI的绘制,第二,通过图形硬件加速绘制图形。
- DFB图形分配策略实现了多颜色层次的SURFACE与主视频FB内存分配
- DFB 支持加速的BLITTER操作。
使用DFB作为UI 图形缓冲的缺点是不支持3D加速。
多媒体及DTV回放支持
这部分解释对ANDROID 运行环境和软件框架的修改区支持DTV和多媒体设备控制。
- 修改Android支持硬件声音和视频解码,允许本地多媒体文件重放。
- 支持DTV频道的搜索记忆。
- 支持DTV频道重放和录放
多媒体回放支持
因为CPU能力不足不直接使用Android 运行库 android.media。为了支持硬件加速多媒体重放,媒体框架将增加选项扩展支持硬件处理。解码和现在的多媒体数据 通过事件通知ANDROID.通过增加额外的硬件插件机制。MMLIB
MMLIB为ANDROID多媒体对象和硬件加速平台解码器的粘合层。它位于android_media_MediaPlayer JNI对象中。MMLIB接口的初始化通过硬件平台插件硬件信息并且存储适当的播放接口。
使用提供支持的信息,媒体播放对象发送多媒体指令,MMLIB解释处理命令并且选择接口。如果没有硬件加速支持的命令MMLIB直接将命令传到OPENCORE的库。
因为平台支持多种音视频,所以需要多个插件。
DTV频道记忆及搜索
DTV 包括不同的前端设备提供模拟或者数字频道的再现。采用ANDROID编程的方式,引进两个JAVA类:一个用户接口和一个JNI对象支持本地频道服务。
引进的对象包括:
- 频道服务线程对象
这个服务线程运行在后台进程中使用了JNI接口。主函数收集修改前端设备平台的信息和能力。第2个函数异步支持手动自动频道搜索等。将信息存储在后台的数据结构中。
- 频道服务数据(略)
- 频道服务客户接口
接口作为频道服务子系统的大门。它实现了一些有用的函数和对象。因为同时可以有多个TV程序在跑所以必须设计实现了异步接口。
为了使用这个程序,需要实现这些接口:频道JNI接口。这个接口链接本地平台前端结构和实现的JAVA频道服务。它提供查询平台能力和获取频道前端服务信息的能力。这个借口编译链接成一个共享对象。从JAVA对象中动态打开,检查是否支持已经在平台中的频道消息。
电视频道的回放及录制。
直接实现一个MMLIB DTV PLUG-IN就可以了。