YUV到苹果A4的RGBA,我应该使用着色器还是NEON?

我正在为Apple TV编写媒体播放器框架,使用OpenGL ES和ffmpeg。 在OpenGL ES上渲染需要转换为RGBA,使用swscale软转换的速度非常慢,所以使用互联网上的信息我提出了两个想法:使用霓虹灯(如这里 )或使用片段着色器和GL_LUMINANCE和GL_LUMINANCE_ALPHA。

正如我对OpenGL几乎一无所知,第二个选项仍然不工作:)

你可以给我任何指针如何进行? 先谢谢你。

学习OpenGL ES2.0着色器是非常值得的:

  1. 您可以在GPU和CPU之间进行负载平衡(例如,在GPU渲染当前帧的情况下对后续帧进行video解码)。
  2. 在任何情况下,video帧都需要进入GPU:如果您的video具有4:2:0采样色度,则使用YCbCr可以节省25%的总线带宽。
  3. 通过GPU硬件内插器,您可以免费获得4:2:0色度上采样。 (您的着色器应该configuration为对YC{b,r}纹理使用相同的顶点坐标,实际上将色度纹理伸展到相同的区域上。
  4. 在iOS5上,将YCbCr纹理压入GPU的速度非常快(没有数据拷贝或混合)纹理caching(请参阅CVOpenGLESTextureCache* API函数)。 与NEON相比,您将保存1-2个数据副本。

我正在使用这些技术在我的超快iPhone相机应用程序SnappyCam中发挥出色 。

您正在实现的正确轨道上:如果您的CbCr交织,则对YCbCr纹理。 否则使用三个GL_LUMINANCE纹理,如果你所有的YCbCr组件都是非交错的。

为4:2:0双平面YCbCr (其中CbCr交错)创build两个纹理非常简单:

  glBindTexture(GL_TEXTURE_2D, texture_y); glTexImage2D( GL_TEXTURE_2D, 0, GL_LUMINANCE, // Texture format (8bit) width, height, 0, // No border GL_LUMINANCE, // Source format (8bit) GL_UNSIGNED_BYTE, // Source data format NULL ); glBindTexture(GL_TEXTURE_2D, texture_cbcr); glTexImage2D( GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, // Texture format (16-bit) width / 2, height / 2, 0, // No border GL_LUMINANCE_ALPHA, // Source format (16-bits) GL_UNSIGNED_BYTE, // Source data format NULL ); 

然后在那里使用glTexSubImage2D()或iOS5纹理caching来更新这些纹理。

我还build议使用跨越纹理坐标空间(x: [0,1], y: [0,1])的2D varying ,以避免片段着色器中的任何相关纹理读取。 最终的结果是超快,根本不会加载GPU。

使用NEON将YUV转换为RGB非常缓慢。 使用着色器卸载到GPU上。