首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当Traceview方法分析运行时,MediaCodec不返回缓冲区

当Traceview方法分析运行时,MediaCodec不返回缓冲区
EN

Stack Overflow用户
提问于 2014-02-20 03:07:59
回答 1查看 279关注 0票数 2

当启用Traceview方法分析时,MediaCodec似乎不返回输入或输出缓冲区。复制步骤:

  1. 在Eclipse中,运行Grafika。
  2. 在Grafika,选择“播放视频(TextureView)”并点击“开始”。
  3. 在Eclipse中,单击"Start Method Profiling“并保持对话框打开。
  4. 在Grafika中,点击"Play“,然后快速返回Eclipse并单击"OK”。一旦您单击“确定”,Grafika将出现挂起(它不再绘制任何框架)。

Grafika详细日志显示,在停止方法分析之前,MediaCodec中没有可用的输入或输出缓冲区。

我的猜测是,MediaCodec在幕后做了一些活生生的事情,这可能与Traceview的实现方式相冲突,但这只是猜测而已。

这是众所周知的问题吗?有没有办法解决它和配置文件应用程序使用MediaCodec?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-20 18:16:47

哇哦。

来自dalvik/vm/Thread.cpp (第2105行):

代码语言:javascript
复制
/*
 * If we're doing method trace profiling, we don't want threads to exit,
 * because if they do we'll end up reusing thread IDs.  This complicates
 * analysis and makes it impossible to have reasonable output in the
 * "threads" section of the "key" file.

通常情况下,这很好--如果线程退出了,它就没有什么可做的了,所以如果我们把它保持得更长一点,也就无关紧要了。Thread#join()的信号已经发生了,所以没有什么可做的了。

但是在这种情况下,提供ACodec回调的原生onFrameAvailable()线程暂时连接到VM上。因此,这个纯本机线程希望将自己附加到VM,调用回调,分离自身,然后返回工作。但是由于方法分析是活动的,线程分离暂停直到方法分析完成.但是,在恢复代码执行之前,方法分析不会完成。所以我们陷入僵局了。

所以这里有两个问题:

  1. 达维克不应该让这条线继续存在。这将使方法分析变得更加复杂,因为它失去了方便的唯一线程ID,但这只是一个内务问题。
  2. libstagefright不应该每次发送“框架可用”消息时都要附加和分离。这是一个相对昂贵的操作,需要分配一个Thread对象,从而阻止运行免费分配的尝试。

我看不出有什么干净的方法可以通过改变应用程序来解决这个问题--你必须在没有可用帧通知的情况下离开。最好的选择是放弃TraceView分析,转而使用系统

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21897288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档