2012-03-30 10 views
5

Tengo una serie de módulos que deben procesar una transmisión de video en tiempo real. El enfoque simple sería tener un búfer de cuadros, desde donde los módulos toman las imágenes de video, procesarlas y luego eliminarlas.Múltiples búferes lógicos en una memoria intermedia de trama real

Problema n. ° 1: no todos los módulos funcionan a la misma velocidad. Algunos pueden procesar todos los marcos, otros no. Por lo tanto, algunos módulos no procesarán todos los marcos. Si espero a que todos los módulos terminen el trabajo antes de eliminar un buffer, los más rápidos se detendrán sin motivo (Figura A).

Una solución simple sería Figura B. Un buffer separado para cada módulo. Si el búfer está lleno, los marcos no se colocarán allí. Pero surge el problema nº 2: se desperdicia memoria: algunos cuadros tendrán múltiples copias en diferentes almacenamientos intermedios.

Una solución más inteligente sería un búfer físico, con más búfer lógico conectado, como en Fig C. Se agrega un marco en el búfer real cuando al menos un búfer lógico puede acomodarlo, y se borra un búfer real cuando se eliminan todos los búferes lógicos que lo vinculan. (Una solución de implementación simple viene dada por punteros inteligentes: agregue un puntero inteligente al búfer a todos los búferes lógicos que puedan acomodarlo) Problema n. ° 3: en el peor de los casos, puede suceder que cada fotograma se asigne a un módulo, y en lugar de compartir, que será un desordenado desventaja de volver a la Solución B.

pregunta

¿hay una mejor manera de hacer frente a este problema? Una respuesta estándar? ¿Una biblioteca de plantillas que lo implementa?

Editar Este mecanismo de alguna manera complicado de usar tampones, pero quitar fotogramas si el buffer está lleno, ofrece una solución escalable en diferentes plataformas: I procesar tantos cuadros como sea posible, independientemente de los módulos o el rendimiento del hardware.

enter image description here

+2

¿Por qué tiene colas si el sistema está diseñado para fallar (módulos que están diseñados para no poder mantener el ritmo completo)? Debe definir cómo desea que el sistema funcione si no hay tiempo para que finalicen todos los módulos. – blueshift

+0

El tiempo dedicado al procesamiento de cada cuadro no es constante, incluso en el mismo módulo. Tener una cola corta (2-3 cuadros) me permite cubrir las fluctuaciones en el tiempo de procesamiento sin perder demasiados cuadros. Pero si la velocidad de procesamiento es baja en promedio, debería poder saltar automáticamente algunos cuadros. – Sam

+0

tal vez no fui lo suficientemente claro: quiero que cada módulo procese tantos marcos como sea posible, sin conocimiento * a priori * sobre las prestaciones de cada módulo – Sam

Respuesta

3

Aquí son dos métodos que he visto en los sistemas de producción de video en tiempo real:

  1. similares a la opción A, almacenar una lista única de tampones, pero añaden dos conjuntos de banderas para cada buffer El primer conjunto de banderas especifica qué tareas deben realizarse en el búfer, y el segundo conjunto de banderas especifica qué tareas se han realizado. Cuando cada módulo esté listo, escaneará la lista de almacenamientos intermedios hasta que encuentre uno con el que pueda ayudar.

  2. Al igual que en la opción C, utilice múltiples fifos que contengan punteros a los datos de fotograma reales. Use reference counting para realizar un seguimiento de los marcos que aún están activos. Esto significa que cada vez que crea un nuevo puntero al cuadro, llama a una función para incrementar su recuento de referencias, y cada vez que ha terminado con el puntero llama a una función para disminuir el recuento de referencias. Los marcos se pueden reutilizar una vez que su recuento de referencia llega a cero.

En mi opinión, el primer método es más sencillo de implementar y es muy bien si usted tiene un pequeño número de tramas pendientes y un pequeño número de tareas de procesamiento, pero el segundo es más general y debería ser más fácil de escalar a un sistema más complicado.

Cuestiones relacionadas