sys/v4l2/v4l2src_calls.c: Handle optional v4l2 ioctls gracefully.
authorMark Nauwelaerts <manauw@skynet.be>
Wed, 22 Aug 2007 08:22:50 +0000 (08:22 +0000)
committerStefan Kost <ensonic@users.sourceforge.net>
Wed, 22 Aug 2007 08:22:50 +0000 (08:22 +0000)
Original commit message from CVS:
patch by: Mark Nauwelaerts <manauw@skynet.be>
* sys/v4l2/v4l2src_calls.c:
Handle optional v4l2 ioctls gracefully.

ChangeLog
common
sys/v4l2/v4l2src_calls.c

index 7a20d6b..0ba542e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2007-08-22  Stefan Kost  <ensonic@users.sf.net>
+
+       patch by: Mark Nauwelaerts <manauw@skynet.be>
+
+       * sys/v4l2/v4l2src_calls.c:
+         Handle optional v4l2 ioctls gracefully.
+
 2007-08-20  Wim Taymans  <wim.taymans@gmail.com>
 
        * gst/rtp/Makefile.am:
diff --git a/common b/common
index 9c7f1a6..cd25ca7 160000 (submodule)
--- a/common
+++ b/common
@@ -1 +1 @@
-Subproject commit 9c7f1a63dfed1b2770b5fdaa16e0ae114b2177cf
+Subproject commit cd25ca736bc2446800de2180ad71fc1da858d324
index 87f2234..0006f0e 100644 (file)
@@ -892,21 +892,28 @@ gst_v4l2src_set_capture (GstV4l2Src * v4l2src, guint32 pixelformat,
 
   memset (&stream, 0x00, sizeof (struct v4l2_streamparm));
   stream.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-  if (ioctl (fd, VIDIOC_G_PARM, &stream) < 0)
-    goto get_parm_failed;
+  if (ioctl (fd, VIDIOC_G_PARM, &stream) < 0) {
+    GST_ELEMENT_WARNING (v4l2src, RESOURCE, SETTINGS,
+        (_("Could not get parameters on device '%s'"),
+            v4l2src->v4l2object->videodev), GST_ERROR_SYSTEM);
+  } else {                      /* seems no point in SET, if can't get GET */
+    /* Note: V4L2 gives us the frame interval, we need the frame rate */
+    stream.parm.capture.timeperframe.numerator = fps_d;
+    stream.parm.capture.timeperframe.denominator = fps_n;
 
-  /* Note: V4L2 gives us the frame interval, we need the frame rate */
-  stream.parm.capture.timeperframe.numerator = fps_d;
-  stream.parm.capture.timeperframe.denominator = fps_n;
+    if (ioctl (fd, VIDIOC_S_PARM, &stream) < 0) {
+      GST_ELEMENT_WARNING (v4l2src, RESOURCE, SETTINGS,
+          (_("Could not set parameters on device '%s'"),
+              v4l2src->v4l2object->videodev), GST_ERROR_SYSTEM);
 
-  if (ioctl (fd, VIDIOC_S_PARM, &stream) < 0)
-    goto set_parm_failed;
+      /* FIXME: better test for fraction equality */
+      if (stream.parm.capture.timeperframe.numerator != fps_d
+          || stream.parm.capture.timeperframe.denominator != fps_n)
+        goto invalid_framerate;
 
+    }
+  }
 
-  /* FIXME: better test for fraction equality */
-  if (stream.parm.capture.timeperframe.numerator != fps_d
-      || stream.parm.capture.timeperframe.denominator != fps_n)
-    goto invalid_framerate;
 
   return TRUE;
 
@@ -948,20 +955,6 @@ invalid_pixelformat:
             GST_FOURCC_ARGS (format.fmt.pix.pixelformat)));
     return FALSE;
   }
-get_parm_failed:
-  {
-    GST_ELEMENT_ERROR (v4l2src, RESOURCE, SETTINGS,
-        (_("Could not get parameters on device '%s'"),
-            v4l2src->v4l2object->videodev), GST_ERROR_SYSTEM);
-    return FALSE;
-  }
-set_parm_failed:
-  {
-    GST_ELEMENT_ERROR (v4l2src, RESOURCE, SETTINGS,
-        (_("Could not set parameters on device '%s'"),
-            v4l2src->v4l2object->videodev), GST_ERROR_SYSTEM);
-    return FALSE;
-  }
 invalid_framerate:
   {
     GST_ELEMENT_ERROR (v4l2src, RESOURCE, SETTINGS,