本文均属自己阅读源代码的点滴总结。转账请注明出处谢谢。

欢迎和大家交流。

qq:1037701636 email:gzzaigcn2012@gmail.com

Android源代码版本号Version:4.2.2; 硬件平台 全志A31

之所以单独把这块内容提炼出来,在于其具备的一定的层次性,结构上具备统一性,API函数的设计须要实现OMX架构独有的接口。

1. 在上一博文Android4.2.2下Stagefright多媒体架构中的A31的OMX插件和Codec组件中我们提到。通过Binder架构,在MPS的线程上创建完一个实际的编解码器节点后,获取到了一个node:node_id。例如以下所看到的将会依据相关的节点信息,创建一个MPS側的OMXCodec结构体,作为相似本地的一个编解码器。

.....
sp<OMXCodec> codec = new OMXCodec(
omx, node, quirks, flags,
createEncoder, mime, componentName,
source, nativeWindow);//创建一个本地OMXCodec解码器。node成为兴许的操作的关键IOMX::node_id
//omx为Master
observer->setCodec(codec);//将解码器交给observer err = codec->configureCodec(meta);//依据数据源配置本地的这个解码器
........

在configureCodec对这个解码器的配置中。我们能够看到一些对之前分配的解码器节点的控制操作。

我们以它当中的一个函数调用为例,进行控制流的层层分析:

 setVideoOutputFormat(mMIME, meta);//设置视频输出格式
mOMX->getParameter(mNode, OMX_IndexParamPortDefinition, &def, sizeof(def))

这里看到mOMX是在创建AwesomePlayer时获取的一个匿名的BpOMX对象。

终于的实如今MediaPlayerService中的中的OMX对象来实现getParameter。

2.OMX对象下的操作。

status_t OMX::getParameter(
node_id node, OMX_INDEXTYPE index,
void *params, size_t size) {
return findInstance(node)->getParameter(
index, params, size);
}

findInstance(node)这里就是依据这个node_id来获取之前注冊的一个OMXNodeInstance对象实例:

OMXNodeInstance *OMX::findInstance(node_id node) {
Mutex::Autolock autoLock(mLock); ssize_t index = mNodeIDToInstance.indexOfKey(node); return index < 0 ? NULL : mNodeIDToInstance.valueAt(index);
}

终于就变成了例如以下的调用:

status_t OMXNodeInstance::setParameter(
OMX_INDEXTYPE index, const void *params, size_t size) {
Mutex::Autolock autoLock(mLock); OMX_ERRORTYPE err = OMX_SetParameter(
mHandle, index, const_cast<void *>(params)); return StatusFromOMXError(err);
}

3.OMX_XXX的实现

#define OMX_GetParameter(                                   \
hComponent, \
nParamIndex, \
ComponentParameterStructure) \
((OMX_COMPONENTTYPE*)hComponent)->GetParameter( \
hComponent, \
nParamIndex, \
ComponentParameterStructure) /* Macro End */

OMX_SetParameter等宏函数是OMX_CORE的核心所在。也是原来OpenOMx里的OMX IL层的体现。来看mHandle的类型,作为一个OMXNodeInstance对象的成员变量。他维护着之前makeComponentInstance返回的一个对底层编解码组件库的句柄。这里看上去就是一个OMX节点实例,一个句柄可操作最下层的解码组件。能够看到handle转为OMX_COMPONENTTYPE类型。

里看看其的结构体类型:

typedef struct OMX_COMPONENTTYPE
{
OMX_U32 nSize; OMX_VERSIONTYPE nVersion; OMX_COMPONENTNAMETYPE eCompName; OMX_PTR pComponentPrivate; OMX_ERRORTYPE (*GetParameter)(
OMX_IN OMX_HANDLETYPE hComponent,
OMX_IN OMX_INDEXTYPE nIndex,
OMX_IN OMX_PTR ComponentParameterStructure);...............

这个handle的获取是在之前创建解码器节点时完毕的,通过须要创建的解码器的name,通过OMX插件库,再进入到libOmxCore.so(OMX IL固有结构)调用OMX_GetHandle来获取相应组件name下的平台解码库libOmxVdec.so。或者libOmxVenc.so等。

这个handle通过下面完毕初始化:

void* aw_omx_create_component_wrapper(OMX_PTR obj_ptr)
{
aw_omx_component *pThis = (aw_omx_component *)obj_ptr;//omx_vdec对象
OMX_COMPONENTTYPE* component = &(pThis->m_cmp);//对m_cmp进行初始化
memset(&pThis->m_cmp,0,sizeof(OMX_COMPONENTTYPE)); component->nSize = sizeof(OMX_COMPONENTTYPE);
component->nVersion.nVersion = OMX_SPEC_VERSION;
component->pApplicationPrivate = 0;
component->pComponentPrivate = obj_ptr;//保存着omx_vdec这个对象 component->AllocateBuffer = &aw_omx_component_allocate_buffer;
component->FreeBuffer = &aw_omx_component_free_buffer;
component->GetParameter = &aw_omx_component_get_parameter;
component->SetParameter = &aw_omx_component_set_parameter;
component->SendCommand = &aw_omx_component_send_command;
component->FillThisBuffer = &aw_omx_component_fill_this_buffer;
component->EmptyThisBuffer = &aw_omx_component_empty_this_buffer;
component->GetState = &aw_omx_component_get_state;
component->GetComponentVersion = &aw_omx_component_get_version;
component->GetConfig = &aw_omx_component_get_config;
component->SetConfig = &aw_omx_component_set_config;
component->GetExtensionIndex = &aw_omx_component_get_extension_index;
component->ComponentTunnelRequest = &aw_omx_component_tunnel_request;
component->UseBuffer = &aw_omx_component_use_buffer;
component->SetCallbacks = &aw_omx_component_set_callbacks;
component->UseEGLImage = &aw_omx_component_use_EGL_image;
component->ComponentRoleEnum = &aw_omx_component_role_enum;
component->ComponentDeInit = &aw_omx_component_deinit;
return (void *)component;
}

通过以上的赋值操作,我们关注这个component->pComponentPrivate   = obj_ptr,他是将硬件平台的解码器实例维护到handle结构体中。由于终于的操作肯定都要回到最底层的解码器控制。

这也就是OMX IL的架构给予了开发人员的方便性和规划化。通过这个我们就能够总结出须要下面几个文件来衔接更底层的编解码器:

xxx_omx_core.c和omx_core_cmp.c两个源文件来完毕。前者提供向上的接口用于创建编解码器实例。后者提供比如上述的xxx_omx_component_api接口的实现,而实际事实上现是调用的是编解码的相关API来处理:

OMX_ERRORTYPE aw_omx_component_get_parameter(OMX_IN OMX_HANDLETYPE     hComp,
OMX_IN OMX_INDEXTYPE paramIndex,
OMX_INOUT OMX_PTR paramData)
{
OMX_ERRORTYPE eRet = OMX_ErrorBadParameter;
aw_omx_component *pThis = (hComp)? (aw_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
DEBUG_PRINT("OMXCORE: aw_omx_component_get_parameter %x, %x , %d\n",(unsigned)hComp,(unsigned)paramData,paramIndex); if(pThis)
{
eRet = pThis->get_parameter(hComp,paramIndex,paramData);
} return eRet;
}

这里的pThis技术当前最底层的解码器组件的控制入口。即所谓的aw_omx_component的派生类对象。

这样也就是说明了我们自己要构建的编解码须要实aw_omx_component的相关接口函数,能够看到这里我们最底层的解码器组件就是对这些函数的实现,加快了自己定义一个新的组件类型,下面是几个接口的定义和实现:

OMX_ERRORTYPE  omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE hComp, OMX_IN OMX_INDEXTYPE paramIndex,  OMX_IN OMX_PTR paramData)
OMX_ERRORTYPE  omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE hComp,
OMX_IN OMX_INDEXTYPE paramIndex,
OMX_INOUT OMX_PTR paramData)

到这里我们基本走通了从OMXCodec到对最底层的编解码器组件的控制,层次分明。接口规范带给我们的是高速开发,我们须要做的核心是在自己的编解码器组件中实现相关的业务,而这和自身的硬件平台具有紧密性。

4.总结新建一个属于stagefright下OMX的编解码组件须要做的事情

我们所要做的核心工作就在libOmxCore.so和libOmxVdec.so这两个库文件的设计。

但都须要符合OMX的协议就可以。


分析了那么多的控制流,也已经有了所谓的OMXCodec,那么兴许主要内容将是数据流的处理。

Android4.2.2下Stagefright下OMX编解码器组件的控制流的更多相关文章

  1. Android4.2.2的Stagefright维护编解码器的数据流

    这里是他们自己的源代码阅读点滴总结属性,转请注明出处,谢谢. 欢迎和大家分享.qq:1037701636 email:gzzaigcn2012@gmail.com Android源代码版本号Versi ...

  2. Tomcat下conf下server.xml的文件配置信息

    Tomcat下conf下server.xml的文件配置信息,基本上不用做任何修改就可以使用,修改的地方就是host区域的一些配置,此文件设置端口为80. 注意:Tomcat配置文件中(即server. ...

  3. 使用linq获得当前文件夹下的下一级满足条件的文件夹

    使用linq获得当前文件夹下的下一级满足条件的文件夹.             SPFolderCollection subAlbums = Folder.SubFolders;            ...

  4. 为Ext添加下拉框和日期组件

    Ext.onReady(function(){ var config = { fields:['module'], data:[['新建'],['删除'],['增加']}; var store = n ...

  5. 本文讲述下windows下使用rsync备份数据

    本文讲述下windows下使用rsync备份数据 需要使用的软件如下: 环境需求: 上海monitor上跑有定时任务计划备份线上数据库,现在需要把上海monitor上的备份数据拉回到179.12数据回 ...

  6. 最近玩了下linux下的lampp注意一些使用

    最近玩了下linux下的lampp注意一些使用 1 配置文件 /opt/lampp/etc 2 一些命令 mysql命令 /opt/lampp/bin/mysql php命令 /opt/lampp/b ...

  7. 使用position:relative制作下边框下的小三角

    在制作tab选项卡的时候,有时会有下边框,且下边框下另一个头向下的小三角,这全然能够用css来实现,而不必使用背景图片. 由于使用背景图片时会有一个问题,选项卡内容字数不同.导致使用背景图片时无法控制 ...

  8. VS2010在WIN7下安装报错“下列组件安装失败”如何解决

    VS2010在WIN7下安装报错“下列组件安装失败”如何解决 http://www.111cn.net/net/42/75914.htm

  9. Linux下ffmpeg的各种编解码器的安装

    首先要安装各种解码器 1.lame  tar -zxvf lame- cd lame- ./configure --enable-shared make make install 2.libogg  ...

随机推荐

  1. MVC、RPC、SOA、微服务架构之间的区别

    MVC.RPC.SOA.微服务架构之间的区别 一.MVC架构 其实MVC架构就是一个单体架构. 代表技术:Struts2.springMVC.Spring.Mybatis 等等. 二.RPC架构 RP ...

  2. document.documentElement与body下clientHeight,scrollHeight等区别

    本次说明仅在chrom环境下,ie等其他浏览器可能不同 1获取显示屏高度(pc和移动端,屏幕分辨率px) window.screen.height => 这个好理解,不多说. 2获取浏览器可视窗 ...

  3. jquery获得url的get参数

    只是用了第一种方法,简单好用直接传入想要获取的参数名,即可返回参数值 function GetQueryString(name) {      var reg = new RegExp("( ...

  4. 数人云CTO解读Docker 1.12和金融业容器化

    7月29日 数人云 在上海举办金融沙龙,邀请上交所和近二十家来自银行.保险.证券的IT技术专家一同探讨容器技术在金融业中的最佳实践.数人云CTO肖德时在会上将传统金融行业通过容器可以解决的四大问题做了 ...

  5. 可编辑div,将光标定位到文本之后

    类似qq回复一样,某人评论之后,在对评论进行回复之后,将光标定位到文本之后: function set_focus() { el=document.getElementById('guestbook_ ...

  6. ASP.NET-Microsoft.Management.Infrastructure错误

    错误如图所示,将MVC发布到IIS上就会出现这个错误,我用到了NPOI这个EXCEL插件,不知道是不是这个造成的,但是实在找不到解决方案,就直接将BIN目录下的这个Microsoft.Manageme ...

  7. 洛谷 P2071 座位安排 seat.cpp/c/pas

    P2071 座位安排 seat.cpp/c/pas 题目背景 公元二零一四年四月十七日,小明参加了省赛,在一路上,他遇到了许多问题,请你帮他解决. 题目描述 已知车上有N排座位,有N*2个人参加省赛, ...

  8. Linux下基于多线程的echo

    准备开始写一些Linux 下网络编程以及多线程的blog,就从这个简单的echo程序开始吧. 在echo的服务端使用多线程与客户进行通信,可以实现一个服务端程序同时连接多个客户的功能.那么,到底在服务 ...

  9. Intellij IDEA插件 - Scroll From Source

    Intellij IDEA插件 - Scroll From Source 学习了:http://blog.csdn.net/luonanqin/article/details/41088171 可以自 ...

  10. [Hyperapp] Interact with the State Object through Hyperapp Action functions

    Hyperapp is an ultra lightweight (1kb), minimal, functional, JavaScript library for building UIs. It ...