component表的初始化
在AuthorDriver::authorThread线程的开始处,OMX mastercore的OMX_MasterInit被调用。最重要的工作在_OMX_MasterInit中完成:
_OMX_MasterInit, codecs_v2/omx/omx_mastercore/src/pv_omxmastercore.cpp
1. 从/system/etc/中找cfg文件
2. 对于一个cfg文件,找到所有包含的动态链接库
3. 对于每一个动态链接库,查询其接口interface
4. 对于每一个接口,呼叫OMX_Init
5. 对于每一个支持的动态库,获取所有的component
6. 打印出所有支持的component名(这就是启动录制时logcat的打印)
比如,对于/system/etc/pvplayer.cfg,其内容如下:
$ cat pvplayer.cfg
(0x1d4769f0,0xca0c,0x11dc,0x95,0xff,0x08,0x00,0x20,0x0c,0x9a,0x66),"libopencore_rtspreg.so"
(0x1d4769f0,0xca0c,0x11dc,0x95,0xff,0x08,0x00,0x20,0x0c,0x9a,0x66),"libopencore_downloadreg.so"
(0x1d4769f0,0xca0c,0x11dc,0x95,0xff,0x08,0x00,0x20,0x0c,0x9a,0x66),"libopencore_mp4localreg.so"
(0x6d3413a0,0xca0c,0x11dc,0x95,0xff,0x08,0x00,0x20,0x0c,0x9a,0x66),"libopencore_mp4localreg.so"
(0xa054369c,0x22c5,0x412e,0x19,0x17,0x87,0x4c,0x1a,0x19,0xd4,0x5f),"libomx_sharedlibrary.so"
opencore内置的动态库,如libomx_sharedlibrary,由静态库libpv_omx_interface, libomx_common_lib等生成。
libpv_omx_interface提供对外接口PVGetInterface,并在该接口中完成PVOMXInterface(继承了OMXInterface)对象的初始化。PVOMXInterface构造函数中,会给pOMX_Init、pOMX_GetHandle等成员赋值,指向libomx_common_lib提供的函数。
libomx_common_lib实现了OMX_Init和OMX_GetHandle等接口。在omx_mastercore掉该interface的OMX_Init时,libomx_common_lib会完成所有内置component的注册。每一个component都会指定名字,role和需要加载的动态库:
pCRT->ComponentName = (OMX_STRING)"OMX.PV.h263dec";
pCRT->RoleString[0] = (OMX_STRING)"video_decoder.h263";
pCRT->SharedLibraryName = (OMX_STRING)"libomx_m4vdec_sharedlibrary.so";
就这样,OMX mastercore利用component将每一种编解码组织起来了。
component的使用
VideoCamera在初始化时,在Prepare前,会设置audio和video encoder,会触发调用:
PVAuthorEngine::DoAddMediaTrack(), engines/author/src/pvauthorengine.cpp
PVMFNodeInterface* node = PVAuthorEngineNodeFactoryUtility::CreateEncoder(uuid);
PVAENodeContainer* encoderNodeContainer = AllocateNodeContainer(node);
iEncoderNodes.push_back(encoderNodeContainer);
这里用PVAuthorEngineNodeFactoryUtility::CreateEncoder创建的正是PVMFOMXEncNode节点。该节点被用来创建一个PVAENodeContainer,并将它push到iEncoderNodes链表中。
AuthorDriver会跟PVAuthorEngine打交道。在MediaRecorder初始化时,AuthorDriver的Prepare会进入PVAuthorEngine的Init:
PVAuthorEngine::DoInit()
iNodeUtil.Prepare(iComposerNodes);
iNodeUtil.Prepare(iEncoderNodes);
iNodeUtil.Prepare(iDataSourceNodes);
这里就进入了每一个encoder node的prepare处理。
PVMFOMXEncNode::DoPrepare, nodes/pvomxencnode/src/pvmf_omx_enc_node.cpp
err = OMX_MasterGetHandle()
这里会根据role、name、iOutFormat等条件在component表中找到对应的OMX Component handle,即iOMXEncoder。后面对该component的配置都通过该handle来完成。