value: Accept NULL as a structure
authorOlivier Crête <olivier.crete@collabora.com>
Mon, 10 Apr 2017 16:24:06 +0000 (12:24 -0400)
committerOlivier Crête <olivier.crete@collabora.com>
Mon, 10 Apr 2017 16:37:12 +0000 (12:37 -0400)
Some GstStructure properties default to NULL, so it should
be a supported value.

With unit test.

gst/gstvalue.c
tests/check/gst/gstvalue.c

index 5dcfd5e..5bf7197 100644 (file)
@@ -2754,6 +2754,12 @@ gst_value_compare_structure (const GValue * value1, const GValue * value2)
   GstStructure *structure1 = GST_STRUCTURE (g_value_get_boxed (value1));
   GstStructure *structure2 = GST_STRUCTURE (g_value_get_boxed (value2));
 
+  if (structure1 == structure2)
+    return GST_VALUE_EQUAL;
+
+  if (!structure1 || !structure2)
+    return GST_VALUE_UNORDERED;
+
   if (gst_structure_is_equal (structure1, structure2))
     return GST_VALUE_EQUAL;
 
index 9d3ae43..639f175 100644 (file)
@@ -1048,6 +1048,23 @@ GST_START_TEST (test_value_compare)
   fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL);
   g_value_unset (&value1);
   g_value_unset (&value2);
+
+  /* Check that we can compare structure */
+  {
+    GstStructure *s = gst_structure_new_empty ("test");
+
+    g_value_init (&value1, GST_TYPE_STRUCTURE);
+    g_value_init (&value2, GST_TYPE_STRUCTURE);
+    fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_EQUAL);
+
+    gst_value_set_structure (&value1, s);
+    fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_UNORDERED);
+    gst_value_set_structure (&value2, s);
+    fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_EQUAL);
+    g_value_unset (&value1);
+    g_value_unset (&value2);
+    gst_structure_free (s);
+  }
 }
 
 GST_END_TEST;