Video Acceleration API - VAAPI
- sábado, enero 10 2015 @ 07:12 CET
- Autor: ceyusa
- Lecturas 1,823

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