lunes, 29 de junio de 2009

mplayer + vdpau

Compilando un MPlayer preparado para VDPAU

Bueno, pues ya tenemos un driver con soporte de VDPAU. Pero, ¿qué reproductor de vídeo para Linux soportan aceleración por VDPAU? Pues de momento, sólo una versión de MPlayer modificada con unos parches de NVidia. Los parches y un script que descarga la versión exacta de MPlayer necesaria del servidor de Subversion de MPlayer están disponibles en:

En mi caso, usaré el mplayer-vdpau-3263604.tar.bz2.

Compilar el MPlayer es una buena experiencia. Resulta interesante porque su configure tiene muchos parámetros con los que jugar y porque a base de instalar diferentes paquetes de desarrollo, vamos consiguiendo activar funcionalidades y códecs, de forma que los vamos conociendo.

No estoy seguro de si pueden ser necesarios más paquetes de desarrollo (porque yo ya los tuviera instalados de antes), pero creo que con estos:

sudo apt-get install libavcodec-dev libpng12-dev libgtk2.0-dev libxvmc-dev libx264-dev libasound2-dev

y los típicos necesarios para desarrollo: gcc, make, libc6-dev, etc., podremos compilar el MPlayer sin problemas. ¡Ah! Y también será necesario el subversion.

Antes de empezar, conviene desinstalar el MPlayer que instala Ubuntu, para evitar conflictos:

 sudo dpkg -P gnome-mplayer  mplayer mplayer-skins gecko-mediaplayer

Y vamos allá (nuestro usuario tiene que pertenecer al grupo src para poder escribir en /usr/src):

cd /usr/src/

wget ftp://download.nvidia.com/XFree86/vdpau/mplayer-vdpau-3263604.tar.bz2

tar xvfj mplayer-vdpau-3263604.tar.bz2

cd mplayer-vdpau-3263604

./checkout-patch-build.sh

cd mplayer-vdpau

sudo make install

Sólo es eso, el checkout-patch-build.sh lo hace absolutamente todo. Se baja la versión de MPlayer exacta necesaria, las librerías que le interesan, parchea el código, lo configura y lo compila:

#!/usr/bin/env sh

set -e
set -x

co_dir=mplayer-vdpau

svn co --ignore-externals -r 27960 svn://svn.mplayerhq.hu/mplayer/trunk ${co_dir}
cd ${co_dir}
svn co -r 15884 svn://svn.mplayerhq.hu/ffmpeg/trunk/libpostproc
svn co -r 15884 svn://svn.mplayerhq.hu/ffmpeg/trunk/libavformat
svn co -r 15884 svn://svn.mplayerhq.hu/ffmpeg/trunk/libavcodec
svn co -r 15884 svn://svn.mplayerhq.hu/ffmpeg/trunk/libavutil

patch -p0 < ../mplayer-vdpau-mplayer.patch
patch -p0 < ../mplayer-vdpau-libavutil.patch
patch -p0 < ../mplayer-vdpau-libavcodec.patch

./configure --disable-x264-lavc --disable-x264 --enable-vdpau
make

Actualización 18/1/09: No es realmente necesario desinstalar el MPlayer que instala Ubuntu por defecto, sólo si queremos usar el de NVidia que soporta VDPAU por defecto. En tal caso, además de no desinstalar el MPlayer oficial, no haremos el “make install” y para probar el MPlayer parcheado con soporte de VDPAU, lo lanzaremos directamente desde el directorio donde lo hayamos compilado.

Probando a reproducir vídeos con y sin VDPAU

Comprobemos ahora si la aceleración es realmente efectiva.

Para mis pruebas, voy a usar una película normal en formato Matroska (.mkv) con resolución 1080p 1920×800/24fps y comprimida con H.264. No he querido probar con los vídeos de demostración que NVidia propone en su README.txt (ver al final la Actualización 17/1/09), ya que esos seguro que están probados de sobra y no hay duda de que funcionarán muy bien.

Si lanzamos la película sólo con “mplayer pelicula.mkv“, la salida del comando no indica nada especial:

[mkv] Track ID 1: video (V_MPEG4/ISO/AVC), -vid 0
[mkv] Track ID 2: audio (A_AC3) "AC3 640 Kbps", -aid 0, -alang eng
[mkv] Will play video track 1.
Matroska file format detected.
VIDEO: [avc1] 1920x800 24bpp 23.976 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)
==========================================================================
VO: [vdpau] 1920x800 => 1920x800 Planar YV12

Sin embargo, si lanzamos la película con la opción “-vc ffh264vdpau” para habilitar la API DPAU: “mplayer -vc ffh264vdpau pelicula.mkv“, sí que ya veremos en la salida datos que se está usando la aceleración:

[mkv] Track ID 1: video (V_MPEG4/ISO/AVC), -vid 0
[mkv] Track ID 2: audio (A_AC3) "AC3 640 Kbps", -aid 0, -alang eng
[mkv] Will play video track 1.
Matroska file format detected.
VIDEO: [avc1] 1920x800 24bpp 23.976 fps 0.0 kbps ( 0.0 kbyte/s)
==========================================================================
Forced video codec: ffh264vdpau
Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
[VD_FFMPEG] VDPAU accelerated codec.
Selected video codec: [ffh264vdpau] vfm: ffmpeg (FFmpeg H.264 (VDPAU))
==========================================================================
VO: [vdpau] 1920x800 => 1920x800 H.264 HIGH VDPAU acceleration

Finalmente, si medimos el uso de CPU del proceso mplayer en un caso y en otro con el comando pidstat (ver sysstat, la colección de herramientas de monitorización de rendimiento):

pidstat -u -p 32645 5

el impresionante resultado, en forma gráfica, es éste:

Video H.264 reproducido con VDPAU y sin VDPAU

Conclusiones y reflexión final

No por esperado el resultado resulta menos sorprendente: El nuevo driver consigue que mi ordenador pase de apenas conseguir mover un vídeo en H.264 1080p directamente a que la CPU se aburra por completo mientras es la GPU la que se encarga de todo. NVidia ha hecho un impresionante trabajo de cara a la comunidad de usuarios de Linux. Como en otros tantos casos, NVidia podría haber ignorado completamente a ese pequeño porcentaje de usuarios que pasa del Windows Aero y, sin embargo, ha hecho un excelente trabajo por nosotros. Los drivers de NVidia son cerrados, sí. Sería absolutamente deseable que fueran abiertos, de acuerdo. Pero hemos de reconocer que al menos sus drivers cerrados tienen bastante buena calidad.

Viendo tan impresionante mejora, no puedo sino lamentarme de todo el tiempo que esta funcionalidad no ha estado disponible en Linux cuando sí que lo ha estado en Windows y de todos los problemas que aparecerán en el futuro para lograr un soporte completo en Linux por parte de todas las aplicaciones sólo porque los fabricantes no han logrado ponerse de acuerdo en una API común. ¡Es el sino de Linux! ¡Lamentable!

Actualización 17/1/09: Las películas de muestra que NVidia propone y la forma de acelerar su descompresión con MPlayer son:

MPEG:
MPEGIO3MBPS30sec.mpg
./mplayer -vo vdpau -vc ffmpeg12vdpau MPEGIO3MBPS30sec.mpg

H.264:
Grey.ts
./mplayer -vo vdpau -vc ffh264vdpau Grey.ts
nature_704×576_25Hz_1500kbits.h264
./mplayer -vo vdpau -vc ffh264vdpau nature_704x576_25Hz_1500kbits.h264

WMV3:
Amazing_Caves_720.exe (es un fichero zip autodescomprimible)
./mplayer -vo vdpau -vc ffwmv3vdpau Amazing_Caves_720.wmv

VC-1:
FlightSimX_720p60_51_15Mbps.wmv
./mplayer -vo vdpau -vc ffvc1vdpau FlightSimX_720p60_51_15Mbps.wmv