domingo, 1 de agosto de 2010

Acelerando video en alta definición H.264 por hardware en Ubuntu 10.04 con ATI

   Desde que monté el HTPC una de las cosas que siempre quise hacer fue acelerar por hardware los vídeos H.264. Todas las series que descargo (que son bastantes) intento que estén siempre en 720p puesto que además de la calidad adicional respecto al divx estándar, también viene con sonido 5.1, por lo que la sensación final es mucho mejor.
   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.deb
$ 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
Instalamos los paquetes que acabamos de descargar:
$ 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 mplayer
   Aunque 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.bz2

$ 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
   Ejecutamos 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.
$ ./checkout-patch-build.sh
Ahora 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.mkv
...
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
   Si ahora hacemos lo mismo pero utilizamos VAAPI vemos en la salida de mplayer que estamos usando las librerías para la aceleración.
$ ./mplayer -vo vaapi -va vaapi Lost.S06E01-02.720p.mkv
...
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.
   Para 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.

   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 -l
**** 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
   Así, debemos ejecutar mplayer indicando la tarjeta y el dispositivo que queremos utilizar para sacar el audio. Adicionalmente también le forzamos el audio AC3:
$ mplayer -ao alsa:device=hw=0.1 -ac hwac3 -vo vaapi -va vaapi pelicula.mvk
   Si 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/config
# 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
   De esta sólo tenemos que ejecutar
$ mplayer pelicula.mkv
y 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).

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


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 :-).

19 comentarios:

Daniel dijo...

Verano y sin descanso!! :D, enhorabuena por el blog, lo sigo desde hace unos meses y tengo que felicitarte por tu trabajo, que a veces reviso, para seguir aprendiendo algo de linux, o como chuleta. Al final tendrás que poner un boton de "donate" para que te tomes una cañita a nuestra salud.

Saludos

Iván dijo...

Hola Daniel,

ya me queda menos para las vacaciones ;-). Muchas gracias, me alegro de que te guste el blog y te resulte útil.

Jajajaja, me conformo con los "miserables" ingresos de adsense, pero vamos, que si alguien me quiere donar algo, que se ponga en contacto conmigo y acordamos cómo hacerlo :-P.

Saludos, Iván.

Anónimo dijo...

Un consejo. En gentoo toda la película de descargar e instalar esas librerías y luego compilar mplayer con soporte vaapi se hace con un solo y sencillo comando.
emerge mplayer-vaapi
Por otra parte lo de instalar ffmpeg con soporte vaapi es otro sencillo comando siempre que tengas la use -vaapi configurada en make.conf
emerge ffmpeg-0.6

Bubuntu para hacer cosas que se salgan de lo normal y estar a la última no es la distro adecuada.

nikhov dijo...

Estupendo post, muy currado.
En cualquier caso, pregúntanos qué opinamos de ATI a los linuxeros que tenemos una tarjeta con chip r500 (serie X1000). ATI ha dejado tirados a los usuarios y encima no han liberado los drivers para que los mantenga la comunidad. Muy majos ellos. Menos mal que los drivers radeon y galium3d van progresando, que si no...

Anónimo dijo...

Bonita receta. Por un momento pensé que me había equivocado y había vuelto a 1970. Menos mal que es en Ubuntu, la distro "para seres humanos"

Iván dijo...

Hola,

[Anónimo]: Gracias por tu consejo sobre gentoo, pero debe ser de lo poco que es más sencillo, quiero decir, que todos sabemos que gentoo no es precisamente para no-iniciados. Aún así, no quita en que para hacer esto en ubuntu hay que tirar de línea de comandos y compilarte tu mismo el mplayer.

[nikhov]: Muchas gracias, me alegro de que te guste :-). Yo también soy de la opinión de que ATI tiene muchísimo que mejorar. El HTPC lo compré con gráfica ATI integrada porque salía bien en calidad/precio, pero me he arrepentido en varias ocasiones, ahora ya un poco menos :-P, pero eso no quita que en el futuro no vaya a ponerle una NVidia...

[Anónimo]: Es tu opinión y se respeta. Ubuntu te soluciona la vida en muchas cosas, en otras simplemente tienes que currártelo un poco más.
Aún así, te pongo un ejemplo. En mi trabajo usamos todos Ubuntu excepto un compañero que usa SLED. Todavía no ha sido capaz de instalar Mumble, es un sistema de VoIP que usamos para comunicarnos. Ha probado muchos paquetes, ha compilado otros y al final lo dejó por imposible. En mi caso es tan sencillo como hacer sudo apt-get install mumble

Saludos, Iván.

Anónimo dijo...

Buenas Iván,
muy bueno esto de la aceleración por HW, funciona bien de bien.
Tengo una pregunta, como puedo instalar el Smplayer sin que me quiera reinstalar el mplayer, que utilice el que ya compilamos.
Gracias y Saludos

Roberto dijo...

Hola Iván. He realizado todos los pasos punto por punto, pero al llegar a la ejecución del script $ ./checkout-patch-build.sh me salen los siguientes errores:
checkout-patch-build.sh: 89: svn: not found
cd: 89: can't cd to mplayer-vaapi
checkout-patch-build.sh: 89: svn: not found
checkout-patch-build.sh: 89: svn: not found
checkout-patch-build.sh: 89: svn: not found
checkout-patch-build.sh: 89: svn: not found
checkout-patch-build.sh: 89: svn: not found
checkout-patch-build.sh: 89: svn: not found
checkout-patch-build.sh: 95: cannot open ../patches/mplayer-vaapi.patch: No such file

¿Puesdes ayudarme?

Anónimo dijo...

Simplemente como sé que este tutorial sirve como referencia a mucha gente, indicar que también pueden utilizar VAAPI en xbmc. Referencia (en inglés): http://coyotesg.blogspot.com/2010_10_01_archive.html Un saludo

Iván dijo...

Hola,

[Anónimo]: yo lo que hice fue instalar primero SMPlayer, que instala el mplayer de los repositorios, y luego, al ejecutar el make install, sobreescribir ése mplayer con el que compilé.
Instala SMPlayer sin miedo y aunque te machaque el mplayer, luego ejecutas de nuevo el make install.

Otro problema similar es cuando el paquete mplayer se actualiza. Para que el gestor de actulizaciones no te esté preguntando, lo que tienes que hacer es bloquear la versión de mplayer. En Synaptic buscas el paquete mplayer y en el menú Package eliges la opción Lock version.

[Roberto]: Ese error es porque no tienes instalado subversion. Para solucionarlo: sudo apt-get install subversion.

[Anónimo]: Gracias por el enlace, a los usuarios de XBMC les vendrá muy bien.

Saludos, Iván.

Anónimo dijo...

Muchas gracias por el artículo,

Yo estoy dudando si pillarme un ion2+atomD525 o un amd (zacate E350) para montar mi HTPC con xbmc. Mi experiencia en linux me dice que huya de AMD, sin embargo este nuevo chip me parece un avance que te cagas.

La gráfica que lleva, por si no lo conoces, es una 6310 y el conjunto mueve los 1080p con la gorra, pero si sacamos la GPU de la ecuación el micro NO PUEDE con 1080p.

Te pido consejo como experto, ¿nos fiamos de esta nueva VAAPI y de ATI con linux? O mejor malo conocido.

Muchas gracias y buen blog

Sr.Cavalier

Iván dijo...

Hola Cavalier,

no estoy muy al día con ion2 ni con los similares de AMD. Cuando compré los componentes para mi HTPC me decidí por esa placa puesto que leí en mucho sitios que la ATI HD3200 integrada podía reproducir sin problemas video en HD. Luego, cuando tenía instalado windows no fui capaz de hacerlo funcionar y con linux tardé algún tiempo en conseguirlo. Durante todo ese periodo maldije a ATI/AMD en varias ocasiones por la mala calidad de los drivers para linux. Aunque ahora la cosa ha cambiado, si tengo que volver a comprar gráfica lo tengo muy claro, Nvidia e Intel, pero en mi caso nunca más ATI.

Aún así, tampoco quiero que esto te eche para atrás. En ningún caso soy un experto como dices, sólo me baso en mi experiencia personal. Tal y como te he dicho, las cosas han mejorado mucho en estos años, pero yo ya he "picado" una vez y no repetiré.

Saludos, Iván.

Anónimo dijo...

Mierda, estamos en las mismas. Yo también escarmenté en el 2009 con mi ATI 4870. No hubo forma de utilizar nada de la GPU, y eso que pille justo la época cuando empezaron a portar el catalist para ubuntu. No sé para qué lo sacaron, no servia para nada.

Esperaba que me confirmases rumores y posicionamientos que ha hecho ati/amd de acercar sus drivers a linux. Seguiré con mi búsqueda!

Muchas gracias por tu respuesta

Sr.Cavalier

Anónimo dijo...

Hola, tengo la misma tarjeta y quiero hacer el procedimiento pero al momento de realizar la instalacion de las librerias me dice que hay una version posterior y de ninguna manera puedo instalarlas ¿que debo hacer?

Anónimo dijo...

Además, al intentar compilar sale este error:

$ sudo apt-get build-dep mplayer
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
E: No pude abrir el fichero /var/lib/apt/lists/ppa.launchpad.net_danielrichter2007_grub-customize_ubuntu_dists_maverick_main_source_Sources - open (2: No existe el fichero o el directorio)

Anónimo dijo...

Buenos días Iván, primero gracias por el trabajo.
Tengo un par de problemas al seguir tus pasos:
Tras instalar el ultimo mplayer ejecutando el script me crea la carpeta mplayer-vaapi.
Abro una terminal en su directorio y 1º no funciona ./mplayer, sino sólo mplayer seguido del directorio del video.
2º la reproducción normal la hace bien pero cuando intento mplayer -vo vaapi -va vaapi me dice: Unknown option on the command line: -va
Error parsing option on the command line: -va
Después cambio -va por -ass y funciona solo el audio, me da la siguiente salida: Error opening/initializing the selected video_out (-vo) device.
Tienes idea de que puede pasar. Tengo una Radeon HD 3200 en un portátil acer.
Gracias

Anónimo dijo...

Disculpa mi ignorancia, pero estas instrucciones son para un sistema ubuntu o una instalación live de xbmc? he probado de varias formas y no consigo aceleración por gráfica - ni activar vaapi, la verdad, comenzaba a valorar el instalar un win7 con el xbmc, mi equipo es un zacate e-350 con hd 6310. ¿debería reproducir fluidamente full-hd ,no? un saludo

Iván dijo...

@Sr.Cavalier: A tí :-)

@Anónimo (3 de marzo): Tengo el HTPC con ubuntu 10.10 y hace mucho que no ejecuto este procedimiento. Es probable que con nuevas versiones de las librerías y de ubuntu haya algo que cambie o no funcione exactamente igual.

@Anónimo (28 de marzo): Si te dice que la opción -va no es válida es porque el mplayer que estás ejecutando no es el compilado sino el que viene por defecto en el sistema que no tiene esa opción habilitada.

@Anónimo (10 de septiembre): Las instrucciones con para Ubuntu.

Saludos, Iván.

Anónimo dijo...

A ese chavón que dijo Bubuntu, le comento que si no le gusta, UBUNTU, no lo denigre, porque habemos muchos que por suerte la usamos y nos alcanza y sobra, porque no la use ,tiene que se mala, error muy feo loco

Publicar un comentario