sandbox_memory_blocks.tex 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. \section{Gestion des blocs de données dans le pipeline}
  2. Lorsque l'on traite des données en streaming, on récupère la plupart du temps
  3. des tronçons de données. Dans VLC, ces tronçons sont annotés par des données
  4. multimédia : le dts et le pts par exemple, qui indique des instants pour le
  5. décodage et la présentation des images d'une vidéo. On verra son fonctionnement
  6. en détails dans la partie encodage matériel pour Android.
  7. Ce type de données est particulièrement présent dans le pipeline multimédia de
  8. VLC. On obtient des \inltype{block_t} après une lecture depuis un fichier ou le
  9. réseau, qui est transmis au \inltype{demux_t} qui va analyser et extraire
  10. différents flux audio, vidéo et sous-titre. Il crée un \inltype{block_t} pour
  11. chacune des unités correspondant au format de ces flux, on peut par exemple
  12. penser à une image pour un flux MJPEG. Ces blocs sont ensuite transmis au
  13. décodeur correspondant qui va créer la \inltype{picture_t} pour la vidéo, ou
  14. \inltype{subpicture_t} pour les sous-titres, ou \inltype{block_t} pour l'audio
  15. et la passer dans la chaîne de filtre pour l'envoyer à la sortie correspondante.
  16. Il faut désormais repenser à la situation de la sandbox et se souvenir que ces
  17. données-là vont devoir transiter d'un processus à l'autre de façon efficace. On
  18. va donc essayer de s'intéresser aux allocations effectuées par les modules et
  19. intégrer cette gestion en utilisant les mécanismes du système d'exploitation.
  20. Dans tous les cas, le système d'exploitation dispose d'un mécanisme de mémoire
  21. partagée pour dresser la correspondance de pages mémoires dans des processus
  22. différents. On peut donc essayer d'introduire des \inltype{block_t} alloués
  23. comme des mémoires partagées que l'on transmet de processus en processus.
  24. \section{Intégration avec la gestion des accès}
  25. Avec cette idée-là, la gestion de l'accès des processsus aux ressources devient
  26. cruciale. Il faut d'un côté pouvoir donner accès à ces données de façon
  27. performante, mais de l'autre côté offrir une isolation suffisante entre les
  28. processus. Il faut également pouvoir s'intégrer facilement dans le système
  29. d'envoi de message.
  30. Deux solutions sont alors envisagées. La première est de créer des blocs de
  31. mémoire sous forme de jetons d'accès dès lors qu'il y a création d'un nouveau
  32. bloc. Ces blocs peuvent donc être passés de façon indépendante, idéalement avec
  33. un paradigme \og{}fire\&forget\fg{} qui fera le transfert de l'appartenance du bloc d'un
  34. processus à l'autre. Avec cette méthode, il suffit de modifier les fonctions
  35. comme \inltype{block_Alloc}, presque aucune synchronisation supplémentaire n'est
  36. requise.
  37. La seconde solution est de créer un seul bloc de mémoire partagé entre les deux
  38. processus, puis de multiplexer l'accès dessus pour plusieurs blocs. Bien
  39. qu'étant plus compatible avec la plupart des systèmes ainsi que plus performant,
  40. cela implique des manipulations sur le tampon ainsi qu'une moins bonne isolation
  41. entre les modules, on préfèrera donc la première méthode dès lors qu'elle est
  42. possible à mettre en place.
  43. On pourra noter qu'il est également possible d'émuler l'accès à travers une IPC,
  44. en transférant directement les blocs dessus, mais on souhaitera éviter cette
  45. situation pour des raisons de performance.