123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- \section{Objectifs}
- La finalité de ce module est de pouvoir lire des flux vidéos depuis un torrent,
- c'est-à-dire d'effectuer la lecture d'un média transmis en streaming pair à
- pair.
- Le module en lui-même est également un très bon candidat pour exploiter un
- nouveau type de module dans libvlccore: les \inltype{stream_extractor}. Ces
- composants s'insèrent au niveau du \inltype{demux} et lui fournissent une
- interface pour choisir quel média lire à partir du fichier torrent ou du lien
- magnet. Le concept amené par ce nouveau type de module est facilement
- descriptible par l'exemple. Le premier module réalisé ayant cette capacité est
- celui capable de lire des archives. Cela permet alors d'ouvrir l'archive comme
- si il s'agissait d'un dossier et lire n'importe quel flux au sein de ce premier
- flux.
- Ce module existait déjà avant le début de mon travail, mais j'ai travaillé sur
- les problématiques suivantes.
- \begin{itemize}
- \item Portage du module et mise à jour des dépendances.
- \item Ajout du support pour GnuTLS.\@
- \item Intégration avec WebTorrent.
- \end{itemize}
- \section{Support de Windows et Android}
- \subsection{Réimplémentation de promesses}
- L'implémentation initiale était écrite avec la bibliothèque standard en C++14.
- le module n'était alors pas utilisable sous Windows compilé avec MinGW en
- version winpthread. Il a donc fallu écrire un wrapper remplaçant les mutexes,
- threads et variables de conditions utilisés en substituant pour l'implémentation
- disponible dans VLC.\@
- Le travail était donc en particulier d'écrire une nouvelle implémentation des
- promesses et futures.
- Le concept se sépare en deux parties: d'un côté les futures sont renvoyées à
- l'utilisateur lorsqu'il souhaite effectuer une action asynchrone. Lorsque
- l'utilisateur souhaite utiliser la valeur, il peut utiliser la fonction
- \inltype{get}. Lors de l'appel à \inltype{get}, soit la valeur est disponible et
- elle est retournée, soit une erreur est disponible sous forme d'exception et
- elle est lancée, soit aucun des deux n'est encore disponible et l'appel bloque
- jusqu'à la validation de la promesse. De l'autre côté, la promesse est utilisée
- par la fonction asynchrone pour fournir la valeur ou l'erreur à renvoyer. Une
- promesse ne peut être exaucée qu'une seule fois par une valeur ou une erreur.
- % TODO: expliquer thread-safe
- Afin de faire fonctionner ces deux parties ensemble, il faut les doter d'un état
- partagé. L'implémentation utilise un pointeur avec comptage de référence sur cet
- état partagé pour gérer atomiquement sa durée de vie, puis l'état contenu dans
- le pointeur fournit une interface thread-safe.
- L'intégration dans le module se fait par la classe déjà existante
- \inltype{i11e_promise}, pour \og{}promesse interruptible\fg{}, qui permet de définir les
- attentes des promesses comme un point d'annulation possible pour le thread.
- \subsection{Correction des problèmes de compilation de libtorrent}
- La seconde partie du travail a consisté à faire compiler libtorrent sur les
- autres plateformes que Linux. J'ai pour cela ouvert des tickets et proposé des
- \og{}pull request\fg{}, principalement pour le système de build. J'ai aussi intégré des
- patch temporaires rajoutant une implémentation des threads pour winpthread. Cela
- semble rentrer en conflit avec le travail effectué précédemment, mais cette
- initiative est seulement cloisonnée à la dépendance et ne déborde pas sur VLC.
- \@ C'est notamment une solution temporaire apparues avec le remplacement de
- \inltype{boost::thread}, destinée à disparaitre dans le futur et un patch
- s'accorde plus facilement avec cet esprit.
- % TODO: https://github.com/arvidn/libtorrent/pull/2999
- % TODO: ajouter références vers les pull requests
- Sur les cinq pull requests proposées, quatre ont été acceptées et intégrées:
- \begin{itemize}
- \item \og{}dynamically load getauxval so as to support older android devices\fg{}
- \#2830: utilise \inltype{dlsym} pour charger dynamiquement
- \inltype{getauxval} et éviter la situation où la bibliothèque ne compile pas
- quand \inltype{sys/auxv.h} n'est pas disponible.
- \item \og{} Add missing define for old android sdk\fg{} \#2831 corrige des erreurs
- de compilation avec netlink lorsque certaines constantes ne sont pas
- définies.
- \item \og{}fix if defined TORRENT\_ANDROID\fg{} \#2836 définit la constante
- \inltype{TORRENT_ANDROID} pour faire fonctionner la pull request précédente.
- \item \og{}add windows socket libraries in Makefile.am\fg{} \#2834 corrige la
- configuration autotools du projet qui n'était pas à jour avec les autres
- scripts de construction.
- \end{itemize}
- \section{Étude des besoins pour l'ajout du support SSL}
- Lors de l'utilisation de trackers privés, il est possible d'utiliser des
- certificats SSL pour s'assurer que la personne se connectant aux autres hôtes
- appartient bien au réseau, en plus de chiffrer très faiblement les données avec
- un algorithme RC4.
- % TODO décrire BEP
- Libtorrent supporte\cite{SSLlibtorrent} la BEP 35\cite{BEP35} qui est une extension au protocole apportant cette
- fonctionnalité. En interne, libtorrent utilise OpenSSL.\@ Or, la licence
- d'OpenSSL n'est pas compatible avec les applications sous licence GPL.\@
- L'objectif de cette mission était donc d'essayer d'intégrer GnuTLS dans
- Libtorrent en parallèle du support pour OpenSSL.\@
- Après discussion avec le développeur principal de Libtorrent, le projet s'est
- transformé en l'intégration de GnuTLS dans boost::asio, la bibliothèque réseau
- utilisée par Libtorrent. Quelques tentatives d'intégration ont néanmoins été
- faites directement dans libtorrent pour modifier d'autres parties dépendant
- directement d'OpenSSL.
- A la suite d'une autre discussion avec des développeurs souhaitant aussi
- l'arrivée de cette fonctionnalité, évoquant la difficulté de faire accepter une
- pull request sur le dépôt officiel, et devant la quantité de travail à effectuer
- pour cette intégration, le projet a été mis en pause pour donner la priorité au
- reste du stage.
- \section{Projet subsidiaire, support du WebTorrent}
- Le module était déjà fonctionnel et est désormais compatible avec toutes les
- plateformes importantes, malgré le manque de support pour OpenSSL.\@ Cependant
- il ne peut pas être intégré et distribué avec VLC pour des raisons
- principalement politiques. Un logiciel aussi connu distribuant un moyen
- d'utiliser des torrents illégaux seraient mal vu et représente une position
- difficile à assumer.
- Suivant l'annonce de la sortie de PeerTube, se voulant être un Youtube
- décentralisé fonctionnant grâce à Webtorrent, l'idée de s'intégrer nativement à
- Peertube a émergé comme une alternative correcte pour justifier l'intégration
- de ce module. Après une discussion avec Jean-Baptiste, l'idée fut acceptée et
- j'ai pû commencer à me renseigner sur les différents moyens à notre disposition
- pour utiliser webtorrent dans le module torrent.
- La stratégie fut sans surprise de procéder à l'intégration dans Libtorrent du
- support de Webtorrent. Malheureusement ce dernier n'est pas encore standardisé
- dans une BEP, ou \og{}BitTorrent Enhancement Proposal\fg{} comme décrit dans la BEP 001.
- L'extension au protocole n'est donc pas encore terminée ni acceptée et seule une
- implémentation de référence en nodeJS est disponible.
- En suivant les discussions autour de cette intégration, je suis rapidement
- arrivé à la nécessité d'intégrer une bibliothèque permettant de supporter une
- connexion WebRTC directement dans libtorrent, le protocole BitTorrent étant
- identique une fois l'établissement de celle-ci. À ce jour, aucune action
- significative n'a encore été entreprise pour avancer sur cette tâche, par manque
- de temps.
|