sys/v4l2/gstv4l2src.c: Initialize num_buffers with minimum value.
authorStefan Kost <ensonic@users.sourceforge.net>
Tue, 17 Jul 2007 11:35:29 +0000 (11:35 +0000)
committerStefan Kost <ensonic@users.sourceforge.net>
Tue, 17 Jul 2007 11:35:29 +0000 (11:35 +0000)
Original commit message from CVS:
* sys/v4l2/gstv4l2src.c: (gst_v4l2src_init):
Initialize num_buffers with minimum value.
* sys/v4l2/v4l2src_calls.c: (gst_v4l2src_fill_format_list),
(gst_v4l2src_probe_caps_for_format), (gst_v4l2src_grab_frame):
Handle frame-size query failure gracefully.

ChangeLog
common
sys/v4l2/gstv4l2src.c
sys/v4l2/v4l2src_calls.c

index 2d310c3..284adc8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2007-07-17  Stefan Kost  <ensonic@users.sf.net>
+
+       * sys/v4l2/gstv4l2src.c: (gst_v4l2src_init):
+         Initialize num_buffers with minimum value.
+
+       * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_fill_format_list),
+       (gst_v4l2src_probe_caps_for_format), (gst_v4l2src_grab_frame):
+         Handle frame-size query failure gracefully.
+
 2007-07-16  Wim Taymans  <wim.taymans@gmail.com>
 
        * gst/qtdemux/qtdemux.c: (qtdemux_parse_node):
diff --git a/common b/common
index fb4b30e..b3fe2a2 160000 (submodule)
--- a/common
+++ b/common
@@ -1 +1 @@
-Subproject commit fb4b30ebbec59a8944cacae5fb5cf40bff5dfcaa
+Subproject commit b3fe2a25c1cd0f4b021795d0db7330aeb338da7c
index d359948..a974791 100644 (file)
@@ -298,7 +298,7 @@ gst_v4l2src_init (GstV4l2Src * v4l2src, GstV4l2SrcClass * klass)
       gst_v4l2_get_input, gst_v4l2_set_input, NULL);
 
   /* number of buffers requested */
-  v4l2src->num_buffers = 0;
+  v4l2src->num_buffers = 2;
 
   v4l2src->formats = NULL;
 
@@ -324,6 +324,7 @@ gst_v4l2src_dispose (GObject * object)
   G_OBJECT_CLASS (parent_class)->dispose (object);
 }
 
+
 static void
 gst_v4l2src_finalize (GstV4l2Src * v4l2src)
 {
@@ -332,6 +333,7 @@ gst_v4l2src_finalize (GstV4l2Src * v4l2src)
   G_OBJECT_CLASS (parent_class)->finalize ((GObject *) (v4l2src));
 }
 
+
 static void
 gst_v4l2src_set_property (GObject * object,
     guint prop_id, const GValue * value, GParamSpec * pspec)
index 4ea9b1b..f90167e 100644 (file)
@@ -379,6 +379,7 @@ gst_v4l2src_fill_format_list (GstV4l2Src * v4l2src)
     v4l2src->formats = g_slist_prepend (v4l2src->formats, format);
   }
   v4l2src->formats = g_slist_reverse (v4l2src->formats);
+  GST_DEBUG_OBJECT (v4l2src, "got %d format(s)", n);
   return TRUE;
 
   /* ERRORS */
@@ -560,9 +561,10 @@ GstCaps *
 gst_v4l2src_probe_caps_for_format (GstV4l2Src * v4l2src, guint32 pixelformat,
     const GstStructure * template)
 {
-#ifdef VIDIOC_ENUM_FRAMESIZES
   GstCaps *ret;
   GstStructure *tmp;
+
+#ifdef VIDIOC_ENUM_FRAMESIZES
   gint fd = v4l2src->v4l2object->video_fd;
   struct v4l2_frmsizeenum size;
   guint32 w, h;
@@ -629,18 +631,17 @@ enum_framesizes_failed:
     GST_DEBUG_OBJECT (v4l2src,
         "Failed to enumerate frame sizes for pixelformat %" GST_FOURCC_FORMAT
         " (%s)", GST_FOURCC_ARGS (pixelformat), g_strerror (errno));
-    return NULL;
+    goto default_frame_sizes;
   }
 unknown_type:
   {
     GST_WARNING_OBJECT (v4l2src,
         "Unknown frame sizeenum type for pixelformat %" GST_FOURCC_FORMAT
         ": %u", GST_FOURCC_ARGS (pixelformat), size.type);
-    return NULL;
+    goto default_frame_sizes;
   }
-#else /* defined VIDIOC_ENUM_FRAMESIZES */
-  GstCaps *ret;
-  GstStructure *tmp;
+default_frame_sizes:
+#endif /* defined VIDIOC_ENUM_FRAMESIZES */
 
   /* This code is for Linux < 2.6.19 */
 
@@ -653,7 +654,6 @@ unknown_type:
       (gint) 1, (gint) 100, (gint) 1, NULL);
   gst_caps_append_structure (ret, tmp);
   return ret;
-#endif /* defined VIDIOC_ENUM_FRAMESIZES */
 }
 
 /******************************************************
@@ -710,9 +710,17 @@ gst_v4l2src_grab_frame (GstV4l2Src * v4l2src, GstBuffer ** buf)
              else {
            */
           GST_DEBUG_OBJECT (v4l2src, "reenqueing buffer");
-          if (ioctl (v4l2src->v4l2object->video_fd, VIDIOC_QBUF, &buffer) < 0) {
-            goto qbuf_failed;
-          }
+          /* FIXME: this is not a good idea, as drivers usualy return the buffer
+           * with index-number set to 0, thus the re-enque will fail unless it
+           * was incidentialy 0.
+           * We could try to re-enque all buffers without handling the ioctl
+           * return.
+           */
+          /*
+             if (ioctl (v4l2src->v4l2object->video_fd, VIDIOC_QBUF, &buffer) < 0) {
+             goto qbuf_failed;
+             }
+           */
           /*} */
         }
         break;
@@ -820,6 +828,7 @@ too_many_trials:
             NUM_TRIALS, v4l2src->v4l2object->videodev, g_strerror (errno)));
     return GST_FLOW_ERROR;
   }
+/*
 qbuf_failed:
   {
     GST_ELEMENT_ERROR (v4l2src, RESOURCE, WRITE,
@@ -829,6 +838,7 @@ qbuf_failed:
             v4l2src->v4l2object->videodev, g_strerror (errno)));
     return GST_FLOW_ERROR;
   }
+*/
 }