如何理解 setDisplay/setSurface/setPrewviewDisplay/setPreviewTexture for Android 的底层

How to understand the underneath of setDisplay/setSurface/setPrewviewDisplay/setPreviewTexture for Android

由于Android api 级别 1,我们可以使用 setDisplay 或 setPrewviewDisplay 将 MediaPlayer 或 Camera 附加到 Surface,然后图像数据可以传输到 gpu 并更快地处理。

引入SurfaceTexture后,我们可以用目标GL_TEXTURE_EXTERNAL_OES创建自己的纹理,并将MediaPlayer或Camera附加到opengl es。

这些都是众所周知的,但我想说的是下面的Android图形架构。(Android Graphics architecture)

产生的数据在CPU这边,所以必须以非常快的方式传输到GPU。

为什么每个Android设备传输数据的速度都这么快,下面是如何做到的?

或者这是与Android无关的硬件问题?

CPU 端不生成数据。相机和硬件视频编解码器将它们的数据存储在内核 gralloc 机制分配的缓冲区中(通过非 public GraphicBuffer 从本机代码引用)。 Surfaces 通过 BufferQueue 对象进行通信,该对象通过句柄传递帧,而不复制数据本身。

由 OEM 确保相机、视频编解码器和 GPU 可以使用通用格式。视频编解码器输出的 YUV 必须是 GLES 实现可以作为外部纹理处理的东西。这也是为什么在将 GLES 渲染发送到 MediaCodec 时需要 EGL_RECORDABLE_ANDROID 的原因...需要让 EGL 实现知道它正在渲染的帧必须可以被视频编解码器识别。