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

8
有没有人能推荐一个非常快的 API,最好是使用 CPU 进行 NEON 优化,以便在 iPhone 上运行时进行 YUV 到 RGB 转换?遗憾的是,加速框架的 vImage 并没有提供合适的内容。使用 vDSP,将其转换为浮点数再转回来似乎不太优秀,而且几乎和编写 NEON 代码一样麻烦。
我知道如何通过着色器在 GPU 上完成这项任务,并且实际上已经在显示主视频平面时使用了 GPU。不幸的是,我还需要在运行时创建和保存显示区域的 RGBA 纹理。对于这个问题,大多数好的答案都涉及使用着色器,但我不想在 GPU 上执行额外的工作,因为:
(1)虽然我可以使用 RenderTextures 和我的 YUV 着色器来转换和缓存区域,但我不想给应用程序增加任何更多的同步 / 复杂性。(我已经将纹理从 CVTextureCache 传递到 Unity3D 中……在许多情况下,我已经在 Unity3D 的背后切换 OpenGL 状态,不想再做任何调试……)
(2)更实际的是,我正在编写一个游戏,没有任何 GPU 可以浪费(因为游戏通常没有 - 在过去几年中,我已经做了更多的演示,介绍如何将东西从 GPU 转移到 CPU 上,而不是反过来......)
(3)在 iPad 上,我有一个闲置的核心。
虽然有许多库可以执行 YUV 到 RGBA 转换,但我很想节省编写自己 NEON 版本的时间。现在我正在使用 OpenCV 的实现方式:
cv::cvtColor(avFoundationYUVCaptureMat, BGRAInputImage, CV_YUV420sp2BGRA, 4);

这是正确的,但速度非常慢。

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

谢谢, Alex。

2个回答

4

如果你有分别位于不同平面的YUV,并且没有进行色度下采样,则应该能够使用vImageMatrixMultiply_Planar8进行转换。


如何使用vImageMatrixMultiply_Planar8? - Allan

2

只有当你理解NEON代码的时候,它才是易如反掌的事情,但我不懂。 - Cthutu
我希望这篇文章以及系列中的下一篇能为您提供启示。http://blogs.arm.com/software-enablement/161-coding-for-neon-part-1-load-and-stores/ - Sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接