android 解码出来的视频frame数据,是如何一步步的传递到显示端的(使用hwc composer online 合成)

本文详细解析了Android系统中,从解码出来的视频帧数据如何通过OMX、Stagefright、SurfaceFlinger和硬件Composer,最终传递到显示端的过程。关键在于graphicBuffer->handle中存储的有效数据,它在各组件间传递,直至在Vsync事件触发时进行屏幕刷新。
摘要由CSDN通过智能技术生成


1,初始化的时候,

-----> allocateOutputBuffersFromNativeWindow
-----> status_t OMXNodeInstance::useGraphicBuffer
-----> virtual status_t useGraphicBuffer
-----> status_t OMXNodeInstance::useGraphicBuffer2_l
-----> OMX_UseBuffer
-----> SEC_OMX_UseBuffer   //temp_bufferHeader->pBuffer        = pBuffer; 
//这里就是把graphicBuffer->handle复制给了bufferHeader->pBuffer,也就是data_ptr,也就是存贮一些地址值的内存,也就是graphicBuffer->handle中最终存储了解码完毕数据存放地址信息,最后传给显示
说到底,就是MediaBuffer中指向了有效的data_ptr, MediaBuffer指向了GraphicBuffer,graphicBuffer->handle实际上就是data_ptr
所以一开始传的是MediaBuffer,最后又传的GraphicBuffer, 但是都能使用到data_ptr


2,解码过程运转起来之后

-----> SEC_OutputBufferGetQueue里面,把pSECComponent->processData[OUTPUT_PORT_INDEX].dataBuffer = dataBuffer->bufferHeader->pBuffer;
-----> SEC_MFC_H264_Decode_Nonblock里面
-----> SsbSipMfcDecGetOutBuf 获取到解码完的数据物理地址填充到dataBuffer,也就是填充到了dataBuffer->bufferHeader->pBuffer,然后一步步往上送
-----> sec_mfc_bufferProcess
-----> SEC_Postprocess_OutputData
-----> SEC_OutputBufferReturn
-----> FillBufferDone
-----> OMX_ERRORTYPE OMXNodeInstance::OnFillBufferDone
-----> OMX_ERRORTYPE OMX::OnFillBufferDone(   node_id node, OMX_IN OMX_BUFFERHEADERTYPE *pBuffer)
 {
    ALOGV("OnFillBufferDone buffer=%p", pBuffer);
    omx_message msg;
    msg.type = omx_message::FILL_BUFFER_DONE;
    msg.node = node;
    msg.u.extended_buffer_data.buffer = pBuffer;
    msg.u.extended_buffer_data.range_offset = pB
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值