[PATCH 1/2] Make device_open() in case of failure store the VIDIOC_QUERYCAP ioctl errno, and return the stored value rather than the current errno, which may be overwritten by a following call to close().

Stefano Sabatini stefano.sabatini-lala
Wed Apr 28 00:31:44 CEST 2010


---
 libavdevice/v4l2.c |    8 ++++----
 1 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/libavdevice/v4l2.c b/libavdevice/v4l2.c
index 724c014..742c043 100644
--- a/libavdevice/v4l2.c
+++ b/libavdevice/v4l2.c
@@ -153,7 +153,7 @@ static int device_open(AVFormatContext *ctx, uint32_t *capabilities)
 {
     struct v4l2_capability cap;
     int fd;
-    int res;
+    int res, err;
     int flags = O_RDWR;
 
     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);
     // 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");
         close(fd);
 
-        return AVERROR(errno);
+        return AVERROR(err);
     }
     if (res < 0) {
         av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_QUERYCAP): %s\n",
                  strerror(errno));
         close(fd);
 
-        return AVERROR(errno);
+        return AVERROR(err);
     }
     if ((cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) == 0) {
         av_log(ctx, AV_LOG_ERROR, "Not a video capture device\n");
-- 
1.7.0


--pf9I7BMVVzbSWLtt--



More information about the ffmpeg-cvslog mailing list