Así, quería poder acelerar el video sin tener que tirar de cpu. Cuando tenía instalado windows xp en el HTPC lo intenté siguiendo varias guías y tutoriales y también con distintos programas, pero al final no fui capaz de conseguirlo. Desde que instalé Ubuntu en el HTPC la cosa ha cambiado. Mi placa base lleva integrada una ATI HD3200, que, aunque es algo modesta y para juegos seguro que se queda corta, permite acelerar vídeos en alta definición. Para ello vamos a utilizar las librerías VAAPI (Video Aceleration API) que son el equivalente para ATI de las famosas VDPAU de NVidia. Además, como no podría ser de otra forma, el reproductor será mplayer. Veamos cómo lo he conseguido.
Instalando el driver propietario de ATI
Utilizaremos la última versión de los drivers propietarios de ATI para Linux. En Ubuntu 10.04 sólo funcionan los drivers a partir de la versión 10.4. Por suerte, cuando salió la última versión de Ubuntu, en ATI se pusieron las pilas y al día siguiente ya habían liberado los drivers. Parece que por fin nos van teniendo en cuenta a los usuarios de Linux.
Actualmente la última versión disponible para mi tarjeta es la 10.7. La descargamos, en mi caso la versión de 64 bits, y la instalamos sin mayor complicación con:
$ sudo ./ati-driver-installer-10-7-x86.x86_64.run
Instalando las librerías VAAPI
Como hemos comentado, para conseguir la aceleración por GPU vamos a usar VAAPI. En la web http://www.splitted-desktop.com/~gbeauchesne/ nos tenemos que bajar las últimas versiones disponibles de: libva, libva-dev, libva-dbg y xvba-video
$ wget http://www.splitted-desktop.com/~gbeauchesne/libva/pkgs/amd64/libva-dev_0.31.1-1+sds4_amd64.debInstalamos los paquetes que acabamos de descargar:
$ wget http://www.splitted-desktop.com/~gbeauchesne/libva/pkgs/amd64/libva1-dbg_0.31.1-1+sds4_amd64.deb
$ wget http://www.splitted-desktop.com/~gbeauchesne/libva/pkgs/amd64/libva1_0.31.1-1+sds4_amd64.deb
$ wget http://www.splitted-desktop.com/~gbeauchesne/xvba-video/xvba-video_0.7.2-1_amd64.deb
$ sudo dpkg -i libva* xvba-video_0.7.2-1_amd64.deb
Compilando mplayer con soporte VAAPI
Aunque no es estrictamente necesario, sí es recomendable instalar primero la versión existente en los repositorios de Ubuntu. Así, el sistema sabrá que está instalado y nos permitirá instalar complementos como la interfaz gráfica SMPlayer.
Antes de poder compilar mplayer tendremos que descargar todas las librerías y paquetes xxxx-dev necesarios. Para ello ejecutamos lo siguiente. En mi caso se descargaron 112 paquetes, pero esto puede variar de un sistema a otro en función de lo que tengamos instalado previamente.
$ sudo apt-get build-dep mplayerAunque la compilación de mplayer puede parecer algo complejo, realmente es muy sencilla. Lo que realmente nos vamos a descargar es un script y unos parches para mplayer. Descargamos la última versión disponible en http://www.splitted-desktop.com/~gbeauchesne/mplayer-vaapi/.
$ wget http://www.splitted-desktop.com/~gbeauchesne/mplayer-vaapi/mplayer-vaapi-20100713.tar.bz2Ejecutamos el script que se encarga de todo. Descarga de los subversions las versiones adecuadas de mplayer, ffmpeg y dvdnav, las parchea y finalmente las compila. Si hemos ejecutado todos los pasos anteriores deberíamos tener todas las dependencias satifeschas y la compilación no debería fallar. Esperamos a que termine ya que tardará más o menos en función de la potencia de la máquina.
$ bunzip2 mplayer-vaapi-20100713.tar.bz2
$ tar xvf mplayer-vaapi-20100713.tar
mplayer-vaapi-20100713/
mplayer-vaapi-20100713/patches/
mplayer-vaapi-20100713/patches/mplayer-vaapi-gma500-workaround.patch
mplayer-vaapi-20100713/patches/mplayer-vdpau.patch
mplayer-vaapi-20100713/patches/mplayer-vaapi.patch
mplayer-vaapi-20100713/patches/mplayer-vaapi-0.29.patch
mplayer-vaapi-20100713/checkout-patch-build.sh
mplayer-vaapi-20100713/README.txt
mplayer-vaapi-20100713/NEWS
$ ./checkout-patch-build.shAhora tendremos un directorio llamado mplayer-vaapi en el que estará disponible nuestra propia versión de mplayer.
Probando a vídeos con aceleración y sin ella
Para hacer la prueba voy a utilizar un capítulo de Lost en 720p. Primero vamos a hacer una prueba sin acelerar ejecutando simplemente:
$ ./mplayer Lost.S06E01-02.720p.mkvSi ahora hacemos lo mismo pero utilizamos VAAPI vemos en la salida de mplayer que estamos usando las librerías para la aceleración.
...
VIDEO: [H264] 1280x720 0bpp 24.000 fps 0.0 kbps ( 0.0 kbyte/s)
==========================================================================
Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
Selected video codec: [ffh264] vfm: ffmpeg (FFmpeg H.264)
==========================================================================
Starting playback...
Movie-Aspect is 1.78:1 - prescaling to correct movie aspect.
VO: [xv] 1280x720 => 1280x720 Planar YV12
$ ./mplayer -vo vaapi -va vaapi Lost.S06E01-02.720p.mkvPara que se vea de una manera más gráfica la diferencia de consumo de CPU, con el comando pidstat tomé muestras del consumo de mplayer en ambos casos.
...
VIDEO: [H264] 1280x720 0bpp 24.000 fps 0.0 kbps ( 0.0 kbyte/s)
libva: libva version 0.31.1-sds1
Xlib: extension "XFree86-DRI" missing on display ":0.0".
libva: va_getDriverName() returns 0
libva: Trying to open /usr/lib/va/drivers/fglrx_drv_video.so
libva: va_openDriver() returns 0
==========================================================================
Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
[VD_FFMPEG] VA API accelerated codec.
Selected video codec: [ffh264] vfm: ffmpeg (FFmpeg H.264)
==========================================================================
VO: [vaapi] 1280x720 => 1280x720 H.264 VA-API Acceleration
[VD_FFMPEG] XVMC-accelerated MPEG-2.

Como vemos la diferencia en ambos casos del uso de CPU es brutal, algo esperado porque quien realmente está decodificando el vídeo en el caso de VAAPI es la GPU.
Finalmente, copiamos mplayer a su ubicación definitiva para poder ejecutarlo desde cualquier sitio. Con esto reemplazaremos los binarios que instalamos desde los repositorios.
$ sudo make install
install -d /usr/local/bin /usr/local/etc/mplayer /usr/local/lib
install -m 755 -s mencoder /usr/local/bin
install -d /usr/local/share/man/man1
install -m 644 DOCS/man/en/mplayer.1 /usr/local/share/man/man1/
cd /usr/local/share/man/man1 && ln -sf mplayer.1 mencoder.1
install -m 755 -s mplayer /usr/local/bin
Automatizando los parámetros de mplayer
Ahora ya sabemos cómo acelerar los vídeos por hardware pero es una tarea un poco pesada tener que pasar todos los parámetros de mplayer para cada vídeo. Además, en mi caso, no estoy utilizando la salida de audio mini-jack de la placa base, sino que uso la salida óptica S/PDIF. Para conseguir que mplayer saque el audio por ese conector, también debemos indicárselo.
Mostramos un listado de los dispositivos hardware capaces de reproducir audio para ver cual es que nos interesa.
$ aplay -lAsí, debemos ejecutar mplayer indicando la tarjeta y el dispositivo que queremos utilizar para sacar el audio. Adicionalmente también le forzamos el audio AC3:
**** List of PLAYBACK Hardware Devices ****
card 0: SB [HDA ATI SB], device 0: ALC889A Analog [ALC889A Analog]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: SB [HDA ATI SB], device 1: ALC889A Digital [ALC889A Digital]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: HDMI [HDA ATI HDMI], device 3: ATI HDMI [ATI HDMI]
Subdevices: 1/1
Subdevice #0: subdevice #0
$ mplayer -ao alsa:device=hw=0.1 -ac hwac3 -vo vaapi -va vaapi pelicula.mvkSi hubiera querido que el audio saliera directamente por el conector HDMI que va a la tele, las opciones que tendría que haber puesto en mplayer serían: -ao alsa:device=hw=1.3
Esto cada vez crece más. Si antes teníamos que poner las opciones para el soporte vaapi, ahora adicionalmente tenemos que poner también la salida por S/PDIF. Para nuestra comodidad podemos añadir todas estas opciones al archivo de configuración de mplayer.
$ cat /home/ivan/.mplayer/configDe esta sólo tenemos que ejecutar
# Write your default config options here!
# Salida por S/PDIF
ao=alsa:device=hw=0.1,
# Forzar audio a AC3
ac=hwac3
# Aceleración HW
vo=vaapi
va=vaapi
$ mplayer pelicula.mkvy tendremos la salida de audio por S/PDIF y la aceleración por hardware habilitada.
¿Y por qué no usar VLC?
Hace un par de semanas se ha liberado la versión 1.1.1 de VLC con soporte VAAPI. Si queréis instalarlo podéis seguir estas instrucciones. Simplemente consiste en añadir un nuevo repositorio e instalar VLC desde él. Aún así esta versión no está compilada con soporte VAAPI. También nos podemos descargar una versión con el soporte vaapi habilitado, pero según podemos leer en el enlace anterior, se "romperán" el resto de reproductores de video y paquetes que utilicen la versión de ffmpeg de los repositorios de Ubuntu. La única solución sería recompilarlos todos contra la nuevas versión de ffmpeg.
Now, regarding vaapi (GPU acceleration): you basically can't compile VLC 1.1.0 with vaapi support without breaking stuff. To get it to work with vaapi, it would need newer ffmpeg packages which would mean every package using the ffmpeg packages in the Ubuntu official repository would be broken unless it is compiled against the same ffmpeg package (so you would need to either compile every package that uses ffmpeg yourself or a PPA should package all these packages - which is practically impossible).Así que nada. Tendremos que esperar a que se actualicen todos los programas de los repos antes de poder probar la aceleración hardware con VLC.
There is a PPA which packages VLC 1.1.0 with vaapi support as well as fixed mplayer to work with the new ffmpeg/gstreamer. But since this PPA only has VLC and mplayer, it means that other video players / video editors will stop working if you use the following PPA and for this reason I won't post instructions for installing it here. You can however find both the PPA and exact instructions for installing VLC 1.1.0 with vaapi support, HERE. Remember: using it, a lot of applications will be broken! Also, the VLC package in the Cutting Edge Multimedia PPA (not the C-Korn PPA we posted in the begining of the post - that's stable and doesn't break anything!) doesn't yet have the latest VLC 1.1.0 but a GIT version dating back to June 16 - that's still very close to the final version.
Conclusiones
Sabía que acelerar los vídeos por GPU iba a suponer que la CPU prácticamente estuviera descansando, aún así el resultado me ha sorprendido gratamente. Además, por fin parece que ATI proporciona unos drivers que funcionan en Linux. Son propietarios y cerrados y sería estupendo que fueran libres, pero al menos, los que decidimos apostar por ATI y Linux no nos sentimos abandonados como hace unos años cuando ATI en Linux era sinónimo de problemas y quebraderos de cabeza. Aún recuerdo cuando monté mi ordenador "de sobremesa" hace ya más de tres años, que elegí una NVidia sin dudarlo por la multitud de problemas que había con ATI en Linux. En fin, los tiempos cambian, por fortuna a mejor, para los usuarios de Linux :-).