android Mediaplayer硬件解码浅探
在讨论stagefright如何调用硬件解码之前,我们要先清楚几个问题。
我不展开这几个结论是如何得来的,因为这部分属于进程间通信binder的理解,和多媒体本身无关。
一.问题空间
这个有点像方法学上的东西了,呵呵。其实我们讨论一个问题,首先要观注的就是,什么是我们应该关心的,什么是我们在这个问题空间里不用解决的。
上次我们说到,awesomeplayer所有codec,包括软解与硬解的,都是由omx封装的。
我的第一个结论就是:OMX是一个server,等同于surfaceflinger,audioflinger的server。
既然是server,那么,肯定存在客户端与服务器两个方面,另外,server是为提供service而存在的,那么,sevice有哪些?
这是我们要探讨的问题。
二.交互过程
我们知道,在互联网的概念里,server都是有域名的,浏览器通过dns从域名解析到ip,通过路由器,进而进行通信。
Binder里面其实也有类似的概念,比如surfaceflinger注册的服务名就是“SurfaceFlinger”。那么omx注册的叫什么?我找了n久,这是一个不和谐的存在:他是一个匿名服务。我只能得出这个结论了,因为OMX这个server实在不符合一般常规的方法。

在Awesomeplayer里面,有个成员叫mClient,在Awesomeplayer构造函数里面,这个成员去与服务器取得了联系,去获取服务都指着他呢,呵呵。
CHECK_EQ(mClient.connect(), (status_t)OK);
并且知道了omx能提供哪些服务,这些服务用IOMX这个类来标识。
好吧,IOMX是一个接口类,都是纯虚函数,那么我们看看这个类的实际实现在哪。
这个接口类,描述了一些功能,我不详细展开说接口的功能了。那样在太像spec了。因为iomx说白了就是把omx那几个c语言头文件,用c++重写了一遍。相当没意思。
OMX.cpp这个就是omx server真正的实现了。
三.OMX.cpp分析
上面说到了connect(),实际connect()时,发生了很多故事。一个有趣的故事就是
mOMX = service->getOMX()(omxclient.cpp)。
我们来看看getOMX()在哪里,又是binder,好麻烦。
sp<IOMX> MediaPlayerService::getOMX() (MediaPlayerService.cpp)。
一个getomx(),直接导致我们的OMX的构造函数被调用。
OMX的构造函数被调用还是小事,他同时又构造了一个对象。(OMXMaster.cpp)
OMXMaster::OMXMaster()
: mVendorLibHandle(NULL) {
addVendorPlugin();
addPlugin(new SoftOMXPlugin);
}
Add了两类plugin()。软件一类,硬件一类。
先看软件那一类。又new一个softomxplugin(),进去看看。
又出来一个接口类,OMXPluginBase,又要实现4个接口。。。。看看softomxplugin如何实现他们。
全是字符串写好的,so库名都是写死的。支持哪种codec就加进来。
然后通过dlopen打开。
找这么_Z22createSoftOMXComponentPKcPK16OMX_CALLBACKTYPE一个怪名子的函数,都怪c++的重载机制了,好好的函数名,一修饰,看不懂了。
不过呢,其实就是他了。android::SoftOMXComponent *createSoftOMXComponent,我们可以看一个实例,softavc.cpp里面有。
这里先不展开,因为内容还够写两篇,呵呵。
再看硬件一类,也是这个文章的终极问题。
直接规定的一个库名。Libstagefrighthw.so这个就是硬解库了。
硬解库要实现些什么呢?先说几个基本的。
createOMXPlugin这个,但是这个只是创建一个OMXPluginBase对象。
实际要完成的关键,还是这个OMXPluginBase里面的四个函数。
其中的秘密,只有芯片厂商知道了。
Android的源代码里面关于libstagefrighthw..so的实现,ti,高通,三星,都是开源的,但是其中关于各个解码器组件的实现,没有厂商释放出来,这里者真金白银,其他的,只是一些看着热闹的垃圾代码而已。呵呵,所以呢?真正有技术实力的东西,永远不在方案厂商这里,只会在芯片厂商那。
android Mediaplayer硬件解码浅探的更多相关文章
- Android中使用MediaCodec硬件解码,高效率得到YUV格式帧,快速保存JPEG图片(不使用OpenGL)(附Demo)
MediaCodec的使用demo: https://github.com/vecio/MediaCodecDemo https://github.com/taehwandev/MediaCodecE ...
- Android的音频解码原来是直接调用的本地C方法直接通过硬件解码
Android就是披着JAVA外衣的C啊~音频解码原来是直接调用的本地C方法直接通过硬件解码的,JAVA和C的字节数组存放模式不同(java是大端,C根据不同平台不同),不同格式需要转化以后才能用. ...
- Android MediaPlayer 和 MediaCodec 的区别和联系(一)
目录: (1)概念解释 : 硬解.软解 (2)Intel关于Android MediaCodec的相关说明 正文: 一.硬解.软解 (1)概念: a.硬 ...
- MediaCodec在Android视频硬解码组件的应用
https://yq.aliyun.com/articles/632892 云栖社区> 博客列表> 正文 MediaCodec在Android视频硬解码组件的应用 cheenc 201 ...
- Android MediaPlayer 基础简介
本文链接: Android MediaPlayer 基础简介 简单介绍MediaPlayer的基本概念,状态,常用的方法与监听器. 什么是MediaPlayer MediaPlayer类可以用来播放音 ...
- 使用C#+FFmpeg+DirectX+dxva2硬件解码播放h264流
本文门槛较高,因此行文看起来会乱一些,如果你看到某处能会心一笑请马上联系我开始摆龙门阵 如果你跟随这篇文章实现了播放器,那你会得到一个高效率,低cpu占用(单路720p视频解码播放占用1%左右cpu) ...
- Android安全开发之浅谈密钥硬编码
Android安全开发之浅谈密钥硬编码 作者:伊樵.呆狐@阿里聚安全 1 简介 在阿里聚安全的漏洞扫描器中和人工APP安全审计中,经常发现有开发者将密钥硬编码在Java代码.文件中,这样做会引起很大风 ...
- 第一部分 Android MediaPlayer 概述
[IT168 技术文档]本文主要介绍的是Android中很重要也最为复杂的媒体播放器(MediaPlayer)部分的架构.对于Android这样一个完整又相对复杂的系统,一个MediaPlayer功能 ...
- Android MediaPlayer Error/Info Code
1. 常见错误 error(-38, 0) 我觉得-38表示在当前的MediaPlayer状态下,不能运行你的操作. 详细怎样做请參考:Android MediaPlayer 另外我在其它资料中.发现 ...
随机推荐
- ImageButton 在IE 10 下的异常
最近在项目中遇到一个棘手问题,在IE10中,一些图片按钮点了毫无反应,其他浏览器(包括IE9)都正常:查看后台,发现如下异常信息: Input string was not in a correct ...
- Unity3D用vistual studio打卡C#脚本卡死解决
小黑已经跟我3年了,不仅很喜欢他方正酷黑的外表,而且稳定性绝对没的说.我已经3年没有重装过系统了,而且现在装了3个系统!虽然小黑很适合程序员,但是他最大的缺点就是做设计比较吃力,显卡512M.像uni ...
- jquery的事件绑定
暂时有 bind(),live(),delegate(),on() 这四个事件监听函数 对应的4个事件解除函数分别是: unbind(),die(),undelegate(),off() bind:向 ...
- 2.redis.3.2 下载,安装、配置、使用 - 2
上篇简单介绍了 下载,安装,测试,现在直接使用了,看结果 使用的redis服务便是,上篇临时搭建的简易服务,,注意,说的是简易,因为它只是一个单点的“玩具”: 临时在项目登录的时候模拟了一下,这里使用 ...
- flexpaper 开源轻量级的在浏览器上显示各种文档的组件
FlexPaper是一个开源轻量级的在浏览器上显示各种文档的组件,被设计用来与PDF2SWF一起使用, 使在Flex中显示PDF成为可能,而这个过程并无需PDF软件环境的支持.它可以被当做Flex的库 ...
- 关于iOS上的静态库
最近再进行项目的真机调试,然后发现了一个天坑.就此研究了一些iOS上的静态库的使用: 首先我们是直接拿一个可以运行的项目来制作静态库的,网上大部分都是先创建静态库然后再写内容,看看我的方法. 1.把子 ...
- iOS 获取当前媒体音量
#import <AVFoundation/AVAudioSession.h> AVAudioSession *audioSession = [AVAudioSession sharedI ...
- Swift 语法须知
什么是swift? swift是 2014 WWDC 发布的一款脚本语言. 使用Swift的好处: OC ARC 最大的困难 内存管理 而 swift 不用担心内存方面. 简洁 ,功能 ...
- JavaScript学习笔记 -- ES6学习(三) 变量的解构赋值
1.解构赋值的定义 在ES6中,允许按照一定模式,从数组和对象中提取值(所谓解构),然后对变量进行赋值. var a = 1; var b = 2; var c = 3; //等价于 var [a, ...
- [转] jQuery按键响应事件keypress对应的按键编码keycode
原文地址:http://blog.csdn.net/chenhj1988918/article/details/7534922 keypress api 文档:http://api.jquery.c ...