【问题标题】:Fastest YUV420P to RGBA conversion on iOS using the CPU使用 CPU 在 iOS 上最快的 YUV420P 到 RGBA 转换
【发布时间】:2012-07-01 08:00:42
【问题描述】:

谁能推荐一个非常快速的 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?)并能推荐一个,我将非常感激。

谢谢, 亚历克斯。

【问题讨论】:

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


    【解决方案1】:

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

    正如 cmets 所说,它仍然很粗糙,您可能需要对其进行调整以转换为 RGBA,但这很容易。

    据我所知,NEON 博客上应该还有其他类似的功能 - 查看 hilbert-space、webshaker、arm 软件启用博客等

    【讨论】:

    • 如果您理解 NEON 代码,那将是一件很容易的事,而我不知道。
    • 希望这篇文章和系列的下一篇文章能给你带来启发blogs.arm.com/software-enablement/…
    【解决方案2】:

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

    【讨论】:

    • 如何使用 vImageMatrixMultiply_Planar8 ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多