gpt4 book ai didi

android - 运行 Traceview 方法分析时 MediaCodec 不返回缓冲区

转载 作者:行者123 更新时间:2023-11-29 01:45:12 24 4
gpt4 key购买 nike

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

  1. 在 Eclipse 中,运行 Grafika。
  2. 在 Grafika 中,选择“播放视频 (TextureView)”并点击“开始”。
  3. 在 Eclipse DDMS 中,单击“开始方法分析”并保持对话框打开。
  4. 在 Grafika 中,点击“播放”并快速返回到 Eclipse 并单击“确定”。单击“确定”后,Grafika 将显示为挂起(不再绘制任何帧)。

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

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

这是一个已知问题吗?有没有办法解决它并使用 MediaCodec 分析应用程序?

最佳答案

糟糕。

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

/*
* 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() 的信号已经发生,所以没有什么可做的。

但在这种情况下,线程被提供 onFrameAvailable() 回调的 native ACodec 线程暂时附加到 VM。所以这个纯 native 线程想要将自己附加到 VM,调用回调,分离自己,然后回去工作。但是因为方法分析处于 Activity 状态,线程分离会停止,直到方法分析完成......但是方法分析在代码执行恢复之前不会完成。所以我们陷入了僵局。

所以这里有两个问题:

  1. Dalvik 不应该让线程保持 Activity 状态。这会使方法分析变得更加复杂,因为它失去了方便的唯一线程 ID,但这只是一个内务管理问题。
  2. libstagefright 不应在每次要发送“帧可用”消息时附加和分离。这是一个相对昂贵的操作,需要分配一个 Thread 对象,挫败免分配运行的尝试。

我没有看到通过更改应用程序来解决此问题的干净方法——您必须在没有框架可用通知的情况下离开。最好的办法是放弃 TraceView 分析并使用 systrace相反。

关于android - 运行 Traceview 方法分析时 MediaCodec 不返回缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21897288/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com