Android多媒体开发(2)——Video buffer传输流程

AwesomePlayer如何和OMX video decoder传输buffer呢?
在这里插入图片描述
1.OMXCodec会在开始的时候通过read()函数将未解码的data送给decoder,并要求decoder将解码后的data回传。

status_t OMXCodec::read(...)
{
    if (mInitialBufferSubmit)  
    {    
        mInitialBufferSubmit = false;    
        drainInputBuffers(); <----- OMX_EmptyThisBuffer    
        fillOutputBuffers(); <----- OMX_FillThisBuffer  
    }  
    ...
}

2.Decoder从input port读取到数据后开始进行解码,并且回传EmptyBufferDone给OMXCodec。

void OMXCodec::on_message(const omx_message &msg)
{  
    switch (msg.type)  
    {    
        case omx_message::EMPTY_BUFFER_DONE:    
        {      
            IOMX::buffer_id buffer = msg.u.extended_buffer_data.buffer;      
            drainInputBuffer(&buffers->editItemAt(i));    
         }  
      }
}

OMXCodec收到EMPTY_BUFFER_DONE之后,继续发送下一个未解码的data给decoder。
3.Decoder将解码后的数据送到output port,并回传FillBufferDone通知OMXCodec。

void OMXCodec::on_message(const omx_message &msg)
{  
    switch (msg.type)  
    {    
        case omx_message::FILL_BUFFER_DONE:    
        {      
            IOMX::buffer_id buffer = msg.u.extended_buffer_data.buffer;      
            fillOutputBuffer(info);      
            mFilledBuffers.push_back(i);      
            mBufferFilled.signal();    
         }  
    }
}

OMXCodec收到FILL_BUFFER_DONE之后,将解码后的数据放入mFilledBuffers,发出mBufferFilled信号,并且要求decoder继续送出数据。
4.read()函数在后面等待mBufferFilled信号。当mFilledBuffers被填入数据后,read()函数将其指定给buffer指针,并回传给AwesomePlayer。

status_t OMXCodec::read(MediaBuffer **buffer, ...)
{  
    ...  
    while (mFilledBuffers.empty())  
    {    
        mBufferFilled.wait(mLock);  
    }  
    BufferInfo *info = &mPortBuffers[kPortIndexOutput].editItemAt(index);  
    info->mMediaBuffer->add_ref();  *buffer = info->mMediaBuffer;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值