UVC / V4L2 webcam / grab
not disclosed <[email protected]>
| Newsgroups | gmane.comp.video.video4linux |
|---|---|
| Message-ID | <[email protected]> |
I need to grab single frames from a UVC / V4L2 webcam with low latency and I need the frame to be acquired ASAP _after_ another event has occurred. The code I am using is ~ that below and the problem I have is that unless I grab one frame and discard it I find the frame I grab (the image) sometimes contains things that could only occur _prior_ to the capture code being called. In pseudo code my problem looks like this: set_condition(1); usleep(DELAY); ... set_condition(2); usleep(DELAY); grabframe(data); The problem is the data may contain output from condition (1) even if DELAY is long enough to guarantee the image should only contain and image from condition (2). If I do something like: set_condition(1); usleep(DELAY); ... set_condition(2); usleep(DELAY); grabframe(data); grabframe(data); the second grab returns the correct image regardless of what DELAY I use. This may be a stupid problem and I am not too familiar with how V4L2 works but here goes: What is the easiest way to use V4L2 to grab an individual frame from a UVC webcam and ensure that the data in the frame relates to an image that occurred _after_ the grab was requested? second part is, what is the fastest / simplest way to do this? I don't even know if it is possible to ensure this because I suppose hardware limitations may prevent a deterministic result. Sorry for cryptic explanation, the detailed one would take a huge space to explain. Simplest terms I am changing the lighting conditions then capturing the result, say this was from red->blue lighting, some of my grabbed images contain red when it would be impossible to do so unless the data I received was captured before I requested it. Cheers, SA // code snippet // set up... int type = V4L2_BUF_TYPE_VIDEO_CAPTURE; ret = ioctl (vd->fd, VIDIOC_STREAMON, &type); // code to run at capture memset (&vd->buf, 0, sizeof (struct v4l2_buffer)); vd->buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; vd->buf.memory = V4L2_MEMORY_MMAP; ret = ioctl (vd->fd, VIDIOC_DQBUF, &vd->buf); memcpy (vd->framebuffer, vd->mem[vd->buf.index],(size_t) vd->framesizeIn); ret = ioctl (vd->fd, VIDIOC_QBUF, &vd->buf); _________________________________________________________________ Share your memories online with anyone you want. http://www.microsoft.com/middleeast/windows/windowslive/products/photos-share.aspx?tab=1-- video4linux-list mailing list Unsubscribe mailto:[email protected]?subject=unsubscribe https://www.redhat.com/mailman/listinfo/video4linux-list