# RPi: Accélération matérielle et GPU.
{{INLINETOC}}
Raspberry est un ordinateur monocarte, compact, puissant et peu coûteux , disposant d'un processeur Cortex-A7 quadricœur fonctionnant à 900 MHz et de 1 Go de RAM, d'une sortie HDMI, etc.
Principalement utilisé avec Java, C et les applications de traitement, qui fonctionnent à bas niveau et sont capables de contrôler les ressources matérielles, mais pour exécuter une application Web, on dépend d'un système d'exploitation qui limite ces ressources. Pour obtenir quelque chose de plus performant et tirer parti de certaines autres ressources, telles que le GPU, il faut créer une distribution personnalisée.
## Construction distribution Linux
Habituellement, on installe Raspbian et on utilise simplement le navigateur disponible fourni avec le système d'exploitation, qu'il s'agisse d'Epiphany ou de Midori. Avec ces navigateurs fonctionnant sur ce système d'exploitation, on peut naviguer sans trop de tracas, mais sans les animations et les performances:
* La mémoire est partagée entre le système et le GPU. On a 1 Go, mais il est partagé entre ces deux composants.
* Les navigateurs ne peuvent pas utiliser nativement l'accélération matérielle du GPU pour traiter les animations.
Un hack connu consiste à utiliser QT pour forcer l'utilisation du GPU. La compilation de WebKit dans QT donne accès à cette ressource, mais pour y parvenir, il faut créer une distribution Linux propre et abandonner tout ce qui n'est pas essentiel pour garder la RAM disponible pour l'application.
### Construction avec Buildroot
La compilation croisée et la configuration du noyau sont courants que dans le monde Linux ; des choses vraiment de bas niveau par rapport à l'environnement Web. Mais il existe des outils pour aider, [[prive:rpi-buildroot|Buildroot]] en fait partie : un outil simple, efficace et facile à utiliser qui génère des systèmes Linux embarqués par compilation croisée.
Même avec [[prive:rpi-buildroot|Buildroot]], il est important de comprendre et de connaître les dépendances requises par chaque bibliothèque que l'on souhaite compiler.
Le référentiel de [[https://github.com/Metrological/buildroot|Metrological]] permet les meilleures configurations de performances pour Buildroot afin d'exécuter la bibliothèque QT et le moteur WebKit dans Raspberry.
Il suffit de cloner le dépôt :
```
git clone https://github.com/Metrological/buildroot
cd buildroot
```
Ensuite, appliquer la configuration de base pour RPI Model 2 :
```
make rpi2_qt5webkit_defconfig
```
Ou pour accéder au menu Buildroot et voir les autres bibliothèques disponibles, utiliser :
```
make menuconfig
```
Dans ce référentiel, on trouve un fichier `.config` de base avec toutes les bibliothèques considérées comme essentielles pour exécuter une application Web, telles que git, fbv, websocket et python.
Maintenant, copier le fichier mentionné dans le répertoire Buildroot et exécuter :
```
make
```
Le processus prend un certain temps.
### Installation sur la carte SD
On a maintenant une image prête à être clonée dans la SDCard. Utiliser l'une des méthodes décrites [[prive:rpi-patch|ici]] pour graver l'image sur la carte SD. Lorsque la carte est prête, on peut démarrer le RPI et se connecter au système via SSH (Login : root, Mot de passe : root).
```
ssh root@192.168.1.100 # Remplacer par l'adresse IP de RPI !
```
Ensuite, lancer l'application :
```
qtbrowser --url=http://url
```
La distribution qui en résulte est vraiment propre. On n'y trouvera pas d'éléments Debian classiques, comme apt-get. Certaines fonctionnalités dont on peut avoir besoin doivent être installées manuellement.
## Configuration
### Fichiers de boot
Placer le contenu suivant dans `/boot/cmdline.txt`. Cela empêchera le journal de démarrage d'apparaître:
```
dwc_otg.fiq_fix_enable=1 sdhci-bcm2708.sync_after_dma=0 dwc_otg.lpm_enable=0 vt.global_cursor_default=0 console=tty3 root=/dev/mmcblk0p2 rootwait loglevel=3 quiet
```
Dans le fichier `/boot/config.txt`, il faut au minimum définir les propriétés utilisées par ce projet :
* **gpu\_mem\_1024=512**((**gpu\_mem** définit la mémoire GPU si le Pi dispose de 256M, 512M ou 1024. **gpu\_mem\_256**, **gpu\_mem\_512** et **gpu\_mem\_1024** remplacent cela s'ils s'exécutent respectivement sur un pi disposant de 256M , 512M et 1024M.)): mémoire vidéo
* **hdmi\_group=1**((**hdmi\_group** définit le type HDMI, Les modes CEA (**hdmi\_group=1**) sont destinés à la télévision, ils incluent de nombreux modes entrelacés et progressifs, généralement avec des fréquences d'images de 25/50/100 Hz (PAL) ou 30/60/120 Hz (NTSC) et des résolutions TV de 288/480/576/720/1080 lignes de balayage. Les modes DMT (**hdmi\_group=2**) sont destinés aux écrans d'ordinateur, il n'y a donc aucun des modes entrelacés, les résolutions sont 640/720/800/1024/1280 et les fréquences d'images sont compatibles avec les écrans d'ordinateur, quelque chose comme 60/70/75/80/ 85/120Hz. Ne pas spécifier le groupe, ou définir sur 0 utilisera le groupe préféré signalé par l'edid.)): force le mode tv
* **hdmi\_mode=16**: pour utiliser le Full HD 60p
* **hdmi\_force\_hotplug=1**: force la sortie HDMI
```
disable_splash=1
disable_overscan=1
boot_delay=0
arm_freq=1000
gpu_freq=500
over_voltage=6
avoid_warnings=1
force_turbo=0
gpu_mem_256=128
gpu_mem_512=256
gpu_mem_1024=512
kernel=zImage
hdmi_group=1
hdmi_mode=16
hdmi_force_hotplug=1
```
Liste complète des résolutions :
^ HDMI mode ^ VGA((**Mode VGA**: **H** signifie variante 16:9 d'un mode normal 4:3, **2x** signifie pixel doublé c'est-à-dire une fréquence d'horloge plus élevée, chaque pixel étant répété deux fois, **4x** signifie pixel quadruplé c'est-à-dire une fréquence d'horloge plus élevée, chaque pixel étant répété quatre fois)) ^^^ DVI ^^^
| hdmi\_mode=1 | @#ffaaaa:VGA | @#ffaaaa: | @#ffaaaa: | @#bbddee:640x350 | @#bbddee:85Hz | @#bbddee: |
| hdmi\_mode=2 | @#ffaaaa:480p | @#ffaaaa:60Hz | @#ffaaaa: | @#bbddee:640x400 | @#bbddee:85Hz | @#bbddee: |
| hdmi\_mode=3 | @#ffaaaa:480p | @#ffaaaa:60Hz | @#ffaaaa:H | @#bbddee:720x400 | @#bbddee:85Hz | @#bbddee: |
| hdmi\_mode=4 | @#ffaaaa:720p | @#ffaaaa:60Hz | @#ffaaaa: | @#bbddee:640x480 | @#bbddee:60Hz | @#bbddee: |
| hdmi\_mode=5 | @#ffaaaa:1080i | @#ffaaaa:60Hz | @#ffaaaa: | @#bbddee:640x480 | @#bbddee:72Hz | @#bbddee: |
| hdmi\_mode=6 | @#ffaaaa:480i | @#ffaaaa:60Hz | @#ffaaaa: | @#bbddee:640x480 | @#bbddee:75Hz | @#bbddee: |
| hdmi\_mode=7 | @#ffaaaa:480i | @#ffaaaa:60Hz | @#ffaaaa:H | @#bbddee:640x480 | @#bbddee:85Hz | @#bbddee: |
| hdmi\_mode=8 | @#ffaaaa:240p | @#ffaaaa:60Hz | @#ffaaaa: | @#bbddee:800x600 | @#bbddee:56Hz | @#bbddee: |
| hdmi\_mode=9 | @#ffaaaa:240p | @#ffaaaa:60Hz | @#ffaaaa:H | @#bbddee:800x600 | @#bbddee:60Hz | @#bbddee: |
| hdmi\_mode=10 | @#ffaaaa:480i | @#ffaaaa:60Hz | @#ffaaaa:4x | @#bbddee:800x600 | @#bbddee:72Hz | @#bbddee: |
| hdmi\_mode=11 | @#ffaaaa:480i | @#ffaaaa:60Hz | @#ffaaaa:4x H | @#bbddee:800x600 | @#bbddee:75Hz | @#bbddee: |
| hdmi\_mode=12 | @#ffaaaa:240p | @#ffaaaa:60Hz | @#ffaaaa:4x | @#bbddee:800x600 | @#bbddee:85Hz | @#bbddee: |
| hdmi\_mode=13 | @#ffaaaa:240p | @#ffaaaa:60Hz | @#ffaaaa:4x H | @#bbddee:800x600 | @#bbddee:120Hz | @#bbddee: |
| hdmi\_mode=14 | @#ffaaaa:480p | @#ffaaaa:60Hz | @#ffaaaa:2x | @#bbddee:848x480 | @#bbddee:60Hz | @#bbddee: |
| hdmi\_mode=15 | @#ffaaaa:480p | @#ffaaaa:60Hz | @#ffaaaa:2x H | @#bbddee:1024x768 | @#bbddee:43Hz | @#bbddee:DO NOT USE |
| hdmi\_mode=16 | @#ffaaaa:1080p | @#ffaaaa:60Hz | @#ffaaaa: | @#bbddee:1024x768 | @#bbddee:60Hz | @#bbddee: |
| hdmi\_mode=17 | @#ffaaaa:576p | @#ffaaaa:50Hz | @#ffaaaa: | @#bbddee:1024x768 | @#bbddee:70Hz | @#bbddee: |
| hdmi\_mode=18 | @#ffaaaa:576p | @#ffaaaa:50Hz | @#ffaaaa:H | @#bbddee:1024x768 | @#bbddee:75Hz | @#bbddee: |
| hdmi\_mode=19 | @#ffaaaa:720p | @#ffaaaa:50Hz | @#ffaaaa: | @#bbddee:1024x768 | @#bbddee:85Hz | @#bbddee: |
| hdmi\_mode=20 | @#ffaaaa:1080i | @#ffaaaa:50Hz | @#ffaaaa: | @#bbddee:1024x768 | @#bbddee:120Hz | @#bbddee: |
| hdmi\_mode=21 | @#ffaaaa:576i | @#ffaaaa:50Hz | @#ffaaaa: | @#bbddee:1152x864 | @#bbddee:75Hz | @#bbddee: |
| hdmi\_mode=22 | @#ffaaaa:576i | @#ffaaaa:50Hz | @#ffaaaa:H | @#bbddee:1280x768 | @#bbddee: | @#bbddee:reduced blanking |
| hdmi\_mode=23 | @#ffaaaa:288p | @#ffaaaa:50Hz | @#ffaaaa: | @#bbddee:1280x768 | @#bbddee:60Hz | @#bbddee: |
| hdmi\_mode=24 | @#ffaaaa:288p | @#ffaaaa:50Hz | @#ffaaaa:H | @#bbddee:1280x768 | @#bbddee:75Hz | @#bbddee: |
| hdmi\_mode=25 | @#ffaaaa:576i | @#ffaaaa:50Hz | @#ffaaaa:4x | @#bbddee:1280x768 | @#bbddee:85Hz | @#bbddee: |
| hdmi\_mode=26 | @#ffaaaa:576i | @#ffaaaa:50Hz | @#ffaaaa:4x H | @#bbddee:1280x768 | @#bbddee:120Hz | @#bbddee:reduced blanking |
| hdmi\_mode=27 | @#ffaaaa:288p | @#ffaaaa:50Hz | @#ffaaaa:4x | @#bbddee:1280x800 | @#bbddee: | @#bbddee:reduced blanking |
| hdmi\_mode=28 | @#ffaaaa:288p | @#ffaaaa:50Hz | @#ffaaaa:4x H | @#bbddee:1280x800 | @#bbddee:60Hz | @#bbddee: |
| hdmi\_mode=29 | @#ffaaaa:576p | @#ffaaaa:50Hz | @#ffaaaa:2x | @#bbddee:1280x800 | @#bbddee:75Hz | @#bbddee: |
| hdmi\_mode=30 | @#ffaaaa:576p | @#ffaaaa:50Hz | @#ffaaaa:2x H | @#bbddee:1280x800 | @#bbddee:85Hz | @#bbddee: |
| hdmi\_mode=31 | @#ffaaaa:1080p | @#ffaaaa:50Hz | @#ffaaaa: | @#bbddee:1280x800 | @#bbddee:120Hz | @#bbddee:reduced blanking |
| hdmi\_mode=32 | @#ffaaaa:1080p | @#ffaaaa:24Hz | @#ffaaaa: | @#bbddee:1280x960 | @#bbddee:60Hz | @#bbddee: |
| hdmi\_mode=33 | @#ffaaaa:1080p | @#ffaaaa:25Hz | @#ffaaaa: | @#bbddee:1280x960 | @#bbddee:85Hz | @#bbddee: |
| hdmi\_mode=34 | @#ffaaaa:1080p | @#ffaaaa:30Hz | @#ffaaaa: | @#bbddee:1280x960 | @#bbddee:120Hz | @#bbddee:reduced blanking |
| hdmi\_mode=35 | @#ffaaaa:480p | @#ffaaaa:60Hz | @#ffaaaa:4x | @#bbddee:1280x1024 | @#bbddee:60Hz | @#bbddee: |
| hdmi\_mode=36 | @#ffaaaa:480p | @#ffaaaa:60Hz | @#ffaaaa:4xH | @#bbddee:1280x1024 | @#bbddee:75Hz | @#bbddee: |
| hdmi\_mode=37 | @#ffaaaa:576p | @#ffaaaa:50Hz | @#ffaaaa:4x | @#bbddee:1280x1024 | @#bbddee:85Hz | @#bbddee: |
| hdmi\_mode=38 | @#ffaaaa:576p | @#ffaaaa:50Hz | @#ffaaaa:4x H | @#bbddee:1280x1024 | @#bbddee:120Hz | @#bbddee:reduced blanking |
| hdmi\_mode=39 | @#ffaaaa:1080i | @#ffaaaa:50Hz | @#ffaaaa: | @#bbddee:1360x768 | @#bbddee:60Hz | @#bbddee: |
| hdmi\_mode=40 | @#ffaaaa:1080i | @#ffaaaa:100H | @#ffaaaa: | @#bbddee:1360x768 | @#bbddee:120Hz | @#bbddee:reduced blanking |
| hdmi\_mode=41 | @#ffaaaa:720p | @#ffaaaa:100H | @#ffaaaa: | @#bbddee:1400x1050 | @#bbddee: | @#bbddee:reduced blanking |
| hdmi\_mode=42 | @#ffaaaa:576p | @#ffaaaa:100H | @#ffaaaa: | @#bbddee:1400x1050 | @#bbddee:60Hz | @#bbddee: |
| hdmi\_mode=43 | @#ffaaaa:576p | @#ffaaaa:100H | @#ffaaaa: H | @#bbddee:1400x1050 | @#bbddee:75Hz | @#bbddee: |
| hdmi\_mode=44 | @#ffaaaa:576i | @#ffaaaa:100H | @#ffaaaa: | @#bbddee:1400x1050 | @#bbddee:85Hz | @#bbddee: |
| hdmi\_mode=45 | @#ffaaaa:576i | @#ffaaaa:100H | @#ffaaaa: H | @#bbddee:1400x1050 | @#bbddee:120Hz | @#bbddee:reduced blanking |
| hdmi\_mode=46 | @#ffaaaa:1080i | @#ffaaaa:120H | @#ffaaaa: | @#bbddee:1440x900 | @#bbddee: | @#bbddee:reduced blanking |
| hdmi\_mode=47 | @#ffaaaa:720p | @#ffaaaa:120H | @#ffaaaa: | @#bbddee:1440x900 | @#bbddee:60Hz | @#bbddee: |
| hdmi\_mode=48 | @#ffaaaa:480p | @#ffaaaa:120H | @#ffaaaa: | @#bbddee:1440x900 | @#bbddee:75Hz | @#bbddee: |
| hdmi\_mode=49 | @#ffaaaa:480p | @#ffaaaa:120H | @#ffaaaa: H | @#bbddee:1440x900 | @#bbddee:85Hz | @#bbddee: |
| hdmi\_mode=50 | @#ffaaaa:480i | @#ffaaaa:120H | @#ffaaaa: | @#bbddee:1440x900 | @#bbddee:120Hz | @#bbddee:reduced blanking |
| hdmi\_mode=51 | @#ffaaaa:480i | @#ffaaaa:120H | @#ffaaaa: H | @#bbddee:1600x1200 | @#bbddee:60Hz | @#bbddee: |
| hdmi\_mode=52 | @#ffaaaa:576p | @#ffaaaa:200H | @#ffaaaa: | @#bbddee:1600x1200 | @#bbddee:65Hz | @#bbddee: |
| hdmi\_mode=53 | @#ffaaaa:576p | @#ffaaaa:200H | @#ffaaaa: H | @#bbddee:1600x1200 | @#bbddee:70Hz | @#bbddee: |
| hdmi\_mode=54 | @#ffaaaa:576i | @#ffaaaa:200H | @#ffaaaa: | @#bbddee:1600x1200 | @#bbddee:75Hz | @#bbddee: |
| hdmi\_mode=55 | @#ffaaaa:576i | @#ffaaaa:200H | @#ffaaaa: H | @#bbddee:1600x1200 | @#bbddee:85Hz | @#bbddee: |
| hdmi\_mode=56 | @#ffaaaa:480p | @#ffaaaa:240H | @#ffaaaa: | @#bbddee:1600x1200 | @#bbddee:120Hz | @#bbddee:reduced blanking |
| hdmi\_mode=57 | @#ffaaaa:480p | @#ffaaaa:240H | @#ffaaaa: H | @#bbddee:1680x1050 | @#bbddee: | @#bbddee:reduced blanking |
| hdmi\_mode=58 | @#ffaaaa:480i | @#ffaaaa:240H | @#ffaaaa: | @#bbddee:1680x1050 | @#bbddee:60Hz | @#bbddee: |
| hdmi\_mode=59 | @#ffaaaa:480i | @#ffaaaa:240H | @#ffaaaa: H | @#bbddee:1680x1050 | @#bbddee:75Hz | @#bbddee: |
| hdmi\_mode=60 | @#ffaaaa: | @#ffaaaa: | @#ffaaaa: | @#bbddee:1680x1050 | @#bbddee:85Hz | @#bbddee: |
| hdmi\_mode=61 | @#ffaaaa: | @#ffaaaa: | @#ffaaaa: | @#bbddee:1680x1050 | @#bbddee:120Hz | @#bbddee:reduced blanking |
| hdmi\_mode=62 | @#ffaaaa: | @#ffaaaa: | @#ffaaaa: | @#bbddee:1792x1344 | @#bbddee:60Hz | @#bbddee: |
| hdmi\_mode=63 | @#ffaaaa: | @#ffaaaa: | @#ffaaaa: | @#bbddee:1792x1344 | @#bbddee:75Hz | @#bbddee: |
| hdmi\_mode=64 | @#ffaaaa: | @#ffaaaa: | @#ffaaaa: | @#bbddee:1792x1344 | @#bbddee:120Hz | @#bbddee:reduced blanking |
| hdmi\_mode=65 | @#ffaaaa: | @#ffaaaa: | @#ffaaaa: | @#bbddee:1856x1392 | @#bbddee:60Hz | @#bbddee: |
| hdmi\_mode=66 | @#ffaaaa: | @#ffaaaa: | @#ffaaaa: | @#bbddee:1856x1392 | @#bbddee:75Hz | @#bbddee: |
| hdmi\_mode=67 | @#ffaaaa: | @#ffaaaa: | @#ffaaaa: | @#bbddee:1856x1392 | @#bbddee:120Hz | @#bbddee:reduced blanking |
| hdmi\_mode=68 | @#ffaaaa: | @#ffaaaa: | @#ffaaaa: | @#bbddee:1920x1200 | @#bbddee: | @#bbddee:reduced blanking |
| hdmi\_mode=69 | @#ffaaaa: | @#ffaaaa: | @#ffaaaa: | @#bbddee:1920x1200 | @#bbddee:60Hz | @#bbddee: |
| hdmi\_mode=70 | @#ffaaaa: | @#ffaaaa: | @#ffaaaa: | @#bbddee:1920x1200 | @#bbddee:75Hz | @#bbddee: |
| hdmi\_mode=71 | @#ffaaaa: | @#ffaaaa: | @#ffaaaa: | @#bbddee:1920x1200 | @#bbddee:85Hz | @#bbddee: |
| hdmi\_mode=72 | @#ffaaaa: | @#ffaaaa: | @#ffaaaa: | @#bbddee:1920x1200 | @#bbddee:120Hz | @#bbddee:reduced blanking |
| hdmi\_mode=73 | @#ffaaaa: | @#ffaaaa: | @#ffaaaa: | @#bbddee:1920x1440 | @#bbddee:60Hz | @#bbddee: |
| hdmi\_mode=74 | @#ffaaaa: | @#ffaaaa: | @#ffaaaa: | @#bbddee:1920x1440 | @#bbddee:75Hz | @#bbddee: |
| hdmi\_mode=75 | @#ffaaaa: | @#ffaaaa: | @#ffaaaa: | @#bbddee:1920x1440 | @#bbddee:120Hz | @#bbddee:reduced blanking |
| hdmi\_mode=76 | @#ffaaaa: | @#ffaaaa: | @#ffaaaa: | @#bbddee:2560x1600 | @#bbddee: | @#bbddee:reduced blanking |
| hdmi\_mode=77 | @#ffaaaa: | @#ffaaaa: | @#ffaaaa: | @#bbddee:2560x1600 | @#bbddee:60Hz | @#bbddee: |
| hdmi\_mode=78 | @#ffaaaa: | @#ffaaaa: | @#ffaaaa: | @#bbddee:2560x1600 | @#bbddee:75Hz | @#bbddee: |
| hdmi\_mode=79 | @#ffaaaa: | @#ffaaaa: | @#ffaaaa: | @#bbddee:2560x1600 | @#bbddee:85Hz | @#bbddee: |
| hdmi\_mode=80 | @#ffaaaa: | @#ffaaaa: | @#ffaaaa: | @#bbddee:2560x1600 | @#bbddee:120Hz | @#bbddee:reduced blanking |
| hdmi\_mode=81 | @#ffaaaa: | @#ffaaaa: | @#ffaaaa: | @#bbddee:1366x768 | @#bbddee:60Hz | @#bbddee: |
| hdmi\_mode=82 | @#ffaaaa: | @#ffaaaa: | @#ffaaaa: | @#bbddee:1080p | @#bbddee: 60z | @#bbddee: |
| hdmi\_mode=83 | @#ffaaaa: | @#ffaaaa: | @#ffaaaa: | @#bbddee:1600x900 | @#bbddee: | @#bbddee:reduced blanking |
| hdmi\_mode=84 | @#ffaaaa: | @#ffaaaa: | @#ffaaaa: | @#bbddee:2048x1152 | @#bbddee: | @#bbddee:reduced blanking |
| hdmi\_mode=85 | @#ffaaaa: | @#ffaaaa: | @#ffaaaa: | @#bbddee:720p | @#bbddee:60Hz | @#bbddee: |
| hdmi\_mode=86 | @#ffaaaa: | @#ffaaaa: | @#ffaaaa: | @#bbddee:1366x768 | @#bbddee: | @#bbddee:reduced blanking |
### Démarrage automatique des applications
Un point intéressant sur l'utilisation du RPI est de construire un système dans lequel l'interaction humaine est rarement nécessaire. Il peut démarrer et se mettre à jour sans aucune interaction. Les scripts peuvent aider dans ce processus
L'exemple suivant utilise git pour mettre à jour un dépôt local:
```
cat >> /etc/init.d/S80init <> /etc/init.d/S90app <Afin d'automatiser un maximum sans devoir saisir un mot de passe sudo crée un fichier `/etc/sudoers.d/90-rpi` contenant:\\ \\ `pi ALL = NOPASSWD:/usr/bin/fbi`
### Écran de démarrage
On peut implémenter un écran de démarrage en quelques étapes simples :
* Créer une séquence PNG nommée frame*.png et la placer dans un répertoire à l'intérieur de RPI.
* Modifier /etc/init.d/S01logging et inclure le code suivant dans la première ligne :
```
# Splash initiale !
cat /dev/zero 1> /dev/fb0 2>/dev/null
fbv -i -c /home/default/bootanimations/frame*.png --delay 1
```
## mpv accéléré matériellement
Pour utiliser la lecture vidéo accélérée par le matériel de mpv sur le Raspberry Pi il faut construire deux packages basés sur les packages officiels, modifiés
* **ffmpeg** avec --enable-mmal pour la prise en charge de l'accélération matérielle MMAL
* **mpv** avec --enable-rpi pour la prise en charge de Raspberry Pi
### Construction de mpv
Pour compiler pour une architecture différente, il faut installer les prérequis nécessaires :
```
apt install git make gcc device-tree-compiler bison flex libssl-dev libncurses-dev
```
Puis installer un compilateur croisé à jour et l'ensemble des outils associés. Il faut choisir la version adaptée à l'architecture de la machine hôte (celle sur laquelle on compile) et de la machine cible.
Par exemple, pour une compilation sur une architectuer aarch64 vers une architecture armhf, utiliser la version gcc-linaro-12.0.1-2022.02-aarch64_arm-linux-gnueabihf.tar.xz.
```
wget https://snapshots.linaro.org/gnu-toolchain/12.0-2022.02-1/arm-linux-gnueabihf/gcc-linaro-12.0.1-2022.02-aarch64_arm-linux-gnueabihf.tar.xz
sudo tar xf gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf.tar.xz -C /opt
```
Configurer le compilateur croisé :
```
export ARCH=arm
export CROSS_COMPILE=/opt/gcc-linaro-12.0.1-2022.02-aarch64_arm-linux-gnueabihf-
```
Bien que ffmpeg prenne une heure à construire, la prise en charge de MMAL est requise pour l'accélération matérielle dans mpv.
```
sudo apt-get install -y gperf bison flex autoconf automake make libharfbuzz-dev libfreetype6-dev libx11-dev libxrandr-dev libvdpau-dev libva-dev mesa-common-dev libegl1-mesa-dev yasm libasound2-dev libpulse-dev libuchardet-dev zlib1g-dev libfribidi-dev git libgnutls28-dev libgl1-mesa-dev libsdl2-dev wget texinfo help2man libtool libtool-bin ncurses-dev git yasm mercurial cmake cmake-curses-gui libfribidi-dev checkinstall libfontconfig1-dev libgl1-mesa-dev libgles2-mesa-dev gnutls-dev libsmbclient-dev libpulse-dev libbluray-dev libdvdread-dev libluajit-5.1-dev libjpeg-dev libv4l-dev libcdio-cdda-dev libcdio-paranoia-dev python g++
git clone https://github.com/mpv-player/mpv-build.git
cd mpv-build
echo --enable-libmpv-shared > mpv_options
echo --disable-cplayer >> mpv_options
echo --enable-rpi >> mpv_options
echo --enable-mmal >> ffmpeg_options
./use-mpv-release
./use-ffmpeg-release
./rebuild -j4
./update
sudo ./install
sudo ldconfig
```
### Construction de jellyfin_media_player
**jellyfin media player** est un client de bureau utilisant jellyfin-web avec lecteur MPV intégré. Il est basé sur Plex Media Player et prend en charge Windows, Mac OS et Linux. Les médias sont lus dans la même fenêtre en utilisant l'interface jellyfin-web contrairement à Jellyfin Desktop. Il prend en charge le flux audio.
```
sudo apt install autoconf automake libtool libharfbuzz-dev libfreetype6-dev libfontconfig1-dev libx11-dev libxrandr-dev libvdpau-dev libva-dev mesa-common-dev libegl1-mesa-dev yasm libasound2-dev libpulse-dev libuchardet-dev zlib1g-dev libfribidi-dev git libgnutls28-dev libgl1-mesa-dev libsdl2-dev cmake wget python g++ qtwebengine5-dev qtquickcontrols2-5-dev libqt5x11extras5-dev libcec-dev qml-module-qtquick-controls qml-module-qtwebengine qml-module-qtwebchannel qtbase5-private-dev
mkdir jmp; cd jmp
git clone git://github.com/iwalton3/jellyfin-media-player
cd jellyfin-media-player
mkdir build
cd build
wget https://github.com/iwalton3/jellyfin-web-jmp/releases/download/jwc-1.7.2-2/dist.zip
unzip dist.zip
cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/usr/local/ ..
make -j4
sudo make install
rm -rf ~/jmp/
```
**jellyfin-mpv-shim** permet de diffuser des médias depuis Jellyfin Mobile et les applications Web vers MPV. On peut l'installer à partir via pip, mais cela nécessite d'installer les prérequis suivants:\\ \\ `sudo apt installer python3-tk python3-jinja2 python3-webview gir1.2-webkit2-4.0`\\ \\ avant d'installer python-mpv, pystray et jellyfin-mpv-shim:\\ \\ `sudo pip3 install --upgrade python-mpv pystray jellyfin-mpv-shim`