1. Clasifique si necesita MIPS bajo o complejidad baja en general
Permítaseme un poco de libertad para dividir este problema en dos partes.
- Codificación de baja complejidad, que permite menores recursos (especialmente en la memoria) para hacer que la codificación responda rápidamente en el sistema dado.
- Bajo explícito en computación (MIPS). - que solo se refiere a los mínimos ciclos de CPU posibles.
Hay un tercer criterio, en el que las personas hablan de "baja latencia", para aplicaciones como la videoconferencia donde los recursos computacionales pueden no ser motivo de preocupación, pero el retraso general introducido por el código
Es importante tener en cuenta que en los sistemas de menor complejidad: el acceso a la memoria (velocidad y ancho del bus de memoria) y, a veces, IO son, en general, extremadamente más lentos, por lo que la clase de algoritmos MPEG sufre aunque el algoritmo computacional podría ser simple.
Antes de emitir un juicio sobre el requisito del códec, debe intentar hacer un presupuesto en términos de:
a. Ciclos de CPU por segundo.
si. Máxima memoria a través de put.
C. Latencia IO
2. Debe personalizar MPEG en lugar de reinventar.
En general, la clase de códecs MPEG le ofrece mecanismos muy flexibles para hacerlo. En ese sentido, no tiene que reinventar el códec tanto como preferiría personalizar MPEG 2 o MPEG 4 para realizar su trabajo.
En primer lugar, digamos qué elementos hacen posible la compresión y organícelos en el orden de complejidad:
- Estimación de movimiento y compensación de movimiento. 1.a. Predicción directa (tramas P) 1.b. Predicción doble (cuadros B) 1.c. vectores de movimiento de alta resolución
- Intra codificación - DCT (+ IDCT)
- Qunatización - y selección del modo codificador
- VLC: codificación de longitud variable. (CABAC en H.264)
- Predicción coeficiente [En mpeg2 solo predicción DC- MPEG4 tiene más]
En la clase de algoritmos MPEG, la codificación basada en DCT y VLC se vuelven bastante obligatorios sin mucha elección, pero el resto de todos los mecanismos son muy esenciales.
Por ejemplo, la estimación de movimiento y la compensación de movimiento es uno de los elementos que más consumen MIPS. Si no tiene recursos para hacer esto, simplemente puede codificar todos los cuadros como cuadros I (lo que lo hace muy parecido a MJPEG), pero el decodificador MPEG estándar puede decodificar esto). Si puede permitirse un poco más de recursos (puede hacer una compensación de movimiento trivial usando la diferencia de cuadro), en lugar de enviar cada cuadro como Intra, puede restar cada blcok de su bloque de cuadro anterior; Si la diferencia es mayor que la señal original, envíela como Intra.
Por supuesto, todo esto significaría que perderá la eficiencia prometida por el codificador anterior, ¡pero creo que está dispuesto a renunciar a eso!
EDITAR:
Puede ver los siguientes códecs como buenos puntos de referencia:
MSSG: http://www.mpeg.org/MPEG/video/mssg-free-mpeg-software.html
Bueno para comprender, pero podría ser el más lento del mundo.
FFMPEG: http://ffmpeg.org/
Probablemente el más rápido del mundo. Es bueno comenzar como un cuadro negro, pero no intente cambiar el código desde adentro. Podría darle buenas opciones para controlar cosas cuando usa la API de la biblioteca. Ya está portado en muchas plataformas, pero hacerlo en una nueva podría ser una tarea.
FAME: http://fame.sourceforge.net/
Esto se inició originalmente con el mismo propósito que usted describió. Sin embargo, estoy un poco fuera de contacto con esto, pero puedes probar esto.
Xvid: http://www.xvid.org/
Esto es MPEG-4. Este es uno de los mejores equilibrios entre código limpio y velocidad razonable. Debería ser más fácil trabajar con él si termina viviendo dentro del codificador.
JPEG: http://www.ijg.org/
Esto es JPEG. Esta es una de las mejores bibliotecas para portarla a través de plataformas. Además, JPEG es inherentemente más simple que algunos aspectos de MPEG, por lo que es posible que deba probar esto primero. La mayoría de las cámaras del mundo probablemente hayan usado esta biblioteca tal como está, ¡en lugar de crear algo propio!
Puede ser que estoy equivocado al usar MPEG! Pero ese es un tipo de riesgo que vale la pena correr.
Probablemente la mejor medida para verificar si eso funcionará o no es, solo intente tomar un DCT 8x8 estándar con cuantización en su imagen; optimizar solo esto. Si puede acercarse a su requisito de tiempo real, entonces creo que es bueno hacerlo con todos los fotogramas JPEG o todos los códecs MPEG I cuadros. Si estás lejos del objetivo, entonces no vale la pena.