\section{Description des missions}

Durant le stage et particulièrement au début, je me suis attaché à corriger des
bogues et ajouter des fonctionnalités mineures à certaines parties de VLC.
L'objectif de ces missions était pour la plupart d'entre elles d'apprendre le
fonctionnement de VLC.

Parmi ces missions, j'ai d'abord tenté de corriger un crash apparaissant lors de
la fermeture de VLC. Puis j'ai ajouté le support du format MPEG-2 dans le
décodeur hardware pour Android, alors que les brevets liés au format expiraient.
Ensuite, j'ai rajouté une solution de contournement pour les fichiers réalisés
avec un logiciel qui produisait un flux Matroska (mkv) invalide, mais restait
lisible par d'autres logiciels.
% TODO http://www.mpegla.com/main/programs/M2/Documents/m2-att1.pdf

Certaines parties du stage ne seront pas décrites dans ce document. Il s'agit
par exemple du support sur le forum dédié à VideoLAN, des communications avec
des acteurs externes à VideoLabs, les réunions et discussions effectuées autour
de différents thèmes venant la plupart du temps d'un des projets de ce document,
les tests manuels de l'application avant la sortie d'une nouvelle version
importante, ou bien les ajouts réellement mineurs liés à une demande
utilisateur.

\section{Tentative de correction d'un crash}

Cette mission fut ma toute première à VideoLabs. Arrivant légèrement en avance,
et après discussion sur l'environnement de travail et mon futur rôle de
stagiaire dans l'entreprise, on me demanda de compiler VLC pour me faire
patienter avant midi, puis ne suffisant pas je fus redirigé vers ce bogue.

% TODO: use after free ou double free ?
Après utilisation de \inltype{asan}, un outil de vérification intrusif des accès
mémoires, il s'avérait qu'un \og{}use-after-free\fg{} avait lieu dans le code de la
playlist VLC lors de la fermeture de l'application. N'ayant jamais utilisé Asan
auparavant, ce fut une excellente introduction à l'outil, mais ne m'a pas suffit
à déterminer la source du problème.

% TODO http://git.videolan.org/?p=vlc.git;a=commit;h=70174a131ac045b33a8db417e7c626ec67cb0f53

Le bug fut corrigé peu après par un autre développeur de l'entreprise, mais m'a
permis de commencer à savoir naviguer dans un code source conséquent tout en
faisant plus attention à mon environnement de débogage et de compilation,
particulièrement sous Archlinux.

\section{Ajout du support MPEG-2 dans MediaCodec}

Cet ajout de fonctionnalité fut le premier patch intégré dans la branche master
de VLC. Ce fut également le premier bug que j'ai pû écrire pour l'application.

D'un part, l'activation du format fut raisonnable simple et correspondait à
remplir un cas particulier dans un \inltype{switch}.

De l'autre part, il a fallu rajouter des fonctions pour parser le bytestream
entrant et extraire les informations de ratio d'aspect. Cette partie fut plus
complexe, dans un premier temps pour comprendre cette notion de ratio d'aspect
et les différences et interactions entre le ratio d'aspect source, le ratio
d'aspect écran et le ratio d'aspect définit par l'utilisateur. Néanmoins ces
informations-là m'ont servi plus tard pour aider à l'ajout de la gestion de
l'aspect ratio utilisateur dans la version iOS de l'application.

Ce passage fut également pour moi l'occasion de lire ma première norme liée au
multimédia, ici la norme DVD, tout en produisant mon premier patch utile pour
VLC. Ce fut également l'occasion de commencer à utiliser
\inltype{git send-email} en suivant les recommandations du wiki de
l'association.

Quant au bug introduit, il fut corrigé plusieurs mois plus tard, révélant la
difficulté de tester correctement VLC avec la diversité des formats, des
bytestreams et des éditeurs existant, en plus de poser des questions techniques
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.
