blob: 4fde95e2b56325e02d5a3e7c097a6dab4f60ca4a [file] [log] [blame]
--- zbar-0.10/zbar/video/v4l2.c 2009-10-23 18:16:44.000000000 +0000
+++ zbar-0.10/zbar/video/v4l2.c 2015-03-07 05:46:36.000000000 +0000
@@ -241,6 +241,21 @@
return(0);
}
+static int v4l2_request_buffers (zbar_video_t *vdo)
+{
+ struct v4l2_requestbuffers rb;
+ memset(&rb, 0, sizeof(rb));
+ rb.count = vdo->num_images;
+ rb.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ rb.memory = V4L2_MEMORY_USERPTR;
+ if(ioctl(vdo->fd, VIDIOC_REQBUFS, &rb) < 0)
+ return(err_capture(vdo, SEV_ERROR, ZBAR_ERR_SYSTEM, __func__,
+ "requesting video frame buffers (VIDIOC_REQBUFS)"));
+ if(rb.count)
+ vdo->num_images = rb.count;
+ return(0);
+}
+
static int v4l2_set_format (zbar_video_t *vdo,
uint32_t fmt)
{
@@ -308,6 +323,8 @@
return(-1);
if(vdo->iomode == VIDEO_MMAP)
return(v4l2_mmap_buffers(vdo));
+ if(vdo->iomode == VIDEO_USERPTR)
+ return(v4l2_request_buffers(vdo));
return(0);
}
@@ -337,8 +354,13 @@
else {
if(!vdo->iomode)
vdo->iomode = VIDEO_USERPTR;
- if(rb.count)
- vdo->num_images = rb.count;
+ /* releasing buffers
+ * lest the driver may later refuse to change format
+ */
+ rb.count = 0;
+ if (ioctl(vdo->fd, VIDIOC_REQBUFS, &rb) < 0)
+ zprintf(0, "WARNING: releasing video buffers failed: error %d\n",
+ errno);
}
return(0);
}