MyException - 我的异常网
当前位置:我的异常网» Android » Android多媒体撑持库OpenCore视频硬件加速

Android多媒体撑持库OpenCore视频硬件加速

www.MyException.Cn  网友分享于:2013-07-16  浏览:19次
Android多媒体支撑库OpenCore视频硬件加速
Android2.2之前版本的视频音频的播放默认支撑库为OpenCore。OpenCore功能非常强大,可以支持多种媒体格式,并支持扩展。当然本文将要简单介绍一下怎样对OpenCore进行视频硬件加速,以提高其视频运行效率。


    OpenCore的作用简单的说就是对媒体(音频视频)数据进行解码,并输出到终端设备。音频数据解码和输出比较简单,本文重点介绍视频数据的解码和输出。为了使OpenCore的视频播放支持Android系统,谷歌定义了两套视频输出方案,一种是由硬件厂商实现硬件加速的视频输出,硬件视频输出里面可以调用硬件Overlay模块对输出的视频数据进行硬件混叠,这样输出效率会非常的高;另外一种为谷歌定义的软视频输出,该软视频输出定义为AndroidSurfaceOutput类,这种方案中系统会调用SurfaceFilnger对输出视频数据进行混叠,该混叠为软件混叠,执行效率比较低。请看文件PlayerDriver.cpp中handleSetVideoSurface方法的代码:




// attempt to load device-specific video MIO
if (mLibHandle != NULL) {
VideoMioFactory f = (VideoMioFactory) ::dlsym(mLibHandle, VIDEO_MIO_FACTORY_NAME);
if (f != NULL) {
    mio = f();
   }
}

// if no device-specific MIO was created, use the generic one
if (mio == NULL) {
LOGW("Using generic video MIO");
mio = new AndroidSurfaceOutput();
}

    可以看出如果mLibHandle不为空,则调用硬件库中的MIO(多媒体IO)工厂方法产生MIO(多媒体IO)。如果mLibHandle为空,则用通用视频MIO(AndroidSurfaceOutput类)。如果你仔细研究AndroidSurfaceOutput类你会发现,其底层调用的SurfaceFlinger来进行视频数据混叠,然后输出的,这部分有兴趣的朋友可以去查看代码。

    那么mLibHandle那里初始化的呢?在文件PlayerDriver.cpp中PlayerDriver类的构造函数中有如下代码:
// running in emulation?
mLibHandle = NULL;
char value[PROPERTY_VALUE_MAX];
if (property_get("ro.kernel.qemu", value, 0)) {
mEmulation = true;
LOGV("Emulation mode - using software codecs");
} else {
// attempt to open h/w specific library
mLibHandle = ::dlopen(MIO_LIBRARY_NAME, RTLD_NOW);
if (mLibHandle != NULL) {
LOGV("OpenCore hardware module loaded");
} else {
LOGV("OpenCore hardware module not found");
}
}

我们可以看出mLibHandle为库MIO_LIBRARY_NAME的句柄。请参考下面的代码:
// library and function name to retrieve device-specific MIOs
static const char* MIO_LIBRARY_NAME = "libopencorehw.so";
static const char* VIDEO_MIO_FACTORY_NAME = "createVideoMio";

   现在我们可以非常清楚的看到如果系统中有libopencorehw.so库,则OpenCore将会调用该库中的createVideoMio函数来创建MIO。由此我们可以知道对OpenCore的视频输出硬件加速,其实就是定义libopencorehw.so库。

   那么libopencorehw.so定义在那里呢?因为libopencorehw.so这个库是和硬件相关的,不同的硬件会有不同的实现,所以这个库可以理解成硬件适配层(HAL)的一部分。请参考《怎样实现Android系统的HAL(硬件适配层)》。由于硬件的千变万化,这里就不给实现的例子了。这样的例子非常多,大部分基于ARM芯片,你可以“依葫芦画瓢”,定制成自己平台的库。


    本文简单介绍了一下OpenCore视频输出的硬件加速的原理。搞清楚视频输出硬件加速的原理,对一些进行Android移植到新硬件平台的朋友会有帮助。如有纰漏之处,请各位朋友指正。


转载:http://my.unix-center.net/~Simon_fu/?p=748

文章评论

程序员和编码员之间的区别
程序员和编码员之间的区别
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
一个程序员的时间管理
一个程序员的时间管理
如何成为一名黑客
如何成为一名黑客
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
我的丈夫是个程序员
我的丈夫是个程序员
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
鲜为人知的编程真相
鲜为人知的编程真相
老程序员的下场
老程序员的下场
程序员的鄙视链
程序员的鄙视链
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
总结2014中国互联网十大段子
总结2014中国互联网十大段子
10个调试和排错的小建议
10个调试和排错的小建议
那些争议最大的编程观点
那些争议最大的编程观点
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
为什么程序员都是夜猫子
为什么程序员都是夜猫子
程序员应该关注的一些事儿
程序员应该关注的一些事儿
代码女神横空出世
代码女神横空出世
Java程序员必看电影
Java程序员必看电影
旅行,写作,编程
旅行,写作,编程
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
每天工作4小时的程序员
每天工作4小时的程序员
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
漫画:程序员的工作
漫画:程序员的工作
程序员必看的十大电影
程序员必看的十大电影
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
中美印日四国程序员比较
中美印日四国程序员比较
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有