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

时间:2012-06-29 19:17:27

标签: iphone ios opencv core-image accelerate-framework

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

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

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

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

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

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

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

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

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

谢谢, 亚历克斯。

2 个答案:

答案 0 :(得分:4)

如果您在不同的平面中有YUV并且没有色度下采样,那么您应该可以使用vImageMatrixMultiply_Planar8进行转换。

答案 1 :(得分:2)

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

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

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