other_bug_features.tex 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. \section{Description des missions}
  2. Durant le stage et particulièrement au début, je me suis attaché à corriger des
  3. bogues et ajouter des fonctionnalités mineures à certaines parties de VLC.
  4. L'objectif de ces missions était pour la plupart d'entre elles d'apprendre le
  5. fonctionnement de VLC.
  6. Parmi ces missions, j'ai d'abord tenté de corriger un crash apparaissant lors de
  7. la fermeture de VLC. Puis j'ai ajouté le support du format MPEG-2 dans le
  8. décodeur hardware pour Android, alors que les brevets liés au format expiraient.
  9. Ensuite, j'ai rajouté une solution de contournement pour les fichiers réalisés
  10. avec un logiciel qui produisait un flux Matroska (mkv) invalide, mais restait
  11. lisible par d'autres logiciels.
  12. % TODO http://www.mpegla.com/main/programs/M2/Documents/m2-att1.pdf
  13. Certaines parties du stage ne seront pas décrites dans ce document. Il s'agit
  14. par exemple du support sur le forum dédié à VideoLAN, des communications avec
  15. des acteurs externes à VideoLabs, les réunions et discussions effectuées autour
  16. de différents thèmes venant la plupart du temps d'un des projets de ce document,
  17. les tests manuels de l'application avant la sortie d'une nouvelle version
  18. importante, ou bien les ajouts réellement mineurs liés à une demande
  19. utilisateur.
  20. \section{Tentative de correction d'un crash}
  21. Cette mission fut ma toute première à VideoLabs. Arrivant légèrement en avance,
  22. et après discussion sur l'environnement de travail et mon futur rôle de
  23. stagiaire dans l'entreprise, on me demanda de compiler VLC pour me faire
  24. patienter avant midi, puis ne suffisant pas je fus redirigé vers ce bogue.
  25. % TODO: use after free ou double free ?
  26. Après utilisation de \inltype{asan}, un outil de vérification intrusif des accès
  27. mémoires, il s'avérait qu'un \og{}use-after-free\fg{} avait lieu dans le code de la
  28. playlist VLC lors de la fermeture de l'application. N'ayant jamais utilisé Asan
  29. auparavant, ce fut une excellente introduction à l'outil, mais ne m'a pas suffit
  30. à déterminer la source du problème.
  31. % TODO http://git.videolan.org/?p=vlc.git;a=commit;h=70174a131ac045b33a8db417e7c626ec67cb0f53
  32. Le bug fut corrigé peu après par un autre développeur de l'entreprise, mais m'a
  33. permis de commencer à savoir naviguer dans un code source conséquent tout en
  34. faisant plus attention à mon environnement de débogage et de compilation,
  35. particulièrement sous Archlinux.
  36. \section{Ajout du support MPEG-2 dans MediaCodec}
  37. Cet ajout de fonctionnalité fut le premier patch intégré dans la branche master
  38. de VLC. Ce fut également le premier bug que j'ai pû écrire pour l'application.
  39. D'un part, l'activation du format fut raisonnable simple et correspondait à
  40. remplir un cas particulier dans un \inltype{switch}.
  41. De l'autre part, il a fallu rajouter des fonctions pour parser le bytestream
  42. entrant et extraire les informations de ratio d'aspect. Cette partie fut plus
  43. complexe, dans un premier temps pour comprendre cette notion de ratio d'aspect
  44. et les différences et interactions entre le ratio d'aspect source, le ratio
  45. d'aspect écran et le ratio d'aspect définit par l'utilisateur. Néanmoins ces
  46. informations-là m'ont servi plus tard pour aider à l'ajout de la gestion de
  47. l'aspect ratio utilisateur dans la version iOS de l'application.
  48. Ce passage fut également pour moi l'occasion de lire ma première norme liée au
  49. multimédia, ici la norme DVD, tout en produisant mon premier patch utile pour
  50. VLC. Ce fut également l'occasion de commencer à utiliser
  51. \inltype{git send-email} en suivant les recommandations du wiki de
  52. l'association.
  53. Quant au bug introduit, il fut corrigé plusieurs mois plus tard, révélant la
  54. difficulté de tester correctement VLC avec la diversité des formats, des
  55. bytestreams et des éditeurs existant, en plus de poser des questions techniques
  56. complexes vis-à-vis de la méthode de test.
  57. \section{Contournement pour la lecture de fichiers matroska invalides}
  58. Il arrive parfois que certains fichiers soient lisibles avec d'autres lecteurs
  59. vidéos mais ne le soient pas avec VLC. Ce cas-ci s'est présenté à moi alors que
  60. les lecteurs en question étaient bien plus simple et supportaient moins de
  61. fonctionnalités.
  62. Le fichier, une vidéo encodée en h264 muxée dans un format matroska, n'ayant
  63. aucune caractéristique supplémentaire indiquant un manque de fonctionnalité j'ai
  64. dû utiliser \inltype{gdb} pour savoir exactement quelle condition rejetait le
  65. fichier. Le problème arrivait en particulier seulement sur le décodeur MediaCodec mais
  66. pas avec le décodeur FFmpeg.
  67. Après débogage, il apparu que c'était la fonction
  68. \inltype{h264_helper_set_extra} qui renvoyait un \inltype{VLC_EGENERIC}.
  69. Le bytestream h264 peut être présenté sous deux formats. Le premier, appelé
  70. Annex B en référence à l'annexe de la norme le décrivant, consiste à séparer les
  71. unités du format par un code spécial, étant ici \inltype{0x00 0x00 0x00 0x01}.
  72. Ce code indique donc le début d'une nouvelle unité à décoder et est spécialement
  73. adapté au streaming vidéo, où on peut commencer à recevoir le stream au milieu
  74. d'une unité. Le second, avcC, précise des informations en début d'unité pour
  75. indiquer où trouver la suivante.
  76. La fonction \inltype{h264_helper_set_extra} se découpe selon le format: le
  77. comportement changent selon si bytestream est de l'avcC ou de l'Annex B, et une
  78. erreur est émise s'il ne s'agit d'aucun des deux. En affichant les quatres
  79. premiers octets de chaque tampon mémoire reçu, j'ai alors vu que je recevais
  80. systématiquement \inltype{0x01 0x00 0x00 0x01} et j'ai donc regardé les
  81. informations et note de mise à jours liées au logiciel utilisé,
  82. \inltype{mkvmerge}. J'ai finalement trouvé une information indiquant que le
  83. premier octets du code de démarrage de l'Annex B, censé être réservé et définit
  84. à zéro, était incorrectement définit à un.
  85. % demux:mkv: fix hvcC detection with mkvmerge
  86. %
  87. % mkvmerge had an issue with the first reserved bits and fixed it in v16.0.0
  88. % in the commit 4bb8ad6f5565e87ad6d6a8e7e9d453e64985344e. Some files done
  89. % with anterior versions were not played by VLC with mediacodec.
  90. %
  91. % See the changelog of mkvmerge for version 16.0.0, especially the
  92. % following:
  93. % * mkvmerge: HEVC/h.265: the generation of the HEVCC structure stored in
  94. % `CodecPrivate` was wrong in two places: 1. the position of the number of
  95. % sub-layers was swapped with reserved bits and 2. the VPS/SPS/PPS/SEI lists
  96. % did not start with a reserved 1 bit.
  97. %
  98. % See also https://code.videolan.org/videolan/vlc-android/issues/466 for issue
  99. % and sample.
  100. Je suis alors remonté jusqu'au demuxeur pour rajouter un test vérifiant le
  101. logiciel utilisé pour muxer et la version de ce logiciel. Si il s'agit de
  102. mkvmerge < 16.0, une correction du bytestream est désormais appliquée pour ne
  103. plus poser de problème au niveau des décodeurs.
  104. Cette résolution de bogue a été étrange pour moi sur la façon dont il a fallu le
  105. résoudre, tout en me montrant deux points particulier. D'abord, supporter des
  106. fichiers invalides peut donner lieu à plus de fichiers invalides et peut à terme
  107. réduire les possibilités d'extension du format ou même son interopérabilité avec
  108. des lecteurs faisant plus attention à la norme. Ensuite, les problèmes liés au
  109. multimédia sont souvent causés par des formats peu compris, mal exploités ou
  110. complètement invalide. Enfin, le patch que j'ai fait n'a finalement pas suffit
  111. et d'autres occurences du problème ont eu lieu plus tard, donnant lieu à un
  112. patch plus large et montrant une nouvelle fois la difficulté de tester le
  113. logiciel sur tous les formats disponibles.