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



谁能推荐一个非常快速的API,理想情况下是NEON优化的,以便在iPhone上使用CPU运行时进行YUV到RGB转换?可悲的是,加速框架的 vImage 没有提供任何合适的东西,而且使用 vDSP,转换为浮点数和返回似乎不是最佳的,几乎和自己编写 NEON 一样多。

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

(1)虽然我可以使用渲染纹理和我的YUV着色器来转换和缓存区域,但我不想给应用程序增加更多的同步/复杂性。 (我已经将纹理从CVTextureCache传递到Unity3D...在许多情况下,我已经在 Unity3D 的背后从 OpenGL 切换状态,不想再进行任何调试......

2)更实际的是,我正在编写一个游戏,并且没有任何GPU可以闲置(因为游戏通常没有 - 在过去的几年里,我做了更多关于如何从GPU上取下东西的演讲,而不是如何把东西放在上面......

(3)在iPad上,我有一个备用核心坐在那里无所事事。

虽然有很多库可以将 YUV 转换为 RGBA,但我很想节省编写自己的 NEON 版本的时间。现在我正在使用OpenCV的实现,如下所示:

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

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

如果有人以前看过其他实现(CoreImage?FFMpeg?并且可以推荐一个,我将不胜感激。

谢谢亚历克斯。

如果你有 YUV 在不同的平面中并且没有色度缩减采样,那么你应该能够使用 vImageMatrixMultiply_Planar8 进行转换。

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

正如评论所述,它仍然很粗糙,您可能需要对其进行调整才能转换为 RGBA,但这是不费吹灰之力的。

据我所知,应该在NEON博客上发布其他此类功能 - 检查希尔伯特空间,网络振动器,arm软件支持博客等

最新更新