Browse Source

chapitre/mediacodec: ajout implementation et définition

Alexandre Janniaux 6 years ago
parent
commit
427d8f5210
1 changed files with 59 additions and 6 deletions
  1. 59 6
      chapters/other_android_mediacodec.tex

+ 59 - 6
chapters/other_android_mediacodec.tex

@@ -3,7 +3,7 @@
 La mission s'inscrivait dans le cadre de la diffusion d'un flux vidéo vers un
 La mission s'inscrivait dans le cadre de la diffusion d'un flux vidéo vers un
 chromecast. Il s'avère que le chromecast ne supporte pas de recevoir des flux de
 chromecast. Il s'avère que le chromecast ne supporte pas de recevoir des flux de
 sous-titre, ou alors certains formats seulement. Ceci parce qu'il était à la
 sous-titre, ou alors certains formats seulement. Ceci parce qu'il était à la
-base prévu pour Youtube qui n'est jamais très loin du format Webm. 
+base prévu pour Youtube qui n'est jamais très loin du format Webm.
 
 
 Le webm est un format utilisant une sous-partie du format Matroska, en étant
 Le webm est un format utilisant une sous-partie du format Matroska, en étant
 spécialement dédié à la diffusion de vidéo sur le web et dans un navigateur.
 spécialement dédié à la diffusion de vidéo sur le web et dans un navigateur.
@@ -27,10 +27,12 @@ ou faire crasher le programme, voire le téléphone en cas d'utilisation
 incorrecte.
 incorrecte.
 
 
 % TODO: reference MediaCodec
 % TODO: reference MediaCodec
-Pour les téléphones Android, c'est l'API MediaCodec qu'il faut utiliser afin de
-manipuler les décodeurs/encodeurs disponibles sur le téléphone. Un décodeur
-MediaCodec étant déjà existant, il s'agit plus ou moins d'étendre les
-fonctionnalités déjà en place pour pouvoir également instancier un encodeur.
+Pour les téléphones Android, c'est l'API MediaCodec
+\footnote{\url{https://developer.android.com/reference/android/media/MediaCodec}}
+qu'il faut utiliser afin de manipuler les décodeurs/encodeurs disponibles sur le
+téléphone. Un décodeur MediaCodec étant déjà existant, il s'agit plus ou moins
+d'étendre les fonctionnalités déjà en place pour pouvoir également instancier un
+encodeur.
 
 
 Dans cette partie-là, nous allons voir ce qu'est un encodeur, comment ils sont
 Dans cette partie-là, nous allons voir ce qu'est un encodeur, comment ils sont
 construits et utilisés au sein de VLC ainsi que quelques détails de
 construits et utilisés au sein de VLC ainsi que quelques détails de
@@ -38,6 +40,14 @@ l'implémentation finale de l'encodeur utilisant l'API MediaCodec d'Android.
 
 
 \section{Qu'est-ce qu'un encodeur}
 \section{Qu'est-ce qu'un encodeur}
 
 
+L'encodeur est le module qui récupère des images dans un format fixé et produit
+un bytestream vidéo correspondant au format d'encodage vidéo choisi. Il se situe
+donc après les filtres vidéos et avant le muxer. Pour la plupart des formats,
+l'encodeur a besoin de données spéciales relative au format utilisé. Pour h264,
+il s'agit du SPS et PPS, décrivant les informations communes aux images
+encodées.
+
+L'encodeur dans MediaCodec fonctionne comme une machine à état.
 % TODO: rôle dans la chaine avec schéma
 % TODO: rôle dans la chaine avec schéma
 % TODO: codec specific data
 % TODO: codec specific data
 % TODO: état de l'encodeur
 % TODO: état de l'encodeur
@@ -55,7 +65,30 @@ encodé par un muxer.
 
 
 L'encodeur est définit par la structure suivante dans le core de VLC.
 L'encodeur est définit par la structure suivante dans le core de VLC.
 
 
-% TODO: structure de l'encodeur
+\begin{code}{c}{Structure d'un encodeur dans VLC}
+struct encoder_t
+{
+    /* common fields */
+    /* ... */
+    /* Properties of the input data fed to the encoder */
+    es_format_t         fmt_in;
+
+    /* Properties of the output of the encoder */
+    es_format_t         fmt_out;
+
+    block_t *           ( * pf_encode_video )( encoder_t *, picture_t * );
+    block_t *           ( * pf_encode_audio )( encoder_t *, block_t * );
+    block_t *           ( * pf_encode_sub )( encoder_t *, subpicture_t * );
+
+    /* Common encoder options */
+    /* ... */
+};
+\end{code}
+
+% TODO: encodage synchrone : on remplit les pf des types de flux qu'on supporte
+% TODO: fmt_in / fmt_out => pas modifiable après ouverture de l'encodeur
+% TODO :modifier paragraphe d'apres
+
 
 
 \section{Implémentation de l'encodeur}
 \section{Implémentation de l'encodeur}
 
 
@@ -64,3 +97,23 @@ possible de modifier le format de sortie de l'encodeur après son initialisation
 dans la fonction \inltype{OpenEncoder}. Or les informations sur le codec --
 dans la fonction \inltype{OpenEncoder}. Or les informations sur le codec --
 codec specific data -- ne sont disponibles qu'après avoir commencé à encoder les
 codec specific data -- ne sont disponibles qu'après avoir commencé à encoder les
 premières images.
 premières images.
+
+L'implémentation que j'ai réalisée fait en sorte de retarder la création du flux
+de sortie jusqu'au moment où les premières images encodées sont disponibles. Or,
+certains muxeur en sortie ne permettent pas de réaliser ce délai. Des
+modifications sur l'architecture étaient donc nécessaires pour l'intégration de
+mon travail et étaient en cours à la fin de mon stage.
+
+L'encodeur fonctionne à travers l'API java de MediaCodec, appelé depuis
+l'interface JNI. La raison de ce choix est l'impossibilité d'effectuer certaines
+actions essentielles à partir de l'interface proposée par le NDK d'android.
+
+Les principales difficultés ont été de:
+\begin{itemize}
+    \item Comprendre le fonctionnement de l'encodeur dans VLC.
+    \item Comprendre les interactions avec le muxer.
+    \item Déterminer la façon la plus correcte de définir des PTS et DTS.\@
+\end{itemize}
+
+La réalisation du module a été une excellente occasion pour comprendre en
+profondeur l'agencement des différents modules du pipeline de VLC.