int CameraInterface::read_frame(int)
{
struct v4l2_buffer buf;
unsigned int i;
//qDebug() << frames_read++;
if (testing_only) return 0;
if (!stream_forever && frames_read >= frame_count)
{
qDebug() << "frame count exceeded";
emit frames_done();
return 0;
}
switch (io)
{
.....
case IO_METHOD_MMAP:
CLEAR(buf);
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
if (-1 == xioctl(fd, VIDIOC_DQBUF, &buf))
{
switch (errno)
{
case EAGAIN:
return 0;
case EIO:
/* Could ignore EIO, see spec. */
/* fall through */
default:
errno_exit("VIDIOC_DQBUF");
}
}
#if 0
qDebug() << "frames read: " << frames_read++;
if (frames_read % 2)
{
qDebug() << "skipping frame";
xioctl(fd, VIDIOC_QBUF, &buf);
return 1;
}
#endif
frameQueued = false;
assert(buf.index < n_buffers);
qDebug() << "\t\t\tframe DQ'ed, bytes " << buf.bytesused << "buffers = " << n_buffers;
if (buf.bytesused != 921600)
{
qDebug() << "partial frame";
xioctl(fd, VIDIOC_QBUF, &buf);
frameQueued = true;
qDebug() << "Unexpected framesize" << buf.bytesused;
//exit(-1);
}
/*
if (!colorCamera && buf.bytesused < 1843200)
{
xioctl(fd, VIDIOC_QBUF, &buf);
frameQueued = true;
qDebug() << "Partial frame" << buf.bytesused;
}
*/
else
{
emit frameReady(buffers[buf.index].start,buf.bytesused);
// when streaming expect client to send message to queue next frame
// otherwise, we know there's been seconds for client to process frame
// setup = false;
if (!setup)
{
xioctl(fd, VIDIOC_QBUF, &buf);
frameQueued=true;
}
}
break;
...
int CameraInterface::read_frame(int)
{
struct v4l2_buffer buf;
unsigned int i;
//qDebug() << frames_read++;
if (testing_only) return 0;
if (!stream_forever && frames_read >= frame_count)
{
qDebug() << "frame count exceeded";
emit frames_done();
return 0;
}
switch (io)
{
.....
case IO_METHOD_MMAP:
CLEAR(buf);
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
if (-1 == xioctl(fd, VIDIOC_DQBUF, &buf))
{
switch (errno)
{
case EAGAIN:
return 0;
case EIO:
/* Could ignore EIO, see spec. */
/* fall through */
default:
errno_exit("VIDIOC_DQBUF");
}
}
#if 0
qDebug() << "frames read: " << frames_read++;
if (frames_read % 2)
{
qDebug() << "skipping frame";
xioctl(fd, VIDIOC_QBUF, &buf);
return 1;
}
#endif
frameQueued = false;
assert(buf.index < n_buffers);
qDebug() << "\t\t\tframe DQ'ed, bytes " << buf.bytesused << "buffers = " << n_buffers;
if (buf.bytesused != 921600)
{
qDebug() << "partial frame";
xioctl(fd, VIDIOC_QBUF, &buf);
frameQueued = true;
qDebug() << "Unexpected framesize" << buf.bytesused;
//exit(-1);
}
/*
if (!colorCamera && buf.bytesused < 1843200)
{
xioctl(fd, VIDIOC_QBUF, &buf);
frameQueued = true;
qDebug() << "Partial frame" << buf.bytesused;
}
*/
else
{
emit frameReady(buffers[buf.index].start,buf.bytesused);
// when streaming expect client to send message to queue next frame
// otherwise, we know there's been seconds for client to process frame
// setup = false;
if (!setup)
{
xioctl(fd, VIDIOC_QBUF, &buf);
frameQueued=true;
}
}
break;
...
To copy to clipboard, switch view to plain text mode
Bookmarks