Creación de documentación con Doxygen

Con el fin de facilitar la evaluación del proyecto, además de que era algo que había que hacer tarde o temprano, se ha incluido un fichero de configuración de Doxygen, para que en caso de desearlo se pueda generar documentación para la API. Como se indica en el README.md, hay que instalar Doxygen y graphviz, y mediante el comando make doxygen, se generará la documentación en HTML automáticamente. Dicha documentación se encuentra en doc/doxygen/ y basta con abrir el index.html con el navegador. Desgraciadamente, no he ido añadiendo los comentarios pertinentes al código, por lo que no se generan las descripciones de las clases y de los métodos

Anuncios

Conclusiones

Hoy, día 1 de abril de 2019, se acaba el período de desarrollo de los proyectos del Consurso Universitario de Software Libre (CUSL), por lo tanto, creo que es oportuno escribir un artículo relatando mi experiencia desarrollando “Zuazo”. El proyecto está lejos de estar acabado, pero ya presenta algunas funcionalidades que iré contando a lo largo de este post.

¿Cómo surgió la idea?

Aunque llevo muchos años siendo usuario de Linux, hasta el año pasado, mis conocimientos sobre programación eran muy básicos. Sin embargo, el año pasado, al comenzar la universidad, se me vino el “gusanillo” de la programación en la asignatura “Programación I”, donde se daban unas pinceladas al lenguaje de programación “C”. Nada más terminar la asignatura, comencé a “juguetear” manipulando imágenes con “C” y diversas librerías, y poco después comencé a desarrollar un mezclador de vídeo basado en esas librerías, que pretendía que fuera controlada por red con un Arduino. Sin embargo, tardé poco en darme que cuenta de que dichas librerías no eran capaces de trabajar en tiempo real, por lo que tenía que cambiar a otras. Existían otras APIs más adecuadas para dicha tarea: GStreamer y Media Lovin’ Toolkit (MLT), teniendo cada una como buque insignia, los editores de vídeo Pitivi y Kdenlive , respectivamente.

Sin embargo los dos seguían teniendo sus inconvenientes. Por un lado, GStreamer presenta una gran curva de aprendizaje, ya que se trata de una API para C. por otra parte, aunque los dos soportan efectos acelerados por hardware, estos efectos son muy limitados, por lo general se tratan de efectos de corrección de color, y similares, pero presentan pocas funcionalidades de composición. Por eso me lancé a la piscina y comencé un proyecto similar desde 0, pero con énfasis en la aceleración por hardware, y en la sencillez. Y así surgió Zuazo.

Desarrollo

Me pasé bastante tiempo haciendo un sistema de “ruteo” de señales que fuese fácil de usar y además “future-proof” ya que tarde o temprano planeaba añadir soporte para audio. Finalmente me decanté de un sistema de “pads” similar al de GStreamer. También le dedique mucho tiempo a crear un subsistema de temporización de eventos (actualizaciones de fotogramas). Sin embargo, ya estoy descontento con el y está pendiente de ser reescrito.

Mientras tanto también me dedique a aprender a usar la API de OpenGL, que aunque dentro de su categoría es la más sencilla, no me resultó -y me sigue sin resultar- fácil de aprender.

Después comencé a codificar la primera -y de momento única- forma de sacar video desde Zuazo, mediante una ventana. Dado que se trata de una incorporación antigua, hay muchas cosas que me descontentan, por lo que también está pendiente de recibir un cambio, sobre todo en la implementación de sacar video en pantalla completa

Más tarde me puse a codificar diversas entradas de video. Aunque algunas fueron más fáciles que otras, he de destacar por su dificultad las entradas desde FFmpeg y V4L2. En el caso de FFmpeg, había mucha documentación obsoleta, ya ésta sufre frecuentes cambios en la API. En el otro caso, en el de V4L2, la documentación me resultó escasa.

Finalmente, la semana pasada, comencé a codificar un compositor de imágenes, que sirve para combinar diversas fuentes de video en una sola. Esta clase sigue en desarrollo, aunque ya hay 2 ejemplos basados en él.

Estado actual

A fecha de hoy, existen 4 ejemplos sobre el uso de la librería, que aunque no abarcan la mayoría de las funcionalidades, pueden ser útiles como “getting-started”.

La primera de ellas enseña como se encaminan las señales. La segunda de ellas enseña el uso de la clase “NonLinear” mediante una fuente de FFmpeg. Ésta puede ser rebobinada, reproducida en distintas velocidades, hacia atrás, ir fotograma por fotograma, etc..

El tercero emplea el compositor para colocar en puntos aleatorios del espacio fuentes aleatorias de imágenes con un tamaño y rotación, adivinad, pues sí, aleatorios. En definitiva, no un premio en diseño gráfico

Ejemplo 3 recibiendo como entradas la película Big Buck Bunny y dos cámaras web

Por último el cuarto ejemplo enseña como crear clases a partir de clases de Zuazo que realicen funciones arbitrárias. En este se crea una clase llamada “SideBySide” que encapsula el compositor de forma ésta sólo sirva para mostrar 2 fuentes de video lado-a-lado sobre un fondo. Las 2 fuentes laterales presentan una inclinación hacia el centro (ver imágen)

Ejemplo 4 mostrando una cámara web (izda.), la película Big Buck Bunny (dcha) y un VJ Loop (Fondo)

Cosas que echo de menos en Zuazo

Hay muchos objetivos que no podré realizar dentro del plazo del CUSL, pero espero que se incorporen tarde o temprano (no siguen un orden en concreto):

  • Efectos basados en shaders de fragmento (correción de color, desenfoques…)
  • Añadir clase que realice “keying” por luminancia, crominancia, lineal, basado en formas geométricas…
  • Terminar de implementación de la clase “Compositor” (queda mucho trabajo)
  • Añadir más tipos de salida (ej. fichero de video, streaming…)
  • Reescribir la clase que controla el temporizado
  • Crear documentación (ahora casi inexistente)
  • Animaciones
  • Muchos más cambios que ahora no me vienen a la cabeza…

Estabilidad

Aunque por lo general no he tenido muchos problemas de estabilidad, las pruebas que le he hecho dejan mucho que desear. Aún así no han sido pocas las ocasiones en los que un deadlock o una lectura de memoria restringida se han manifestado. Las veces que he podido detectar el problema, han sido solucionado, pero probablemente haya unos cuantos bugs de este tipo por ahí

Conclusión

Zuazo ha sido y sigue siendo una buena manera de matar parte de mi tiempo libre. Aunque como habréis podido observar ya hace algunas “cosillas”, no está listo para ser usada en una “aplicación de verdad”

Estado actual del proyecto

Desde este martes, “Zuazo” ya es una librería compartida (shared library) como tal. Hasta ahora se compilaba de forma estática con un fichero que incluía el main(), donde realizaba distintas pruebas para comprobar el correcto funcionamiento de las componentes. Ahora se ha creado un fichero CMake que permite compilar e instalarla en el sistema.

También se ha añadido al README.md un breve fragmento que indica como se puede instalar “Zuazo” en Debian 10. En breve espero comprobar su correcto funcionamiento en Ubuntu 18.04 LTS, y corregir posibles fallos de compilación en este.

Por último decir que se han publicado 2 ejemplos sobre el uso de la librería. El primer ejemplo consiste en un sencillo programa que recibe como parámetros una serie de entradas de video y saca una de ellas por pantalla (se puede cambiar de una a otra por teclado). El segundo, consiste en un simple reproductor de vídeo, nuevamente controlada por teclado. Aunque ninguna de ellas es de gran utilidad práctica, sirven para mostrar cuál es la dinámica a la hora de usar “Zuazo”

Presentación

¡Hola! En primer lugar me presento: soy Oier Lauzirika Zarrabeitia. Soy de Gernika-Lumo (Bizkaia), aunque actualmente por motivos académicos me encuentro en Madrid. Estudio Ingeniería de Imagen y Sonido en la ETSI de Sistemas de Telecomunicación de la Universidad Politécnica de Madrid.

En este blog pretendo contar mi experiencia desarrollando el proyecto de software libre “Zuazo”, una librería que permitirá manipular video en tiempo real empleando aceleración por GPU. Me presento con él al Concurso Universitario de Software Libre (CUSL)

Empecé a desarrollar este proyecto en diciembre, por lo que no comienzo desde “cero” para el concurso, aunque a día de hoy, el estado de desarrollo es muy primitivo.