stagefright 的OpenMax

Stagefright的編解碼功能是利用OpenMAX框架,而且用的還是OpenCORE之OMX的實作,我們 來看一下Stagefright和OMX是如何運作的。

(1) OMX_Init

OMXClient mClient;

AwesomePlayer::AwesomePlayer()
{
  mClient.connect();
}

status_t OMXClient::connect()
{
  mOMX = service->getOMX();
}

sp<IOMX> MediaPlayerService::getOMX()
{
  mOMX = new OMX;
}

OMX::OMX() : mMaster(new OMXMaster)

OMXMaster::OMXMaster()
{
  addPlugin(new OMXPVCodecsPlugin);
}

OMXPVCodecsPlugin::OMXPVCodecsPlugin()
{
  OMX_MasterInit();
}

OMX_ERRORTYPE OMX_MasterInit() <-- under OpenCORE
{
  return OMX_Init();
}


(2) OMX_SendCommand

OMXCodec::function_name()
{
  mOMX->sendCommand(mNode, OMX_CommandStateSet, OMX_StateIdle);
}

status_t OMX::sendCommand(node, cmd, param)
{
  return findInstance(node)->sendCommand(cmd, param);
}

status_t OMXNodeInstance::sendCommand(cmd, param)
{
  OMX_SendCommand(mHandle, cmd, param, NULL);
}



(3) 其他作用在 OMX 元件的指令

其他 作用在OMX元件的指令也和OMX_SendCommand的call path一樣,請見下表:

OMXCodecOMXOMXNodeInstance
 useBufferuseBuffer (OMX_UseBuffer)
 getParametergetParameter (OMX_GetParameter)
 fillBufferfillBuffer (OMX_FillThisBuffer)
 emptyBufferemptyBuffer (OMX_EmptyThisBuffer)

 






 

在  android 4.0.3  SF和Openmax关系

   awesomplayer.cpp 中 awesomeplay有一个成员 OMXClient mClient;
   这个mClient是通过MediaPlayerService的getOmx()方法创建(new OMX),代码如下
sp<IOMX> MediaPlayerService::getOMX() {
    Mutex::Autolock autoLock(mLock);

    if (mOMX.get() == NULL) {
        mOMX = new OMX;
    }

    return mOMX;
}  
可以跟综OMX.cpp这个文件,查看创建过程 
OMX::OMX()
    : mMaster(new OMXMaster),
      mNodeCounter(0) {
}
mNodeCounter:omxnode 计数器,在OmxCodec.cpp中返回nodeid
mMaster 这个对象是omx核心 可以理解为服务器端,之后在Omxcodec.cpp中create时传入的mOmx是mclient,它的所有调用都会通过IOMX.cpp转到Omx.cpp中。
下面我们来重点分析一下 OMXMaster
OMXMaster::OMXMaster()
    : mVendorLibHandle(NULL) {
    addVendorPlugin();
    addPlugin(new SoftOMXPlugin);
}
通过addPlugin添加openmax外挂的插件,可以拿 addPlugin(new SoftOMXPlugin)为例,在SoftOMXPlugin插件中包含了支持的所有解码器组件,在我们的系统中支持的解码组件如下:

static const struct {
    const char *mName;
    const char *mLibNameSuffix;
    const char *mRole;

} kComponents[] = {
    { "OMX.google.aac.decoder", "aacdec", "audio_decoder.aac" },
    { "OMX.google.amrnb.decoder", "amrdec", "audio_decoder.amrnb" },
    { "OMX.google.amrwb.decoder", "amrdec", "audio_decoder.amrwb" },
    { "OMX.google.h264.decoder", "h264dec", "video_decoder.avc" },
    { "OMX.google.g711.alaw.decoder", "g711dec", "audio_decoder.g711alaw" },
    { "OMX.google.g711.mlaw.decoder", "g711dec", "audio_decoder.g711mlaw" },
    { "OMX.google.h263.decoder", "mpeg4dec", "video_decoder.h263" },
    { "OMX.google.mpeg4.decoder", "mpeg4dec", "video_decoder.mpeg4" },
    { "OMX.google.mp3.decoder", "mp3dec", "audio_decoder.mp3" },
    { "OMX.google.vorbis.decoder", "vorbisdec", "audio_decoder.vorbis" },
    { "OMX.google.vpx.decoder", "vpxdec", "video_decoder.vpx" },
};
addPlugin(softomxplugin)时,会把调用SoftOmXPlugin的enumerateComponents,依次把上面这些组件添加到OMXMaster 的mPluginByComponentName中。
在omxcodec.cpp中创建组件时:
 status_t err = omx->allocateNode(componentName, observer, &node);
会依次根据componentName,通过iomx.cpp(ibinder)->omx.cpp->OMXMaster.cpp中的makeComponentInstance
 OMXMaster的makeComponentInstance会根据componentName名字查找到具体插件,比如componentName是OMX.google.vorbis.decoder,则会找到SoftOMXPlugin插件(vorbis这个组件包含在SoftOMXPlugin插件中,从上数据可以看出来),然后要据componentname调用插件SoftOMXPlugin->makeComponentInstance的方法,生成真正的组件(对应的解码器)。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值