OmxComponentFactoryDynamicCreate()函数的实现

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)无错返回。

你可能感兴趣的:(String,null,interface)