% --------------------------------------------------------------------
%    nouveau juillet 2014 à mixart-myrys
% --------------------------------------------------------------------

\chapter{Webcam}
\label{chap:webcam}
\index{webcam}

Sous Linux, c'est quand même un peu tordu%
\footnote{Avis personnel !}, dans le même genre
que la pile son, quoi...
Nous allonc commencer par les principes et outils
de base, puis passer à plus
simple : juste tenter de prendre une photo avec une
\textsl{webcam} classique en USB, et d'enregistrer cette
image.

% --------------------------------------------------------------------

\section{v4l2}\index{v4l2}

\textsl{Video For Linux, second edition.}

%
%	PLEASE EXPLAIN !
%

\begin{verbatim}
tth@delirium:~$ v4l2-ctl --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
        Type: Video Capture

        [0]: 'MJPG' (Motion-JPEG, compressed)
                Size: Discrete 640x480
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 320x240
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 1920x1080
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 1280x720
                        Interval: Discrete 0.033s (30.000 fps)
\end{verbatim}

Question : quelle méthode utiliser pour avoir la même chose avec
des lignes de code écrites en C ?
Il faut certainement passer par une suite d'appels
\texttt{ioctl}\index{ioctl} après ouverture du device,
mais la documentation est difficile à \textsl{greper}.

% --------------------------------------------------------------------
%  nouveau :     Tue Sep  3 11:14:13 UTC 2024

\section{libwebcam}		\index{libwebcam}

\begin{quote}
The Webcam Library libwebcam is designed to simplify
the development of webcam applications, primarily on Linux but
with an option to be ported to other platforms, in particular
Solaris. It realizes part of what the unwritten Video4Linux user
space library was always supposed to be: an easy to use library
that shields its users from many of the difficulties and problems
of using the V4L2 API directly.
\end{quote}

% --------------------------------------------------------------------
% nouveau du Tue Sep 17 08:03:49 UTC 2024

\section{UVC} \index{UVC}


\begin{quote}
L'USB video device class (aussi appelé USB video class abrégé en UVC)
est un protocole de gestion de périphériques électroniques vidéo via
les ports de type USB\index{USB}.
Il permet de gérer les flux vidéo dans différents encodages, les images fixes,
ainsi que le contrôle des appareils qui le permettent.
\end{quote}

 
Le jour\footnote{Lundi 17 septembre 2024}* où je me penche sur cette techno, premier souci~:
\textsl{Le pilote pour les WebCams UVC
– standard utilisé pour les caméras USB modernes –
n’est pas encore au point et n’est pas inclus dans les
versions publiées de Haiku.}



% --------------------------------------------------------------------

\section{GameBoy camera}

%
%    trouvé dans pleroma
%

Voilà (désolé dur de faire moins technique en 500 charactères):

\texttt{sudo modprobe v4l2loopback exclusive\_caps\=1 video\_nr\=7 %
        card\_label="WebcamVirtuelle"}

On créé un périphérique de caméra virtuelle sur /dev/video7

\texttt{ffmpeg -video\_size 352x288 -i /dev/video0 -i ./palette.png
-lavfi fps=10,scale=w=128:h=112,paletteuse=dither=bayer,format=yuyv422
-f v4l2 /dev/video7}

On fait une chaîne ffmpeg de la webcam réelle vers la virtuelle,
en redimensionnant en 128x112 1/2

puis en appliquant un algorithme de dithering et une palette de
couleurs (juste un PNG carré avec les différentes couleurs à utiliser
pour le dithering, je peux le fournir si besoin).
Enfin on force un format pour la webcam de destination et on sort
sur son fichier (/dev/video7 comme défini tout à l'heure).

C'est pas propre (et il faudrait que je change d'algorithme pour le
scaling parce qu'il y a un effet de flou désagréable), MAIS ça
fonctionne et le rendu ressemble.

% --------------------------------------------------------------------

\section{vgrabbj}
\index{vgrabbj}


D'après la manpage : 
« \textit{%
vgrabbj is a program that will grab images from any v4l-capable device
which supports one of the  rgb24,  rgb32,  yuv420,  yuv420p,  yuyv,  or
yuv422 palettes and saves the image as a .jpg, .png, or .pnm file.
} »

Quelques options à connaitre :
\texttt{-S} échange des
deux composantes R et B; \texttt{-s <device>} affiche
les capacités du périphérique v4l\index{v4l}.


% --------------------------------------------------------------------
\section{Cheese}

\begin{quote}
cheese uses your webcam to take photos and videos, applies fancy special
effects and lets you share the fun with others. It was written as part of
Google's 2007 Summer of Code lead by daniel g. siegel and mentored by Raphaël
Slinckx. Under the hood, Cheese uses GStreamer to apply fancy effects to photos
and videos. With Cheese it is easy to take photos of you, your friends, pets or
whatever you want and share them with others. After the success of the Summer
of Code, the development continued and we are still looking for people with
 nice ideas and patches ;)
\end{quote}

% --------------------------------------------------------------------

\section{Kinect} \index{Kinect}

Bon, voilà un nouveau gadget ;)

À priori, la partie caméra RGB est gérée classiquement par v4l2,
mais le coté spécifique, je ne sais pas qu'en faire...

% --------------------------------------------------------------------

