Archives pour juillet 2008

h1

libplayer et le multi-threading

2008.07.30

Hi,

depuis le 28 juillet, le “core” de libplayer a subit une très grosse refonte. La raison principale était l’impossibilité d’auto-piloter libplayer depuis l’intérieur. Par exemple il n’était pas possible d’ordonner à libplayer de passer au morceau suivant depuis le callback. La raison est assez simple, le callback était (et est toujours) exécuté en parallèle au reste de la librairie. Appeler les routines pour changer de morceau aurait pu avoir de graves conséquences si depuis l’API public, le programme basé sur libplayer faisait la même chose dans le même intervalle de temps. En résumé, libplayer n’était tout simplement pas thread-safe.

Désormais ceci n’est plus qu’un souvenir. libplayer peut gérer des appels multiples et concourants sur “presque” toute l’API publique. Oui “presque”, car les fonctions d’init/uninit sont évidemment mandataires sur toutes les autres fonctions. Et les appels parallèles doivent se limiter à une même instance de player_t. Il y a également quelques fonctions uniquement réentrantes qui ne sont utiles qu’à la gestion des instances pour les MRLs.

Le diagramme ci-dessous résume assez bien le fonctionnement interne du nouveau libplayer:

Il y a grosso-modo deux threads principaux. Tout d’abord le superviseur qui va gérer toutes les entrées de l’API qui sont thread-safes et un gestionnaire d’événements qui va s’occuper de renvoyer les événements au callback interne puis au callback public tout en restant synchronisé avec le superviseur. Quelques explications plus techniques sont disponibles dans ce fichier de documentation.

A bientôt

Mathieu SCHROETER

h1

libplayer: MPlayer et le dvd://

2008.07.03

Hello,

en voulant étendre libplayer comme à mon habitude je me suis confronté à un petit problème. Et de ce fait j’ai dû me pencher sur les sources d’MPlayer. Il faut dire que ce n’est pas la première fois, mais j’y reviendrais un jour dans un autre article.

Il y a quelques mois, libplayer permettait de gérer les dvd et dvdnav simplement parce que la commande pour ajouter un stream utilisait directement des MRLs. Mais ceci a changé pour différentes raisons.. Et donc il faut désormais explicitement dire à libplayer quel genre de ressource on désire lire. Dans le cas d’un DVD un enum donne le choix entre MRL_RESOURCE_DVD et MRL_RESOURCE_DVDNAV. Mon but est donc de gérer ces deux cas de figure afin que l’on puisse à nouveau lire ce genre de média. Et c’est exactement ici qu’un problème apparait.

Selon le manpage de MPlayer, le MRL pour lire un dvd/dvdnav se comporte ainsi:

[dvd|dvdnav]://[title|[start_title]-end_title]

Ce qui me semblait surprennant c’est que pour lire un CD-Audio ou même un VideoCD, les MRLs permettent de passer en plus un argument optionnel [/device] afin d’indiquer le lecteur CD à utiliser. Ce qui est extrêmement pratique dans le cas de libplayer, car il faut savoir que sans cet argument, le seul moyen de changer le lecteur de DVD par défaut est de le spécifier au démarrage de MPlayer avec -dvd-device ou alors en spécifiant celui-ci dans le fichier .mplayer/config.
Bien entendu ce n’est pas acceptable lorsque l’on travail en mode “-slave -idle”. Car dans ce cas, MPlayer est chargé une fois pour toute au démarrage et il est fréquent que les utilisateurs aient plusieurs lecteurs DVD.

Je me suis donc plongé dans le code de MPlayer à la recherche de cet argument optionnel. Et j’ai constaté un détail très intéressant avec dvdnav. Celui-ci permet déjà de gérer l’argument [/device] mais pourtant le manpage n’est pas du même avis. J’en profite donc pour étudier le fonctionnement de l’argument dans stream/stream_vcd.c et stream/stream_dvdnav.c afin de créer un patch pour stream/stream_dvd.c.

Au moment même où j’écris ces lignes, ce patch est en attente d’être contrôlé et je l’espère commité par un dev d’MPlayer.

http://lists.mplayerhq.hu/pipermail/mplayer-dev-eng/2008-July/058011.html

A bientôt…

Mathieu SCHROETER