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.
¿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
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
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