|
@@ -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.
|