zoukankan      html  css  js  c++  java
  • 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来完成。

  • 相关阅读:
    2019icpc上海站 打星体验,首次感想 D K代码
    P1983 车站分级 思维+拓扑排序
    POJ 2352 Stars Treap & 线段树
    POJ 2761 Feed the dogs 基础Treap
    POJ 1442 Black Box 基础Treap
    CodeForces R285 Div2
    HDU 5145 NPY and girls 莫队算法
    2014 上海赛区小结
    2014 牡丹江赛区总结
    HDU 5125 Magic Ball DP+树状数组
  • 原文地址:https://www.cnblogs.com/eustoma/p/2415848.html
Copyright © 2011-2022 走看看