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");
}