Browse Source

chapters/other_bug_features: ajout du bug mkv

Alexandre Janniaux 6 years ago
parent
commit
8afc0bb025
1 changed files with 63 additions and 1 deletions
  1. 63 1
      chapters/other_bug_features.tex

+ 63 - 1
chapters/other_bug_features.tex

@@ -71,4 +71,66 @@ complexes vis-à-vis de la méthode de test.
 
 \section{Contournement pour la lecture de fichiers matroska invalides}
 
-
+Il arrive parfois que certains fichiers soient lisibles avec d'autres lecteurs
+vidéos mais ne le soient pas avec VLC. Ce cas-ci s'est présenté à moi alors que
+les lecteurs en question étaient bien plus simple et supportaient moins de
+fonctionnalités.
+
+Le fichier, une vidéo encodée en h264 muxée dans un format matroska, n'ayant
+aucune caractéristique supplémentaire indiquant un manque de fonctionnalité j'ai
+dû utiliser \inltype{gdb} pour savoir exactement quelle condition rejetait le
+fichier. Le problème arrivait en particulier seulement sur le décodeur MediaCodec mais
+pas avec le décodeur FFmpeg.
+
+Après débogage, il apparu que c'était la fonction
+\inltype{h264_helper_set_extra} qui renvoyait un \inltype{VLC_EGENERIC}.
+
+Le bytestream h264 peut être présenté sous deux formats. Le premier, appelé
+Annex B en référence à l'annexe de la norme le décrivant, consiste à séparer les
+unités du format par un code spécial, étant ici \inltype{0x00 0x00 0x00 0x01}.
+Ce code indique donc le début d'une nouvelle unité à décoder et est spécialement
+adapté au streaming vidéo, où on peut commencer à recevoir le stream au milieu
+d'une unité. Le second, avcC, précise des informations en début d'unité pour
+indiquer où trouver la suivante.
+
+La fonction \inltype{h264_helper_set_extra} se découpe selon le format: le
+comportement changent selon si bytestream est de l'avcC ou de l'Annex B, et une
+erreur est émise s'il ne s'agit d'aucun des deux. En affichant les quatres
+premiers octets de chaque tampon mémoire reçu, j'ai alors vu que je recevais
+systématiquement \inltype{0x01 0x00 0x00 0x01} et j'ai donc regardé les
+informations et note de mise à jours liées au logiciel utilisé,
+\inltype{mkvmerge}. J'ai finalement trouvé une information indiquant que le
+premier octets du code de démarrage de l'Annex B, censé être réservé et définit
+à zéro, était incorrectement définit à un.
+
+%    demux:mkv: fix hvcC detection with mkvmerge
+%
+%    mkvmerge had an issue with the first reserved bits and fixed it in v16.0.0
+%    in the commit 4bb8ad6f5565e87ad6d6a8e7e9d453e64985344e. Some files done
+%    with anterior versions were not played by VLC with mediacodec.
+%
+%    See the changelog of mkvmerge for version 16.0.0, especially the
+%    following:
+%    * mkvmerge: HEVC/h.265: the generation of the HEVCC structure stored in
+%      `CodecPrivate` was wrong in two places: 1. the position of the number of
+%      sub-layers was swapped with reserved bits and 2. the VPS/SPS/PPS/SEI lists
+%      did not start with a reserved 1 bit.
+%
+%    See also https://code.videolan.org/videolan/vlc-android/issues/466 for issue
+%    and sample.
+
+Je suis alors remonté jusqu'au demuxeur pour rajouter un test vérifiant le
+logiciel utilisé pour muxer et la version de ce logiciel. Si il s'agit de
+mkvmerge < 16.0, une correction du bytestream est désormais appliquée pour ne
+plus poser de problème au niveau des décodeurs.
+
+Cette résolution de bogue a été étrange pour moi sur la façon dont il a fallu le
+résoudre, tout en me montrant deux points particulier. D'abord, supporter des
+fichiers invalides peut donner lieu à plus de fichiers invalides et peut à terme
+réduire les possibilités d'extension du format ou même son interopérabilité avec
+des lecteurs faisant plus attention à la norme. Ensuite, les problèmes liés au
+multimédia sont souvent causés par des formats peu compris, mal exploités ou
+complètement invalide. Enfin, le patch que j'ai fait n'a finalement pas suffit
+et d'autres occurences du problème ont eu lieu plus tard, donnant lieu à un
+patch plus large et montrant une nouvelle fois la difficulté de tester le
+logiciel sur tous les formats disponibles.