07/08/2012

Accélération matérielle du décodage vidéo (VLC et VAAPI)

La carte graphique de mon desktop a grillé aujourd’hui et j’en ai donc profité pour virer cette merde de nVidia (F-U!) pour une ATI HD6450, une des moins chères de mon vendeur d’informatique.

Après m’être battu plus d’une heure dans la config de Xorg (AMD? F-U also tiens!) pour faire marcher la carte correctement, je me suis attardé sur une des fonctionnalités de cette nouvelle carte, ses capacités de décodage matériel du H.264.

Décodage matériel

Je ne parlerai pas ici des capacités de rendu vidéo de Xorg ou du mode overlay de VLC. Le but est uniquement d’accélérer le décodage des vidéos compressées en H.264 (et parfois d’autres codecs selon le GPU, mais le H.264 est le plus répandu de nos jours).

Concrètement, VLC envoie le flux compressé au GPU, attend le flux décompressé en retour. Tout le reste (affichage, stream, recompression) est à charge du CPU.

Ce qui est intéressant c’est que mon desktop de plus de 4 ans est maintenant capable de décoder des flux HD 1080p sans soucis, chose dont il était incapable avant sa mise à jour à 40€ !

VAAPI

Pour offrir du décodage matériel, VLC implémente VAAPI (Video Acceleration API). Initialement développée par Intel sous forme libre, cette API peut aussi servir d’interface avec les technologies propres à AMD (XvBA) et nVidia (VDPAU).

Selon votre GPU, installez le driver approprié :

  • Intel GMA :
    sudo apt-get install libva-intel-vaapi-driver libva-glx1 libva-x11-1 vainfo
  • nVidia :
    sudo apt-get install vdpau-va-driver libva-glx1 libva-x11-1 vainfo
  • AMD/ATI :
    sudo apt-get install xvba-va-driver libva-glx1 libva-x11-1 vainfo

Exécutez ensuite vainfo pour vérifier que tout fonctionne. Il devrait retourner la liste des capacités matérielles de votre GPU, par exemple sur ma carte Intel GMA HD 3000 :

tito@sigma:~$ vainfo
libva: VA-API version 0.32.0
libva: va_getDriverName() returns 0
libva: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so
libva: va_openDriver() returns 0
vainfo: VA-API version: 0.32 (libva 1.0.15)
vainfo: Driver version: Intel i965 driver - 1.0.15
vainfo: Supported profile and entrypoints
      VAProfileMPEG2Simple            : VAEntrypointVLD
      VAProfileMPEG2Main              : VAEntrypointVLD
      VAProfileH264Baseline           : VAEntrypointVLD
      VAProfileH264Baseline           : VAEntrypointEncSlice
      VAProfileH264Main               : VAEntrypointVLD
      VAProfileH264Main               : VAEntrypointEncSlice
      VAProfileH264High               : VAEntrypointVLD
      VAProfileH264High               : VAEntrypointEncSlice
      VAProfileVC1Simple              : VAEntrypointVLD
      VAProfileVC1Main                : VAEntrypointVLD
      VAProfileVC1Advanced            : VAEntrypointVLD

VLC

Il n’y a plus qu’à activer l’option dans les préférences de VLC, sous “Lecture & Codecs” cocher “Utiliser l’accéléaration matérielle du GPU.”

Tests

J’ai la flemme de faire des tests (je vois clairement à l’utilisation CPU que ça marche) mais je vous montre ce joli screenshot fait par quelqu’un d’autre :

D’après mes estimations et différents tests, je dirais que cela soulage le CPU d’environ 60% du travail de décompression !

Conclusion

Les performances sont améliorées mais pas encore optimales. L’idéal serait d’envoyer le flux compressé directement à la carte graphique et qu’elle-même se charge de l’affichage.

Ici on envoie le flux compressé puis la carte renvoie le flux brut, que VLC traite avant de renvoyer à la partie affichage du GPU (via Xorg). Pas optimal donc mais mieux que rien.

Source

  1. Dup
    | #1

    Je suppose que VLC agit ainsi afin de pouvoir appliquer des effets et sous titres à la vidéo avant son affichage ce qui serait impossible à ajouter au flux compressé.

  2. Ned
    | #2

    “Impossible de trouver le paquet vdpau-va-driver”
    Je suppose que c’est la faute à mon Ubuntu : 10.04 ?

  3. | #3

    @Dup Oui c’est pour permettre à VLC de faire un tas de modifications sur la vidéo, et décider où l’afficher. VLC profite quand même de certaines capacités de la carte graphique pour accélérer l’affichage (overlay) mais c’est une méthode tout à fait standard.

    @Ned Effectivement le driver n’est pas présent par défaut dans 10.04. Il existe des PPA pour l’obtenir, comme par exemple http://www.ubuntuupdates.org/ppa/lucidbleed?dist=lucid

  4. Ned
    | #4

    Merci pour la réponse 🙂
    Hélas ce ppa ne propose pas libva-glx1, et celui que j’ai trouvé requiert à son tour libva-x11-1 (>> 1.0.15~), arrivé là j’abandonne plutôt que de trop tripatouiller le système (un upgrade d me semble plus sain)

  5. Ned
    | #5

    @Ned
    oups : “…upgrade de la distribution…”

  6. | #6

    Super cet article,

    Dans le but de faire survivre mon PC qui date de quelques années, j’ai fait pas mal de test pour optimiser au mieux l’utilisation du décodage matériel avec VDPAU( ma CG -> Nvidia GeForce 8600 GT).

    J’ai observer de meilleurs résultats avec mplayer que vlc. Avec mplayer la charge CPU est proche de 0 contrairement à vlc.
    Par contre maintenant, je rencontre d’autres problèmes à présent avec les fonctionnalités 3D des distribs nouvelles générations. Tandis que sur gnome 2 ça marchait du tonnerre.

  7. | #7

    @nicofonk mplayer utilise directement VDPAU et non VAAPI si je me souviens bien. Mais oui, pour les mêmes résultats 😉

    Enfin je ne suis pas un grand fan de mplayer, c’est une vieille usine à gaz. Je dis pas que VLC est top mais il est plus abouti que mplayer actuellement.

  8. | #8

    Bon artile. J’ajoute que VDPAU n’est pas actuellement utilisable avec les NVIDIA pour ordinateurs portables utilisant bumblebee.

  9. | #9

    y1yls3

  10. | #10

    fcgnlh

  11. | #11

    x81fc2

  12. | #12

    6zz6vp

  13. | #13

    949x5p

  14. | #14

    jf5nab

  15. | #15

    a0kjcg

  16. | #16

    yqbn3x

  17. | #17

    cft1ke

  18. | #18

    krkhsh

  19. | #19

    i9vc1b

  20. | #20

    174spk

  1. | #1