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