android omx,android OMX相关4:编码输入线程和输出线程

提交数据:

GraphicBufferSource: submitBuffer_l

-> mOMXNode->emptyBuffer (这里经过一系列的封装才能到OMXNodeInstance,不用深究)

-> OMXNodeInstance::emptyBuffer // 此处有个bufferType不明确 ???

-> Rockchip_OMX_EmptyThisBuffer : Rockchip_OMX_Baseport.c

-> 存入inputBufferQueue // pRockchipPort = &pRockchipComponent->pRockchipPort[INPUT_PORT_INDEX];

-> 构建一个消息 message = Rockchip_OSAL_Malloc(sizeof(ROCKCHIP_OMX_MESSAGE));

message->messageType = ROCKCHIP_OMX_CommandEmptyBuffer;

message->messageParam = (OMX_U32) i;

message->pCmdData = (OMX_PTR)pBuffer;

-> 把消息加入队列 Rockchip_OSAL_Queue(&pRockchipPort->bufferQ, (void *)message); // 此处的bufferQ对应的InputBufferProcess

->>>> Rockchip_OMX_EmptyThisBuffer end

-> GraphicBufferSource: emptyGraphicBuffer succeeded

-> GraphicBufferSource: buffer submitted

-> OMXNodeInstance: onMessages

输入线程:

Rkvpu_OMX_Venc.c: Rkvpu_OMX_InputProcessThread

循环

Rkvpu_InputBufferGetQueue : Rkvpu_OMX_VencControl.c

->Rockchip_OSAL_SemaphoreWait

->>>Rkvpu_InputBufferGetQueue end

-> Rkvpu_SendInputData

//仅新建编码器时执行 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 这个format表示: OMX_COLOR_Format32bitARGB8888

-> Rockchip_OSAL_OMX2HalPixelFormat(omx_format)

通过上一步得到的ColorFormat,得到 halfFormat = HAL_PIXEL_FORMAT_RGBA_8888

-> 设置p_vpu_ctx 中 rc_mode = 1,设置 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);

//--- 仅新建编码器时执行 end

-> Rkvpu_ProcessStoreMetaData

-> Rockchip_OSAL_GetInfoRkWfdMetaData

-> Rockchip_OSAL_GetInfoFromMetaData

-> Rockchip_OSAL_GetANBColorFormat 得到 omx_format

-> Rockchip_OSAL_OMX2HalPixelFormat(omx_format) 得到 pVideoEnc->bPixel_format

-> 打开GPU节点测试,如果存在则 pVideoEnc->bRgb2yuvFlag = OMX_TRUE;

gpu_fd = open("/dev/pvrsrvkm", O_RDWR, 0); //这里打开节点接着关闭了,是测试是否可用的意思,并设置pVideoEnc->bRgb2yuvFlag,实际用的地方怀疑在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 大约耗时 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

-> 构建message, type 为 omx_message::EMPTY_BUFFER_DONE,发送到消息处理线程去处理

-> bufferSource->onInputBufferEmptied

-> GraphicBufferSource::onInputBufferEmptied

->>>>> OMXNodeInstance::OnEmptyBufferDone end

->>>> Rkvpu_OMX_InputBufferReturn end

输出线程:

output线程:

Rkvpu_OMX_Venc.c: Rkvpu_OMX_OutputProcessThread

-> Rkvpu_OMX_OutputBufferProcess 消息处理循环

-> Rkvpu_OutputBufferGetQueue(ROCKCHIP_OMX_BASECOMPONENT *pRockchipComponent)

-> Rockchip_OSAL_Dequeue(&pRockchipPort->bufferQ) //从bufferQ中取出一个消息

emptyBuffer流程中queue的消息就是在这里被dequeue的

-> 将dequeue出的msg中的数据,存入Rkvpu_OutputBufferGetQueue的参数中返回

->>>> Rkvpu_OutputBufferGetQueue end

-> Rkvpu_Post_OutputStream(OMX_COMPONENTTYPE *pOMXComponent)

-> p_vpu_ctx = pVideoEnc->vpu_ctx

-> p_vpu_ctx->encoder_getstream(p_vpu_ctx, &pOutput)

该函数怀疑存在于 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值