Make device_open() store the VIDIOC_QUERYCAP ioctl errno, and in case

of failure return the stored value rather than the current errno,
which may be overwritten by a following call to close().

Originally committed as revision 23001 to svn://svn.ffmpeg.org/ffmpeg/trunk
release/0.6
Stefano Sabatini 15 years ago
parent 2d23fecd5d
commit 50f852186f
  1. 8
      libavdevice/v4l2.c

@ -153,7 +153,7 @@ static int device_open(AVFormatContext *ctx, uint32_t *capabilities)
{ {
struct v4l2_capability cap; struct v4l2_capability cap;
int fd; int fd;
int res; int res, err;
int flags = O_RDWR; int flags = O_RDWR;
if (ctx->flags & AVFMT_FLAG_NONBLOCK) { if (ctx->flags & AVFMT_FLAG_NONBLOCK) {
@ -169,18 +169,18 @@ static int device_open(AVFormatContext *ctx, uint32_t *capabilities)
res = ioctl(fd, VIDIOC_QUERYCAP, &cap); res = ioctl(fd, VIDIOC_QUERYCAP, &cap);
// ENOIOCTLCMD definition only availble on __KERNEL__ // ENOIOCTLCMD definition only availble on __KERNEL__
if (res < 0 && errno == 515) { if (res < 0 && ((err = errno) == 515)) {
av_log(ctx, AV_LOG_ERROR, "QUERYCAP not implemented, probably V4L device but not supporting V4L2\n"); av_log(ctx, AV_LOG_ERROR, "QUERYCAP not implemented, probably V4L device but not supporting V4L2\n");
close(fd); close(fd);
return AVERROR(errno); return AVERROR(515);
} }
if (res < 0) { if (res < 0) {
av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_QUERYCAP): %s\n", av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_QUERYCAP): %s\n",
strerror(errno)); strerror(errno));
close(fd); close(fd);
return AVERROR(errno); return AVERROR(err);
} }
if ((cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) == 0) { if ((cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) == 0) {
av_log(ctx, AV_LOG_ERROR, "Not a video capture device\n"); av_log(ctx, AV_LOG_ERROR, "Not a video capture device\n");

Loading…
Cancel
Save