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