【Android论文栏目提醒】:文章导读:在新的一年中,各位网友都进入紧张的学习或是工作阶段。
网学会员整理了Android论文-Android下OpenMaxIL框架的研究和应用 - 期刊论文的相关内容供大家参考,祝大家在新的一年里工作和学习顺利!
第 29 卷第 8 期 计算机应用与软件 Vol. 29 No. 8 2012 年 8 月 Computer Applications and Software Aug. 2012
Android 下 OpenMax IL 框架的研究和应用 沈永增 李晓凤 吴冬林 ( 浙江工业大学信息工程学院 浙江 杭州 310023)摘 要 由于
Android 系统多媒体引擎使用的是 OpenMax 软件解码组件,出现了播放分辨率较高视频不流畅的问题。
为此,提出在
Android 系统上设计一 OpenMax 硬件解码组件,并将其放在嵌入式开发平台上进行测试。
该组件是在对
Android 系统自带 Open- 以Max IL 层进行研究的基础上, SamSung S3C6410 为嵌入式核心处理器,针对 MPEG- 视频流而设计。
实验结果表明, 4 设计的硬件解码组件优于系统自带的软件解码组件,表明该方案切实可行。
关键词
Android OpenMax 解码组件 嵌入式 MPEG-4中图分类号 TP399 文献标识码 A RESEARCH AND APPLICATION OF OPENMAX IL FRAMEWORK BASED ON
ANDROID Shen Yongzeng Li Xiaofeng Wu Donglin ( College of Information Engineering,Zhejiang University of Technology,Hangzhou 310023,Zhejiang,China)Abstract Due to the use of OpenMax software decoding component in
Android multimedia engine system,there arises the problem of lesssmooth when playing high resolution video. Therefore,we propose to design an OpenMax hardware decoding component on
Android system, 4and test it on the embedded development platform. The component is designed for the MPEG- video streams using SamSung S3C6410 as itsembedded core processor based on the research on OpenMax IL layer in
Android system. Experimental results show that the designedhardware decoding component outperforms the software decoding component the
android system comes with,this indicates that the program ispractical and feasible.Keywords
Android OpenMax Decoding component Embedded system Mpeg-4 个多媒体应用程序的框架标准。
OpenMAX 分为三层,自底而上0 引 言 分别为 OpenMAX DL( 开发层) ,OpenMAX IL( 集成层) ,Open- MAX AL ( 应用层) 。
自
Android 作为一款开源的手机操作系统, 07 年推出至今, 其中,OpenMAX IL 层目前已经成为了事实上的多媒体框 〔1〕在手机 领 域 越 来 越 受 到 推 崇 。
由 于 其 底 层 是 以 开 放 性 的 架标准。
多媒体框架和多媒体应用程序可以通过 OpenMAX IL,Linux kernel 为架构〔2〕 ,因此我们完全可以利用
Android 完整的 以一种统一的方式来使用其他的多媒体数据处理功能和解码组 〔5〕体系结构、 将 开放性以及应用程序开发便捷等特点,
Android 广 件,具有跨越软硬件平台的移植性 。
泛地应用于一般的嵌入式环境中去 〔3〕 。
本 基 针对以上问题 和 分 析, 文 以 TQ6410 为 开 发 平 台, 于 既然
Android 是手机操作系统,当然其多媒体功能必然是
Android2. 0 操作系统〔6〕 , OpenMax IL 框架进行研究, 对 并在此强大的,但是恰恰在视频上,面对现在人们需求的提高,
Android 框架下设计了一款能够解码 MPEG- 标准视频流的 OpenMax 硬 4 件解码组件,最后,在嵌入式平台上验证其合理有效性。
系统自带的软件解码插件已经满足不了人们的需求。
因此,有些手机厂商在硬件上额外添加一图形处理器 GPU,并且自主设 〔4〕 1 OpenMax IL 框架研究计代码,来实现视频的硬件解码 ,这样导致了代码多样化。
尤其在普通嵌入式平台上,现在很多 CPU 都集成了视频硬件解 1. 1 OpenMax IL 层次结构码功能,而这些 CPU 并不都是用于手机的,而是给手机以外其
Android 下的 OpenMax IL 层,通常作为多媒体引擎插件,完他移动终端使用的。
这样就使得广大嵌入式开发者在选择用 成
Android 下的音视频编解码工作。
其层次结构如图 1 所示。
Android 操作系统进行开发的时候必须自主开发视频硬件解码插件。
这在开发上带来了一定的难度。
收稿日期: 2011 - 09 - 06。
沈永增,教授,主研领域: 嵌入式系统,计 OpenMax 是无授权费的,跨平台的应用程序接口 API,是一 算机智能控制,模式识别,图像处理。
李晓凤,硕士生。
吴冬林,硕士生。
266 计算机应用与软件 2012 年 库下。
Omx Core 规范规定了 Omx Core 的 9 种方法。
在
Android 下,实现了两个 Omx Core,一个 Omx Core 是其他 Omx Core 的管 理者,然后其他 Omx Core 去管理组件。
这个职位最高的 Omx Core 在
Android 下称之为 Omx Core 封装层。
该封装层通过动态 调用 dlopen 的方式打开动态库, dlsym 的方式来调用 Omx Core 方法。
Android 下的 Omx Core 封装层实现与其他 Omx Core 本质 上是一样的。
Omx Core 封装层实现如下: 首先,定义了一个包 括重要全局数据的类 ,比如 Omx Core 库的索引,Omx Core 对应 的组件索引,整个组件数目,Omx Core 数目等等,这个类提供了 图1 OpenMax IL 层层次结构 对所有 Omx Core 的一个全局管理功能; 其次, 实现了所有 Omx
Android 下基本使用的是标准的 OpenMax IL 层接口,对其 〔7〕 Core 的方法,比如 OMX_MasterInit,该函数根据指定路径读取所进行简单封装被 OpenCore 多媒体引擎所使用 。
由于 Open- 然 有的配置文 件, 后 根 据. cfg 配 置 文 件 将 支 持 OMX _ INTER-Max IL 层是用 C / C 编写的,其标准化的设计,易于与底层硬 FACE_ID 的库加载进来, 通过 QueryInterface( ) 验证这些库是否件解码驱动形成衔接,易于扩展硬件解码组件。
真的支持这个 ID, 将 初始化这些组件, Omx Core 索引与 Omx1. 2 OpenMax IL 实现的结构 Core 相对应的组件建立联系,并对其各组件进 行 注 册。
再 比 在
Android 系 统 内,OpenMax IL 实 现 的 具 体 结 构 如 图 2 如,OMX_MasterGetHandle 函数的实现,它会从已注册的组件中所示。
根据名字来查找这个组件,然后根据查找到的组件索引获得对 应的 Omx Core 的索引,然后再根据此索引获得相应的 OMX _ getHandle 函数,并对其进行调用。
还有 OMX _MasterSetupTun- nel、OMX_MasterComponentNameEnum 函数等等。
2 解码组件 2. 1 OpenMax 组件部分 由于我们是要在
Android 的 OpenMax IL 下添加一个新的组 件,因此我们设计的组件必须符合其原有架构。
我们在组件部 分设计两个 C 文件,一个为组件定义文件,另一个是硬件解 码器调用者文件。
由于原有自带软件解码组件已包含此目录, 因此我们用自己设计的文件将其覆盖掉。
并将其置于 codecs_ v2 omx omx_mpeg4 src 目录下。
图2 OpenMax IL 实现的具体结构 1) 组件定义文件 多媒体引擎是通过一个 omx core 来实现与 OpenMax IL 组 该文件内容主要是 MPEG- 解码组件的构建、 4 配置、数据流件的通信。
其实现方式是通过 / system / etc 下. cfg 文件内标识的 分离解析等函数实现。
该文件实现的所有函数都设计在 Class 对ID, OpenMax IL 入口库进行调用。
该标识 ID 为固定 ID,若要 Openmaxmpeg4AO 下,该类继承于 OmxComponentVideo 基类。
如自己设计 OpenMax IL 层, 此 避免修改
Android 系统源代码, ID 下:就不可修改。
该 ID 为( 0xa054369c, 0x412e, 0x22c5, 0x17, 0x19, Class Openmaxmpeg4AO: public OmxComponentVideo{0x87, 0x1a, 0x4c, 0x19,0xd4,0x5f) ,相对应动态入口库 libomx _ …sharedlibrary. so。
该动态库由 5 个静态库组成, 分别为 libomx_ OMX_ERRORTYPE ConstructComponent( OMX_PTR pAppData,OMXcommon_lib. a( 公共库) 、libomx_queue_lib. a( 队列库) 、libpvomx_ _PTR pProxy) ; / / 组件构建proxy_lib. a( 代理机制库) 、libomx_baseclass_lib. a( 基础类库) 、 OMX_ERRORTYPE DestroyComponent( ) ;libpv_omx_interface. a( 接口库) 。
其中前四个库是基本库,提供 OMX_ERRORTYPE ComponentInit( ) ; / / 组件初始化 最了整个 插 件 所 用 到 的 公 共 的 函 数, 后 一 个 库 是 实 现 各 个 OMX_ERRORTYPE ComponentDeInit( ) ; / / 组件资源释放 void ProcessData( ) ; / / 数据流处理OpenMax 组件的接口库。
void DecodeWithoutMarker( ) ; 通过 libomx_sharedlibrary. so 动态打开各个 OpenMax 组件, void DecodeWithMarker( ) ;包括音频 AAC、AMR、MP3 编解码组件,视频 AVC、MPEG- 编解 4 …码组件。
各个编解码组件分别使用 codecs_v2 audio 和 codecs_ };v2 video 目录下的软件编解码库去实现。
其中,组件构建与数据解析是最复杂的两个函数。
组件构1. 3 OpenMax IL 下的 Omx Core 建主要包括: 将命令控制 SendCommand 函数、参数设置 SetPa- Omx Core 的功能是实现组件的初始化和对组 件 的 管 理。
rameter 函数、配置设置 SetConfig 函数等函数指针指向基类实现如果将 omx 组件集成到 PVMF 框架下,必须提供相对应的 Omx 的相对应函数; 然后设置该组件的能力, 即能否支持外部输入输Core,并且所有的组件和相对应的 Omx Core 都必须放在同一个 出 buffer 分配,是否支持部分帧、是否能够处理不完全帧等; 最 第8 期 沈永增等:
Android 下 OpenMax IL 框架的研究和应用 267后,设置输入输出端口,包括输入格式,输出格式等。
而数据解 通过 mfc_dec_slice( ) 函数对输入的 buffer 进行解码,通过析函数中,主要是以上类中的 ProcessData( ) 函数,该函数对有 返回值再进一步做处理。
当解码正常即返回值为 1 时, 对端口标志位的 buffer 和没有标志位的 buffer 进行分开处理,最终实现 参数的帧宽、帧长进行设置,同时通过 mfc_get_yuv( ) 函数获取输入视频数据流的处理功能。
该函数调用 DecodeWithoutMarker 解码输出的 YUV buffer,最后对帧计数进行加 1,继续循环。
而( ) 与 DecodeWithMarker( ) 函数分开完成数据处理,这两个函数 获取输出 YUV buffer 函数,则是直接调用底层硬件解码封装层核心都是去调用硬件解码器调用者,并根据硬件解码器的返回 函数 SsbSipMPEG4DecodeGetOutBuf( ) 直接获得应用层解码输出进行操作,包括 buffer 不足、输入数据流已结束、解码出错等,最 的 buffer。
后将解码后的数据送到输出 buffer 中。
其中, 调用解码相关部 2. 2 硬件解码封装部分分核心函数为 OMX_BOOL 这部分设计同样不能破坏原有的
Android 的 OpenMax IL 架 mpeg4Decoder_ OMX: : mpeg4DecodeVideo _ OMX ( …) 函 数, 构,因此我们将该部分设计文件内容放在 video 目录下, 新建一该函数实现部分在硬件解码器调用者文件中,通过该函数来实 名为 mpeg4 文件夹。
同时设计相应的. mk 文件。
该部分主要是现与硬件解码库调用者的连接。
完成底层驱动与上层调用的接口。
核心 C 函数主要有底层硬 2) 硬件解码器调用者文件 件资源初始化函数 void SsbSipMPEG4DecodeInit( ) ,底层硬件 该文件主要功能是实现与硬件解码库的连接与调用。
整个 指定 buffer 下解码函数, SsbSipMPEG4DecodeExe( void open- int文件实现 mpeg4Decoder_OMX 类构建、 初始化、反初始化、解码 Handle,long lengthBufFill) ,底层硬件解码获取输出 buffer 函数库调用、解码句柄初始化、获取输出 YUV buffer、设置解码类型、 void SsbSipMPEG4DecodeGetOutBuf( void openHandle,long复位 / 增加 / 获取时间戳以及解码 slice 等功能。
该类一部分函 size) ,还有设置底层配置、获取底层配置、获取输入 buffer 函数。
数如下: 其中,初始化函数通过 open 来打开底层设备, 映射输入输 class mpeg4Decoder_OMX{ 出 buffer,然后对重要解码数据结构体进行初始化。
而解码函数 … 则是调用 ioctl 函数,先使用 IOCTL_MFC_MPEG4_DEC_INIT 命 OMX_BOOL Mp4DecodeVideo_OMX( …) ; .