我有一个android应用程序,它将视频解码成yuv420p格式,然后使用opengles渲染视频帧。
我使用gltexsubimage2d()将y/u/v缓冲区上载到gpu,然后使用shader进行yuv2rgb转换。所有的egl/opengl设置/渲染代码都是本地代码。
现在我并不是说我的代码没有问题,但考虑到同样的代码在iOS(iPad/iPhone)、Nexus7、KindleHD8.9、三星Note1和其他一些运行Android4.0/4.1/4.2的廉价中国平板电脑(A31/RockChip3188)上运行的很好。我认为我的代码不太可能出错。在这些设备上,gltexsubimage2d()使用小于16ms的时间上载sd或720p hd纹理。
然而,在Nexus10上,gltexSubimage2d()对于SD或720p HD纹理大约需要50~90ms,对于30fps或60fps视频来说这太慢了。
我想知道
1)如果我选择不同的纹理格式(rgba或bgra)。有没有一种方法可以检测出GPU使用的最佳纹理格式?
2)如果在所有其他SOC上存在“关闭”但在Exynos 5上设置为“打开”的功能。例如,自动mipmap生成选项。(顺便说一句,我把它关掉了)
3)如果这是三星Exynos SoC的已知问题-我找不到Exynos CPU的支持论坛
4)在配置egl曲面时,是否需要设置任何选项?例如,透明度、表面格式等?(我不知道我在说什么)
5)这可能意味着gpu正在进行隐式格式转换,但我检查了glu亮度始终被使用。它同样适用于所有其他平台。
6)还有别的吗?
我的egl配置:
const EGLint attribs[] = {
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_BLUE_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_RED_SIZE, 8,
EGL_NONE
};
初始设置:
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, ctx->frameW, ctx->frameH, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL); /* also for U/V */
后续部分更换:
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, ctx->frameW, ctx->frameH, GL_LUMINANCE, GL_UNSIGNED_BYTE, yBuffer); /*also for U/V */
我正在尝试以每秒30帧或每秒60帧的速度以sd或720p高清分辨率渲染视频。
最佳答案
我们已经向ARM报告了一个已知的驱动程序问题。以后的更新会修复它。