On Tue, Jul 29, 2008 at 12:00:34PM +0200, Hans de Goede wrote:
Indeed, so iow I'm happy to conclude that thie is not a libv4l bug :)
Will you add a work around like the above in libv4l?
Thanks, Gregor
Index: libv4l2/libv4l2.c =================================================================== RCS file: /var/cvs/vidsoft/extern/libv4l/libv4l2/libv4l2.c,v retrieving revision 1.5 diff -u -r1.5 libv4l2.c --- libv4l2/libv4l2.c 14 Jul 2008 14:00:28 -0000 1.5 +++ libv4l2/libv4l2.c 29 Jul 2008 11:51:20 -0000 @@ -97,7 +97,7 @@ req.count = devices[index].nreadbuffers; req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; req.memory = V4L2_MEMORY_MMAP; - if ((result = syscall(SYS_ioctl, devices[index].fd, VIDIOC_REQBUFS, &req))){ + if ((result = syscall(SYS_ioctl, devices[index].fd, VIDIOC_REQBUFS, &req)) < 0){ int saved_err = errno; V4L2_LOG_ERR("requesting buffers: %s\n", strerror(errno)); errno = saved_err; @@ -121,7 +121,7 @@ req.count = 0; req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; req.memory = V4L2_MEMORY_MMAP; - if ((result = syscall(SYS_ioctl, devices[index].fd, VIDIOC_REQBUFS, &req))) { + if ((result = syscall(SYS_ioctl, devices[index].fd, VIDIOC_REQBUFS, &req)) < 0) { int saved_err = errno; V4L2_LOG_ERR("unrequesting buffers: %s\n", strerror(errno)); errno = saved_err; @@ -723,8 +723,9 @@ v4l2_unmap_buffers(index);
result = syscall(SYS_ioctl, devices[index].fd, VIDIOC_REQBUFS, req); - if (result) + if (result < 0) break; + result = 0; // some drivers return the number of buffers on success
/* If we got more frames then we can handle lie to the app */ if (req->count > V4L2_MAX_NO_FRAMES)