Bug#978667: bug #978667 update

2020-12-29 Thread William Melgaard
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 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
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, )) {
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, )) {
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, )){
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, )){
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, _request) < 0){
printf("ERROR Request l buffer failed\n");
  }
  if(r = xioctl(lfd, VIDIOC_REQBUFS, _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, ) < 0)
  printf("ERROR Failed to QBUF left camera\n");
if(r = xioctl(rfd, VIDIOC_QBUF, ) < 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, );
if(r < 0)printf("ERROR Failed to STREAMON left camera\n");
r = xioctl(rfd, VIDIOC_STREAMON, );
if(r < 0)printf("ERROR Failed to STREAMON right camera\n");
  
}


Bug#978667: bug #978667 update

2020-12-29 Thread William Melgaard
There is a typo in line 95 my previous submission. Corrected program is attachedThe result is that ioctl(rfd, VIDIOC_QBUF, );is successful, but ioctl(rfd, VIDIOC_STREAMON, );(i.e. second camera) is not successful// v4l2_test.c
// compile as $ gcc v4l2_test.c -o v4l2_test

#define MMAP_BUFFERS 3

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
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, )) {
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, )) {
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, )){
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, )){
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, _request) < 0){
printf("ERROR Request l buffer failed\n");
  }
  if(r = xioctl(rfd, VIDIOC_REQBUFS, _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, ) < 0)
  printf("ERROR Failed to QBUF left camera\n");
if(r = xioctl(rfd, VIDIOC_QBUF, ) < 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, );
if(r < 0)printf("ERROR Failed to STREAMON left camera\n");
r = xioctl(rfd, VIDIOC_STREAMON, );
if(r < 0)printf("ERROR Failed to STREAMON right camera\n");
  
}