之前遇见在VIDIOC_DQBUF处阻塞问题时,只是简单的设置了一下分辨率解决了当前问题就没再继续处理了。今天再看官网的demo时,才发现有个select函数可以来监听ioctl超时问题:
fd_set fds;
struct timeval tv;
int r;
FD_ZERO (&fds);
FD_SET (fd, &fds);
/* Timeout. */
tv.tv_sec = 2;
tv.tv_usec = 0;
r = select (fd + 1, &fds, NULL, NULL, &tv);
if (-1 == r) {
if (EINTR == errno)
continue;
errno_exit ("select");
}
if (0 == r) {
fprintf (stderr, "select timeout\n");
exit (EXIT_FAILURE);
}
if (read_frame ())
break;
/* EAGAIN - continue select loop. */
不过阻塞的具体原因还不清楚,目前猜测是USB传输的问题,因为在USB3.0下无问题,切换到USB2.0就不行。