我有一个
Android应用程序,将视频解码为yuv420p格式,然后使用OpenGLES呈现视频帧.
我使用glTexSubImage2D()将y / u / v缓冲区上传到GPU,然后使用着色器进行YUV2RGB转换.所有EGL / OpenGL设置/呈现代码都是本机代码.
我使用glTexSubImage2D()将y / u / v缓冲区上传到GPU,然后使用着色器进行YUV2RGB转换.所有EGL / OpenGL设置/呈现代码都是本机代码.
现在我并不是说我的代码没有问题,但考虑到相同的代码在iOS(iPad / iPhone),Nexus 7,Kindle HD 8.9,Samsung Note 1和其他一些廉价的中国平板电脑上运行完美(A31 / RockChip 3188)运行Android 4.0 / 4.1 / 4.2.我会说我的代码不太可能出错.在这些设备上,glTexSubImage2D()使用不到16ms的时间来上传SD或720P高清纹理.
然而,在Nexus 10上,glTexSubImage2D()对于SD或720P高清纹理大约需要50~90ms,这对于30fps或60fps的视频来说太慢了.
我想知道
1)如果我应该选择不同的纹理格式(RGBA或BGRA).有没有办法检测哪个是GPU使用的最佳纹理格式?
2)如果在所有其他SOC上有一个“OFF”功能,但在Exynos 5上设置为“ON”.例如,自动MIPMAP生成选项. (我把它关了,顺便说一句)
3)如果这是三星Exynos SOC的已知问题 – 我找不到Exynos cpu的支持论坛
4)配置EGL表面时是否需要设置任何选项?喜欢,透明度,表面格式等? (我不知道我在说什么)
5)这可能意味着GPU正在进行隐式格式转换,但我检查了GL_LUMINANCE总是被使用.它再次适用于所有其他平台.
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,EGL_RED_SIZE,EGL_NONE };
初始设置:
glTexImage2D(GL_TEXTURE_2D,GL_LUMINANCE,ctx->frameW,ctx->frameH,GL_UNSIGNED_BYTE,NULL); /* also for U/V */
后续部分替换:
glTexSubImage2D(GL_TEXTURE_2D,yBuffer); /*also for U/V */
我试图在SD或720P HD分辨率下以~30FPS或~60FPS渲染视频.
解决方法
这是我们向ARM报告的已知驱动程序问题.未来的更新应该修复它.