Chrome 108 est sortie et normalement le codec HEVC devrait être disponible avec Chrome >= 108.0.5354.0, si le GPU du PC gère HEVC.
Savez-vous pourquoi je ne peux pas lire de vidéos HEVC ?
HEVC n'est supporté par Chrom(ium) qu'avec décodage matériel complet.
Or depuis les dernières version (104/105/106?), il n'y aucune accel hardware sous Linux (complète ou via copie software).
Il ne suffit pas de consulter
chrome://gpules informations réelles sont dans
chrome://media-internals en sélectionnant le player voulu parmi ceux qui ont été créés pour le contenu.
L'information cruciale est sous la clé "kVideoDecoderName"
- VaapiVideoDecoder : décodage matériel total, sans recopie, via une surface GBM en sortie de VA-API. C'est le seul mode qui permet HEVC.
- VdaVideoDecoder : décodage matériel, puis recopie software vers la surface (et probablement resampling YUV > RGB)
- FFmpeg/Vpx/Dav1d : décodage software à 100%
Et donc, pourquoi rien ne fonctionne sous linux ?
A propos du VdaVideoDecoder (disons accel demi-matérielle), il était actif par défaut il y a peu.
Sous réserve des librairies à jour (Mesa, DRI, etc), d'un noyau en bon état, et du harware qui le supporte (Intel c'est sur, AMD probablement, Nvidia j'en sais rien).
Mais récemment chromium a activé par défaut la feature "UseChromeOSDirectVideoDecoder" qui concrètement désactive VdaVD au profit de son successeur : VaapiVideoDecoder
Pourquoi VaapiVideoDecoder ne parvient pas à s'activer sur les linux standards ?
- dans les traces media-internals : "video decoder fallback after initial decode error"
- dans la console : "Could not find SharedImageBackingFactory with params: usage: DisplayRead|Scanout, format: YUV_420_BIPLANAR"
Comprendre : les surfaces GL directes (GBM) proposées par Angle ou Mesa ne supportent pas le NV12, qui est ce que VAAPI produit en sortie.
Solution VulkanLancer chrome avec "--enable-features=Vulkan"
=> VaapiVideoDecoder s'active si la stack graphique supporte Vulkan, mais le rendu est assez dégradé, aucun upscaling/downscaling sur les surfaces Vulkan créées par chrome.
Ca ne se remarque pas trop sur BigBuckBunny, mais sur des lignes plus géométrique c'est très net, les lignes droites "fourmillent".
(c'est clairement la solution d'avenir à moyen terme, supposons que les soucis de rendu seront traités d'ici là)
Solution Minigbm chromium=> Utiliser le GBM pour ChromeOS (minigbm) et pas celui de Mesa.
Il supporte NV12 et c'est évoqué sur divers sujets,
ex :
https://bugs.chromium.org/p/chromium/issues/detail?id=1236697mais ca ne semble pas fonctionner avec les drivers Gallium (iris_drv), pas chez moi en tout cas
A noter que même si c'était le cas, il faut compiler Chromium en activant ce flag.
Compter 90mn sur un serveur haut de gamme, probablement 8/12h sur un PC standard.
Solution MesaOn bricole la libgbm de Mesa en la forcant à accepter le format NV12 (GBM_FORMAT_NV12)
L'ajout est trivial :
diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c
index 11a6ba90e66..82727308609 100644
--- a/src/gbm/backends/dri/gbm_dri.c
+++ b/src/gbm/backends/dri/gbm_dri.c
@@ -528,6 +528,9 @@ static const struct gbm_dri_visual gbm_dri_visuals_table[] = {
{ 16, 16, 16, 16 },
true,
},
+ {
+ GBM_FORMAT_NV12, __DRI_IMAGE_FORMAT_NONE,
+ },
};
static int
En admettant que le hardware derrière sache s'en arranger. C'est le cas avec les GPU Intel, le reste aucune idée.
Il faudra ensuite lancer Chrome en mode EGL direct (ne pas utiliser ANGLE)
Soit :
LD_LIBRARY_PATH="/chemin/vers/libgbm/modifiee" ~/chromium.main/chrome --no-sandbox --disable-features=Vulkan --use-gl=egl
Et VaapiVideoDecoder est actif.
(il fonctionne alors très bien pour toutes les vidéos de ton sujet)
Note : on peut revenir sur l'ancien mode : --disable-features=UseChromeOSDirectVideoDecoder
L'acceleration matérielle revient pour H264, mais toujours pas HEVC.
Note 2 : il semble que sur les dernières builds, chrome ait activé Vulkan par défaut
Peut-être sous certaines conditions, je n'ai pas regardé le détail.
Donc VaapiVideoDecoder en standard pour tout le monde, mais avec les soucis Vulkan cités plus haut.