Apple A4 上的 YUV 到 RGBA,我应该使用着色器还是 NEON?
我正在使用 OpenGL ES 和 ffmpeg 为 Apple TV 编写媒体播放器框架。 在 OpenGL ES 上渲染需要转换为 RGBA,使用 swscale 进行软转换速度慢得难以忍受,因此根据互联网上的信息我想出了两个想法:使用 neon (如 此处)或使用片段着色器和 GL_LUMINANCE 和GL_LUMINANCE_ALPHA。
由于我对 OpenGL 几乎一无所知,所以第二个选项仍然不起作用:)
你能给我一些如何继续的指示吗? 先感谢您。
I'm writing media player framework for Apple TV, using OpenGL ES and ffmpeg.
Conversion to RGBA is required for rendering on OpenGL ES, soft convert using swscale is unbearably slow, so using information on the internet I came up with two ideas: using neon (like here) or using fragment shaders and GL_LUMINANCE and GL_LUMINANCE_ALPHA.
As I know almost nothing about OpenGL, the second option still doesn't work :)
Can you give me any pointers how to proceed?
Thank you in advance.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
OpenGL ES2.0 着色器绝对值得学习:
YCbCr
可以节省 25% 的总线带宽。Y
和C{b,r}
纹理使用相同的顶点坐标,实际上将色度纹理拉伸到同一区域。 )YCbCr
纹理推送到 GPU 的速度很快(无需数据复制或混合)(请参阅CVOpenGLESTextureCache*
API 函数)。与 NEON 相比,您将节省 1-2 个数据副本。我在我的超快 iPhone 相机应用程序 SnappyCam 中使用这些技术,取得了很好的效果。
您的实现方向是正确的:如果您的
CbCr
是交错的,则对Y
和GL_LUMINANCE_ALPHA
使用GL_LUMINANCE
纹理。否则,如果所有YCbCr
组件都是非交错的,则使用三个GL_LUMINANCE
纹理。为 4:2:0 双平面
YCbCr
(其中CbCr
交错)创建两个纹理非常简单:然后您可以在其中使用
glTexSubImage2D()
> 或iOS5纹理缓存来更新这些纹理。我还建议使用跨越纹理坐标空间的 2D
variing
(x: [0,1], y: [0,1])
以便避免任何依赖纹理都会在片段着色器中读取。根据我的经验,最终结果是超快的并且根本不会加载 GPU。It is most definitely worthwhile learning OpenGL ES2.0 shaders:
YCbCr
saves you 25% bus bandwidth if your video has 4:2:0 sampled chrominance.Y
andC{b,r}
textures, in effect stretching the chrominance texture out over the same area.)YCbCr
textures to the GPU is fast (no data-copy or swizzling) with the texture cache (see theCVOpenGLESTextureCache*
API functions). You will save 1-2 data-copies compared to NEON.I am using these techniques to great effect in my super-fast iPhone camera app, SnappyCam.
You are on the right track for implementation: use a
GL_LUMINANCE
texture forY
andGL_LUMINANCE_ALPHA
if yourCbCr
is interleaved. Otherwise use threeGL_LUMINANCE
textures if all of yourYCbCr
components are noninterleaved.Creating two textures for 4:2:0 bi-planar
YCbCr
(whereCbCr
is interleaved) is straightforward:where you would then use
glTexSubImage2D()
or the iOS5 texture cache to update these textures.I'd also recommend using a 2D
varying
that spans the texture coordinate space(x: [0,1], y: [0,1])
so that you avoid any dependent texture reads in your fragment shader. The end result is super-fast and doesn't load the GPU at all in my experience.使用 NEON 将 YUV 转换为 RGB 非常慢。使用着色器将负载卸载到 GPU 上。
Converting YUV to RGB using NEON is very slow. Use a shader to offload onto the GPU.