tests/: New test, sets up N elements, at each level teeing into M streams per element...
authorAndy Wingo <wingo@pobox.com>
Thu, 24 Feb 2005 15:36:22 +0000 (15:36 +0000)
committerAndy Wingo <wingo@pobox.com>
Thu, 24 Feb 2005 15:36:22 +0000 (15:36 +0000)
Original commit message from CVS:
2005-02-24  Andy Wingo  <wingo@pobox.com>

* tests/Makefile.am:
* tests/complexity.c: New test, sets up N elements, at each level
teeing into M streams per element. Eeeenteresting.

ChangeLog
tests/Makefile.am
tests/benchmarks/complexity.c [new file with mode: 0644]
tests/complexity.c [new file with mode: 0644]

index 23aa751..28395cd 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2005-02-24  Andy Wingo  <wingo@pobox.com>
 
+       * tests/Makefile.am:
+       * tests/complexity.c: New test, sets up N elements, at each level
+       teeing into M streams per element. Eeeenteresting.
+
        * tests/mass_elements.gnuplot: gnuplot file for the mass_elements
        benchmark. Run as gnuplot mass_elements.gnuplot > foo.ps, after
        running bench-mass_elements.scm.
index 4cf093c..8ad8cb8 100644 (file)
@@ -8,7 +8,7 @@ LAT = lat
 
 endif
 
-noinst_PROGRAMS = $(LAT) spidey_bench mass_elements
+noinst_PROGRAMS = $(LAT) spidey_bench mass_elements complexity
 
 AM_CFLAGS = $(GST_OBJ_CFLAGS)
 LIBS = $(GST_OBJ_LIBS)
diff --git a/tests/benchmarks/complexity.c b/tests/benchmarks/complexity.c
new file mode 100644 (file)
index 0000000..44937aa
--- /dev/null
@@ -0,0 +1,139 @@
+/*
+ * Copyright (C) 2004 Benjamin Otte <otte@gnome.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <gst/gst.h>
+
+#define BUFFER_COUNT (1000)
+#define SRC_ELEMENT "fakesrc"
+#define SINK_ELEMENT "fakesink"
+
+
+static GstClockTime
+gst_get_current_time (void)
+{
+  GTimeVal tv;
+
+  g_get_current_time (&tv);
+  return GST_TIMEVAL_TO_TIME (tv);
+}
+
+gint
+main (gint argc, gchar * argv[])
+{
+  GstElement *pipeline, *src, *e;
+  GSList *saved_src_list, *src_list, *new_src_list;
+  guint complexity_order, n_elements, i, j, max_this_level;
+  GstClockTime start, end;
+  gboolean all_srcs_linked;
+
+  gst_init (&argc, &argv);
+
+  if (argc != 3) {
+    g_print ("usage: %s COMPLEXITY_ORDER N_ELEMENTS\n", argv[0]);
+    return 1;
+  }
+
+  complexity_order = atoi (argv[1]);
+  n_elements = atoi (argv[2]);
+
+  start = gst_get_current_time ();
+
+  pipeline = gst_element_factory_make ("pipeline", NULL);
+  g_assert (pipeline);
+
+  e = gst_element_factory_make ("fakesrc", NULL);
+  g_object_set (e, "num-buffers", BUFFER_COUNT, NULL);
+  gst_bin_add (GST_BIN (pipeline), e);
+  src_list = saved_src_list = g_slist_append (NULL, e);
+
+  new_src_list = NULL;
+
+  max_this_level = 1;
+  j = 0;
+  i = 0;
+  all_srcs_linked = FALSE;
+  for (i = 0, j = 0; i < n_elements; i++, j++) {
+    if (j >= max_this_level) {
+      g_slist_free (saved_src_list);
+      saved_src_list = new_src_list;
+      new_src_list = NULL;
+      j = 0;
+      all_srcs_linked = FALSE;
+      max_this_level *= complexity_order;
+    }
+
+    if (!src_list) {
+      if (j)
+        all_srcs_linked = TRUE;
+      src_list = saved_src_list;
+    }
+
+    src = (GstElement *) src_list->data;
+    src_list = src_list->next;
+
+    e = gst_element_factory_make ("tee", NULL);
+    new_src_list = g_slist_prepend (new_src_list, e);
+
+    gst_bin_add (GST_BIN (pipeline), e);
+    if (gst_element_link (src, e) != GST_PAD_LINK_OK)
+      g_assert_not_reached ();
+  }
+
+  if (all_srcs_linked)
+    src_list = new_src_list;
+  else
+    src_list = g_slist_concat (new_src_list, g_slist_copy (src_list));
+
+  g_slist_free (saved_src_list);
+  saved_src_list = src_list;
+  while (src_list) {
+    src = (GstElement *) src_list->data;
+    src_list = src_list->next;
+
+    e = gst_element_factory_make ("fakesink", NULL);
+    gst_bin_add (GST_BIN (pipeline), e);
+    if (gst_element_link (src, e) != GST_PAD_LINK_OK)
+      g_assert_not_reached ();
+  }
+  g_slist_free (saved_src_list);
+
+  end = gst_get_current_time ();
+  g_print ("%" GST_TIME_FORMAT " - creating and linking %d tee elements\n",
+      GST_TIME_ARGS (end - start), i);
+
+  start = gst_get_current_time ();
+  if (gst_element_set_state (pipeline, GST_STATE_PLAYING) != GST_STATE_SUCCESS)
+    g_assert_not_reached ();
+  end = gst_get_current_time ();
+  g_print ("%" GST_TIME_FORMAT " - setting pipeline to playing\n",
+      GST_TIME_ARGS (end - start));
+
+  start = gst_get_current_time ();
+  while (gst_bin_iterate (GST_BIN (pipeline)));
+  end = gst_get_current_time ();
+  g_print ("%" GST_TIME_FORMAT " - putting %u buffers through\n",
+      GST_TIME_ARGS (end - start), BUFFER_COUNT);
+
+  start = gst_get_current_time ();
+  g_object_unref (pipeline);
+  end = gst_get_current_time ();
+  g_print ("%" GST_TIME_FORMAT " - unreffing pipeline\n",
+      GST_TIME_ARGS (end - start));
+
+  return 0;
+}
diff --git a/tests/complexity.c b/tests/complexity.c
new file mode 100644 (file)
index 0000000..44937aa
--- /dev/null
@@ -0,0 +1,139 @@
+/*
+ * Copyright (C) 2004 Benjamin Otte <otte@gnome.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <gst/gst.h>
+
+#define BUFFER_COUNT (1000)
+#define SRC_ELEMENT "fakesrc"
+#define SINK_ELEMENT "fakesink"
+
+
+static GstClockTime
+gst_get_current_time (void)
+{
+  GTimeVal tv;
+
+  g_get_current_time (&tv);
+  return GST_TIMEVAL_TO_TIME (tv);
+}
+
+gint
+main (gint argc, gchar * argv[])
+{
+  GstElement *pipeline, *src, *e;
+  GSList *saved_src_list, *src_list, *new_src_list;
+  guint complexity_order, n_elements, i, j, max_this_level;
+  GstClockTime start, end;
+  gboolean all_srcs_linked;
+
+  gst_init (&argc, &argv);
+
+  if (argc != 3) {
+    g_print ("usage: %s COMPLEXITY_ORDER N_ELEMENTS\n", argv[0]);
+    return 1;
+  }
+
+  complexity_order = atoi (argv[1]);
+  n_elements = atoi (argv[2]);
+
+  start = gst_get_current_time ();
+
+  pipeline = gst_element_factory_make ("pipeline", NULL);
+  g_assert (pipeline);
+
+  e = gst_element_factory_make ("fakesrc", NULL);
+  g_object_set (e, "num-buffers", BUFFER_COUNT, NULL);
+  gst_bin_add (GST_BIN (pipeline), e);
+  src_list = saved_src_list = g_slist_append (NULL, e);
+
+  new_src_list = NULL;
+
+  max_this_level = 1;
+  j = 0;
+  i = 0;
+  all_srcs_linked = FALSE;
+  for (i = 0, j = 0; i < n_elements; i++, j++) {
+    if (j >= max_this_level) {
+      g_slist_free (saved_src_list);
+      saved_src_list = new_src_list;
+      new_src_list = NULL;
+      j = 0;
+      all_srcs_linked = FALSE;
+      max_this_level *= complexity_order;
+    }
+
+    if (!src_list) {
+      if (j)
+        all_srcs_linked = TRUE;
+      src_list = saved_src_list;
+    }
+
+    src = (GstElement *) src_list->data;
+    src_list = src_list->next;
+
+    e = gst_element_factory_make ("tee", NULL);
+    new_src_list = g_slist_prepend (new_src_list, e);
+
+    gst_bin_add (GST_BIN (pipeline), e);
+    if (gst_element_link (src, e) != GST_PAD_LINK_OK)
+      g_assert_not_reached ();
+  }
+
+  if (all_srcs_linked)
+    src_list = new_src_list;
+  else
+    src_list = g_slist_concat (new_src_list, g_slist_copy (src_list));
+
+  g_slist_free (saved_src_list);
+  saved_src_list = src_list;
+  while (src_list) {
+    src = (GstElement *) src_list->data;
+    src_list = src_list->next;
+
+    e = gst_element_factory_make ("fakesink", NULL);
+    gst_bin_add (GST_BIN (pipeline), e);
+    if (gst_element_link (src, e) != GST_PAD_LINK_OK)
+      g_assert_not_reached ();
+  }
+  g_slist_free (saved_src_list);
+
+  end = gst_get_current_time ();
+  g_print ("%" GST_TIME_FORMAT " - creating and linking %d tee elements\n",
+      GST_TIME_ARGS (end - start), i);
+
+  start = gst_get_current_time ();
+  if (gst_element_set_state (pipeline, GST_STATE_PLAYING) != GST_STATE_SUCCESS)
+    g_assert_not_reached ();
+  end = gst_get_current_time ();
+  g_print ("%" GST_TIME_FORMAT " - setting pipeline to playing\n",
+      GST_TIME_ARGS (end - start));
+
+  start = gst_get_current_time ();
+  while (gst_bin_iterate (GST_BIN (pipeline)));
+  end = gst_get_current_time ();
+  g_print ("%" GST_TIME_FORMAT " - putting %u buffers through\n",
+      GST_TIME_ARGS (end - start), BUFFER_COUNT);
+
+  start = gst_get_current_time ();
+  g_object_unref (pipeline);
+  end = gst_get_current_time ();
+  g_print ("%" GST_TIME_FORMAT " - unreffing pipeline\n",
+      GST_TIME_ARGS (end - start));
+
+  return 0;
+}