android OMX相關(guān)2: allocateNode流程詳解

轉(zhuǎn)載請(qǐng)注明:http://www.reibang.com/p/0cb16c896c36

以RK3399為例

相關(guān)數(shù)據(jù)結(jié)構(gòu):


中心主題.png

OMX::allocateNode -> new OMXNodeInstance
-> OMXMaster::makeComponentInstance -> 從名稱(chēng)插件map中查到名字對(duì)應(yīng)的插件 OMXPluginBase *plugin = mPluginByComponentName.valueAt(index) -> plugin->makeComponentInstance
-> RKOMXPlugin::makeComponentInstance  如果用到了插件libstagefrighthw.so
    ->對(duì)Vector<RKOMXCore*> mCores循環(huán)  mCores存著編碼器和解碼器各一
    -> 調(diào)用core->mGetHandle句柄
    -> Rockchip_OMX_Core: RKOMX_GetHandle(pHandle, cComponentName, pAppData, pCallBacks)
        創(chuàng)建ROCKCHIP_OMX_COMPONENT *loadComponent 對(duì)象, 
        loadComponent->libName = "libomxvpu_enc.so", loadComponent->componentName = "rk.omx_enc"
    -> Rockchip_OMX_Component_Register: Rockchip_OMX_ComponentLoad(loadComponent)
    -> dlopen(libomxvpu_enc.so) -> dlsym("Rockchip_OMX_ComponentConstructor")  對(duì)應(yīng)代碼位于hardware_rockchip\omx_il\component\video\enc
        -> Rkvpu_OMX_Venc: Rockchip_OMX_ComponentConstructor
            -> Rockchip_OMX_Basecomponent: Rockchip_OMX_BaseComponent_Constructor(OMX_HANDLETYPE hComponent)
                ->構(gòu)建變量ROCKCHIP_OMX_BASECOMPONENT *pRockchipComponent,  pOMXComponent->pComponentPrivate=pRockchipComponent
                ->創(chuàng)建互斥量:Rockchip_OSAL_SemaphoreCreate(&pRockchipComponent->msgSemaphoreHandle),
                    Rockchip_OSAL_MutexCreate(&pRockchipComponent->compMutex),
                    Rockchip_OSAL_SignalCreate(&pRockchipComponent->abendStateEvent)
                ->Rockchip_OSAL_QueueCreate(&pRockchipComponent->messageQ, MAX_QUEUE_ELEMENTS);創(chuàng)建消息隊(duì)列
                -> Rockchip_OSAL_ThreadCreate(&pRockchipComponent->hMessageHandler, Rockchip_OMX_MessageHandlerThread, pOMXComponent);  創(chuàng)建消息處理線(xiàn)程Rockchip_OMX_MessageHandlerThread
                -> 設(shè)置幾個(gè)函數(shù)指針
                        pOMXComponent->GetComponentVersion = &Rockchip_OMX_GetComponentVersion;
                        pOMXComponent->SendCommand         = &Rockchip_OMX_SendCommand;   //用于給消息隊(duì)列發(fā)送指令
                        pOMXComponent->GetState            = &Rockchip_OMX_GetState;
                        pOMXComponent->SetCallbacks        = &Rockchip_OMX_SetCallbacks;
                        pOMXComponent->UseEGLImage         = &Rockchip_OMX_UseEGLImage;
            ->>>>>>Rockchip_OMX_Basecomponent: Rockchip_OMX_BaseComponent_Constructor end            
            ->Rockchip_OMX_Baseport: Rockchip_OMX_Port_Constructor(pOMXComponent)
                -> pRockchipComponent = (ROCKCHIP_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate
                -> 設(shè)置版本號(hào)恢着,port數(shù)量為ALL_PORT_NUM = 2染乌, INPUT_PORT_INDEX = 1
                    INIT_SET_SIZE_VERSION(&pRockchipComponent->portParam, OMX_PORT_PARAM_TYPE);
                    pRockchipComponent->portParam.nPorts = ALL_PORT_NUM;
                    pRockchipComponent->portParam.nStartPortNumber = INPUT_PORT_INDEX;
                    pRockchipPort = Rockchip_OSAL_Malloc(sizeof(ROCKCHIP_OMX_BASEPORT) * ALL_PORT_NUM);
                ->  構(gòu)建input port: pRockchipInputPort
                    pRockchipComponent->pRockchipPort = pRockchipPort; 利用中間變量創(chuàng)建兩個(gè)隊(duì)列
                    pRockchipInputPort = &pRockchipPort[INPUT_PORT_INDEX];
                    Rockchip_OSAL_QueueCreate(&pRockchipInputPort->bufferQ, MAX_QUEUE_ELEMENTS);
                    Rockchip_OSAL_QueueCreate(&pRockchipInputPort->securebufferQ, MAX_QUEUE_ELEMENTS);
                    pRockchipInputPort->extendBufferHeader = Rockchip_OSAL_Malloc(sizeof(ROCKCHIP_OMX_BUFFERHEADERTYPE) * MAX_BUFFER_NUM);
                    ...
                ->  構(gòu)建output buffer : pRockchipOutputPort
                -> 給返回參數(shù)設(shè)置函數(shù)指針
                    pOMXComponent->EmptyThisBuffer = &Rockchip_OMX_EmptyThisBuffer;
                    pOMXComponent->FillThisBuffer  = &Rockchip_OMX_FillThisBuffer;
            ->>>>>>  Rockchip_OMX_Baseport: Rockchip_OMX_Port_Constructor end
            ->構(gòu)建對(duì)象 RKVPU_OMX_VIDEOENC_COMPONENT *pVideoEnc
                ->pVideoEnc->hSharedMemory 這個(gè)字段存著"/dev/ion" 這個(gè)文件的句柄
            ->設(shè)置 pRockchipComponent 的各種版本信息
                pRockchipComponent->hComponentHandle = pVideoEnc(把上一步的共享內(nèi)存句柄賦值到這里)
                pRockchipComponent->bMultiThreadProcess = OMX_TRUE;
                pRockchipComponent->codecType = HW_VIDEO_ENC_CODEC;
            -> 設(shè)置pVideoEnc的信息
                pVideoEnc->bFirstFrame = OMX_TRUE;
                pVideoEnc->bFirstInput = OMX_TRUE;
                pVideoEnc->bFirstOutput = OMX_TRUE;
                pVideoEnc->configChange = OMX_FALSE;
                pVideoEnc->bStoreMetaData = OMX_FALSE;
                pVideoEnc->bPrependSpsPpsToIdr = OMX_FALSE;
                pVideoEnc->bRkWFD = OMX_FALSE;
                pVideoEnc->quantization.nQpI = 4; // I frame quantization parameter
                pVideoEnc->quantization.nQpP = 5; // P frame quantization parameter
                pVideoEnc->quantization.nQpB = 5; // B frame quantization parameter
                //add by xlm for use mpp or vpuapi
                pVideoEnc->bIsUseMpp = OMX_FALSE;
                pVideoEnc->bIsNewVpu = OMX_TRUE;        
            -> 初始化input port: pRockchipComponent->pRockchipPort[INPUT_PORT_INDEX]
                一堆賦值操作
            -> 初始化output port: pRockchipComponent->pRockchipPort[OUTPUT_PORT_INDEX]
                一堆賦值操作
            -> pOMXComponent 設(shè)置一堆函數(shù)指針
                pOMXComponent->UseBuffer              = &Rkvpu_OMX_UseBuffer;
                pOMXComponent->AllocateBuffer         = &Rkvpu_OMX_AllocateBuffer;
                pOMXComponent->FreeBuffer             = &Rkvpu_OMX_FreeBuffer;
                pOMXComponent->ComponentTunnelRequest = &Rkvpu_OMX_ComponentTunnelRequest;
                pOMXComponent->GetParameter           = &Rkvpu_OMX_GetParameter;
                pOMXComponent->SetParameter           = &Rkvpu_OMX_SetParameter;
                pOMXComponent->GetConfig              = &Rkvpu_OMX_GetConfig;
                pOMXComponent->SetConfig              = &Rkvpu_OMX_SetConfig;
                pOMXComponent->GetExtensionIndex      = &Rkvpu_OMX_GetExtensionIndex;
                pOMXComponent->ComponentRoleEnum      = &Rkvpu_OMX_ComponentRoleEnum;
                pOMXComponent->ComponentDeInit        = &Rockchip_OMX_ComponentDeInit;
            -> pRockchipComponent設(shè)置一堆函數(shù)指針
                pRockchipComponent->rockchip_codec_componentInit      = &Rkvpu_Enc_ComponentInit;
                pRockchipComponent->rockchip_codec_componentTerminate = &Rkvpu_Enc_Terminate;
                pRockchipComponent->rockchip_AllocateTunnelBuffer = &Rkvpu_OMX_AllocateTunnelBuffer;
                pRockchipComponent->rockchip_FreeTunnelBuffer     = &Rkvpu_OMX_FreeTunnelBuffer;
                pRockchipComponent->rockchip_BufferProcessCreate    = &Rkvpu_OMX_BufferProcess_Create;  //注意這個(gè)函數(shù)指針,會(huì)啟動(dòng)兩個(gè)線(xiàn)程
                pRockchipComponent->rockchip_BufferProcessTerminate = &Rkvpu_OMX_BufferProcess_Terminate;
                pRockchipComponent->rockchip_BufferFlush          = &Rkvpu_OMX_BufferFlush;
            -> 為pVideoEnc中的AVCComponent數(shù)組設(shè)置參數(shù),????這里比較可疑,沒(méi)有生效
                INIT_SET_SIZE_VERSION(&pVideoEnc->AVCComponent[i], OMX_VIDEO_PARAM_AVCTYPE);
                pVideoEnc->AVCComponent[i].nPortIndex = i;
                pVideoEnc->AVCComponent[i].eProfile   = OMX_VIDEO_AVCProfileBaseline;
                pVideoEnc->AVCComponent[i].eLevel     = OMX_VIDEO_AVCLevel31;
                pVideoEnc->AVCComponent[i].nPFrames = 20;
                pVideoEnc->codecId = OMX_VIDEO_CodingAVC;
                pRockchipPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingAVC;
            ->設(shè)置狀態(tài)機(jī):     pRockchipComponent->currentState = OMX_StateLoaded;
            ->>>>>>Rkvpu_OMX_Venc: Rockchip_OMX_ComponentConstructor end
    ->>>>>>Rockchip_OMX_Component_Register: Rockchip_OMX_ComponentLoad(loadComponent)  end
        rockchip_component 就是調(diào)用者傳進(jìn)的參數(shù)loadComponent
        rockchip_component->libHandle = libHandle;
        rockchip_component->pOMXComponent = pOMXComponent;
        rockchip_component->rkversion = OMX_COMPILE_INFO;
    -> loadComponent->pOMXComponent->SetCallbacks(loadComponent->pOMXComponent, pCallBacks, pAppData)
        這里會(huì)設(shè)置一個(gè)回調(diào),回調(diào)函數(shù)是從OMX中創(chuàng)建的 OMXNodeInstance 對(duì)象的 kCallbacks
    ->>>>>> Rockchip_OMX_Core: RKOMX_GetHandle(pHandle, cComponentName, pAppData, pCallBacks)  end
        返回給調(diào)用者的 pHandle = loadComponent->pOMXComponent
    -> 構(gòu)建 RKOMXComponent comp
        comp.mComponent = *component //這里的component就是上一步RKOMX_GetHandle的參數(shù)pHandle
        comp.mCore = mCores[i];
    -> mComponents.push_back(comp); 把組件加入隊(duì)列
->>>> 循環(huán)結(jié)束
->>>> RKOMXPlugin::makeComponentInstance結(jié)束
-> instance->setHandle(handle) // instance是OMXNodeInstance對(duì)象绩卤,
    這里把上面創(chuàng)建的OMX_COMPONENTTYPE *handle給賦值到OMXNodeInstance:mHandle
->>>> OMX::allocateNode結(jié)束
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末途样,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子濒憋,更是在濱河造成了極大的恐慌娘纷,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跋炕,死亡現(xiàn)場(chǎng)離奇詭異赖晶,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)辐烂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)遏插,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人纠修,你說(shuō)我怎么就攤上這事胳嘲。” “怎么了扣草?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵了牛,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我辰妙,道長(zhǎng)鹰祸,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任密浑,我火速辦了婚禮蛙婴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘尔破。我一直安慰自己街图,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布懒构。 她就那樣靜靜地躺著餐济,像睡著了一般。 火紅的嫁衣襯著肌膚如雪胆剧。 梳的紋絲不亂的頭發(fā)上絮姆,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音赞赖,去河邊找鬼滚朵。 笑死,一個(gè)胖子當(dāng)著我的面吹牛前域,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播韵吨,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼匿垄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起椿疗,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤漏峰,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后届榄,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體浅乔,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年铝条,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了靖苇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡班缰,死狀恐怖贤壁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情埠忘,我是刑警寧澤脾拆,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站莹妒,受9級(jí)特大地震影響名船,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜旨怠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一包帚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧运吓,春花似錦渴邦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至倦青,卻和暖如春瓮床,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背产镐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工隘庄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人癣亚。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓丑掺,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親述雾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子街州,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容