From 0efd48dfd15273a5ac85f2fd42f19d419fafe90d Mon Sep 17 00:00:00 2001 From: Luca Barbato Date: Thu, 5 Jan 2012 12:17:45 +0100 Subject: [PATCH] v4l2: poll the file descriptor Instead of busy waiting use poll(); --- libavdevice/v4l2.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/libavdevice/v4l2.c b/libavdevice/v4l2.c index 9c5da39e6a..2da98728c9 100644 --- a/libavdevice/v4l2.c +++ b/libavdevice/v4l2.c @@ -36,6 +36,7 @@ #include #include #include +#include #if HAVE_SYS_VIDEOIO_H #include #else @@ -48,6 +49,7 @@ #include "libavutil/parseutils.h" #include "libavutil/pixdesc.h" #include "libavutil/avstring.h" +#include "libavutil/mathematics.h" static const int desired_video_buffers = 256; @@ -61,6 +63,7 @@ struct video_data { int frame_format; /* V4L2_PIX_FMT_* */ int width, height; int frame_size; + int timeout; int interlaced; int top_field_first; @@ -436,12 +439,20 @@ static int mmap_read_frame(AVFormatContext *ctx, AVPacket *pkt) struct video_data *s = ctx->priv_data; struct v4l2_buffer buf; struct buff_data *buf_descriptor; + struct pollfd p = { .fd = s->fd, .events = POLLIN }; int res; memset(&buf, 0, sizeof(struct v4l2_buffer)); buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory = V4L2_MEMORY_MMAP; + res = poll(&p, 1, s->timeout); + if (res < 0) + return AVERROR(errno); + + if (!(p.revents & (POLLIN | POLLERR | POLLHUP))) + return AVERROR(EAGAIN); + /* FIXME: Some special treatment might be needed in case of loss of signal... */ while ((res = ioctl(s->fd, VIDIOC_DQBUF, &buf)) < 0 && (errno == EINTR)); if (res < 0) { @@ -635,6 +646,10 @@ static int v4l2_set_parameters(AVFormatContext *s1, AVFormatParameters *ap) s1->streams[0]->codec->time_base.den = tpf->denominator; s1->streams[0]->codec->time_base.num = tpf->numerator; + s->timeout = 100 + + av_rescale_q(1, s1->streams[0]->codec->time_base, + (AVRational){1, 1000}); + return 0; }