LongoMatch:The Digital Coach

Archive for the ‘GStreamer’ Category

We are glad to announce the release of GStreamer-Winbuilds 0.10.3.

The changes for this release are listed below:

  • Updated gst-plugins-ugly to 0.10.11
  • Updated gst-plugins-bad to 0.10.11
  • Updated gst-ffmpeg to 0.10.7
  • Added OpenGL support
  • Added XML support
  • Added gstcdda
  • Added gstfft
  • Added gstspeex plugin
  • Added gstpng plugin
  • Added gstalpha plugin
  • Added gstspectrum plugin
  • Added gstequalizer plugin
  • Added gstflv plugin
  • Added gstcairo plugin
  • Added gstmpegdemux2 plugin (mpegtsparse element)

You can download it from the GStreamer-Winbuilds wiki
(http://www.gstreamer-winbuild.ylatuya.es/doku.php?id=download)

The GStreamer-Winbuilds Team.

Después del éxito que ha tenido el sub-proyecto GStreamer-WinBuilds en la comunidad de desarrolloadores de GStreamer, he decido presentarlo al Google Summer of Code. Mi propuesta es trabajar junto con el equipo de GStreamer para facilitar el desarrollo de GStreamer en Windows, lo cual pasa por 3  importantes puntos:

  1. Automatizar la creación de un  entorno de compilación con todas las depencias externas del proyecto GStreamer para facilitar la compilación de los plugins externos a GStreamer.
  2. Portar todos los proyectos existentes de Visual Studio a Code::Blocks, un IDE multiplataforma y de Software Libre, para no depender de Visual Studio
  3. Finalizar el trabajo empezado con GStreamer-WinBuilds y crear un instalador con todos los plugins existentes en GStreamer.

Ahora sólo falta que el equipo de GStreamer lo considere de interés!

Hace unas semanas ffmpeg anunciaba una nueva versión oficial, la 0.5, lo cual es una estupenda noticia teniendo en cuenta que la última versión databa de la era prehistórica. Estos últimos años el equipo de ffmpeg mantenía la rama trunk de desarrollo “estable”, de tal forma que compilar la última versión de ffmpeg era compilar la última revisión del repositorio. Parece ser que han cambiado de política y van a volver a lanzar una nueva versión de forma periódica, lo cual, en mi opinión, es una excelente idea.

La última actualización del módulo ffmpeg de GStreamer utiliza esta versión, la 0.5, y no puede usarse ninguna revisión posterior por los cambios introducidos en avutil. Como siempre, he descargado el tarball y me he puesto a compilar…. Todo perfecto, pero a la hora de ejecutar me salta un horrible error:

“The application failed to initialize properly (0xc00000005). Click OK to terminate the application”

Esto supone un gran contratiempo, ya que no podré incluir la actualización de este módulo en GStreamer-WinBuilds. Además, a primera vista, es un error al que no se le puede dar suloción
Indagando en las listas de correo de ffmpeg, resulta que el enlace dinámico con avutil y avcodec está roto en Windows, por lo que sólo se puede enlazar estáticamente con dichas librerías. Esta noche intentaré configurar el proyecto gstffmpeg de Visual Studio para enlazar estáticamente utilizando las librerías de MinGW.

El termino DLL Hell se refiere a los problemas ocasionados por las dll en Windows. El “infierno” ocurre cuando:

  • Una instalación sobreescribe una biblioteca con otra versión, dejando en algunos casos los porgramas que enlazaban con ella inservibles.
  • Una desintalación borra una biblioteca compartida.

El DLL Hell se ha intentado corregir por parte de Microsoft con los “side-by-side  assemblies”  (SxS) que permiten a una aplicación selecionar una versión específica de una dll.  En que consiste esto? Pues tiene una fácil explicación: en el manifest de la aplicación se especifica la dll que vamos a usar y su versión, de tal forma que cuando se vaya cargar dicha dll, se buscará el ensamblado con la versión especificada en el manifest. El problema es que se buscan las dll’s en un caché de ensamblados y si no está, la aplicación muere al no poder cargarla. Ahora ya no se puede simplemente copiar esa dll a cargar en el directorio en el que está el ejecutable (esto daría lugar al famoso DLL Hell), sino que tiene que estar registrada en el caché

Esto deriva en nuevo problema: el Manifest Hell. ¿Qué pasa si compilamos una aplicación con VC2008, enlazando con el CRT de Windows, es decir, con msvcr90.dll? La aplicación tendrá un manifest de este tipo:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level='asInvoker' uiAccess='false' />
</requestedPrivileges>
</security>
</trustInfo>
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
</dependentAssembly>
</dependency>
</assembly>

Cómo se observa en la sección dependentAssembly, la aplicación buscará el ensamblado Microsoft.VC90.CRT de versión 9.0.21022.8 , el cual no se distribuye en por defecto en ningún sistema operativo de Windows. ¿Esto quiere decir que si compilo una aplicación con VC2008  no la puedo ejecutar en culauiqer máquina? La respuesta es NO, NO SE PUEDE. Este problema ha sido todo un infierno, de ahí el nombre Manifest Hell, en el despliegue de LongoMatch (y más específicamente de GStreamer) y me ha llevado un muchos de quevraderos de cabeza estos últimos meses. La solución de Microsoft es instalar en la máquina objetivo el Microsoft Redistributable Package, lo cual me parece una solución poco elegante al tener que recurrir a otro instalador.

El problema es que mi aplicación usa  GStreamer, cuyos binarios tengo que compilar con VC2008 (GStreamer no proporciona binarios para Windows y cada uno tiene que hacerlo a su manera, lo cual ha derivado en nuevo proyecto que está teniendo muy buena acogida en la  comunidad GStreamer).  La solución es más simple de lo que parece, pero estando muy mal documentada fué muy difícil de encontrar.

Antes he comentado que la busqueda de ensamblados se realiza en una caché de ensamblados SxS, pero existe una forma de distribuir copias privadas. Consiste en copiar el contenido de la capeta %PROGDIR%\Microsoft Visual Studio 9.0\VC\Redist\x86\Microsoft.VC90.CRT a la carpeta bin\ de nuestro programa. De esta forma, al lanzar el ejecutable principal y buscar el ensamblado Microsoft.VC90.CRT, encontrará en su directorio de ejecución una carpeta de nombre Microsoft.VC90.CRT con el contenido del ensamblado. Si la versión buscada coincide con la especificada en el manifest cargará la dll con éxito.

Problema Solucionado!

The GStreamer project doesn’t provide  any updated  binary package for Windows and if you want to develop an application based on GStreamer  for this OS you have to build them by yourself.

That why we have created the GStreamer WinBuilds project which goal is to provide precompiled GStreamer binary packages for Microsoft Windows, including a large collection of encoding/decoding plugins.

This project is based on  OABuild, but with a different approach in the way of adding external plugins. Rather than trying to compile all the external dependencies with the MSVC toolchain (ffmpeg, libxvid, libx264, liba52, etc…) , which not always possible,  we compile them using Mingw/Msys linking the gstreamer plugins to these libraries.

The changes we made so far are:

  • Added ffmpeg plugin with full codec support
  • Added gstvolume plugin.
  • Added gstmad plugin.
  • Added gstasfdemux plugin.
  • Added gstlame.
  • Removed  Direct Show wrapper to use the ffmepg plugin for all the decoding stuff.
  • Added gstxvid plugin.
  • Added gstmpeg2decoder plugin.
  • Added gstmpegstream plugin.
  • Added gstresindvd plugin.
  • Added gstfaad plugin.
  • Added gstfaac plugin.
  • Added gstdvdspu plugin.
  • Adde gsta52 plugin.
  • Added gstmpeg4parse plugin.
  • Added gstqtdemux plugin.

Find out more at the  GStreamer Winbuilds Wiki

Uno de los principales objetivos de LongoMatch es demostrar que hoy por hoy se puede crear una aplicación multimedia multiplataforma utilizando única y exclusivamente herramientas de Software Libre. Para ello escogí como framework multimedia GStreamer un gran conocido en el mundo GNU/Linux pero que apenas se ha dado a conocer en Mac y Windows debido a la existencia de Direct Show y QuickTime.

Lo que muchos proyectos hacían hasta el momento era desarrollar un backend para cada  SO, lo que representa un gran trabajo ya que se deben mantener tres a la vez para el caso Windows/Mac/Linux. El enfoque de LongoMatch es totalmente distinto ya que se usa el mismo backend para todas las plataformas. Junto con Songbird y el media center Elisa, LongoMatch es uno de los primeros proyectos en apostar por GStreamer como framework único.

Uno de los grandes problemas de GStreamer es que no proporciona binarios ni para Windows ni para Mac de ahí que cada uno se las tenga que apañar por si mismo. Ante este problema he creado dos nuevos proyectos GStreamer WinBuilds y GStreamer MacBuilds para crear un instalador en esas plataformas que nace de las necesidades de LongoMatch para ser multiplataforma. Para ambos cuento con la colaboración de  Andrés Colubri, estudiante argentino de la Universidad de California de Los Angeles (UCLA).

GStreamer WinBuilds

La compilación de GStreamer en windows está basada en el método OABuild que proporciona un entorno para compilar GStreamer usando Visual Studio. El problema de OAbuild es que los binarios que genera no son funcionales del todo por que le faltan mucho plugins esenciales por intentar compilar todas las dependencias externas con MSVC. Lo que hice fue compilar estas dependencias (ffmpeg, libxvid, libx264, liba52, etc…) usando Mingw/Msys y enlazando el compilado de windows con las librerías generadas.

Los cambios que he realizado hasta la fecha son:

  • Added ffmpeg plugin with full codec support
  • Updated Glib to 2.18
  • Added volume plugin
  • Added libmad plugin
  • Added asfdemux plugin.
  • Added lame plugin
  • Removed  Direct Show wrapper and use the ffmepg plugin for all the decoding stuff.
  • Added xvid plugin.
  • Added the mpeg2decoder.
  • Added mpegstream plugin.
  • Added resindvd plugin.
  • Added libfaad plugin.
  • Added libfaac plugin.
  • Added libdvdspu plugin.
  • Adde liba52 plugin.
  • Added mpeg4parse plugin.
  • Added qtdemux plugin.

En la forja están colgados los instaladores para XP y Vista.

GStreamer MacBuilds

Este proyecto está basado en Macports. El problema original de Macports es que compila unos cambios pulgins con dependencias con Gtk+, lo cual nos genera unas depencias finales de varios megas. La ide es suprimir estos plugins, que no son esenciales, para obtener unos binarios finales con las minimas dependencias finales a fin de empaquetar todo en un instaldor de no más de 50 megas.

Este proyecto está todavía en su fasis de análisi y diseño pero las pautas a seguir serán:

  1. Localizar los plugins que dependan de gconf y de gnome-vfs
  2. Crear un repositorio local de portfiles (http://guide.macports.org/#development.local-repositories)
  3. Modificar los portfiles de gstreamer y gst-plugins-* suprimiendo las dependencias a gconf y gnome-vfs que a su vez dependen de GTK+
  4. Modificar los portfiles de gstreamer y gst-plugins-* suprimiendo los plugins que dependan de gconf y gnome-vfs  en “configure.args” (por ejemplo añadiendo –disable-gnomevfssink)
  5. Crear el instalador (http://guide.macports.org/#using.binaries.binary-packages)

Pasada ya la primera gran iteración del desarrollo de LongoMatch, que va a dar por concluida la versión 1.0, estoy ya desarrollando importantes mejoras para el programa pensando en la siguiente versión.

Hasta el momento he conseguido un sistema estable que actualmente cumple con todos los requisitos que fijé para la primera version. Es hora de ir pensando en nueva mejoras y una de las más importantes es crear un capturadora de vídeo para poder realizar análisis de partidos en directo. De momento LongoMatch sólo puede trabajar con archivos locales por lo que el análisis debe esperar a que finalice el partido. Con esta mejora se pretende que se pueda visualizar y capturar la salida de una cámara digital de tal modo que el análisis sea instantáneo.

Ya he implementado la capturadora usando GStremer y me faltan realizar algunas pruebas mas para integrarlo en el sistema. Aquí dejo una captura del monstruito funcionando!!!

Capturadora de video multiplataforma basada en GStreamer

Capturadora de video multiplataforma basada en GStreamer


Descripción del proyecto

LongoMatch es un proyecto de Software Libre que proporciona una serie de herramientas para el análisis por vídeo. Está enfocado al deporte y ayuda a entrenadores y ténicos a realizar estudios de acciones a través del vídeo, permitiendo localizar y agrupar por categorías diferentes segmentos de una grabación para facilitar su posterior análisis. Su uso puede llegar a ser más genérico, pudiendo ser utilizado para realizar resúmenes de conferencias, estudios de películas o cualquier actividad que consista en localizar y estudiar partes concretas de una grabación. Para más información, visitad la página web del proyecto: www.ylatuya.es