OmxComponentFactoryDynamicCreate()函数的上一层是FunctionPtrCreateComponent()函数,用于创建对应格式的编解码组件。
参数:OMX_OUT OMX_HANDLETYPE* pHandle,作为输出参数,指向创建的组件handle。
OMX_IN OMX_PTR pAppData, OMX_IN OMX_PTR pProxy, OMX_STRING aOmxLibName,指向组件的so库名。
OMX_PTR &aOmxLib,指向so库的指针。
OMX_PTR aOsclUuid, 指向库的UUID
OMX_U32 &aRefCount,成功加载so库,会将此参数加1.
返回:为OMX_ERRORTYPE类型,成功无错 ,失败有错。
流程:
1)判断参数aOmxLib是否空,若为空说明为第一次调用此函数,根据so库的名字创建一个OsclSharedLibrary,用lib保存;
若不为空,则直接将其值传递给lib。
2)调用lib->LoadLib(),实际为OsclSharedLibrary::LoadLib()
OSCL_EXPORT_REF OsclLibStatus OsclSharedLibrary::LoadLib()
{
return LoadLib (iLibPath);//根据路径加载库文件。
}
3)若加载成功,将aRefCount加1,调用lib->QueryInterface(PV_OMX_SHARED_INTERFACE , (OsclAny*&)interfacePtr)
返回指针interfacePtr是指向具体格式组件共享库的接口类的。如MP3格式会指向类Mp3OmxSharedLibraryInterface。
将指针interfacePtr强制类型转换为OmxSharedLibraryInterface,用omxIntPtr保存。
4)调用omxIntPtr->QueryOmxComponentInterface(*temp(UUID), PV_OMX_CREATE_INTERFACE),进入具体格式共享库的接口类,
以MP3为例,QueryOmxComponentInterface的定义如下:
OsclAny *QueryOmxComponentInterface(const OsclUuid& aOmxTypeId, const OsclUuid& aInterfaceId)
{
if (PV_OMX_MP3DEC_UUID == aOmxTypeId)
{
if (PV_OMX_CREATE_INTERFACE == aInterfaceId)
{
return ((OsclAny*)(&Mp3OmxComponentFactory ));
}
else if (PV_OMX_DESTROY_INTERFACE == aInterfaceId)
{
return ((OsclAny*)(&Mp3OmxComponentDestructor));
}
}
return NULL;
};
可以看出根据参数,最终返回指向组件工厂函数的指针。
5)调用上面返回的组件工厂函数,创建具体格式的组件。
(*createComp)(pHandle,作为 输出参数,类型是OMX_HANDLETYPE,如果要移植新的组件,此处应要保持一致。
pAppData, pProxy, aOmxLibName, aOmxLib, aOsclUuid, aRefCount)
6)将lib传递给aOmxLib。
7)无错返回。