URL: https://linuxfr.org/news/dav1d-is-an-av1-decoder Title: dav1d is An AV1 Decoder Authors: fcartegnie BenoĂźt Sibaud, ZeroHeure, Davy Defaud, BAud, teoB, bubarđŠ„, jcr83, Ontologia, palm123, NĂżco et Ê âŻ Date: 2019ćčŽ01æ16æ„T13:20:01+01:00 License: CC By-SA Tags: dav1d, av1, firefox, videolan, vidĂ©o, format_ouvert et benchmark Score: 46 dav1d est une implĂ©mentation de dĂ©codeur dâAV1 destinĂ©e Ă un usage rĂ©el, en dehors du cadre du dĂ©codeur de rĂ©fĂ©rence libaom ; et un acronyme rĂ©cursif. DestinĂ© Ă ĂȘtre multiâplateâforme et _open source_, sa devise est « petit et rapide ». Ce projet est chapeautĂ© par VideoLAN Ă lâinstar des x264 et x265, pour les codecs [H.264](https://fr.wikipedia.org/wiki/H.264) et [HEVC](https://fr.wikipedia.org/wiki/H.265/HEVC). Ce projet est financĂ© partiellement par lâ[_Alliance for Open Media_](https://fr.wikipedia.org/wiki/Alliance_for_Open_Media) (AOM). ---- [dav1d repository](https://code.videolan.org/videolan/dav1d/) [Annonce de la premiĂšre version de dav1d en septembre 2018](http://www.jbkempf.com/blog/post/2018/First-release-of-dav1d) [LâĂ©tiquette « dav1d » sur LinuxFr.org](https://linuxfr.org/tags/dav1d/public) [Les statistiques de dav1d 0.2.0](https://medium.com/@ewoutterhoeven/dav1d-0-2-0-covering-all-pcs-including-mobile-eac3e43868c2) ---- # Un autre dĂ©codeur pour quoi faire ? dav1d est issu de la phase 1B du dĂ©ploiement dâAV1, soit la phase dâoptimisation du codec. En lâĂ©tat actuel, les codecs de nouvelle gĂ©nĂ©ration sont hautement complexes et dans les plus hautes rĂ©solutions, leur rendu ne peut ĂȘtre effectuĂ© simplement sur le processeur en temps rĂ©el. Câest pour cela que les rĂ©solutions 4K et 2K sont problĂ©matiques, notamment avec HEVC. Lâaugmentation de complexitĂ© en passant Ă AV1 empire les choses. Les implĂ©mentations matĂ©rielles nâĂ©tant prĂ©vues que pour 2020, il est nĂ©cessaire dâavoir des dĂ©codeurs logiciels fortement optimisĂ©s et tirant parti des capacitĂ©s vectorielles des processeurs pour que la vidĂ©o codĂ©e en AV1 dans des rĂ©solutions standard et HD soit lisible sur un processeur actuel, en attendant lâarrivĂ©e des implĂ©mentations matĂ©rielles. Un autre point important est la mise Ă disposition sous licence BSD 2 simplifiĂ©e, ce qui permet Ă lâindustrie de rĂ©utiliser le code comme socle pour un dĂ©codeur purement matĂ©riel ou bien hybride.  ## Performance actuelles Les optimisations assembleur ont dâabord Ă©tĂ© effectuĂ©es en utilisant le jeu dâinstructions AVX2, disponibles Ă partir des processeurs Intel _Haswell_ [commercialisĂ©s sous le nom Core](https://en.wikipedia.org/wiki/Advanced_Vector_Extensions#CPUs_with_AVX2). Le choix a aussi Ă©tĂ© fait de ne travailler dans un premier temps que les optimisations de traitement des transformations gĂ©nĂ©riques et le format le plus courant : le [YâUV](https://fr.wikipedia.org/wiki/YUV) 4:2:0 en 8 bits. De mĂȘme, il a Ă©tĂ© choisi de faire une architecture permettant lâoptimisation des fils dâexĂ©cution (_threads_) du processeur pour effectuer un dĂ©codage par tranche ou par image, mais aussi combinĂ©. Lâordonnancement des tĂąches et des mĂ©canismes dâexclusivitĂ© laisse envisager une optimisation Ă venir aussi de ce cĂŽtĂ©, avec dans lâidĂ©al une progression presque linĂ©aire dans la majoritĂ© des cas, en fonction du nombre de cĆurs affectĂ©s. On peut voir le dĂ©codage par tranche comme une parallĂ©lisation spatiale et le dĂ©codage par image comme une parallĂ©lisation temporelle. La parallĂ©lisation par tranche permet de dĂ©coder une image rapidement : câest trĂšs utile pour les flux vidĂ©os en temps rĂ©el et les images fixes (photos encodĂ©es en AV1). La parallĂ©lisation par image permet de dĂ©coder les images suivantes en avance. Les optimisations x86 en assembleur (SIMD) sont effectuĂ©es pour diffĂ©rents niveaux dâinstructions : - AVX2, prĂ©sent sur tous les processeurs rĂ©cents, traite 256 bits en parallĂšle ; - SSSE3, quelques gĂ©nĂ©rations avant, qui ne propose que 128 bits et un jeu dâopĂ©rations restreintes. dav1d 0.1.0 ciblait AVX2. La version 0.2.0 propose donc la prise en charge du SSSE3 pour les anciens (4-5 ans) processeurs et processeurs 32 bits, ainsi que la prise en charge des ARM et ARM64 via le jeu dâinstructions Neon. Concernant les implĂ©mentations SSSE3 des codecs nouvelle gĂ©nĂ©ration, câest un peu comme si on Ă©tait revenu Ă lâĂ©poque de lâarrivĂ©e des dĂ©codeurs MP3 sur vos Pentium Ă 100 MHz : on sait faire avec de la vectorisation, mais on est vraiment Ă la limite du matĂ©riel. _Un doute sur votre processeur ? AVX2 ou SSSE3 dans `/proc/cpuinfo`_ Les performances actuelles de dav1d 0.2.0 pour le jeu dâinstructions AVX2 en comparaison avec _aomdec_ sont :  Et lĂ oĂč dav1d fait la diffĂ©rence par son architecture est sur lâexĂ©cution en parallĂšle sur de multiples fils dâexĂ©cutions :  Pour les optimisations niveau SSSE3 qui viennent dâĂȘtre ajoutĂ©es :  Sur le plan des optimisations pour les autres platesâformes, la version ARM64 est actuellement dĂ©jĂ 60 % Ă 120 % plus rapide quâaom, bien quâelle nâait reçu quâune optimisation partielle, mais aussi bien plus rapide que dans dav1d 0.1.0 :  Je vous renvoie sur le [blog dâEwout](https://medium.com/@ewoutterhoeven/dav1d-0-2-0-covering-all-pcs-including-mobile-eac3e43868c2) qui effectue des tests rĂ©guliers pour lâarticle original, les stats complĂštes et les Ă©chantillons utilisĂ©s. Reste en chantier le code assembleur concernant le [sousâĂ©chantillonnage de la chrominance](https://fr.wikipedia.org/wiki/Sous-%C3%A9chantillonnage_de_la_chrominance) (4:2:2, 4:4:4 et les profondeurs sur 10 et 12 bits sont Ă venir), mais aussi des amĂ©liorations plus globales sur le code C. ## Utilisations Lâutilisation de dav1d en remplacement de libaom est une Ă©vidence pour les projets dĂ©sirant proposer AV1 dans de bonnes conditions : - [Firefox](https://bugzilla.mozilla.org/show_bug.cgi?id=1493397) rĂšgle les derniers soucis dâintĂ©gration ; - [[VLC]] a dĂ©jĂ remplacĂ© libaom par dĂ©faut dans sa branche de dĂ©veloppement, et la prochaine version stable sur la branche 3.0 en bĂ©nĂ©ficiera aussi ; - de maniĂšre identique, [[FFmpeg]] intĂ©grera dav1d dans sa prochaine version stable ; - Chromium travaille aussi Ă lâadoption du dĂ©codeur ; - Handbrake. # ++dav1d Si dav1d propose bien une amĂ©lioration des performances considĂ©rable, on gardera en tĂȘte que le travail nâest pas achevĂ© et que dans les cas non standards (4:4:4,> 8 bits...) lâabsence dâoptimisation assembleur ne permet rien de mieux, voire pire, que libaom. Encore beaucoup de travail en perspective donc. AV1 est un codec complexe et innovant. Cependant, faire un dĂ©codeur rapide nâest le fait que dâoptimiser « une recette » Ă appliquer. Un autre dĂ©fi bien plus difficile Ă relever est celui de lâencodage. Toute la complexitĂ© dâun codec rĂ©side dans cette Ă©tape. Parce que câest la source de revenus dans le modĂšle Ă©conomique dâAV1, une multitude dâencodeurs, le plus souvent propriĂ©taires, arriveront bientĂŽt. Reste donc Ă trouver une personne qui serait [rav1e](https://github.com/xiph/rav1e) de parler du codeur AV1 libre Ă©crit en [[Rust]].