unsigned i;
int s = 0;
int err = 0;
+ bool again;
switch (m_capMethod) {
case methodRead:
break;
case methodMmap:
- if (!dqbuf_mmap_cap(buf)) {
+ if (!dqbuf_mmap_cap(buf, again)) {
error("dqbuf");
m_capStartAct->setChecked(false);
return;
}
+ if (again)
+ return;
if (useWrapper())
memcpy(m_capImage->bits(), (unsigned char *)m_buffers[buf.index].start,
break;
case methodUser:
- if (!dqbuf_user_cap(buf)) {
+ if (!dqbuf_user_cap(buf, again)) {
error("dqbuf");
m_capStartAct->setChecked(false);
return;
}
+ if (again)
+ return;
for (i = 0; i < m_nbuffers; ++i)
if (buf.m.userptr == (unsigned long)m_buffers[i].start
return ioctl(VIDIOC_REQBUFS, &reqbuf) >= 0;
}
-bool v4l2::dqbuf_mmap_cap(v4l2_buffer &buf)
+bool v4l2::dqbuf_mmap_cap(v4l2_buffer &buf, bool &again)
{
+ int res;
+
memset(&buf, 0, sizeof(buf));
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
- return ioctl(VIDIOC_DQBUF, &buf) >= 0;
+ res = ioctl(VIDIOC_DQBUF, &buf);
+ again = res < 0 && errno == EAGAIN;
+ return res >= 0 || again;
}
-bool v4l2::dqbuf_user_cap(v4l2_buffer &buf)
+bool v4l2::dqbuf_user_cap(v4l2_buffer &buf, bool &again)
{
+ int res;
+
memset(&buf, 0, sizeof(buf));
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_USERPTR;
- return ioctl(VIDIOC_DQBUF, &buf) >= 0;
+ res = ioctl(VIDIOC_DQBUF, &buf);
+ again = res < 0 && errno == EAGAIN;
+ return res >= 0 || again;
}
bool v4l2::qbuf(v4l2_buffer &buf)
bool reqbufs_mmap_cap(v4l2_requestbuffers &reqbuf, int count = 0);
bool reqbufs_user_cap(v4l2_requestbuffers &reqbuf, int count = 0);
- bool dqbuf_mmap_cap(v4l2_buffer &buf);
- bool dqbuf_user_cap(v4l2_buffer &buf);
+ bool dqbuf_mmap_cap(v4l2_buffer &buf, bool &again);
+ bool dqbuf_user_cap(v4l2_buffer &buf, bool &again);
bool qbuf(v4l2_buffer &buf);
bool qbuf_mmap_cap(int index);
bool qbuf_user_cap(int index, void *ptr, int length);