Conversión más rápida de YUV420P a RGBA en iOS usando la CPU

¿Alguien puede recomendar una API realmente rápida, idealmente optimizada para NEON para hacer la conversión de YUV a RGB en time de ejecución en el iPhone usando la CPU ? La image de aceleración de vImage no proporciona nada adecuado, lamentablemente, y el uso de vDSP, la conversión a flotadores y la espalda parece subóptima y casi tanto trabajo como escribir NEON.

Sé cómo utilizar la GPU para esto a través de un sombreador, y de hecho ya lo hago para mostrar mi plano de video principal. Desafortunadamente, también necesito crear y save texturas RGBA de subregiones de la pantalla en time de ejecución. La mayoría de las buenas respuestas a esta pregunta incluyen sombreadores, pero no quiero usar la GPU para ese trabajo adicional, porque:

(1) Aunque podría usar RenderTextures y mi sombreador YUV para convertir y almacenar en caching las regiones, no quiero agregar más synchronization / complejidad a la aplicación. (Ya paso las texturas de un CVTextureCache a Unity3D … Estoy cambiando el estado de OpenGL detrás de Unity3D en muchos casos y ya no quiero hacer más debugging …)

(2) Más prácticamente estoy escribiendo un juego, y no tengo ninguna GPU para sobra (como los juegos generalmente no lo hacen), he dado más presentaciones sobre cómo sacar cosas de la GPU en los últimos años que cómo hacerlo poner cosas en él …)

(3) En el iPad, tengo un núcleo de repuesto sentado allí sin hacer nada.

Si bien hay muchas bibliotecas por ahí que harán YUV a RGBA, me encantaría ahorrar el time de escribir mi propia versión NEON. En este momento estoy usando la implementación de OpenCV así:

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

que es correcto, pero lento al final de los días.

Si alguien ha mirado previamente otras implementaciones (CoreImage? FFMpeg?) Y puede recomendar una, estaría enormemente agradecida.

Gracias, Alex.

Si tiene Y , U , V en planos separados y no hay un downsampling de chroma, entonces debería poder usar vImageMatrixMultiply_Planar8 para hacer la conversión.

Todo lo que hice fue a google yuv rgb neon y esto es lo que encontré: https://code.ros.org/trac/opencv/browser/trunk/opencv/android/android-jni/jni/yuv2rgb_neon.c?rev= 4083

Como dicen los comentarios, todavía es difícil, y es posible que tengas que adaptarlo para convertirlo a RGBA, pero eso sería una obviedad.

Por lo que yo sé, debería haber otras funciones similares publicadas en los blogs de NEON: compruebe hilbert-space, webshaker, blog de activación de software de armado, etc.