Grupo Linuxero del Bajío

Video Acceleration API - VAAPI

Víctor Manuel Jáquez Leal

El procesamiento de vídeo es muy costoso en términos computacionales. Para tener una idea de lo intensivo en datos que es, baste decir que por cada fotograma (frame) de alta definición hay que procesar alrededor de 2 millones de pixeles, desplegando entre 25 y 60 fotogramas por segundo. Ahora, la operación de decodificar un píxel no es sencilla, hablamos de estructuras de entre 24 y 32 bits extraídos de datos codificados y comprimidos que utilizan algoritmos como la transformada rápida de Fourier, entre otros.

Debido a que el procesamiento de multimedia consumía la mayor parte del procesador central, los fabricantes y diseñadores de hardware, desde hace una década aproximadamente, se han dedicado a añadir hardware exclusivamente para el procesamiento de multimedia, liberando así al procesador central para que pudiera atender otras peticiones del usuario, simultáneamente al procesamiento multimedia.

Pero una vez añadido el hardware el problema no termina, los desarrolladores de software deben tener una interfaz para utilizar dicho hardware. Y cada fabricante, deseando mantener su nicho, ofrece su propia interfaz. En el caso de Nvidia tenemos VDPAU (Video Decode and Presentation API for Unix); Intel, por su parte ofrece VAAPI (Video Acceleration API); AMD Graphics, a su vez publicó XvBA (X-Video Bitstream Acceleration). En el mundillo de ARM la cosa es aún más caótica, aunque todo indica que los fabricantes se están decantando por v4l2 (Video4Linux versión 2).

Como el título lo indica, este comentario va sobre VAAPI, la opción del Intel para la aceleración de vídeo.

VAAPI es una interfaz de programación (junto con su implementación bajo licencia MIT) entre una aplicación de vídeo y un acelerador por hardware, liberando al procesador central de las operaciones de codificación, decodificación y despliegue.

Aunque VAAPI es independiente de plataforma, hoy en día se utiliza solamente en Linux, FreeBSD, Solaris y Android.

La implementación de VAAPI acepta varios backends, por citar un ejemplo interesante, hay un backend de VAAPI para VDPAU: es decir, una tarjeta Nvidia con soporte para VDPAU puede ser usada desde VAAPI. También hay backends para Broadcom Crystal HD, para XvBA, etcétera.

Viene entonces la pregunta, “yo, como usuario y suponiendo que tengo el hardware y el soporte de software necesario ¿cómo puedo utilizar VAAPI?” La respuesta es que necesitas un reproductor de multimedia (el programa cliente) que use la interfaz VAAPI para decodificar su vídeo, como lo es MPlayer, VideoLAN, así como cualquier aplicación que use GStreamer, con el plugin correspondiente, o <a libav / FFmpeg.

En mi caso tengo una computadora portátil con una GPU Intel:

$ sudo lspci -vs 00:02.0
00:02.0 VGA compatible controller: Intel Corporation 4th Gen Core Processor Integrated Graphics Controller (rev 06) (prog-if 00 [VGA controller])
        Subsystem: Lenovo Device 221d
        Flags: bus master, fast devsel, latency 0, IRQ 49
        Memory at f1000000 (64-bit, non-prefetchable) [size=4M]
        Memory at e0000000 (64-bit, prefetchable) [size=256M]
        I/O ports at 4000 [size=64]
        Expansion ROM at <unassigned> [disabled]
        Capabilities: [90] MSI: Enable+ Count=1/1 Maskable- 64bit-
        Capabilities: [d0] Power Management version 2
        Capabilities: [a4] PCI Advanced Features
        Kernel driver in use: i915

Uso Debian (testing) así que, sin ningún esfuerzo, instalo el driver para i965, así como el programa para desplegar la información del driver:

sudo aptitude install i965-va-driver vainfo

Y compruebo el soporte:

$ vainfo
libva info: VA-API version 0.36.0
libva info: va_getDriverName() returns 0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so
libva info: Found init function __vaDriverInit_0_36
libva info: va_openDriver() returns 0
vainfo: VA-API version: 0.36 (libva 1.4.1)
vainfo: Driver version: Intel i965 driver for Intel(R) Haswell Mobile - 1.4.1
vainfo: Supported profile and entrypoints
      VAProfileMPEG2Simple            : VAEntrypointVLD
      VAProfileMPEG2Simple            : VAEntrypointEncSlice
      VAProfileMPEG2Main              : VAEntrypointVLD
      VAProfileMPEG2Main              : VAEntrypointEncSlice
      VAProfileH264ConstrainedBaseline: VAEntrypointVLD
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
      VAProfileH264Main               : VAEntrypointVLD
      VAProfileH264Main               : VAEntrypointEncSlice
      VAProfileH264High               : VAEntrypointVLD
      VAProfileH264High               : VAEntrypointEncSlice
      VAProfileH264MultiviewHigh      : VAEntrypointVLD
      VAProfileH264MultiviewHigh      : VAEntrypointEncSlice
      VAProfileH264StereoHigh         : VAEntrypointVLD
      VAProfileH264StereoHigh         : VAEntrypointEncSlice
      VAProfileVC1Simple              : VAEntrypointVLD
      VAProfileVC1Main                : VAEntrypointVLD
      VAProfileVC1Advanced            : VAEntrypointVLD
      VAProfileNone                   : VAEntrypointVideoProc
      VAProfileJPEGBaseline           : VAEntrypointVLD
      VAProfileH264MultiviewHigh      : VAEntrypointVLD
      VAProfileH264MultiviewHigh      : VAEntrypointEncSlice
      VAProfileH264StereoHigh         : VAEntrypointVLD
      VAProfileH264StereoHigh         : VAEntrypointEncSlice

¡Perfecto! Nuestro hardware puede decodificar varios perfiles de MPEG2, H264, VC1 y JPEG.

El siguiente paso es instalar los plugins de GStreamer para VAAPI, y a disfrutar del vídeo acelerado con totem o algún otro reproductor basado en GStreamer:

$ sudo aptitude install gstreamer1.0-vaapi
...
$ totem http://www.quirksmode.org/html5/videos/big_buck_bunny.mp4