gstvalue: Implement gst_value_is_subset() for flagsets
authorJan Schmidt <jan@centricular.com>
Wed, 27 May 2015 12:23:00 +0000 (22:23 +1000)
committerJan Schmidt <jan@centricular.com>
Tue, 2 Jun 2015 14:48:17 +0000 (00:48 +1000)
gst/gstvalue.c
tests/check/gst/gstvalue.c

index 0c7c3c3..4310222 100644 (file)
@@ -3387,6 +3387,31 @@ gst_value_is_subset_int64_range_int64_range (const GValue * value1,
   return TRUE;
 }
 
+/* A flag set is a subset of another if the superset allows the
+ * flags of the subset */
+static gboolean
+gst_value_is_subset_flagset_flagset (const GValue * value1,
+    const GValue * value2)
+{
+  guint f1, f2;
+  guint m1, m2;
+
+  g_return_val_if_fail (GST_VALUE_HOLDS_FLAG_SET (value1), FALSE);
+  g_return_val_if_fail (GST_VALUE_HOLDS_FLAG_SET (value2), FALSE);
+
+  f1 = value1->data[0].v_uint;
+  f2 = value2->data[0].v_uint;
+
+  m1 = value1->data[1].v_uint;
+  m2 = value2->data[1].v_uint;
+
+  /* Not a subset if masked bits of superset disagree */
+  if ((f1 & m1) != (f2 & (m1 & m2)))
+    return FALSE;
+
+  return TRUE;
+}
+
 /**
  * gst_value_is_subset:
  * @value1: a #GValue
@@ -3408,6 +3433,9 @@ gst_value_is_subset (const GValue * value1, const GValue * value2)
   } else if (GST_VALUE_HOLDS_INT64_RANGE (value1)
       && GST_VALUE_HOLDS_INT64_RANGE (value2)) {
     return gst_value_is_subset_int64_range_int64_range (value1, value2);
+  } else if (GST_VALUE_HOLDS_FLAG_SET (value1) &&
+      GST_VALUE_HOLDS_FLAG_SET (value2)) {
+    return gst_value_is_subset_flagset_flagset (value1, value2);
   }
 
   /*
index 554866e..18ce2f5 100644 (file)
@@ -664,8 +664,18 @@ GST_START_TEST (test_flagset)
       "resulting mask is 0x%u, not 0x%x",
       gst_value_get_flagset_mask (&dest), test_mask);
 
+  gst_value_set_flagset (&value,
+      GST_SEEK_FLAG_ACCURATE, GST_SEEK_FLAG_ACCURATE);
+  gst_value_set_flagset (&value2, GST_SEEK_FLAG_ACCURATE | GST_SEEK_FLAG_FLUSH,
+      GST_SEEK_FLAG_ACCURATE | GST_SEEK_FLAG_SNAP_BEFORE | GST_SEEK_FLAG_FLUSH);
+  /* Check that accurate alone is a subset of accurate+!snap_before+flush,
+   * but not vice-versa */
+  fail_unless (gst_value_is_subset (&value, &value2));
+  fail_if (gst_value_is_subset (&value2, &value));
+
   g_value_unset (&dest);
   g_value_unset (&value);
+  g_value_unset (&value2);
 }
 
 GST_END_TEST;