caps: Add gst_caps_foreach() and gst_caps_map_in_place()
[platform/upstream/gstreamer.git] / tests / check / gst / gstcaps.c
index a0090a2..cb6128b 100644 (file)
@@ -16,8 +16,8 @@
  *
  * You should have received a copy of the GNU Library General Public
  * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
  */
 
 
@@ -103,6 +103,8 @@ GST_START_TEST (test_static_caps)
   static GstStaticCaps scaps = GST_STATIC_CAPS ("audio/x-raw,rate=44100");
   GstCaps *caps1;
   GstCaps *caps2;
+  static GstStaticCaps sany = GST_STATIC_CAPS_ANY;
+  static GstStaticCaps snone = GST_STATIC_CAPS_NONE;
 
   /* caps creation */
   caps1 = gst_static_caps_get (&scaps);
@@ -120,6 +122,14 @@ GST_START_TEST (test_static_caps)
 
   gst_caps_unref (caps1);
   gst_caps_unref (caps2);
+
+  caps1 = gst_static_caps_get (&sany);
+  fail_unless (gst_caps_is_equal (caps1, GST_CAPS_ANY));
+  caps2 = gst_static_caps_get (&snone);
+  fail_unless (gst_caps_is_equal (caps2, GST_CAPS_NONE));
+  fail_if (gst_caps_is_equal (caps1, caps2));
+  gst_caps_unref (caps1);
+  gst_caps_unref (caps2);
 }
 
 GST_END_TEST;
@@ -312,6 +322,50 @@ GST_START_TEST (test_subset)
   fail_if (gst_caps_is_subset (c2, c1));
   gst_caps_unref (c1);
   gst_caps_unref (c2);
+
+  c1 = gst_caps_from_string ("video/x-h264, parsed=(boolean)true");
+  c2 = gst_caps_from_string
+      ("video/x-h264, stream-format=(string)byte-stream, alignment=(string)nal");
+  fail_if (gst_caps_is_subset (c2, c1));
+  fail_if (gst_caps_is_subset (c1, c2));
+  fail_if (gst_caps_is_equal (c1, c2));
+  gst_caps_unref (c1);
+  gst_caps_unref (c2);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_subset_duplication)
+{
+  GstCaps *c1, *c2;
+
+  c1 = gst_caps_from_string ("audio/x-raw, format=(string)F32LE");
+  c2 = gst_caps_from_string ("audio/x-raw, format=(string)F32LE");
+
+  fail_unless (gst_caps_is_subset (c1, c2));
+  fail_unless (gst_caps_is_subset (c2, c1));
+
+  gst_caps_unref (c2);
+  c2 = gst_caps_from_string ("audio/x-raw, format=(string){ F32LE }");
+
+  fail_unless (gst_caps_is_subset (c1, c2));
+  fail_unless (gst_caps_is_subset (c2, c1));
+
+  gst_caps_unref (c2);
+  c2 = gst_caps_from_string ("audio/x-raw, format=(string){ F32LE, F32LE }");
+
+  fail_unless (gst_caps_is_subset (c1, c2));
+  fail_unless (gst_caps_is_subset (c2, c1));
+
+  gst_caps_unref (c2);
+  c2 = gst_caps_from_string
+      ("audio/x-raw, format=(string){ F32LE, F32LE, F32LE }");
+
+  fail_unless (gst_caps_is_subset (c1, c2));
+  fail_unless (gst_caps_is_subset (c2, c1));
+
+  gst_caps_unref (c1);
+  gst_caps_unref (c2);
 }
 
 GST_END_TEST;
@@ -714,6 +768,70 @@ GST_START_TEST (test_intersect2)
 
 GST_END_TEST;
 
+GST_START_TEST (test_intersect_list_duplicate)
+{
+  GstCaps *caps1, *caps2, *icaps;
+
+  /* make sure we don't take too long to intersect these.. */
+  caps1 = gst_caps_from_string ("video/x-raw, format=(string)YV12; "
+      "video/x-raw, format=(string)I420; video/x-raw, format=(string)YUY2; "
+      "video/x-raw, format=(string)UYVY; "
+      "video/x-raw, format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx,"
+      " xRGB, xBGR, { RGBA, RGBA, { RGBA, RGBA }, "
+      "{ RGBA, RGBA, { RGBA, RGBA } }, { RGBA, RGBA, { RGBA, RGBA }, "
+      "{ RGBA, RGBA, { RGBA, RGBA } } }, { RGBA, RGBA, { RGBA, RGBA }, "
+      "{ RGBA, RGBA, { RGBA, RGBA } }, { RGBA, RGBA, { RGBA, RGBA }, "
+      "{ RGBA, RGBA, { RGBA, RGBA } } } }, { RGBA, RGBA, { RGBA, RGBA }, "
+      "{ RGBA, RGBA, { RGBA, RGBA } }, { RGBA, RGBA, { RGBA, RGBA }, "
+      "{ RGBA, RGBA, { RGBA, RGBA } } }, { RGBA, RGBA, { RGBA, RGBA }, "
+      "{ RGBA, RGBA, { RGBA, RGBA } }, { RGBA, RGBA, { RGBA, RGBA }, "
+      "{ RGBA, RGBA, { RGBA, RGBA } } } } } }, BGRA, ARGB, { ABGR, ABGR, "
+      "{ ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } }, "
+      "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } } }, "
+      "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } }, "
+      "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } } } }, "
+      "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } }, "
+      "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } } }, "
+      "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } }, "
+      "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } } } } } }, "
+      "RGB, BGR, Y41B, Y42B, YVYU, Y444 }; "
+      "video/x-raw, format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, "
+      "xRGB, xBGR, { RGBA, RGBA, { RGBA, RGBA }, "
+      "{ RGBA, RGBA, { RGBA, RGBA } }, { RGBA, RGBA, { RGBA, RGBA }, "
+      "{ RGBA, RGBA, { RGBA, RGBA } } }, { RGBA, RGBA, { RGBA, RGBA }, "
+      "{ RGBA, RGBA, { RGBA, RGBA } }, { RGBA, RGBA, { RGBA, RGBA }, "
+      "{ RGBA, RGBA, { RGBA, RGBA } } } }, { RGBA, RGBA, { RGBA, RGBA }, "
+      "{ RGBA, RGBA, { RGBA, RGBA } }, { RGBA, RGBA, { RGBA, RGBA }, "
+      "{ RGBA, RGBA, { RGBA, RGBA } } }, { RGBA, RGBA, { RGBA, RGBA }, "
+      "{ RGBA, RGBA, { RGBA, RGBA } }, { RGBA, RGBA, { RGBA, RGBA }, "
+      "{ RGBA, RGBA, { RGBA, RGBA } } } } } }, BGRA, ARGB, "
+      "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } }, "
+      "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } } }, "
+      "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } }, "
+      "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } } } }, "
+      "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } }, "
+      "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } } }, "
+      "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } }, "
+      "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } } } } } }, "
+      "RGB, BGR, Y41B, Y42B, YVYU, Y444, NV12, NV21 }; "
+      "video/x-raw, format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, "
+      "BGRx, xRGB, xBGR, { RGBA, RGBA, { RGBA, RGBA }, "
+      "{ RGBA, RGBA, { RGBA, RGBA } }, { RGBA, RGBA, { RGBA, RGBA }, "
+      "{ RGBA, RGBA, { RGBA, RGBA } } } }, BGRA, ARGB, "
+      "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } }, "
+      "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } } } }, "
+      "RGB, BGR, Y41B, Y42B, YVYU, Y444, NV12, NV21 }");
+
+  caps2 = gst_caps_copy (caps1);
+
+  icaps = gst_caps_intersect (caps1, caps2);
+
+  gst_caps_unref (caps1);
+  gst_caps_unref (caps2);
+  gst_caps_unref (icaps);
+}
+
+GST_END_TEST;
 
 GST_START_TEST (test_intersect_zigzag)
 {
@@ -899,6 +1017,228 @@ GST_START_TEST (test_broken)
 
 GST_END_TEST;
 
+GST_START_TEST (test_features)
+{
+  GstCaps *c1, *c2, *c3;
+  GstStructure *s1, *s2;
+  GstCapsFeatures *f1, *f2;
+  gchar *str1;
+  static GstStaticCaps scaps =
+      GST_STATIC_CAPS
+      ("video/x-raw(memory:EGLImage), width=320, height=[ 240, 260 ]");
+
+  c1 = gst_caps_new_empty ();
+  fail_unless (c1 != NULL);
+  s1 = gst_structure_new ("video/x-raw", "width", G_TYPE_INT, 320, "height",
+      GST_TYPE_INT_RANGE, 240, 260, NULL);
+  fail_unless (s1 != NULL);
+  f1 = gst_caps_features_new ("memory:EGLImage", NULL);
+  fail_unless (f1 != NULL);
+
+  gst_caps_append_structure_full (c1, s1, f1);
+  s2 = gst_caps_get_structure (c1, 0);
+  fail_unless (s1 == s2);
+  f2 = gst_caps_get_features (c1, 0);
+  fail_unless (f1 == f2);
+
+  str1 = gst_caps_to_string (c1);
+  fail_unless (str1 != NULL);
+  c2 = gst_caps_from_string (str1);
+  fail_unless (c2 != NULL);
+  g_free (str1);
+
+  fail_unless (gst_caps_is_equal (c1, c2));
+  fail_unless (gst_caps_is_subset (c1, c2));
+  fail_unless (gst_caps_is_subset (c2, c1));
+  fail_unless (gst_caps_can_intersect (c1, c2));
+
+  gst_caps_unref (c2);
+
+  c2 = gst_caps_new_empty ();
+  fail_unless (c2 != NULL);
+  s2 = gst_structure_new ("video/x-raw", "width", G_TYPE_INT, 320, "height",
+      GST_TYPE_INT_RANGE, 240, 260, NULL);
+  fail_unless (s2 != NULL);
+  f2 = gst_caps_features_new ("memory:VASurface", "meta:VAMeta", NULL);
+  fail_unless (f2 != NULL);
+  gst_caps_append_structure_full (c2, s2, f2);
+
+  fail_if (gst_caps_is_equal (c1, c2));
+  fail_if (gst_caps_is_subset (c1, c2));
+  fail_if (gst_caps_is_subset (c2, c1));
+  fail_if (gst_caps_can_intersect (c1, c2));
+
+  str1 = gst_caps_to_string (c2);
+  fail_unless (str1 != NULL);
+  c3 = gst_caps_from_string (str1);
+  fail_unless (c3 != NULL);
+  g_free (str1);
+
+  fail_unless (gst_caps_is_equal (c2, c3));
+  fail_unless (gst_caps_is_subset (c2, c3));
+  fail_unless (gst_caps_is_subset (c3, c2));
+  fail_unless (gst_caps_can_intersect (c2, c3));
+
+  f1 = gst_caps_get_features (c3, 0);
+  fail_unless (f1 != NULL);
+  fail_if (f1 == f2);
+  gst_caps_features_contains (f1, "memory:VASurface");
+  gst_caps_features_remove (f1, "memory:VASurface");
+  fail_if (gst_caps_is_equal (c2, c3));
+  fail_if (gst_caps_is_subset (c2, c3));
+  fail_if (gst_caps_is_subset (c3, c2));
+  fail_if (gst_caps_can_intersect (c2, c3));
+
+  gst_caps_unref (c3);
+  gst_caps_unref (c2);
+
+  c2 = gst_static_caps_get (&scaps);
+  fail_unless (c2 != NULL);
+  fail_unless (gst_caps_is_equal (c1, c2));
+  fail_unless (gst_caps_is_subset (c1, c2));
+  fail_unless (gst_caps_is_subset (c2, c1));
+  fail_unless (gst_caps_can_intersect (c1, c2));
+  gst_caps_unref (c2);
+
+  c2 = gst_caps_from_string
+      ("video/x-raw(ANY), width=320, height=[ 240, 260 ]");
+  fail_unless (c2 != NULL);
+  fail_if (gst_caps_is_equal (c1, c2));
+  fail_unless (gst_caps_is_subset (c1, c2));
+  fail_if (gst_caps_is_subset (c2, c1));
+  fail_unless (gst_caps_can_intersect (c1, c2));
+
+  c3 = gst_caps_intersect (c1, c2);
+  fail_unless (gst_caps_is_equal (c3, c1));
+
+  gst_caps_unref (c3);
+  gst_caps_unref (c2);
+  gst_caps_unref (c1);
+
+  c1 = gst_caps_from_string ("video/x-raw");
+  c2 = gst_caps_from_string ("video/x-raw");
+
+  f1 = gst_caps_get_features (c1, 0);
+  gst_caps_features_add (f1, "memory:VASurface");
+
+  fail_unless (gst_caps_features_is_equal (f1, gst_caps_get_features (c1, 0)));
+  fail_if (gst_caps_can_intersect (c1, c2));
+
+  f2 = gst_caps_get_features (c2, 0);
+  fail_unless (gst_caps_features_is_equal
+      (GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY, f2));
+
+  gst_caps_unref (c2);
+  gst_caps_unref (c1);
+
+  c1 = gst_caps_from_string ("video/x-raw");
+  f1 = gst_caps_get_features (c1, 0);
+  f2 = gst_caps_features_new ("memory:dmabuf", NULL);
+  gst_caps_set_features (c1, 0, f2);
+
+  gst_caps_unref (c1);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_special_caps)
+{
+  GstCaps *caps;
+
+  caps = gst_caps_new_any ();
+  fail_unless (gst_caps_is_any (caps));
+  fail_unless (gst_caps_is_any (caps) == TRUE);
+  fail_if (gst_caps_is_empty (caps));
+  fail_unless (gst_caps_is_empty (caps) == FALSE);
+  gst_caps_unref (caps);
+
+  caps = gst_caps_new_empty ();
+  fail_if (gst_caps_is_any (caps));
+  fail_unless (gst_caps_is_any (caps) == FALSE);
+  fail_unless (gst_caps_is_empty (caps));
+  fail_unless (gst_caps_is_empty (caps) == TRUE);
+  gst_caps_unref (caps);
+}
+
+GST_END_TEST;
+
+static gboolean
+foreach_append_function (GstCapsFeatures * features, GstStructure * structure,
+    gpointer user_data)
+{
+  GstCaps *caps = user_data;
+
+  gst_caps_append_structure_full (caps, gst_structure_copy (structure),
+      features ? gst_caps_features_copy (features) : NULL);
+
+  return TRUE;
+}
+
+GST_START_TEST (test_foreach)
+{
+  GstCaps *caps, *caps2;
+
+  caps =
+      gst_caps_from_string
+      ("video/x-raw, format=I420; video/x-raw(foo:bar); video/x-h264");
+  caps2 = gst_caps_new_empty ();
+  fail_unless (gst_caps_foreach (caps, foreach_append_function, caps2));
+  fail_unless (gst_caps_is_strictly_equal (caps, caps2));
+  gst_caps_unref (caps);
+  gst_caps_unref (caps2);
+
+  caps = gst_caps_new_empty ();
+  caps2 = gst_caps_new_empty ();
+  fail_unless (gst_caps_foreach (caps, foreach_append_function, caps2));
+  fail_unless (gst_caps_is_strictly_equal (caps, caps2));
+  gst_caps_unref (caps);
+  gst_caps_unref (caps2);
+}
+
+GST_END_TEST;
+
+static gboolean
+map_function (GstCapsFeatures * features, GstStructure * structure,
+    gpointer user_data)
+{
+  /* Remove caps features if there are any, otherwise add some dummy */
+  if (gst_caps_features_contains (features, "foo:bar")) {
+    gst_caps_features_remove (features, "foo:bar");
+  } else {
+    gst_caps_features_add (features, "foo:bar");
+    gst_caps_features_remove (features, GST_CAPS_FEATURE_MEMORY_SYSTEM_MEMORY);
+  }
+
+  /* Set some dummy integer in the structure */
+  gst_structure_set (structure, "foo", G_TYPE_INT, 123, NULL);
+
+  return TRUE;
+}
+
+GST_START_TEST (test_map_in_place)
+{
+  GstCaps *caps, *caps2;
+
+  caps =
+      gst_caps_from_string
+      ("video/x-raw, format=I420; video/x-raw(foo:bar); video/x-h264");
+  caps2 =
+      gst_caps_from_string
+      ("video/x-raw(foo:bar), foo=(int)123, format=I420; video/x-raw, foo=(int)123; video/x-h264(foo:bar), foo=(int)123");
+  fail_unless (gst_caps_map_in_place (caps, map_function, NULL));
+  fail_unless (gst_caps_is_strictly_equal (caps, caps2));
+  gst_caps_unref (caps);
+  gst_caps_unref (caps2);
+
+  caps = gst_caps_new_empty ();
+  caps2 = gst_caps_new_empty ();
+  fail_unless (gst_caps_map_in_place (caps, map_function, NULL));
+  fail_unless (gst_caps_is_strictly_equal (caps, caps2));
+  gst_caps_unref (caps);
+  gst_caps_unref (caps2);
+}
+
+GST_END_TEST;
 
 static Suite *
 gst_caps_suite (void)
@@ -914,17 +1254,23 @@ gst_caps_suite (void)
   tcase_add_test (tc_chain, test_simplify);
   tcase_add_test (tc_chain, test_truncate);
   tcase_add_test (tc_chain, test_subset);
+  tcase_add_test (tc_chain, test_subset_duplication);
   tcase_add_test (tc_chain, test_merge_fundamental);
   tcase_add_test (tc_chain, test_merge_same);
   tcase_add_test (tc_chain, test_merge_subset);
   tcase_add_test (tc_chain, test_intersect);
   tcase_add_test (tc_chain, test_intersect2);
+  tcase_add_test (tc_chain, test_intersect_list_duplicate);
   tcase_add_test (tc_chain, test_intersect_zigzag);
   tcase_add_test (tc_chain, test_intersect_first);
   tcase_add_test (tc_chain, test_intersect_first2);
   tcase_add_test (tc_chain, test_intersect_duplication);
   tcase_add_test (tc_chain, test_normalize);
   tcase_add_test (tc_chain, test_broken);
+  tcase_add_test (tc_chain, test_features);
+  tcase_add_test (tc_chain, test_special_caps);
+  tcase_add_test (tc_chain, test_foreach);
+  tcase_add_test (tc_chain, test_map_in_place);
 
   return s;
 }