提交數(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