gststructure: Add gst_structure_can_intersect API
authorEdward Hervey <bilboed@bilboed.com>
Fri, 10 Sep 2010 16:33:34 +0000 (18:33 +0200)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Tue, 17 May 2011 07:28:06 +0000 (09:28 +0200)
Allows checking if two structures can intersect without having to
go through GstCaps

API: gst_structure_can_intersect

https://bugzilla.gnome.org/show_bug.cgi?id=629300

docs/gst/gstreamer-sections.txt
gst/gstcaps.c
gst/gststructure.c
gst/gststructure.h
win32/common/libgstreamer.def

index 25633e5..7e2294d 100644 (file)
@@ -2210,6 +2210,7 @@ gst_structure_n_fields
 gst_structure_has_field
 gst_structure_has_field_typed
 gst_structure_is_equal
+gst_structure_can_intersect
 gst_structure_id_has_field
 gst_structure_id_has_field_typed
 gst_structure_get_boolean
index dc7735d..ceaaa22 100644 (file)
@@ -1265,52 +1265,6 @@ error:
   return NULL;
 }
 
-static gboolean
-gst_caps_structure_can_intersect_field (GQuark id, const GValue * val1,
-    gpointer data)
-{
-  GstStructure *other = (GstStructure *) data;
-  const GValue *val2 = gst_structure_id_get_value (other, id);
-
-  if (G_LIKELY (val2)) {
-    if (!gst_value_can_intersect (val1, val2)) {
-      return FALSE;
-    } else {
-      gint eq = gst_value_compare (val1, val2);
-
-      if (eq == GST_VALUE_UNORDERED) {
-        /* we need to try interseting */
-        GValue dest_value = { 0 };
-        if (gst_value_intersect (&dest_value, val1, val2)) {
-          g_value_unset (&dest_value);
-        } else {
-          return FALSE;
-        }
-      } else if (eq != GST_VALUE_EQUAL) {
-        return FALSE;
-      }
-    }
-  }
-  return TRUE;
-}
-
-static gboolean
-gst_caps_structure_can_intersect (const GstStructure * struct1,
-    const GstStructure * struct2)
-{
-  g_assert (struct1 != NULL);
-  g_assert (struct2 != NULL);
-
-  if (G_UNLIKELY (struct1->name != struct2->name))
-    return FALSE;
-
-  /* tries to intersect if we have the field in both */
-  if (G_UNLIKELY (!gst_structure_foreach ((GstStructure *) struct1,
-              gst_caps_structure_can_intersect_field, (gpointer) struct2)))
-    return FALSE;
-
-  return TRUE;
-}
 
 /**
  * gst_caps_can_intersect:
@@ -1379,7 +1333,7 @@ gst_caps_can_intersect (const GstCaps * caps1, const GstCaps * caps2)
       struct1 = gst_caps_get_structure_unchecked (caps1, j);
       struct2 = gst_caps_get_structure_unchecked (caps2, k);
 
-      if (gst_caps_structure_can_intersect (struct1, struct2)) {
+      if (gst_structure_can_intersect (struct1, struct2)) {
         return TRUE;
       }
       /* move down left */
index 7b962c7..e97d159 100644 (file)
@@ -2961,3 +2961,62 @@ gst_structure_is_equal (const GstStructure * structure1,
   return gst_structure_foreach (structure1, gst_structure_is_equal_foreach,
       structure2);
 }
+
+static gboolean
+gst_caps_structure_can_intersect_field (GQuark id, const GValue * val1,
+    gpointer data)
+{
+  GstStructure *other = (GstStructure *) data;
+  const GValue *val2 = gst_structure_id_get_value (other, id);
+
+  if (G_LIKELY (val2)) {
+    if (!gst_value_can_intersect (val1, val2)) {
+      return FALSE;
+    } else {
+      gint eq = gst_value_compare (val1, val2);
+
+      if (eq == GST_VALUE_UNORDERED) {
+        /* we need to try interseting */
+        GValue dest_value = { 0 };
+        if (gst_value_intersect (&dest_value, val1, val2)) {
+          g_value_unset (&dest_value);
+        } else {
+          return FALSE;
+        }
+      } else if (eq != GST_VALUE_EQUAL) {
+        return FALSE;
+      }
+    }
+  }
+  return TRUE;
+}
+
+/**
+ * gst_structure_can_intersect:
+ * @struct1: a #GstStructure
+ * @struct2: a #GstStructure
+ *
+ * Tries interesecting @struct1 and @struct2 and reports whether the result
+ * would not be empty.
+ *
+ * Returns: %TRUE if intersection would not be empty
+ *
+ * Since: 0.10.31
+ */
+gboolean
+gst_structure_can_intersect (const GstStructure * struct1,
+    const GstStructure * struct2)
+{
+  g_return_val_if_fail (GST_IS_STRUCTURE (struct1), FALSE);
+  g_return_val_if_fail (GST_IS_STRUCTURE (struct2), FALSE);
+
+  if (G_UNLIKELY (struct1->name != struct2->name))
+    return FALSE;
+
+  /* tries to intersect if we have the field in both */
+  if (G_UNLIKELY (!gst_structure_foreach ((GstStructure *) struct1,
+              gst_caps_structure_can_intersect_field, (gpointer) struct2)))
+    return FALSE;
+
+  return TRUE;
+}
index 1d0d812..97536c3 100644 (file)
@@ -250,6 +250,8 @@ gboolean                 gst_structure_fixate_field_nearest_fraction (GstStructu
 
 gboolean                 gst_structure_is_equal(const GstStructure *structure1,
                                                GstStructure *structure2);
+gboolean                 gst_structure_can_intersect(const GstStructure *struct1,
+                                                    const GstStructure *struct2);
 
 G_END_DECLS
 
index 0fcebc8..a156c97 100644 (file)
@@ -964,6 +964,7 @@ EXPORTS
        gst_stream_error_get_type
        gst_stream_error_quark
        gst_stream_status_type_get_type
+       gst_structure_can_intersect
        gst_structure_change_type_get_type
        gst_structure_copy
        gst_structure_empty_new