Blame SOURCES/0003-v4l2src-fix.patch

e23cb3
--- gst-plugins-good-0.10.31/sys/v4l2/gstv4l2object.c	2011-12-30 14:59:13.000000000 +0100
e23cb3
+++ gst-plugins-good-0.10.31.fixed/sys/v4l2/gstv4l2object.c	2012-06-05 23:45:16.670981047 +0200
e23cb3
@@ -1583,6 +1583,7 @@
e23cb3
 
e23cb3
   if (ival.type == V4L2_FRMIVAL_TYPE_DISCRETE) {
e23cb3
     GValue rate = { 0, };
e23cb3
+    guint i;
e23cb3
 
e23cb3
     g_value_init (&rates, GST_TYPE_LIST);
e23cb3
     g_value_init (&rate, GST_TYPE_FRACTION);
e23cb3
@@ -1602,7 +1603,16 @@
e23cb3
 
e23cb3
       /* swap to get the framerate */
e23cb3
       gst_value_set_fraction (&rate, denom, num);
e23cb3
-      gst_value_list_append_value (&rates, &rate;;
e23cb3
+      /* avoid duplicate framerates, yes some hw reports duplicates :( */
e23cb3
+      for (i = 0; i < gst_value_list_get_size(&rates); i++) {
e23cb3
+        const GValue *val = gst_value_list_get_value(&rates, i);
e23cb3
+        if (gst_value_compare(val, &rate) == GST_VALUE_EQUAL) {
e23cb3
+          break;
e23cb3
+        }
e23cb3
+      }
e23cb3
+      if (i == gst_value_list_get_size(&rates)) {
e23cb3
+        gst_value_list_append_value(&rates, &rate;;
e23cb3
+      }
e23cb3
 
e23cb3
       ival.index++;
e23cb3
     } while (v4l2_ioctl (fd, VIDIOC_ENUM_FRAMEINTERVALS, &ival) >= 0);