Stagefright 之 Buffer传输流程

Stagefright之四

                                                            ——Buffer传输流程

       Stagefright中,数据流向过程是怎样的,那么就要关注StagefrightOMX video decoderbuffer的传递。

 

(1)    OMXCodecinit(); allocateBuffersOnPort() /*包括input port output port*/之后,会调用read()函数来读取未解码的data,并传送给decoderdecoder会传回解码后的data

 

status_t OMXCodec::read(MediaBuffer **buffer, const ReadOptions *options)

{

  if (mInitialBufferSubmit)

  {

    mInitialBufferSubmit = false;

 

    drainInputBuffers(); <----- OMX_EmptyThisBuffer

    fillOutputBuffers(); <----- OMX_FillThisBuffer

  }

}

***************************************************************************

void OMXCodec::drainInputBuffer(BufferInfo *info)

{

  mOMX->emptyBuffer(..., buffer, ...);

}

 

status_t OMX::emptyBuffer(..., buffer, ...)

{

    return findInstance(node)->emptyBuffer(..., buffer, ...);

}

 

status_t OMXNodeInstance::emptyBuffer (OMX::buffer_id buffer, ...)

 {   

    OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer;

  

    OMX_ERRORTYPE err = OMX_EmptyThisBuffer(mHandle, header);

}

******************************************************************************

void OMXCodec::fillOutputBuffer(BufferInfo *info)

{

  mOMX->fillBuffer(mNode, buffer);

}

 

status_t OMX::fillBuffer(node, buffer) {

    return findInstance(node)->fillBuffer(buffer);

}

 

status_t OMXNodeInstance::fillBuffer(OMX::buffer_id buffer)

{

    OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer;

 

    OMX_ERRORTYPE err = OMX_FillThisBuffer(mHandle, header);

}

******************************************************************************

 

(2) Decoderinput 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之后,继续传送下一个未解码的数据给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()函数最后一段code,我们可以知道,read()在等待mBufferFilled信号。当mFilledBuffers被填入data后,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;

}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值