Stagefright的編解碼功能是利用OpenMAX框架,而且用的還是OpenCORE之OMX的實作,我們 來看一下Stagefright和OMX是如何運作的。
(1) OMX_Init
OMXClient mClient;
AwesomePlayer::AwesomePlayer()
{
}
status_t OMXClient::connect()
{
}
sp<IOMX> MediaPlayerService::getOMX()
{
}
OMX::OMX() : mMaster(new OMXMaster)
OMXMaster::OMXMaster()
{
}
OMXPVCodecsPlugin::OMXPVCodecsPlugin()
{
}
OMX_ERRORTYPE OMX_MasterInit()
{
}
(2) OMX_SendCommand
OMXCodec::function_name()
{
}
status_t OMX::sendCommand(node, cmd, param)
{
}
status_t OMXNodeInstance::sendCommand(cmd, param)
{
}
(3)
其他 作用在OMX元件的指令也和OMX_SendCommand的call path一樣,請見下表:
OMXCodec | OMX | OMXNodeInstance |
| useBuffer | useBuffer (OMX_UseBuffer) |
| getParameter | getParameter (OMX_GetParameter) |
| fillBuffer | fillBuffer (OMX_FillThisBuffer) |
| emptyBuffer | emptyBuffer (OMX_EmptyThisBuffer) |
在 android 4.0.3
sp<IOMX> MediaPlayerService::getOMX() {
}
可以跟综OMX.cpp这个文件,查看创建过程
OMX::OMX()
}
mNodeCounter:omxnode 计数器,在OmxCodec.cpp中返回nodeid
mMaster 这个对象是omx核心 可以理解为服务器端,之后在Omxcodec.cpp中create时传入的mOmx是mclient,它的所有调用都会通过IOMX.cpp转到Omx.cpp中。
下面我们来重点分析一下 OMXMaster
OMXMaster::OMXMaster()
}
通过addPlugin添加openmax外挂的插件,可以拿 addPlugin(new SoftOMXPlugin)为例,在SoftOMXPlugin插件中包含了支持的所有解码器组件,在我们的系统中支持的解码组件如下:
static const struct {
} kComponents[] = {
};
addPlugin(softomxplugin)时,会把调用SoftOmXPlugin的enumerateComponents,依次把上面这些组件添加到OMXMaster 的mPluginByComponentName中。
在omxcodec.cpp中创建组件时:
会依次根据componentName,通过iomx.cpp(ibinder)->omx.cpp->OMXMaster.cpp中的makeComponentInstance