基于Android的OpenMAX框架研究与开发

上传人:无*** 文档编号:105006640 上传时间:2022-06-11 格式:DOC 页数:63 大小:1.63MB
收藏 版权申诉 举报 下载
基于Android的OpenMAX框架研究与开发_第1页
第1页 / 共63页
基于Android的OpenMAX框架研究与开发_第2页
第2页 / 共63页
基于Android的OpenMAX框架研究与开发_第3页
第3页 / 共63页
资源描述:

《基于Android的OpenMAX框架研究与开发》由会员分享,可在线阅读,更多相关《基于Android的OpenMAX框架研究与开发(63页珍藏版)》请在装配图网上搜索。

1、 . . . 基于Android的OpenMAX框架研究与开发摘要从近几年手机的发展趋势看,智能手机越来越流行,Android手机表现的尤为强劲。而多媒体播放的娱乐功能显得尤为重要。如何更好地提高多媒体效率成为了用户选择使用的一大契机。本文主要研究在Android平台上实现硬件编解码。主要是jni技术实现数据交换,通过对OpenMAX框架的抽象封装,流程控制,数据输入输出。从而实现硬件编解码,并且把OpenMAX框架硬件编解码集成到项目中,加强多媒体文件编解码速度,提高性能。论文的研究结果可以提供一个优秀的OpenMAX硬件编解码框架,为其他Android手机开发者参考。本文的主要创新点和贡献

2、点如下:1, 实现多媒体硬件编解码,提高多媒体文件的编解码效率。2, 对OpenMAX框架的抽象和封装,更加便于开发调用。3, 实现更加精简的代码便于后期维护。4, 加强产品的使用性,提高产品的用户体验。本文同时介绍了Google Android平台与多媒体框架的工作机制,OpenMAX框架,硬件编解码。详细分析OpenMAX框架的运行机制。对Android和OpenMAX有一个更加详细的了解。关键词:Android,OpenMAX,多媒体框架,编解码55 / 63AbstractDevelopment trends of mobile phones in recent years, smar

3、t phones become increasingly popular,Android phone is particularly strong. The entertainment feature of multimedia player is particularly important. How to better improve the the Multimedia efficiency has become a great opportunity for the user to choose.This paper mainly studies hardware codec on t

4、he Android platform. The main is the jni technology for data exchange, the abstract encapsulation for the OpenMAX framework ,process control, data input and output. In order to achieve hardware codec, and OpenMAX framework hardware codec integrated into the project, to enhance multimedia file encodi

5、ng and decoding speed, improve performance. The thesis results can provide an excellent the OpenMAX hardware codec framework of reference for other Android phone developer. The main innovation and contribution of this article are as follows:1,multimedia hardware codec, improve the efficiency of enco

6、ding and decoding of multimedia documents.2, abstraction and encapsulation of the OpenMAX framework easier to develop.3, to achieve a more streamlined code to facilitate later maintenance.4, to enhance the use of the product, to improve the user experience.This paper describes the working mechanism

7、of the Google Android platform multimedia framework, the OpenMAX framework, hardware codec. Detailed analysis of the operating mechanism of the OpenMAX framework. A more detailed understanding of the Android and OpenMAX.Key Words:Android, OpenMAX, multimediaframework, Hard-codec目录摘要iAbstractii图目录IV表

8、目录V第1章 绪论11.1 项目背景11.2 项目研究目的和意义11.3 国外现状分析21.4 本人主要工作31.5 章节安排4第2章 Android系统的介绍52.1 Android系统的简介52.2 Android平台的架构62.2.1 Linux Kernel(Linux核层)62.2.2 Library(函数库)62.2.3 Android Runtime(Android运行时库)72.2.4 Application Framework(应用软件架构)72.2.5 Application(应用程序)82.3 Android系统的多媒体框架82.4 本章小结9第3章 OpenMAX介绍1

9、03.1 OpenMAX的简介103.2 OpenMAX的概述103.2.1 OpenMAX标准化接口17103.2.1.1 OpenMAX IL(Integration Layer)103.2.1.2 OpenMAX DL(Development Layer)123.2.1.3 OpenMAX AL (Appliction Layer)123.2.2 Android中OpenMAX的使用情况153.2.3 Android 中OpenMAX的实现的容153.2.4 Android中的OpenMAX接口函数163.3 本章小结19第4章 OpenMAX框架硬编解码分析和设计204.1 OpenM

10、AX框架硬件编解码结构204.2 OpenMAX框架硬件编解码模块与功能分析214.2.1 JNI模块214.2.2 硬件解码功能224.2.2.1 数据转换模块224.2.2.2 硬件控制模块224.2.3 硬件编码功能234.2.3.1 数据转换模块234.2.3.2 硬件控制模块234.3 OpenMAX框架硬件编解码的整体设计234.3.1 OpenMAX框架硬件编解码的整体结构234.3.2 OpenMAX框架硬件解码的数据控制结构244.3.3 OpenMAX框架硬件编码控制结构244.4 本章小结25第5章 OpenMAX框架的硬编解码的实现265.1 系统整体流程265.1.1

11、 具体流程265.1.2 数据处理流程275.1.3 编解码的参数设置285.1.3.1 解码芯片参数285.1.3.2 编码芯片参数285.2 基于OpenMAX框架硬件解码295.2.1 基于OpenMAX框架硬件解码整体设计295.2.2 基于OpenMAX框架硬件解码的设计305.2.2.1 硬件解码的设置305.2.2.2 初始化的设计305.2.2.3 打开的设计315.2.2.4 关闭的设计325.2.2.5 数据处理过程具体函数325.2.3 基于OpenMAX框架硬件解码的实现335.2.3.1 变量和结构体的定义335.2.3.2 主要函数345.3 基于OpenMAX框架

12、硬件编码345.3.1 基于OpenMAX框架硬件编码整体设计345.3.2 基于OpenMAX框架硬件编码的设计355.3.2.1 硬件编码设置365.3.2.2 初始化的设计365.3.2.3 打开的设计365.3.2.4 启动的设计375.3.2.5 关闭的设计385.3.2.6 数据处理过程具体函数395.3.3 基于OpenMAX框架硬件解码的实现405.3.3.1 变量和结构体的实现405.3.3.2 主要函数415.4 本章小结42第6章 Android中OpenMAX框架硬编解码的应用436.1 OpenMAX框架硬件编解码的应用436.1.1 生成动态库436.1.2 Jni

13、的数据交互446.2 MovieStory中OpenMAX框架硬件解码的应用446.2.1 MovieStory项目的介绍446.2.2 MovieStory使用OpenMAX框架硬解码446.2.2.1 OMX开启446.2.2.2 数据流程456.2.2.3 OMX的关闭456.3 Amdv中OpenMAX框架硬件编码应用456.3.1 Amdv的简单介绍456.3.2 Amdv使用OpenMAX框架硬编码476.3.2.1 初始化476.3.2.2 数据的传入476.3.2.3 数据的输出476.3.2.4 退出486.4 本章小结48第7章 OpenMAX效果测试497.1 效果测试环

14、境497.2 MovieStory硬件解码效果测试497.2.1 MovieStory硬件解码效果测试设计497.2.2 MovieStory硬件解码效果数据对比497.2.3 MovieStory硬件解码加强点497.3 Amdv中的硬件编码效果的测试507.3.1 Amdv硬件编码效果测试设计507.3.2 Amdv硬件编码效果数据对比507.3.3 Amdv硬件编码效果加强点517.4 本章小结51第8章 总结52参考文献53作者简历55致56图目录图 2.1 Android系统的构成6图 2.2 Android 多媒体播放整体框架8图 3.1 OpenMAX IL 层次结构11图 3.

15、2 OpenMAX IL 组件工作流程13图 3.3 OpenMAX IL 组件结构14图 3.4 OMX Codec解码序列图18图 4.1 OpenMAX框架硬件编解码整体架构20图 4.2 OpenMAX框架硬编解码的部结构23图 4.3 OpenMAX框架硬解码的数据控制结构24图 4.4 OpenMAX框架硬编码的数据控制结构25图 5.1 整体流程类图26图 5.2 编解码控制流程27图 5.3 整体数据流程28图 5.4 解码控制流程30图 5.5 解码数据流程30图 5.6 解码Init函数流程31图 5.7 解码Open函数流程32图 5.8 解码Close函数流程32图 5

16、.9 解码数据处理具体流程33图 5.10 编码控制流程35图 5.11 编码数据流程35图 5.12 编码Init函数流程36图 5.13 编码Open函数流程37图 5.14 编码ProcStart函数流程38图 5.15 编码Close函数流程39图 5.16 编码数据处理具体流程40图 7.1 MovieStory的运行效果50图 7.2 Amdv的运行效果51表目录表5.1 图片解码参数28表5.2 音频解码参数28表5.3 视频解码参数28表5.4 MEDIA_MIMETYPE_AUDIO_AMR_NB参数29表5.5 MEDIA_MIMETYPE_AUDIO_AAC参数29表5.

17、6 MEDIA_MIMETYPE_VIDEO_MPEG4参数29表5.7 MEDIA_MIMETYPE_VIDEO_H263参数29表5.8 MEDIA_MIMETYPE_VIDEO_AVC参数表29表7.1 软件硬件解码效率对比表47表7.2 软件硬件编码效率对比表49第1章 绪论本章为本文的绪论,主要介绍了项目的背景,研究的目的和意义,较为详细的介绍了当前Android手机设备的软件编解码和硬件编解码在手机中的使用情况,最后对本人进行的主要工作和本文的章节安排进行描述。1.1 项目背景目前,Android上的多媒体软件大部分都还没有使用OpenMAX硬件编解码提高手机性能,如何通过硬件编解

18、码提高多媒体的性能仍处于需要加强的阶段,需要通过实际手机设备提高性能,与实际应用联系不够,所使用的多媒体软件性能不够强大。基于此,本文主要结合视频编辑器项目和OpenMAX框架的结合,研究如何在Android项目过OpenMAX实现视频硬件编解码,以提高项目的编解码效率,提高性能。Android系统对OpenMAX层进行使用部分,基本上使用的都是标准OpenMAX层之上的接口,只是对其进行了简单的封装。标准的OpenMAX实现非常容易以插件的形式嵌入到Android系统中。Android中的多媒体引擎OpenCore和StageFright都是使用OpenMAX作为多媒体编解码上的插件,只是没

19、有直接通过OpenMAX层提供的纯C接口调用,而是对纯C接口进行了一定的抽象封装。并且Android上的多媒体引擎OpenCore和StageFright大部分都是采用了软件形式的编解码,很少采用通过硬件形式的编解码。1.2 项目研究目的和意义多媒体无论图像、视频还是声音,都早已经成为了手机移动设备受到广泛欢迎的主要原因。到目前,基本上每个手机设备都会有一个以上的摄像头,并且随着手机技术的不断更新,同时越来越多的手机设备都需要拥有更为高档次的多媒体性能。目前使用者都是非常频繁地用手机来进行拍摄和浏览照片,同时也有录制声音和观看视频功能1。Android系统的多媒体解决方案一般都是软件编解码,解

20、码效率不高,并且代码复杂纷乱,不容易调试,这样满足不了消费者的需求,也不容易维护。运用OpenMAX硬件编解码既可以解析大多数流行的媒体文件,而且编解码效率也是增加不少,这样既可以满足消费者的要求,对开发和OEM来说也方便维护。本文通过对Android的OMXCodec的封装和抽象,对OpenMAX的控制,对数据的循环输入和输出,对代码的精简,对硬件编解码的控制。实现了一个基于Android系统的,编解码效率更加强大的OpenMAX多媒体编解码框架。它是通过研究OpenMAX来实现一个更加简洁,功能更加强大的代码框架,而且便于后期维护,提供新的多媒体编解码解决方案。目的实现可以屏蔽硬件特性,最

21、大发挥硬件编解码效率的框架。1.3 国外现状分析Android是以Linux为核心的手机操作平台,使用Java作为主要编程语言,但可以通过NDK支持C/C+,主要使用于便携设备2。Android是Google公司在2007年11月5日公布的智能手机操作系统3。早期是由原名是Android的公司来开发,谷歌在2005年收购Android.Inc公司后,继续对Android系统进行深入开发运营推广,它采用了4个主要层次架构,包括Linux Kernel(Linux核层),Library(函数库)和Android Runtime(Android运行时库),Application Framework(

22、应用软件架构),Application(应用程序) 4。2012年初数据显示,无论设备的出货量还是手机的数据流量都已经成为了手机系统里面的老大,已经完全超过了IOS,黑莓系统,还有称霸十年的塞班系统,使Android系统成为了我们最为喜爱的智能手机系统5。目前,Android系统不仅广泛应用于各种手机设备,而且平板电脑的数量也在急剧上升。采用Android系统开始广泛流行,主要厂商众多包括HTC、三星、LG、摩托罗拉等,中国大陆厂商如:华为、中兴、联想等6。目前多媒体蓬勃发展,Android手机设备已经深入到了大众生活。手机设备上的多媒体应用更加显的流行了。更是由于3G时代的来临,多媒体功能越

23、来越受到大众的喜欢。编解码效率的提高对多媒体的性能提高有极大的帮助。现在的手机上的编解码大体主要分为两类:分为硬件解码和软件解码两种。硬件解码的话,音质主要取决于置的解码芯片,而如今的技术发展比较快,更为强劲出色的解码芯片已经不比MP3差了,效率比较高。而软件解码就是通过CPU的运算进而实现视频音频的播放,使用操作系统的手机一般采用上面这种方法。当前的智能手机使用的CPU频率已经非常高,并且解码软件也非常成熟,支持解码MP3变得非常轻松的一件事情,输出的音频视频的质量还是非常高7。一般播放器都会识别多种视频格式封装(即文件格式), 例如, Coreplayer能播放AVI, WMV, MP4等

24、多种格式, RUN播放器能播放rm, rmvb格式的视频。Android系统中的的多媒体主要为OpenCore和StageFright。Android的多媒体引擎OpenCore和StageFright都是通过OpenMAX作为多媒体问卷的编解码插件,只是没有直接通过OpenMAX层提供的纯C接口的调用,而是对纯C接口进行了一定的抽象封装。OpenMAX是无授权费的,实现跨平台的应用程序接口API,目的是使媒体加速组件能够在开发、集成和编程各个环节中能够屏蔽硬件的差别同时实现接口统一,方便调用。也为设备提供比较全面的编解码器和应用程序来屏蔽硬件。OpenMAX API将会和处理器一起提供,以使

25、库和编解码器的开发者能够高速有效地利用硬件芯片的完整加速潜能,并且无需担心底层的硬件结构8。OpenMAX标准主要是针对嵌入式移动设备和手机移动设备的多媒体软件架构。在架构底层上为多媒体的编解码和数据处理定义了一套非常完整的统一的编程接口即(OpenMAX IL API),并且对多媒体数据编解码进行了非常系统的抽象,同时用户可以不用关注底层硬件的细节了。因此,大多数的多媒体软件和多媒体框架就是通过OpenMAX IL实现了一种可以用统一的方式来让codec和其他多媒体数据实现处理功能,屏蔽了底层硬件的差异性。1.4 本人主要工作在这个项目开发中,本人主要进行的工作:1. 研究Android系统

26、的多媒体框架。2. 研究OpenMAX框架的运行机制。3. 设计软件的架构。设计了OpenMAX框架硬件编解码的处于的层次,与OpenMAX框架硬件编解码的逻辑设计,对硬件控制,数据控制进行了详细的设计。4. 编写OpenMAX模块的的代码,加入逻辑控制。5. 将功能集成到项目。6. 优化代码,提高编解码效率。7. 测试项目,修改出现的问题。1.5 章节安排第二章:对Android系统的介绍,描述Android的结构与多媒体框架的现状。第三章:对OpenMAX的具体介绍,具体分析了OpenMAX框架的关系和接口,为下一步设计做好准备。第四章:对OpenMAX框架进行设计,详细地阐述了如何设计整

27、个框架。设计对硬件的控制,对数据的控制。第五章:对OpenMAX框架进行实现,详细地阐述了如何实现整个框架。第六章:对OpenMAX框架的应用,把OpenMAX框架集成到项目里面,能够在项目中远行。第七章:对OpenMAX框架的效果显示第八章:对全文进行总结,并对进一步工作进行展望。第2章 Android系统的介绍本章介绍了Android操作系统,首先简要介绍了一下Android系统的背景,然后分别从系统架构,多媒体框架和目前的编解码等方面详细的介绍了一下,并重点介绍了Android多媒体框架中的OpenMAX的作用。最后给出了搭建开发环境的步骤并对开发步骤做出介绍。2.1 Android系统

28、的简介由Google牵头和30多家业移动技术和无线应用领域非常领先的企业组成的一个开放手机联盟 (OpenHandsetAlhance)同时发布了其Android智能手机平台 9。Android一词的原义就是指“机器人”,同时也是Google于2007年11月发布的基于Linux平台上的开源智能手机操作系统的名称。这个平台由用户使用界面、linux操作系统、应用程序以与中间件一起组成,号称是第一个为移动手机终端打造的非常强劲和全面的移动智能手机系统10。每当谷歌发布它的新一版本的智能手机操作系统之后,各家手机厂商都会把升级他们上一版本智能手机系统便会进行了,同时也会把下一版本智能手机系统的消息

29、放在互联网上流出,这样的形式目前已经成为谷歌在推广Android手机操作系统的一种常用方式。在Android2.3饼马上发布的时候,Android3.0系统蜂巢就会被曝光,当各家手机厂商都在把自己的精力放在把Android手机升级到Android2.2操作系统的同时,国外媒体就会有消息传出Android下一版本手机操作系统名称已经被确定了,该操作系统的系列产品代号为Ice Cream Sandwich,简称为ICS,直译过来的名字就是冰激凌治。并且谷歌方面已经明确的告诉大家:Android4.0是把各手机系统与平板电脑系统融合在一起的产品,并没有限定最低硬件要求,理论上来讲,现有的Androi

30、d2.2/2.3设备都可以升级到Android4.0。在硬件上没有设限。Android智能手机操作系统采用的是软件堆层(software stack,又名软件叠层)的架构,主要分成了三部分。底层Linux核一般只提供了最基本的功能,其他的应用软件是由各设备生产公司自行开发,当然部分程序是以Java编写。2.2 Android平台的架构如图2.1所示,Android基本上就是在嵌入式Linux系统的上面再加上一些重要的手机应用开发的软件, 如果深入研究Android系统架构,就会发现整体自底向上主要是由4个主要层次构成,包括Linux Kernel(Linux核层),Library(函数库)和A

31、ndroid Runtime(Android运行时库),Application Framework(应用软件架构),Application(应用程序)。图2.1Android系统的构成2.2.1 Linux Kernel(Linux核层)Android核心系统服务都是基于Linux核上的,如安全性、存管理、进程管理、网络协议栈和驱动模型等模块。Linux 核同时也是连接硬件和软件栈之间的桥梁。2.2.2 Library(函数库)Android 包含了C/C+库,Android系统中的上层应用程序可以调用这些库。它们主要是通过Android 应用程序框架来为软件开发者提供调用一些接口的服务。下面

32、是Android的主要核心库:系统C库:C系统的函数库(LibC),它是专门为基于嵌入式Linux手机移动设备专门定制的;媒体库:基于Stagefright,该库主要为音频、视频格式文件的回放和录制,静态图像文件的编解码的调用,编码格式包括MPEG4、H.264、MP3、AAC、AMR、JPG和PNG;Surface Manager:管理图像显示的子系统,同时为软件提供了2D和3D图层的无缝融合11;SGL:负责底层2D图形的引擎;3D库:在OpenGL ES 1.0 API基础上实现;该库提供了可以使用3D硬件的加速或使用非常优化的3D软件加速;FreeType:位图(Bitmap)和矢量(

33、Vector)字体显示;SQLite库:一个小型的数据库引擎,可以被所有程序使用,并且功能非常强。2.2.3 Android Runtime(Android运行时库)Android包含一个核心库,为Java编程语言核心类库提供了各种可用的功能,使得每个Android程序都是虚拟机中的一个实例,都有自己的进程,拥有对立性。Dalvik虚拟机为应用程序提供了一个良好的远行环境,同时一个设备可以远行多个Dalvik虚拟机。Dalvik虚拟机执行的是.dex文件。 2.2.4 Application Framework(应用软件架构)开发者使用所有API框架可以和核心应用程序一样的权限。该应用程序的架

34、构设计简化了组件的重用;每一个人都可以发布自己写的应用程序里面的功能块,同时其他开发者也可以调用他的功能块来开发应用程序。同样,由于应用程序的可复用机制也使各个用户可以非常方便地替换各个程序组件。每个软件开发都会有服务和系统支撑,这其中包括:视图(Views):效果非常好可以扩展,可以被应用程序调用,并且很丰富,它包括按钮(Buttons),列表(Lists)、文本框(Text Boxes)、网格(Grids)、甚至包括可嵌入的Web浏览器;容提供器(Content Providers):让各个应用程序可以实现数据的共享,可以一个程序访问另外一个程序的数据,实现咯数据的分享;资源管理器(Res

35、ource Manager):管理和访问各种非代码的资源,包含对本地字符串、布局文件(Layout Files)和图形的管理;2.2.5 Application(应用程序)Android发布的时候会和它同一系列一些核心应用程序包一起发布,该应用程序重要包括JAVA编写的一些应用程序,比如一些视频播放器,摄像程序,图片浏览等等。所有的应用程序都是使用Java语言编写12。2.3 Android系统的多媒体框架Android的多媒体主要框架部分包含了应用程序、JAVA框架层、C语言框架层、硬件抽象层等环节。媒体的播放的时候实际上就是由下层的OpenCORE或Stagefright等多媒体框架实现的

36、13。Android的系统的多媒体框架在Android2.2版本之前主要使用的是OpenCORE,在Android2.3版本之后使用的是Stagefright。具体的分析如下图2.2Android 多媒体播放整体框架最上层的JAVA应用程序是使用媒体URI(媒体文件或者流媒体)来作为多媒体框架输入设置给媒体播放器,经过了Java框架层,到Jni层,在到本地框架层,一直设置到引擎PVPlayer。这个过程就是为媒体设置了媒体URI的路径,但是这个时候数据传递还没有开始。当开启了PVPlayer,再进入到PVPlayer后开始进行了解析,再根据媒体的格式把文件分成了音频流(MP3,AMP,AAC等

37、)和视频流(H263,H264,MPEG4等),然后经过编解码器的处理,把数据变成原始数据(音频通常是PCM,视频通常是YUV或RGB格式)。再把音视频原始数据放在音频和视频的输出播放环节(扬声器或者显示屏等硬件)进行输出14-15。AwesomePlayer是Stagefright的核心类,创建并管理Parser(MediaExtractor), Codec(OMXCodec), Render(AwesomeRendererer)与AudioPlayer等。音频播放功能流程通过调用AwesomePlayer 的setDataSource 函数来设置数据源; AwesomePlayer 通过调

38、用MediaExtractor的Create 函数来识别该文件的格式,MediaPlayer 判断该文件为WMA 格式后,会创建一个WMAExtractor,在创建WMAExtractor 的同时,WMAExtractor 会解析文件头,获取文件中的相关信息。然后调用WMAExtractor的getTrack 函数创建一个WMASource; AwesomePlayer通过OMXCodec 创建一个WMADecoder; AwesomePlayer接着创建一个AudioPlayer,并把WMADecoder 做为数据源传给AudioPlayer,并调用AudioPlayer 的start 函数

39、; AudioPlayer 获取WMADecoder中的相关参数: 文件类型、采样率、声道数,并根据该数据开启AudioSink,并把AudioSinkCallback做为回调函数传给AudioSink。AudioPlayer 先调用WMADecoder 解第一帧数据, 并把该数据传给AudioSink去播放,当播放完成后AudioSink 会调用回调函数AudioSinkCallback 再取解码后的数据,AudioSinkCallback又会调用FillBuffer 函数获取解码后的原始数据,解码后数据如果被取完后,AudioPlayer又会调用WMADecoder 解下一帧数据给Audi

40、oSink,来回反复,直到文件中数全部被播放。在拉动滚动条时,上层会传来SeekTime,经AudioPlayer 传给WMADecoder 再传给WMAExtractor,WMAExtractor 根据上层传来的SeekTime 判断出要播放的原始数据的起始位置,然后从该位置读取一个数据包传给WMADecoder 解码16。2.4 本章小结本章为全文的第二章,介绍了Android操作系统构成,重点介绍了Android多媒体框架的组成,最后介绍了目前的编解码。第3章 OpenMAX介绍本章主要分析了OpenMAX框架的主要运行的模式,介绍了几个重要功能模块和接口函数。和Android中的情况。

41、3.1 OpenMAX的简介OpenMAX是无授权费的,实现跨平台的应用程序接口API,目的是使媒体加速组件能够在开发、集成和编程各个环节中能够屏蔽硬件的差别同时实现接口统一,方便调用。也为设备提供比较全面的编解码器和应用程序来屏蔽硬件。OpenMAX API将会和处理器一起提供,以使库和编解码器的开发者能够高速有效地利用硬件芯片的完整加速潜能,并且无需担心底层硬件结构8。3.2 OpenMAX的概述3.2.1 OpenMAX标准化接口17OpenMAX是Khronos公司制定的针对手持设备和嵌入式移动设备的行业标准。它是无授权费的,跨平台的API 接口。OpenMAX标准主要是针对嵌入式移动

42、设备和手机移动设备的多媒体架构 。并且在架构底层上可以为多媒体文件进行的codec或数据处理定义了一套完整统一的编程接口(OpenMAX API),同时对多媒体数据处理的时候进行了系统的封装抽象,屏蔽了底层的结构,更加快速开发程序。因此,大多数的多媒体软件和多媒体框架都是通过OpenMAX来实现一套非常完整统一的接口,让codec和其他多媒体的数据处理功能变的更加方便,同时实现了跨越软硬件平台的可移植性18。OpenMAX共分为3层:OpenMAX IL(Integration Layer), OpenMAX DL (Development Layer), OpenMAX AL (Applic

43、tion Layer)。3.2.1.1 OpenMAXIL(Integration Layer)OpenMAX IL 是由Khronos 组织发起并起草的一个公开的技术标准,2005 年12 月发布第一个版本,目前的最新版本是version 1.1。OpenMAX IL 作为实现音频,视频和图像编解码器与多媒体编解码器的交互,并且统一的行为来支持组件。这些编解码器或者是软件解码器,或者是硬件解码器,或许是软硬件的混合体。OpenMAX IL提供了透明的媒体框架,为编解码器提供一个系统抽象,它解决了不同媒体系统之间编解码移植的问题。OpenMAX API会和处理器一起提供的,为库和编解码器开发者

44、可以高速有效地利用新器件的完整加速潜能,不需担心其底层的硬件结构。在架构底层上为多媒体的编解码和数据处理提供了统一的编程接口,对多媒体数据的处理功能进行系统级抽象,为用户屏蔽了底层的细节。因此,多媒体应用程序和多媒体框架通过OpenMAX IL可以以一种统一的方式来使用编解码和其他多媒体数据处理功能,具有了跨越软硬件平台的移植性。OpenMAX IL目前已经成为了事实上的多媒体框架标准。嵌入式处理器或者多媒体编解码模块的硬件生产者,常常提供标准的OpenMAX IL层的软件接口,这样软件的开发者就可以基于这个层次的标准化接口进行多媒体程序的开发。在Android中,OpenMAX IL层,通常

45、可以用于多媒体框架的插件,Android的多媒体框架OpenCore和StageFright都可以使用OpenMAX作为插件,主要用于编解码(Codec)处理。OpenMAX IL的组件结构如图3.1所示。图3.1OpenMAX IL 层次结构OpenMAX IL以组件的形式封装了应用程序所需的功能,每个组件对应一个功能模块,组件可以分类为输入(sources),输出(sinks),过滤器(filters),分离器(splitters),混合器(mixers)等。组件端口主要用于组件数据的输入输出。用于发送数据到端口和从端口获取数据的函数分别是EmptyThisBuffer 和FillThis

46、Buffer,这两个调用均是异步的。每个OpenMAX IL 组件都要经历一系列的状态转换。组件通过OpenMAX IL 核的调用加载并转换为加载(Loaded)状态,其他的状态转换通过IL client 与组件的直接通信完成。IL client 通过OMX_SendCommand 函数使用OMX_CommandStateSet 命令控制组件改变状态19。其中,OpenMAX IL层主要实现了OpenMAX IL中的各个组(Component)。对下层来说,OpenMAX IL可以直接调用各种Codec实现。对上层来说,OpenMAX IL可以向应用程序提供接口供应用程序调用。OpenMAX

47、IL主要容如下所示:l 客户端(Client):OpenMAX IL的调用者。l 组件(Component):OpenMAX IL的单元,每一个组件实现一种功能。l 端口(Port):组件的输入输出接口。l 隧道化(Tunneled):让两个组件直接连接的方式。OpenMAX IL的基本运作过程如图3.2所示图3.2OpenMAX IL 组件工作流程OpenMAX IL客户端调用了四个OpenMAX IL组件实现的编解码器功能。四个组成分别是Source组件、Host组件、Accelerator组件和Sink组件。其中,Source组件只有一个输出端口,Host组件有一个输入端口和输出端口;

48、Accelerator组件有一个输入端口,使用了硬件编解码器,以加快整个环节。Accelerator组件和Sink组件,通过私人通信,组件端口一直没有明确的组成部分。OpenMAX IL在使用的时候,处理数据流也会有自己的不同的处理方式:既有经过客户端的,也有不经过客户端的。Source组件到Host组件的数据流就是需要客户端的;而Host组件到Accelerator组件的数据流就没有经过客户端,使用了隧道化(Tunneled)的方式;Accelerator组件和Sink组件甚至可以使用私有的通讯方式。OpenMAX IL的组件是OpenMAX IL实现的核心容,一个组件以输入、输出端口为接口

49、,端口可以被连接到另一个组件上。外部对组件可以发送命令,还进行设置和获取参数、获取配置等操作。组件的端口可以包含缓冲区(Buffer)的队列。OpenMAX IL的组件的处理的核心容就是:把Buffer放在输入端口,如何进行解码或者编码操作处理;再把Buffer从输出端口拿出,即是将解码或者编码后的数据进行输出,由此多组件相联接可以构成流式的处理。OpenMAX IL中一个组件的结构如图3.3所示图3.3OpenMAX IL 组件结构OpenMAX IL的组件功能和它定义的端口类型密切相关,通常情况下:只有一个输出端口的,为Source组件;只有一个输入端口的,为Sink组件;有多个输入端口,

50、一个输出端口的为Mux组件;有一个输入端口,多个输出端口的为DeMux组件;输入输出端口各一个组件的为中间处理环节,这是最常见的组件。 不同的OpenMAX IL组件它的端口支持的数据类型也不同。例如,对于一个输入、输出端口各一个的组件,它的输入端口可以是WMA格式的数据,输出端口可以是PCM格式的数据,那么这就是一个WMA的解码组件。隧道化(Tunneled)是关于组件连接方式的一个概念。通过隧道化可以将不同的组件的一个输入端口和一个输出端口连接到一起,在这种情况下,两个组件的处理过程合并,两个组件共同处理数据。特别的,对于一个输入端口和一个输出端口的组件,两个组件可以作为类似一个组件来使用

51、。但是这种方式在Android Opencore里没有用到。3.2.1.2 OpenMAX DL(Development Layer)OpenMAX DL定义了一套API ,它是音频,视频和图像功能模块的集合。它包括了音频信号的处理功能,如 FFT 和Filter ,图像原始处理,如颜色空间的转换,和视频的原始处理,以实现例如 MPEG-4 ,H.264 ,MP3,AAC和JPEG 等编解码器的优化。OpenMAX 通过iDL和aDL来加速,iDL 使用 OpenMAX IL 结构,aDL向OpenMAX DL API增加了异步接口。3.2.1.3 OpenMAX AL (Appliction

52、 Layer)OpenMAX AL 定义了一下多媒体应用程序的框架标准。3.2.2 Android中OpenMAX的使用情况OpenMAX就是一个为多媒体应用程序准备的API标准。其中,OpenMAXIL(集成层)技术规格定义了媒体组件接口,以便在嵌入式器件的流媒体框架中快速集成加速编解码器。在Android中,OpenMAX层,通常可以用于多媒体引擎的插件,Android的多媒体引擎OpenCore和StageFright都是使用OpenMAX作为插件,主要用于的编解码(Codec)处理。在Android的框架层,在Android里面定义了一套OpenMAX接口,和标准的接口概念基本一样,但

53、是使用C+类型的接口,并且使用了Android的BinderIPC机制。Android封装OpenMAX的接口被StageFright使用,OpenCore没有使用这个接口,而是使用其他形式对OpenMAXIL层接口进行封装。Android系统Opencore的编解码部分采用对OpenMAX IL层进行封装来使用,使用的是标准OpenMAX IL层的接口,但是这些接口Google又进行了简单的封装,并没有直接使用OpenMAX IL层提供的纯C接口。封装后的OpenMAX IL组件很容易被嵌入到StageFright中。3.2.3 Android 中OpenMAX的实现的容Android中Op

54、encore使用的主要是OpenMAX的编解码功能。虽然OpenMAX也可以生成输入、输出、文件解析和构建等组件,但是在各个系统 (Android等)中使用的最多的还是编解码组件。原因是媒体的输入、输出环节和系统的关系很大导致引入OpenMAX标准比较麻烦;文件解析和构建环节一般也不需要使用硬件加速。编解码组件也是最能体现硬件加速的环节,因此最常使用。在Android Opencore中实现OpenMAX IL层和标准的OpenMAX IL层的方式基本一样,一般需要实现以下两个环节。 编解码驱动程序:位于Linux核空间,需要通过Linux核调用驱动程序,通常使用非标准的驱动程序。 OpenM

55、AX IL层:根据OpenMAX IL层的标准头文件实现不同功能的组件。Android中还提供了OpenMAX的适配层接口(对OpenMAX IL的标准组件进行封装适配),它作为Android本地层接口,可以被Android的多媒体框架Opencore调用。OpenMAX IL在使用的时候,其数据流也有不同的处理方式:既可以经由客户端,也可以不经由客户端。Source组件到Host组件的数据流就是经过客户端的;而Host组件到Accelerator组件的数据流就没有经过客户端,使用了隧道化的方式;Accelerator组件和Sink组件甚至可以使用私有的通讯方式。OpenMAX Core是辅助

56、各个组件运行的部分,它通常需要完成各个组件的初始化等工作,在真正运行过程中,重点的是各个OpenMAX IL的组件,OpenMAX Core不是重点,也不是标准。OpenMAX IL的组件是OpenMAX IL实现的核心容,一个组件以输入、输出端口为接口,端口可以被连接到另一个组件上。外部对组件可以发送命令,还进行设置/获取参数、配置等容。组件的端口可以包含缓冲区(Buffer)的队列。组件的处理的核心容是:通过输入端口消耗Buffer,通过输出端口填充Buffer,由此多组件相联接可以构成流式的处理。组件的功能和其定义的端口类型密切相关,通常情况下:只有一个输出端口的,为Source组件;只

57、有一个输入端口的,为Sink组件;有多个输入端口,一个输出端口的为Mux组件;有一个输入端口,多个输出端口的为DeMux组件;输入输出端口各一个组件的为中间处理环节,这是最常见的组件。端口具体支持的数据也有不同的类型。例如,对于一个输入、输出端口各一个组件,其输入端口使用MP3格式的数据,输出端口使用PCM格式的数据,那么这个组件就是一个MP3解码组件。隧道化(Tunneled)是一个关于组件连接方式的概念。通过隧道化可以将不同的组件的一个输入端口和一个输出端口连接到一起,在这种情况下,两个组件的处理过程合并,共同处理。尤其对于单输入和单输出的组件,两个组件将作为类似一个使用。3.2.4 An

58、droid中的OpenMAX接口函数Android中的OMXCodec在AwesomePlayer中是充当着codec的角色。Stagefright 通过OpenMAX 框架实现了解码的功能。StageFright的核心播放器AwesomePlayer中包含了sp型的mVideoSource指针,初始化时指向OMXCodec的实际对象。OMXCodec使用了Binder机制,实现了远程函数调用,且函数调用模式于本地函数无异,其中IOMX作为接口类定义了OMX的大部分接口函数。OMX的具体实现时,OMXMaster用于管理OMX的插件,OMXNodeInstance类代表OMX的具体实例,完成和

59、Component的调用和交互,部类CallbackDispatcher是一个主动类,它用于调度处理回调函数传回的消息。OMXNodeInstance和CallbackDispatcher一一对应,协同工作,完成不同实例的消息处理。OMXNodeInstance类中最重要的几个函数为:1. allocateBuffer: Client通过调用此函数让Component分配Buffer。2. useBuffer: Client通过此函数将已分配好的Buffer传给Component,让其使用。3. freeBuffer: Client通过调用此函数让Component释放allocateBuff

60、er()分配的Buffer。4. fillBuffer: Client通过调用此函数传递空的Buffer给Component,让其将处理好的数据填入其中。此函数会调用OMX标准接口OMX_FillThisBuffer()。5. emptyBuffer: Client通过调用此函数传递输入Buffer给Component,让其读取其中的数据进行编解码等处理。此函数会调用OMX标准接口OMX_ EmptyThisBuffer ()。6. OnEmptyBufferDone: Component完成对输入buffer的读取后,调用此回调函数,向Client发送EmptyBufferDone消息。7.

61、 OnFillBufferDone: Component完成相应处理将输出数据填入输出Buffer后,调用此回调函数,向Client发送FillBufferDone消息。图3.4 OMX Codec解码序列图OMXCodec使用emptyBuffer()函数(IL层中为OMX_EmptyThisBuffer()传递未解码的buffer给component,component收到该命令后会读取input port buffer中的数据,将其组装成帧进行解码,读取buffer中的数据完成后会调用EmptyBufferDone通知OMXCodec。Compoment使用EmptyBufferDone

62、消息通知OMXCodec已完成input buffer的读取, 具体的实现是通过调用回调函数OnEmptyBufferDone()实现的。OMXCodec收到该命令后会通过mVideoTrack读取新的视频码流到input port的buffer中,并调用OMX_EmptyThisBuffer通知component。OMXCodec使用OMX_FillThisBuffer传递空的bffer给component用于存储解码后的帧,Component收到该命令后将解码好的帧数据复制到该buffer上,然后调用FillBufferDone通知OMXCodec。Compoment使用FillBuffe

63、rDone通知OMXCodec已完成output port buffer的填充,具体的实现是通过调用回调函数OnFillBufferDone()实现的。OMXCodec收到该命令后将解码好的帧存入可显示队列中,AwesomePlayer调用OMXCodec:read()函数读出可显示队列的对头送给Renderer完成颜色转换等操作,再传递给mISurface进行图像绘制,同时Render调用release()函数,其中的SignalBufferDone()会用OMX_FillThisBuffer通知component有空的buffer可填充。假设input port buffer中有2个buffer,分别为buffer_1和buffer_2,并且这两个buffer所携带的数据可构成1帧,则AssemblePartialFrames首先申请一块存区域tmp_buffer_1,将buffer_1的有效数据拷贝到tmp_buffer_1上,然后再申请一块存区域tmp_buffer_2,申请完后第一步将tmp_buffer_1的数据拷贝到自身的前半部,第二步将buffer_2的有效数据拷贝到后半部来组合成为1帧。组合完成后将tmp_buffer_2和output port的buffer交给AvcDecoder_OMX进行解码, AvcDecoder_OMX将解码后的帧数据拷贝到out

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!