我有一个Android应用程序,将视频解码为yuv420p格式,然后使用OpenGLES呈现视频帧.我使用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, 8,
EGL_RED_SIZE, 8,
EGL_NONE
};
Run Code Online (Sandbox Code Playgroud)
初始设置:
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, ctx->frameW, ctx->frameH, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL); /* also for U/V */
Run Code Online (Sandbox Code Playgroud)
后续部分替换:
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, ctx->frameW, ctx->frameH, GL_LUMINANCE, GL_UNSIGNED_BYTE, yBuffer); /*also for U/V */
Run Code Online (Sandbox Code Playgroud)
我试图在SD或720P HD分辨率下以~30FPS或~60FPS渲染视频.
mmap()用于创建由文件系统支持的内存区域。但是,我要相反:由内存支持的文件。那可能吗?我有一个旧式静态库(意味着无法更改它)只能打开本地文件。我无法将其更改为使用重定向的fd或stdin(因为管道不支持查找),我希望文件内容从Windows共享(CIFS / SMB)流式传输。是否可以在本地文件系统上以假大小创建虚拟文件,并且当旧静态库访问文件的任何部分(查找或读取,不写入)时,我们通过从CIFS / SMB进行提取并返回到旧版库(就像处理页面错误一样)?这样,旧版库就不会注意到任何区别...
由于权限问题,无法挂载CIFS / SMB共享。假设环境为POSIX,但是也欢迎使用特定于操作系统的建议。
在Android Doc和Google上找不到任何明确的内容.
如果有API来检测这个,它是什么以及在HDMI输出上启用/禁用HDCP的API是什么?
如果没有API检测到这一点,是否可以使用设备检查HDMI端口上的HDCP标志?
在某些Android设备(最值得注意的是三星设备)上,HDMI端口始终启用了HDCP.但其他制造商的设备呢?在Google认证的设备上是否必须使用HDCP?如果不是强制性的,主要内容提供商的Android应用程序(来自Big cable company teleco)如何阻止视频输出到非HDCP保护的HDMI端口?
我需要从纹理中删除所有奇数行 - 这是简单去隔行器的一部分。
在下面的代码示例中,我没有从纹理中获取 RGB,而是选择为奇数线输出白色,为偶数线输出红色 - 因此我可以直观地检查结果是否符合我的预期。
_texcoord 从顶点着色器传入,x 和 y 的范围均为 [0, 1]
uniform sampler2D sampler0; /* not used here because we directly output White or Red color */
varying highp vec2 _texcoord;
void main() {
highp float height = 480.0; /* assume texture has height of 480 */
highp float y = height * _texcoord.y;
if (mod(y, 2.0) >= 1.0) {
gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
} else {
gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0);
}
} …
Run Code Online (Sandbox Code Playgroud)