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