使用CPU在iOS上进行最快的YUV420P到RGBA转换

任何人都可以推荐一个非常快的API,理想情况下NEON优化用于在iPhone上使用CPU在运行时进行YUV到RGB转换吗? 加速框架的vImage没有提供任何合适的东西,遗憾的是,使用vDSP,转换为浮点数和返回看起来不是最理想的,几乎和我自己编写NEON一样多。

我知道如何通过着色器使用GPU,事实上已经这样做了,用于显示我的主video平面。 不幸的是,我还需要在运行时创建和保存显示的子区域的RGBA纹理。 这个问题的大部分好答案都涉及着色器,但我不想将GPU用于额外的工作,因为:

(1)虽然我可以使用RenderTextures和我的YUV着色器来转换和缓存区域,但我不想为应用添加任何更多的同步/复杂性。 (我已经将纹理从CVTextureCache传递到Unity3D ……在许多情况下,我已经在Unity3D的后面切换状态,并且不想再做任何调试……)

(2)更实际的是我正在编写游戏,并且没有任何GPU可供使用(因为游戏通常没有 – 我已经在过去几年中提供了更多关于如何从GPU中获取内容的演示而不是如何把东西放在上面…)

(3)在iPad上,我有一个备用的核心坐在那里什么都不做。

虽然有很多库可以做到YUV到RGBA,但我很乐意节省编写自己的NEON版本的时间。 现在我正在使用这样的OpenCV实现:

cv::cvtColor(avFoundationYUVCaptureMat, BGRAInputImage, CV_YUV420sp2BGRA, 4); 

这是正确的,但结束的日子很慢。

如果有人以前看过其他实现(CoreImage?FFMpeg?)并且可以推荐一个我会非常感激。

谢谢,Alex。

如果在单独的平面中有YUV并且没有色度下采样,那么您应该能够使用vImageMatrixMultiply_Planar8进行转换。

我所做的就是google yuv rgb neon ,这就是我发现的 – https://code.ros.org/trac/opencv/browser/trunk/opencv/android/android-jni/jni/yuv2rgb_neon.c?rev= 4083

正如评论所述,它仍然很粗糙,你可能必须调整它以转换为RGBA,但这将是一个没有脑子。

据我所知,在NEON博客上应该发布其他类似function – 检查hilbert-space,webshaker,arm软件支持博客等