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

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

Я знаю, как использовать для этого графический процессор с помощью шейдера, и фактически уже делаю это для отображения моей основной плоскости видео. К сожалению, мне также нужно создавать и сохранять 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?) И мог бы порекомендовать одну, я был бы очень благодарен.

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

2 ответа

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

Все, что я сделал, было в Google 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, блог о поддержке ПО и т.д.

Другие вопросы по тегам