测量 eglPresentationTimeANDROID() 的效果

measuring the effect of eglPresentationTimeANDROID()

我正在调试使用 eglPresentationTimeANDROID() 来改进口型同步的 C++ 视频渲染器。这个egl extension is not available on all devices I tested, but for some (e.g. adreno), it must be manually disabled - otherwise the stream gets stuck. I understand that some devices actually ignore the PTS (cf. ).

我最近遇到了更多设备(非常奇怪)在启用此功能时出现故障,我考虑完全禁用它。但是为了做出这个决定,我想在决定摆脱它之前衡量这个 PTS 的效果。

通常,查看扩展有任何影响的唯一方法是使用 systrace 来监视诸如 Grafika 的“scheduled swap”Activity(为此目的创建)之类的输出。流没有理由卡住,至少在 AOSP 源代码中是这样;我不知道 OEM 可能添加了哪些代码。

渲染时的逻辑应该是:

  • 如果某个帧的所需显示时间已经过去,并且没有其他帧可用于当前显示槽,则显示它;
  • 如果所需的显示时间已经过去,并且有另一个帧准备好用于下一个显示槽,则将其删除;
  • 如果想要的展示时间在近期,暂且保留;
  • 如果所需的演示时间是未来一秒以上,请立即显示。

格式错误的 PTS 值最多应暂停显示一秒钟。时间戳使用单调时钟,因此不受时钟更新的影响。

没有必要使用该功能,只要您能完美地控制视频帧的提交速度即可。扩展的目的是让应用程序更容易管理同步。目标是在系统视频播放器中使用它来改善同步,但我不知道这是否真的发生了。 (我没有看到它在 AOSP 源代码中使用。)