這篇文章將介紹Stagefright中是如何和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
  }

...
}

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) 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之後,繼續傳送下一個未解碼的資料給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;
}


StageFright框架(四)Video Buffer傳輸流程相关推荐

  1. stagefright框架(四)-Video Buffer傳輸流程

    這篇文章將介紹Stagefright中是如何和OMX video decoder傳遞buffer. (1) OMXCodec會在一開始的時候透過read函式來傳送未解碼的data給decoder,並且 ...

  2. stagefright框架(四)-Video Buffer傳輸流程 .

    這篇文章將介紹Stagefright中是如何和OMX video decoder傳遞buffer. (1) OMXCodec會在一開始的時候透過read函式來傳送未解碼的data給decoder,並且 ...

  3. android stagefright框架

    http://blog.csdn.net/mirkerson/article/details/38520135 stagefright框架(一)Video Playback的流程 在Android上, ...

  4. StageFright框架流程解读

    1.    StageFright介绍 Android froyo版本多媒体引擎做了变动,新添加了stagefright框架,并且默认情况android选择stagefright,并没有完全抛弃ope ...

  5. android stagefright 框架

    原文:[转]android stagefright 框架 链接:http://blog.chinaunix.net/uid-9838896-id-2976618.html 在Android上,预设的多 ...

  6. [WCF]利用net.tcp傳輸協定來建置WCF Service

    http://www.dotblogs.com.tw/puma/archive/2009/06/21/wcf-net-tcp-channelfactory-clientbase.aspx 最近很少在寫 ...

  7. stagefright框架概述

    多媒体框架stagefright是android2.3后替代opencore的.整个框架非常庞大,这里将它分为编码器.解码器.合成器.分离器.PCM数据和YUV数据输入.数据源(DataSource) ...

  8. ffmpeg的内部Video Buffer管理和传送机制

    本文主要介绍ffmpeg解码器内部管理Video Buffer的原理和过程,ffmpeg的Videobuffer为内部管理,其流程大致为:注册处理函数->帧级释放->帧级申请->清空 ...

  9. 藉由GZipStream的壓縮,來減少Web Service的傳輸量

    不知道有多少人有遇到跟我一樣的問題,就是Web Service的資料回傳量太大了,如果都是走區域網路的話,除非量很大,不然還感覺不太出來,可是,如果是透過ADSL的頻寬的話,那就很驚人了,以30MB的 ...

最新文章

  1. [转载]交换机背板带宽计算方法
  2. 国产计算机设备,小芯机:“天玥”中国第一台纯国产电脑诞生!
  3. Javascript简介
  4. python无法安装pycurl_Python安装pycurl失败的解决方法
  5. 一步一步写算法(之 算法总结)【转】
  6. Markdown---图片保存位置设置
  7. var radioname = new array();_兰帕德:引进VAR是为了回放关键时刻的情况,他们的行为令我困惑...
  8. 专访 YYKit 作者 ibireme: 开源大牛是怎样炼成的
  9. Yii框架官方指南系列41——专题:自动代码生成
  10. ADT(Android) — Eclipse开发连接夜神模拟器方法(亲测有效!)
  11. H3C配置PPP协议
  12. 谷歌开源内部代码评审规范
  13. php请求图片,PHP - 发送GET请求并获取图片作为回报
  14. nginx基于域名的虚拟主机配置实战
  15. ElasticSearch
  16. 华为手机html乱码,华为手机系统语言变成乱码了怎么办?
  17. 第一章 使用SOAPUI测试和开发Web Services Stubs
  18. 梦想cms-v1.4-后台存在任意文件读取漏洞
  19. matlab cftool光滑曲线导出为什么就不光滑了_不会吧,还有人不知道MATLAB这8个小技巧?...
  20. 拼多多面试官没想到ThreadLocal我用得这么溜,人直接傻掉

热门文章

  1. 《世界上最远的距离》 泰戈尔
  2. Opencv 图像拼接与融合简单方法Stitcher
  3. 江宁开发区深化与东南大学合作共建大学科技园
  4. 你受伤和人类受伤你会怎么选择
  5. 程序员的祖师爷到底有多么牛逼?
  6. 特斯拉2年内实现全自动驾驶,无人驾驶时代还远吗?丨曼孚科技
  7. java实现发布订阅
  8. python水浒传名字次数_水浒传top20人物出现名字次数
  9. 仿QQ弹出窗口[转]
  10. 4.3 ipu_init_channel_buffer函数的详细分析