mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
Support for the AVFMT_FLAG_NONBLOCK flag (non-blocking input) in v4l2.c
Originally committed as revision 9496 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
bf09c2e2a6
commit
653387d8f0
@ -119,8 +119,12 @@ static int device_open(AVFormatContext *ctx, uint32_t *capabilities)
|
||||
struct v4l2_capability cap;
|
||||
int fd;
|
||||
int res;
|
||||
int flags = O_RDWR;
|
||||
|
||||
fd = open(ctx->filename, O_RDWR /*| O_NONBLOCK*/, 0);
|
||||
if (ctx->flags & AVFMT_FLAG_NONBLOCK) {
|
||||
flags |= O_NONBLOCK;
|
||||
}
|
||||
fd = open(ctx->filename, flags, 0);
|
||||
if (fd < 0) {
|
||||
av_log(ctx, AV_LOG_ERROR, "Cannot open video device %s : %s\n",
|
||||
ctx->filename, strerror(errno));
|
||||
@ -331,9 +335,13 @@ static int mmap_read_frame(AVFormatContext *ctx, AVPacket *pkt)
|
||||
buf.memory = V4L2_MEMORY_MMAP;
|
||||
|
||||
/* FIXME: Some special treatment might be needed in case of loss of signal... */
|
||||
while ((res = ioctl(s->fd, VIDIOC_DQBUF, &buf)) < 0 &&
|
||||
((errno == EAGAIN) || (errno == EINTR)));
|
||||
while ((res = ioctl(s->fd, VIDIOC_DQBUF, &buf)) < 0 && (errno == EINTR));
|
||||
if (res < 0) {
|
||||
if (errno == EAGAIN) {
|
||||
pkt->size = 0;
|
||||
|
||||
return AVERROR(EAGAIN);
|
||||
}
|
||||
av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_DQBUF): %s\n", strerror(errno));
|
||||
|
||||
return -1;
|
||||
|
Loading…
Reference in New Issue
Block a user