From 00614e2c2b3882604d7715908a3b43230a2607aa Mon Sep 17 00:00:00 2001 From: Nicolas Dufresne Date: Tue, 6 May 2014 16:46:55 -0400 Subject: [PATCH] value: Add support for GObject comparising in structures This is useful to allow comparing pool configuration where a GstAllocator is set. https://bugzilla.gnome.org/show_bug.cgi?id=728268 --- gst/gstvalue.c | 30 ++++++++++++++++++++++++++++++ tests/check/gst/gstvalue.c | 10 ++++++++++ 2 files changed, 40 insertions(+) diff --git a/gst/gstvalue.c b/gst/gstvalue.c index 30f9595dd8..9e52f8ab0f 100644 --- a/gst/gstvalue.c +++ b/gst/gstvalue.c @@ -5840,6 +5840,24 @@ gst_value_compare_bitmask (const GValue * value1, const GValue * value2) return GST_VALUE_UNORDERED; } +/************ + * GObject * + ************/ + +static gint +gst_value_compare_object (const GValue * value1, const GValue * value2) +{ + gpointer v1, v2; + + v1 = value1->data[0].v_pointer; + v2 = value2->data[0].v_pointer; + + if (v1 == v2) + return GST_VALUE_EQUAL; + + return GST_VALUE_UNORDERED; +} + static void gst_value_transform_object_string (const GValue * src_value, GValue * dest_value) @@ -6239,6 +6257,18 @@ _priv_gst_value_initialize (void) gst_value_register (&gst_value); } + { + static GstValueTable gst_value = { + 0, + gst_value_compare_object, + NULL, + NULL, + }; + + gst_value.type = G_TYPE_OBJECT; + gst_value_register (&gst_value); + } + REGISTER_SERIALIZATION (G_TYPE_DOUBLE, double); REGISTER_SERIALIZATION (G_TYPE_FLOAT, float); diff --git a/tests/check/gst/gstvalue.c b/tests/check/gst/gstvalue.c index 5f1b347d0a..774feccb01 100644 --- a/tests/check/gst/gstvalue.c +++ b/tests/check/gst/gstvalue.c @@ -771,6 +771,16 @@ 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 objects */ + g_value_init (&value1, GST_TYPE_BIN); + g_value_take_object (&value1, gst_bin_new (NULL)); + g_value_init (&value2, GST_TYPE_BIN); + g_value_take_object (&value2, gst_bin_new (NULL)); + fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_UNORDERED); + fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL); + g_value_unset (&value1); + g_value_unset (&value2); } GST_END_TEST;