component表

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来完成。

原文地址:https://www.cnblogs.com/eustoma/p/2415848.html