• stagefright框架(四)-Video Buffer传输流程


    這篇文章將介紹Stagefright中是如何和OMX video decoder传送buffer

    stagefright框架(四)-Video <wbr>Buffer傳輸流程


    (1) OMXCodec會在一開始的時候透過read函式來傳送未解碼的datadecoder,並且要求decoder將解碼後的data傳回來


    status_t OMXCodec::read(...)
    {
      if (mInitialBufferSubmit)
      {
        mInitialBufferSubmit false;

        drainInputBuffers()<----- OMX_EmptyThisBuffer
        fillOutputBuffers()<----- OMX_FillThisBuffer
      }

      ...
    }

    void OMXCodec::drainInputBuffers()
    {
      Vector<BufferInfo*buffers &mPortBuffers[kPortIndexInput];

      for (i = 0; i < buffers->size()++i)
      {
        drainInputBuffer(&buffers->editItemAt(i));
      }
    }

    void OMXCodec::drainInputBuffer(BufferInfo *info)
    {
      mOMX->emptyBuffer(...);
    }

    void OMXCodec::fillOutputBuffers()
    {
      Vector<BufferInfo*buffers &mPortBuffers[kPortIndexOutput];

      for (i = 0; i < buffers->size()++i)
      {
        fillOutputBuffer(&buffers->editItemAt(i));
      }
    }

    void OMXCodec::fillOutputBuffer(BufferInfo *info)
    {
      mOMX->fillBuffer(...);
    }


    (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函式在後段等待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;
    }

     
  • 相关阅读:
    【翻译自mos文章】 11gR1版本号 asmcmd的新命令--cp、md_backup、md_restore
    Android实现ListView或GridView首行/尾行距离屏幕边缘距离
    iOS-为方便项目开发在pch加入一些经常使用宏定义
    [ACM] FZU 1686 神龙的难题 (DLX 反复覆盖)
    Cocos2d-x Touch事件处理机制
    在linux環境下安裝jprofiler_linux_8_0_2.sh
    QT5 Failed to load platform plugin &quot;windows&quot; 终极解决方式 命令行问题
    我们想要如何子的生活?
    javaEE mvc样例具体解释
    安装Kali Linux操作系统Kali Linux无线网络渗透
  • 原文地址:https://www.cnblogs.com/shakin/p/4097110.html
Copyright © 2020-2023  润新知