2012-06-29 27 views
7

¿Alguien puede recomendar una API realmente rápida, idealmente optimizada para NEON para hacer la conversión de YUV a RGB en tiempo de ejecución en el iPhone usando la CPU? La vImage de accelerate framework no proporciona nada adecuado, lamentablemente, y el uso de vDSP, la conversión a flotadores y la copia de seguridad parece ser un trabajo subóptimo y casi tanto como escribir NEON yo mismo.Conversión más rápida de YUV420P a RGBA en iOS usando la CPU

Sé cómo usar 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 guardar texturas RGBA de subregiones de la pantalla en tiempo de ejecución. La mayoría de las buenas respuestas a esta pregunta involucran sombreadores, pero no quiero usar la GPU para ese trabajo adicional, porque:

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

(2) Más prácticamente Estoy escribiendo un juego, y no tengo ninguna GPU de sobra (como generalmente no lo hacen los juegos). He dado más presentaciones sobre cómo sacar cosas de la GPU en los últimos años que sobre cómo ponerle las cosas. ..)

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

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

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

que es correcto, pero al final de los tiempos es lento.

Si alguien ya ha analizado otras implementaciones (CoreImage? FFMpeg?) Y puede recomendar una, le agradecería inmensamente.

Gracias, Alex.

Respuesta

2

único 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

A medida que el estado de los comentarios, sigue siendo difícil, y puede que tenga que adaptarse para convertir a RGBA, pero eso sería un no Brainer

Por lo que yo sé, no debería ve otras funciones similares publicados en los blogs NEON - comprobar Hilbert-espacio, webshaker, blog de software de habilitación de brazo, etc

+0

Solo sería pan comido si entendieras el código NEON, que yo no entiendo. – Cthutu

+0

Espero que este artículo y los siguientes de la serie lo iluminen http://blogs.arm.com/software-enablement/161-coding-for-neon-part-1-load-and-stores/ – Sam

4

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

Cuestiones relacionadas