La liste des formats de capture

Nouveau à V4L, j'ai décidé de commencer à utiliser le video4linux2 bibliothèque, dans le but de capturer une image à partir de mon appareil photo en C (je suis en utilisant le module uvcvideo avec un Ricoh Co. appareil photo). J'ai suivi plusieurs guides et tutoriels, et a réussi à obtenir l'exécution d'un programme. Ma question est surtout sur cette ligne de code :

struct v4l2_format format = {0};
format.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG;
//...

C'est où j'ai mis la vidéo en format à utiliser lors de la capture. Comme vous pouvez le voir, dans cet exemple, je suis en utilisant MJPEG (http://lxr.free-electrons.com/source/include/uapi/linux/videodev2.h#L390). Même si cela pourrait être un grand format et à tous, ma demande va probablement être simple RVB mise en forme, pixel par pixel, je suppose. Pour cette raison, j'ai essayé d'utiliser le format RGB constantes telles que V4L2_PIX_FMT_RGB24. Maintenant, pour une raison... v4l2 ne l'aime pas. Je suppose que c'est lié au matériel, mais je voudrais éviter MJPEG manipulations autant que possible. Pour des fins de test, j'ai essayé d'utiliser d'autres constantes et les formats, mais peu importe ce que j'ai fait, v4l2 cessé de changer le pixelformat valeur du champ :

xioctl(fd, VIDIOC_S_FMT, &format); //This call succeeds with errno != EINTR.
if(format.fmt.pix.pixelformat != V4L2_PIX_FMT_RGB24){
    //My program always enters this block when not using MJPEG.
    fprintf(stderr, "Format wasn't accepted by v4l2.");
    exit(4);
}

Maintenant, ma question est : est-il possible que je puisse obtenir une liste de accepté les formats vidéo (et je veux dire, accepté par mon appareil photo/v4l2), à partir de laquelle j'ai pu choisir autre chose que le MJPEG ? Si vous pensez que je dois continuer à MJPEG, auriez-vous me recommander une bibliothèque en me permettant de le manipuler, et finalement, le capturer dans un GUI cadre ?

Barbare code de test

J'ai utilisé l'astuce suivante pour tester tous les formats disponibles sur mon matériel. Tout d'abord, certains script shell pour obtenir une liste de tous les formats...

grep 'V4L2_PIX_FMT' /usr/include/linux/videodev2.h | grep define | tr '\t' ' ' | cut -d' ' -f2 | sed 's/$/,/g'

... dont la sortie est utilisé dans ce programme C :

int formats[] = {/* result of above command */};
int i = 0;
struct v4l2_format format = {0};

for(i = 0; i < /* number of lines in previous command output */; i++){
    format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    format.fmt.pix.width = 320;
    format.fmt.pix.height = 240;
    format.fmt.pix.pixelformat = formats[i];
    format.fmt.pix.field = V4L2_FIELD_NONE;
    if(xioctl(fd, VIDIOC_S_FMT, &format) != -1 && format.fmt.pix.pixelformat == formats[i])
        fprintf(stderr, "Accepted : %d\n", i);
}

Ce test révèle que seulement V4L2_PIX_FMT_YUYV et V4L2_PIX_FMT_MJPEG sont fonctionnels. De toute façon, j'ai pu améliorer cela, ou est-il matériel ?

  • linuxtv.org/downloads/v4l-dvb-apis/pixfmt.html ?
  • Désolé, je n'étais pas assez claire, de ma faute. Je suis à la recherche d'une liste de accepté formats, sens formats de mon appareil photo accepte d'utilisation (voir mon if déclaration ci-dessus). Quand j'ai quelque chose qui MJPEG, la pixelformat attribut n'est pas défini par la bibliothèque, probablement parce qu'il ne peut pas être manipulé par mon matériel.