Самое быстрое преобразование YUV420P в RGBA на iOS с использованием ЦП

Может ли кто-нибудь порекомендовать действительно быстрый API, идеально оптимизированный для NEON, для преобразования YUV в RGB во время выполнения на iPhone с использованием ЦП? К сожалению, vImage из ускоренного фреймворка не предоставляет ничего подходящего, а использование vDSP, преобразование в числа с плавающей запятой и обратно кажется неоптимальным и почти таким же трудоемким, как написание NEON.

Я знаю, как использовать GPU для этого через шейдер, и фактически уже делаю это для отображения моей основной видеоплоскости. К сожалению, мне также нужно создавать и сохранять текстуры RGBA подобластей дисплея во время выполнения. Большинство хороших ответов на этот вопрос связаны с шейдерами, но я не хочу использовать GPU для этой дополнительной работы, потому что:

(1) Хотя я мог бы использовать RenderTextures и свой шейдер YUV для преобразования и кэширования регионов, я не хочу добавлять дополнительную синхронизацию/сложность в приложение. (Я уже передаю текстуры из CVTextureCache в Unity3D... Во многих случаях я уже переключаю состояние с OpenGL за спиной Unity3D и не хочу больше заниматься отладкой...)

(2) На практике я пишу игру, и у меня нет лишнего графического процессора (как обычно нет в играх — за последние несколько лет я провел больше презентаций о том, как избавиться от графического процессора, чем о том, как положить вещи на него...)

(3) На iPad у меня лежит запасное ядро, ничего не делающее.

Хотя существует множество библиотек, которые преобразуют YUV в RGBA, я хотел бы сэкономить время на написании собственной версии NEON. Прямо сейчас я использую реализацию OpenCV следующим образом:

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

что правильно, но в конце дней медленно.

Если кто-то ранее рассматривал другие реализации (CoreImage? FFMpeg?) и может порекомендовать одну из них, я был бы очень признателен.

Спасибо, Алекс.


person Alex Ferrier    schedule 29.06.2012    source источник


Ответы (2)


Если у вас есть Y, U, V в разных плоскостях и нет понижающей дискретизации цветности, вы сможете использовать vImageMatrixMultiply_Planar8 для преобразования.

person Ian Ollmann    schedule 03.10.2012
comment
как использовать vImageMatrixMultiply_Planar8? - person Allan; 23.06.2018

Все, что я сделал, это погуглил 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, блог поддержки программного обеспечения и т. д.

person Sam    schedule 30.06.2012
comment
Это было бы просто, если бы вы понимали код NEON, чего я не понимаю. - person Cthutu; 21.07.2012
comment
Я надеюсь, что эта статья и следующие в этой серии помогут вам понять, blogs.arm.com/software-enablement/ - person Sam; 21.07.2012