\documentclass[aspectratio=169,obeyspaces,spaces,hyphens,dvipsnames]{beamer}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}% http://ctan.org/pkg/lm
\usepackage{minted}
\usepackage{hyperref}
\usepackage{xcolor}
\usepackage{pgfplots}
\usepackage{tikz}
\usepackage[normalem]{ulem}

\mode<presentation>
\usetheme{Bootlin}

\def\signed #1{{\leavevmode\unskip\nobreak\hfil\penalty50\hskip2em
  \hbox{}\nobreak\hfil(#1)
  \parfillskip=0pt \finalhyphendemerits=0 \endgraf}}

\newsavebox\mybox
\newenvironment{aquote}[1]
  {\savebox\mybox{#1}\begin{quotation}}
  {\signed{\usebox\mybox}\end{quotation}}

\graphicspath{{images/}}

\title{V4L2 pour l'accélération matérielle de décodage vidéo}
\authors{Paul Kocialkowski}
\email{paul@bootlin.com}
\slidesurl{https://bootlin.com/pub/conferences/}
\institute{Bootlin}
\conference{Toulouse Embedded Linux \& Android Meetup}

\begin{document}

\addtocontents{toc}{\protect\setcounter{tocdepth}{-1}}
\section{V4L2 pour l'accélération matérielle de décodage vidéo}
\addtocontents{toc}{\protect\setcounter{tocdepth}{2}}

\begin{frame}{Paul Kocialkowski}
  \begin{itemize}
  \item Ingénieur Linux Embarqué chez Bootlin
    \begin{itemize}
    \item {\bf Expertise} Linux Embarqué
    \item {\bf Développement}, consulting et formations
    \item Fortement axé sur l'open-source
    \end{itemize}
  \item Contributeur à l'Open-source
  \item Habitant à {\bf Toulouse} en France
  \end{itemize}
\end{frame}

\begin{frame}{Prise en charge du VPU Allwinner dans Linux \textit{mainline}}

\begin{itemize}
\item{Objet du projet :
\begin{itemize}
\item{\textbf{Plateformes Allwinner} : SoCs ARMv7 et ARMv8}
\item{\textbf{VPU} : Accélérateur matériel de décodage vidéo}
\item{\textbf{Noyau Linux \textit{mainline}} : intégration à l'arbre officiel}
\item{\textbf{Intégration} en espace utilisateur}
\end{itemize}}
\pause
\item{Situation initiale :
\begin{itemize}
\item{Noyaux Allwinner (3.4/3.10) et blobs en espace utilisateur}
\item{Reverse Engineering par la communauté : \textbf{Cedrus}}
\item{Première implémentation : Stage chez Bootlin, été 2017}
\end{itemize}
}
\pause
\item{Déroulement :
\begin{itemize}
\item{Campagne de financement participatif}
\item{Stage de fin d'études}
\item{Période de 6 mois, Mars-Août 2018}
\end{itemize}
}
\end{itemize}

\end{frame}

\begin{frame}{Compression vidéo}

\begin{itemize}
\item{Taille exorbitante des données brutes (1h30 en 1280x720, RGB32, 30~fps) : \\
\begin{center}
\(t = 1280 \times 720 \times 3 \times 30 \times 90 \times 60 \simeq 417~Gio\)
\end{center}
}
\pause
\item{Méthodes de compression vidéo :
\begin{itemize}
\item{Compression visuelle : sous-échantillonnage YUV}
\item{Compression spatiale : DCT et filtrage}
\item{Compression temporelle : prédiction multi-directionnelle et interpolation}
\item{Compression entropique : Codage de Huffman, arithmétique (CABAC, CAVLC)}
\end{itemize}}
\pause
\item{Réduction drastique de la taille (facteur \(610\) pour \(700~Mio\))}
\item{Opérations coûteuses à l'encodage et au décodage}
\item{Nécessaire de décharger le CPU dans l'embarqué}
\end{itemize}

\end{frame}

\begin{frame}{Structure et encapsulation d'une vidéo}

\begin{center}
\includegraphics[height=6em]{video-file.pdf}
\end{center}

\begin{itemize}
\item{Données compressées :
\begin{itemize}
\item{\textit{Macroblock ou Coding Tree Block : unité de base}}
\item{\textit{Slice} : regroupement de MB/CTB}
\item{\textit{Picture (frames/field)} : image reconstituée}
\end{itemize}}
\item{Méta-données :
\begin{itemize}
\item{Paramètres de la chaîne de décodage}
\end{itemize}}
\end{itemize}

\begin{center}
\textbf{Bitstream : données compressées + méta-données (+ en-têtes)}
\end{center}

\end{frame}

\begin{frame}{Approches pour l'accélération du décodage et types de VPU}

\begin{minipage}{0.45\linewidth}
\begin{center}
Chaîne logicielle : \textbf{stateful}
\end{center}

\begin{itemize}
\item{Processeur auxiliaire (type DSP)}
\item{Micrologiciel associé}
\item{Passage du bitstream}
\item{Commandes de décodage}
\item{Gère le contexte de décodage}
\end{itemize}
\end{minipage}
\hspace{2em}
\pause
\begin{minipage}{0.45\linewidth}
\begin{center}
Chaîne matérielle : \textbf{stateless}
\end{center}

\begin{itemize}
\item{Bloc matériel dédié}
\item{Pas de micrologiciel}
\item{Passage des slices}
\item{Registres pour les méta-données}
\item{Pas de contexte de décodage}
\end{itemize}

\end{minipage}
\vspace{1.5em}

\begin{center}
Interface avec le CPU : MMIO
\end{center}

\end{frame}

\begin{frame}[fragile]{API V4L2 : Généralités}

Concepts principaux :
\begin{itemize}
\item{\textbf{Queues} : \verb,OUTPUT, (vers le matériel), \verb,CAPTURE, (depuis le matériel)}
\item{\textbf{Format} par queue : dimensions, \textit{pixel format}}
\item{\textbf{Buffers} tournants par queue : données}
\item{\textbf{Contrôles} : méta-données de configuration}
\end{itemize}~
\pause

% + schéma ici avec matériel?

Opérations : \verb,/dev/videoN,:
\begin{itemize}
\item{Configuration : \verb,VIDIOC_S_FMT,, \verb,VIDIOC_S_CTRL,/\verb,VIDIOC_S_EXT_CTRLS,}
\item{Allocation/libération des buffers : \verb,VIDIOC_REQBUF, ou \verb,VIDIOC_QUERYBUF,}
\item{Démarrage/fin du flux : \verb,VIDIOC_STREAMON,/\verb,VIDIOC_STREAMOFF,}
\item{Ajout/retrait des buffers en queue : \verb,VIDIOC_QBUF,/\verb,VIDIOC_DQBUF,}
\item{Attente des données : \verb,poll,}
\end{itemize}

\end{frame}

\begin{frame}[fragile]{V4L2 M2M : VPU \textit{stateful}}

Application au décodage \textit{stateful} :
\begin{itemize}
\item{Utilise les deux queues simultanément : \textit{Memory to Memory} (M2M)}
\item{Queue \verb,OUTPUT, : données du bitstream (e.g. \verb,V4L2_PIX_FMT_H264,)}
\item{Queue \verb,CAPTURE, : images décodées (e.g. \verb,V4L2_PIX_FMT_NV12,)}
\end{itemize}~
\pause

Côté driver et framework V4L2 M2M :
\begin{itemize}
\item{Contexte de décodage : associe les buffers}
\item{Routine \verb,device_run(), pour le décodage}
\item{Complétion du décodage lié aux contexte (interruption)}
\item{Planification du décodage dès les conditions réunies}
\end{itemize}

\end{frame}

\begin{frame}[fragile]{Media Request API : VPU \textit{stateless}}

Besoins spécifiques des VPU \textit{stateless}:
\begin{itemize}
\item{Passage des slices de \textbf{données compressées} : buffers}
\item{Passage des \textbf{méta-données} : contrôles}
\item{\textbf{Synchronisation} des buffers et des contrôles}
\end{itemize}

\begin{center}
\textbf{Problème : Pas de mécanisme de synchronisation explicite}
\end{center}~
\pause

Media Request API :
\begin{itemize}
\item{Requêtes associées aux buffers et contrôles}
\item{Ne prennent effet qu'au traitement de la requête}
\item{Poursuite des opérations habituelles (M2M)}
\end{itemize}

\end{frame}

\begin{frame}{Décodage avec V4L2 M2M et Request API en résumé}

\begin{center}
\includegraphics[width=0.8\linewidth]{request-api.pdf}
\end{center}

\end{frame}

\questionslide

\end{document}
