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