android OMX相關(guān)4:編碼輸入線程和輸出線程

提交數(shù)據(jù):

GraphicBufferSource: submitBuffer_l 
-> mOMXNode->emptyBuffer (這里經(jīng)過一系列的封裝才能到OMXNodeInstance,不用深究)
    -> OMXNodeInstance::emptyBuffer // 此處有個(gè)bufferType不明確  ???
    -> Rockchip_OMX_EmptyThisBuffer  : Rockchip_OMX_Baseport.c
    -> 存入inputBufferQueue // pRockchipPort = &pRockchipComponent->pRockchipPort[INPUT_PORT_INDEX];
    -> 構(gòu)建一個(gè)消息 message = Rockchip_OSAL_Malloc(sizeof(ROCKCHIP_OMX_MESSAGE)); 
        message->messageType = ROCKCHIP_OMX_CommandEmptyBuffer;
        message->messageParam = (OMX_U32) i;
        message->pCmdData = (OMX_PTR)pBuffer;
    -> 把消息加入隊(duì)列  Rockchip_OSAL_Queue(&pRockchipPort->bufferQ, (void *)message);  // 此處的bufferQ對(duì)應(yīng)的InputBufferProcess
->>>> Rockchip_OMX_EmptyThisBuffer end
-> GraphicBufferSource: emptyGraphicBuffer succeeded
-> GraphicBufferSource: buffer submitted
-> OMXNodeInstance: onMessages

輸入線程:


Rkvpu_OMX_Venc.c: Rkvpu_OMX_InputProcessThread
循環(huán)
Rkvpu_InputBufferGetQueue : Rkvpu_OMX_VencControl.c
    ->Rockchip_OSAL_SemaphoreWait
->>>Rkvpu_InputBufferGetQueue end
-> Rkvpu_SendInputData
    //僅新建編碼器時(shí)執(zhí)行 begin
    -> Rockchip_OSAL_GetInfoFromMetaData : Rockchip_OSAL_Android.cpp
    -> Rockchip_OSAL_GetANBColorFormat
        -> Rockchip_get_gralloc_private : gralloc_priv_omx.cpp
            得到 priv_hnd.format: 0x1
    -> Rockchip_OSAL_Hal2OMXPixelFormat : Rockchip_OSAL_Android.cpp
        得到 ColorFormat: 0x10 這個(gè)format表示: OMX_COLOR_Format32bitARGB8888
    -> Rockchip_OSAL_OMX2HalPixelFormat(omx_format)
        通過上一步得到的ColorFormat灵妨,得到 halfFormat = HAL_PIXEL_FORMAT_RGBA_8888
    -> 設(shè)置p_vpu_ctx 中 rc_mode = 1搂鲫,設(shè)置 encType為 VPU_H264ENC_RGB888
        p_vpu_ctx->control(p_vpu_ctx, VPU_API_ENC_GETCFG, (void*)&vpug);
        vpug.rc_mode = 1;
        p_vpu_ctx->control(p_vpu_ctx, VPU_API_ENC_SETCFG, (void*)&vpug);
        H264EncPictureType encType = VPU_H264ENC_RGB888;
        p_vpu_ctx->control(p_vpu_ctx, VPU_API_ENC_SETFORMAT, (void *)&encType);
    //--- 僅新建編碼器時(shí)執(zhí)行 end    
    -> Rkvpu_ProcessStoreMetaData
        -> Rockchip_OSAL_GetInfoRkWfdMetaData
        -> Rockchip_OSAL_GetInfoFromMetaData
        -> Rockchip_OSAL_GetANBColorFormat 得到 omx_format
        -> Rockchip_OSAL_OMX2HalPixelFormat(omx_format) 得到 pVideoEnc->bPixel_format
        -> 打開GPU節(jié)點(diǎn)測(cè)試麸粮,如果存在則 pVideoEnc->bRgb2yuvFlag = OMX_TRUE;
            gpu_fd = open("/dev/pvrsrvkm", O_RDWR, 0);  //這里打開節(jié)點(diǎn)接著關(guān)閉了氢卡,是測(cè)試是否可用的意思喷鸽,并設(shè)置pVideoEnc->bRgb2yuvFlag蛉谜,實(shí)際用的地方懷疑在libvpu.so中
            close(gpu_fd);
        -> Rockchip_OSAL_getANBHandle
        -> rga_rgb2nv12 : Rockchip_OSAL_RGA_Process.c
            -> rga_convert
            -> VPUMemClean : vpu_mem.c
                ioctl(vpm_vpu.fd, VPU_MEM_CACHE_CLEAN, &p->offset);
        ->>> rga_rgb2nv12 end  大約耗時(shí) 4ms
    ->>>   Rkvpu_ProcessStoreMetaData end  
    -> p_vpu_ctx->encoder_sendframe(p_vpu_ctx, &aInput);
    -> Rkvpu_InputBufferReturn
        -> Rkvpu_OMX_InputBufferReturn
            -> pRockchipComponent->pCallbacks->EmptyBufferDone(pOMXComponent, pRockchipComponent->callbackData, bufferHeader);
                -> OMXNodeInstance::OnEmptyBufferDone
                    -> 構(gòu)建message, type 為 omx_message::EMPTY_BUFFER_DONE晚树,發(fā)送到消息處理線程去處理
                        -> bufferSource->onInputBufferEmptied
                            -> GraphicBufferSource::onInputBufferEmptied
                ->>>>> OMXNodeInstance::OnEmptyBufferDone end
        ->>>> Rkvpu_OMX_InputBufferReturn end  

輸出線程:

 
output線程:
Rkvpu_OMX_Venc.c: Rkvpu_OMX_OutputProcessThread
-> Rkvpu_OMX_OutputBufferProcess 消息處理循環(huán)
    -> Rkvpu_OutputBufferGetQueue(ROCKCHIP_OMX_BASECOMPONENT *pRockchipComponent)
        -> Rockchip_OSAL_Dequeue(&pRockchipPort->bufferQ)  //從bufferQ中取出一個(gè)消息
            emptyBuffer流程中queue的消息就是在這里被dequeue的
        -> 將dequeue出的msg中的數(shù)據(jù)姻采,存入Rkvpu_OutputBufferGetQueue的參數(shù)中返回
    ->>>> Rkvpu_OutputBufferGetQueue end
-> Rkvpu_Post_OutputStream(OMX_COMPONENTTYPE *pOMXComponent)    
    -> p_vpu_ctx = pVideoEnc->vpu_ctx
    -> p_vpu_ctx->encoder_getstream(p_vpu_ctx, &pOutput) 
        該函數(shù)懷疑存在于 libvpu.so 中
    -> Rkvpu_OutputBufferReturn(pOMXComponent, outputUseBuffer); // Rkvpu_OMX_VencControl.c
        -> Rockchip_OMX_OutputBufferReturn(pOMXComponent, bufferHeader) //Rockchip_OMX_Baseport.c
            -> pRockchipComponent->pCallbacks->FillBufferDone(pOMXComponent, pRockchipComponent->callbackData, bufferHeader);
                    ->OMXNodeInstance::OnFillBufferDone

?著作權(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)離奇詭異,居然都是意外死亡愚铡,警方通過查閱死者的電腦和手機(jī)蛉签,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沥寥,“玉大人碍舍,你說我怎么就攤上這事∫匮牛” “怎么了片橡?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長淮野。 經(jīng)常有香客問我锻全,道長狂塘,這世上最難降的妖魔是什么录煤? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任鳄厌,我火速辦了婚禮,結(jié)果婚禮上妈踊,老公的妹妹穿的比我還像新娘了嚎。我一直安慰自己,他們只是感情好廊营,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布歪泳。 她就那樣靜靜地躺著,像睡著了一般露筒。 火紅的嫁衣襯著肌膚如雪呐伞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天慎式,我揣著相機(jī)與錄音伶氢,去河邊找鬼。 笑死瘪吏,一個(gè)胖子當(dāng)著我的面吹牛癣防,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播掌眠,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼蕾盯,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了蓝丙?” 一聲冷哼從身側(cè)響起级遭,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎渺尘,沒想到半個(gè)月后挫鸽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沧烈,尸身上長有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
  • 文/蒙蒙 一搏屑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧粉楚,春花似錦辣恋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至燃异,卻和暖如春携狭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背回俐。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來泰國打工逛腿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鲫剿。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓鳄逾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親灵莲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子雕凹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

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