see attached for program which generates the reported bug.
This program assumes (two identical) cameras at /dev/video1 and /dev/video3
// v4l2_test.c
// compile as $ gcc v4l2_test.c -o v4l2_test

#define MMAP_BUFFERS 3

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <linux/videodev2.h>
#include <libv4l2.h>
struct v4l2_capability lcap, rcap;
struct v4l2_format lfmt, rfmt;


int xioctl(int fh, int request, void *arg){
  int r;
  do {
    r = ioctl(fh, request, arg);
  } while (r == -1 && ((errno == EINTR) || (errno == EAGAIN)));
  return r;
}

int main(int argc, char **argv){
  char *left_camera, *right_camera;
  int lfd, rfd, i, r;
  struct v4l2_buffer lbuf, rbuf;
  left_camera = "/dev/video1";
  right_camera = "/dev/video3";
  // Open the device
  lfd = open(left_camera, O_RDWR | O_NONBLOCK, 0);
  if (lfd < 0) {
    printf("Failed to open left camera\n");
    exit(EXIT_FAILURE);
  }
  rfd = open(right_camera, O_RDWR | O_NONBLOCK, 0);
  if (rfd < 0) {
    printf("Failed to open right camera\n");
    exit(EXIT_FAILURE);
  }
    
  if (-1 == xioctl(lfd, VIDIOC_QUERYCAP, &lcap)) {
    printf("Left ERROR: %s\n", strerror(errno));
    if(lcap.capabilities != V4L2_CAP_VIDEO_CAPTURE)
      printf("ERROR Left camera deficient capability\n");
    exit(EXIT_FAILURE);
  }
  if (-1 == xioctl(rfd, VIDIOC_QUERYCAP, &rcap)) {
    printf("Right ERROR: %s\n", strerror(errno));
    if(rcap.capabilities != V4L2_CAP_VIDEO_CAPTURE)
      printf("ERROR Right camera deficient capability\n");
    exit(EXIT_FAILURE);
  }
  // poll fd for device format
  lfmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; // == 1
  if(-1 == xioctl(lfd, VIDIOC_G_FMT, &lfmt)){
    printf("ERROR getting info from %s\n", left_camera);
    return 1;
  }
  // poll fd for device format
  rfmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; // == 1
  if(-1 == xioctl(rfd, VIDIOC_G_FMT, &rfmt)){
    printf("ERROR getting info from %s\n", right_camera);
    return 1;
  }
  // Request N buffers that are memory mapped between
  // our application space and the device
  struct v4l2_requestbuffers l_request, r_request;
  l_request.count = r_request.count = MMAP_BUFFERS;
  l_request.type = r_request.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  l_request.memory = r_request.memory = V4L2_MEMORY_MMAP;
  if(r = xioctl(lfd, VIDIOC_REQBUFS, &l_request) < 0){
    printf("ERROR Request l buffer failed\n");
  }
  if(r = xioctl(lfd, VIDIOC_REQBUFS, &r_request) < 0){
    printf("ERROR Request r buffer failed\n");
  }
  if(l_request.count != r_request.count)
    printf("ERROR in request count match\n");
  printf("request count = %d\n", l_request.count);

  // Queue the buffers, i.e. indicate to the device
  // that they are available for writing now.
  for (i = 0; i < l_request.count; ++i) {
    // struct v4l2_buffer buf; - declared at head of main()
    lbuf.type = rbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    lbuf.memory = rbuf.memory = V4L2_MEMORY_MMAP;
    lbuf.index = rbuf.index = i;
    if(r = xioctl(lfd, VIDIOC_QBUF, &lbuf) < 0)
      printf("ERROR Failed to QBUF left camera\n");
    if(r = xioctl(rfd, VIDIOC_QBUF, &rbuf) < 0)
      printf("ERROR Failed to QBUF right camera\n");
  }

    // Start stream v4l_buf_type
    enum v4l2_buf_type type;
    type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    r = xioctl(lfd, VIDIOC_STREAMON, &type);
    if(r < 0)printf("ERROR Failed to STREAMON left camera\n");
    r = xioctl(rfd, VIDIOC_STREAMON, &type);
    if(r < 0)printf("ERROR Failed to STREAMON right camera\n");
  
}

Reply via email to