這篇文章將介紹Stagefright中是如何和OMX video decoder傳遞buffer。

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

  1. status_t OMXCodec::read(...)
  2. {
  3. if (mInitialBufferSubmit)
  4. {
  5. mInitialBufferSubmit = false;
  6. drainInputBuffers(); <----- OMX_EmptyThisBuffer
  7. fillOutputBuffers(); <----- OMX_FillThisBuffer
  8. }
  9. ...
  10. }
  11. void OMXCodec::drainInputBuffers()
  12. {
  13. Vector<BufferInfo> *buffers = &mPortBuffers[kPortIndexInput];
  14. for (i = 0; i < buffers->size(); ++i)
  15. {
  16. drainInputBuffer(&buffers->editItemAt(i));
  17. }
  18. }
  19. void OMXCodec::drainInputBuffer(BufferInfo *info)
  20. {
  21. mOMX->emptyBuffer(...);
  22. }
  23. void OMXCodec::fillOutputBuffers()
  24. {
  25. Vector<BufferInfo> *buffers = &mPortBuffers[kPortIndexOutput];
  26. for (i = 0; i < buffers->size(); ++i)
  27. {
  28. fillOutputBuffer(&buffers->editItemAt(i));
  29. }
  30. }
  31. void OMXCodec::fillOutputBuffer(BufferInfo *info)
  32. {
  33. mOMX->fillBuffer(...);
  34. }

(2) Decoder從input port讀取資料後,開始進行解碼,並且回傳EmptyBufferDone通知OMXCodec

  1. void OMXCodec::on_message(const omx_message &msg)
  2. {
  3. switch (msg.type)
  4. {
  5. case omx_message::EMPTY_BUFFER_DONE:
  6. {
  7. IOMX::buffer_id buffer = msg.u.extended_buffer_data.buffer;
  8. drainInputBuffer(&buffers->editItemAt(i));
  9. }
  10. }
  11. }

OMXCodec收到EMPTY_BUFFER_DONE之後,繼續傳送下一個未解碼的資料給decoder。

(3) Decoder將解碼完的資料送到output port,並回傳FillBufferDone通知OMXCodec

  1. void OMXCodec::on_message(const omx_message &msg)
  2. {
  3. switch (msg.type)
  4. {
  5. case omx_message::FILL_BUFFER_DONE:
  6. {
  7. IOMX::buffer_id buffer = msg.u.extended_buffer_data.buffer;
  8. fillOutputBuffer(info);
  9. mFilledBuffers.push_back(i);
  10. mBufferFilled.signal();
  11. }
  12. }
  13. }

OMXCodec收到FILL_BUFFER_DONE之後,將解碼後的資料放入mFilledBuffers,發出mBufferFilled信號,並且要求decoder繼續送出資料。

(4) read函式在後段等待mBufferFilled信號。當mFilledBuffers被填入資料後,read函式將其指定給buffer指標,並回傳給AwesomePlayer

  1. status_t OMXCodec::read(MediaBuffer **buffer, ...)
  2. {
  3. ...
  4. while (mFilledBuffers.empty())
  5. {
  6. mBufferFilled.wait(mLock);
  7. }
  8. BufferInfo *info = &mPortBuffers[kPortIndexOutput].editItemAt(index);
  9. info->mMediaBuffer->add_ref();
  10. *buffer = info->mMediaBuffer;
  11. }

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. OSChina 周二乱弹 ——假期综合症
  2. vc动态生成按钮并响应
  3. 深入理解分布式技术 - Redis 分布式锁解决方案
  4. 快速排序算法_常用排序算法之快速排序
  5. Webserver内存溢出分析
  6. 如何QLayout内部的成员部件之间从左到右依次排列
  7. 使用BeetleX.NetBenchmark压测TCP,HTTP和Websocket服务
  8. 微信小程序实现选项卡
  9. 客户端控件Javascript验证类
  10. Entity Framework 4 数据事务操作
  11. win10 android 手机驱动下载,win10手机刷机包驱动
  12. 【读书笔记——开关电源】《精通开关电源设计》(1)
  13. asp.net母版页学习总结
  14. 微软商店打不开,错误代码0x80131500
  15. 哪些客户群体适合使用云服务器?
  16. [高项]消极风险VS积极风险
  17. 100以内所有质数的输出。
  18. 获取微信公众号的二维码图片
  19. golang牛牛算法规则与聊天功能
  20. CentOS7配置nexus开机自启动

热门文章

  1. [渝粤题库]广东开放大学 社会调查与方法 形成性考核
  2. 海康监控H5 实时视频监控
  3. 历年四级作文范文(1994.6-2007.6)
  4. Web前端成都培训机构
  5. 你也可以找到好工作(一)
  6. 【牛客网】---字符集合
  7. “那些看似不起波澜的日复一日,终会在某天让你看到坚持的意义。”
  8. how2heap glibc 2.27
  9. c语言中定义密码为英文字母,请设计 一个密码生成器,要求随机生成4组10位密码(C语言)...
  10. 子网怎么算?IP地址(A,B,C,D,E类地址),子网,子网掩码,容纳主机20台,网络号,主机号