在讨论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硬件解码浅探的更多相关文章

  1. Android中使用MediaCodec硬件解码,高效率得到YUV格式帧,快速保存JPEG图片(不使用OpenGL)(附Demo)

    MediaCodec的使用demo: https://github.com/vecio/MediaCodecDemo https://github.com/taehwandev/MediaCodecE ...

  2. Android的音频解码原来是直接调用的本地C方法直接通过硬件解码

    Android就是披着JAVA外衣的C啊~音频解码原来是直接调用的本地C方法直接通过硬件解码的,JAVA和C的字节数组存放模式不同(java是大端,C根据不同平台不同),不同格式需要转化以后才能用. ...

  3. Android MediaPlayer 和 MediaCodec 的区别和联系(一)

    目录: (1)概念解释 : 硬解.软解 (2)Intel关于Android MediaCodec的相关说明 正文: 一.硬解.软解         (1)概念:                 a.硬 ...

  4. MediaCodec在Android视频硬解码组件的应用

    https://yq.aliyun.com/articles/632892 云栖社区> 博客列表> 正文 MediaCodec在Android视频硬解码组件的应用   cheenc 201 ...

  5. Android MediaPlayer 基础简介

    本文链接: Android MediaPlayer 基础简介 简单介绍MediaPlayer的基本概念,状态,常用的方法与监听器. 什么是MediaPlayer MediaPlayer类可以用来播放音 ...

  6. 使用C#+FFmpeg+DirectX+dxva2硬件解码播放h264流

    本文门槛较高,因此行文看起来会乱一些,如果你看到某处能会心一笑请马上联系我开始摆龙门阵 如果你跟随这篇文章实现了播放器,那你会得到一个高效率,低cpu占用(单路720p视频解码播放占用1%左右cpu) ...

  7. Android安全开发之浅谈密钥硬编码

    Android安全开发之浅谈密钥硬编码 作者:伊樵.呆狐@阿里聚安全 1 简介 在阿里聚安全的漏洞扫描器中和人工APP安全审计中,经常发现有开发者将密钥硬编码在Java代码.文件中,这样做会引起很大风 ...

  8. 第一部分 Android MediaPlayer 概述

    [IT168 技术文档]本文主要介绍的是Android中很重要也最为复杂的媒体播放器(MediaPlayer)部分的架构.对于Android这样一个完整又相对复杂的系统,一个MediaPlayer功能 ...

  9. Android MediaPlayer Error/Info Code

    1. 常见错误 error(-38, 0) 我觉得-38表示在当前的MediaPlayer状态下,不能运行你的操作. 详细怎样做请參考:Android MediaPlayer 另外我在其它资料中.发现 ...

随机推荐

  1. Unity3D 之NGUI各种脚本及应用

    这里来介绍一下NGUI的各种脚本的作用,以便以后需要某种效果的时候,去添加相应的脚本去实现效果 UIButton --> 按钮脚本 UIPanel   --> 面板脚本 UIToggle  ...

  2. using(){},Close(),Dispose()的区别

    //用Close(),Dispose()方式关闭连接 string connString = "Data Source=(local);Initial Catalog=Linq;Integr ...

  3. 有关IT的小笑话

    路上看到一个女孩朝我走来:“请问你是不是学计算机的?”我疑惑的点点头,她兴奋的又问:“那你有女朋友吗?”我兴奋的摇头:“没有啊,是不是你家电脑坏了?”她转身对后面的女孩说:“看吧,我就知道这种背双肩包 ...

  4. html元素

    类型 HTML元素 描述 主窗体元素 <HTML></HTML> 超文本的开始和结束 <HEAD></HEAD> 超文本信息头的开始和结束 <TI ...

  5. ASP.NET CompareValidator 控件在VS2012中出错的问题

    CompareValidator 控件用于将由用户输入到输入控件的值与输入到其他输入控件的值或常数值进行比较. -------如果输入控件为空,则不会调用任何验证函数,并且验证将成功.使用 Requi ...

  6. JS修改JSON中key的方法

    function modifyJosnKey(json,oddkey,newkey){ var val=json[oddkey]; delete json[oddkey]; json[newkey]= ...

  7. ArcGIS Runtime SDK for WPF已不更新,后续将被ArcGIS Runtime SDK for .NET取代

    ArcGIS Runtime SDK 10.2.5 for WPF is now available! by mbranscomb and Rex Hansen on January 27, 2015 ...

  8. mysql error笔记1

    mysql视图问题: The user specified as a definer ('root'@'%') does not exist 原因:由于root用户对全局host无访问权限,给root ...

  9. java PropertyChangeSupport委托帧听类的使用

    要委托的Bean类写法. import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import ...

  10. P1832 A+B Problem(再升级)

    P1832 A+B Problem(再升级) 题目提供者 usqwedf 传送门 标签 动态规划 数论(数学相关) 洛谷原创 难度 普及/提高- 通过/提交 107/202 题目背景 ·题目名称是吸引 ...