Some cleanups, add modplug seeking example.
authorWim Taymans <wim.taymans@gmail.com>
Tue, 11 Jun 2002 19:20:52 +0000 (19:20 +0000)
committerWim Taymans <wim.taymans@gmail.com>
Tue, 11 Jun 2002 19:20:52 +0000 (19:20 +0000)
Original commit message from CVS:
Some cleanups, add modplug seeking example.

examples/seeking/seek.c
examples/seeking/spider_seek.c
tests/examples/seek/seek.c
tests/examples/seek/spider_seek.c
tests/old/examples/seek/spider_seek.c

index 575fac1..ff7b7c4 100644 (file)
@@ -8,8 +8,9 @@ static GList *rate_pads = NULL;
 static GList *seekable_elements = NULL;
 
 static GstElement *pipeline;
-static guint64 duration, position;
+static guint64 duration;
 static GtkAdjustment *adjustment;
+static gboolean stats = FALSE;
 
 static guint update_id;
 
@@ -58,6 +59,37 @@ setup_dynamic_connection (GstElement *element, const gchar *padname, GstPad *tar
 }
 
 static GstElement*
+make_mod_pipeline (const gchar *location) 
+{
+  GstElement *pipeline;
+  GstElement *src, *decoder, *audiosink;
+  GstPad *seekable;
+  
+  pipeline = gst_pipeline_new ("app");
+
+  src = gst_element_factory_make (SOURCE, "src");
+  decoder = gst_element_factory_make ("modplug", "decoder");
+  audiosink = gst_element_factory_make ("osssink", "sink");
+  //g_object_set (G_OBJECT (audiosink), "sync", FALSE, NULL);
+
+  g_object_set (G_OBJECT (src), "location", location, NULL);
+
+  gst_bin_add (GST_BIN (pipeline), src);
+  gst_bin_add (GST_BIN (pipeline), decoder);
+  gst_bin_add (GST_BIN (pipeline), audiosink);
+
+  gst_element_connect (src, decoder);
+  gst_element_connect (decoder, audiosink);
+
+  seekable = gst_element_get_pad (decoder, "src");
+  seekable_pads = g_list_prepend (seekable_pads, seekable);
+  rate_pads = g_list_prepend (rate_pads, seekable);
+  rate_pads = g_list_prepend (rate_pads, gst_element_get_pad (decoder, "sink"));
+
+  return pipeline;
+}
+
+static GstElement*
 make_wav_pipeline (const gchar *location) 
 {
   GstElement *pipeline;
@@ -452,76 +484,89 @@ query_rates (void)
 }
 
 G_GNUC_UNUSED static void
-query_durations (GstPad *pad)
+query_durations ()
 {
-  gint i = 0;
-
-  g_print ("durations %8.8s: ", GST_PAD_NAME (pad));
-  while (seek_formats[i].name) {
-    gboolean res;
-    gint64 value;
-    GstFormat format;
-
-    format = seek_formats[i].format;
-    res = gst_pad_query (pad, GST_PAD_QUERY_TOTAL, &format, &value);
-    if (res) {
-      g_print ("%s %13lld | ", seek_formats[i].name, value);
-      if (seek_formats[i].format == GST_FORMAT_TIME)
-       duration = value;
-    }
-    else {
-      g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*");
+  GList *walk = seekable_pads;
+
+  while (walk) {
+    GstPad *pad = GST_PAD (walk->data);
+    gint i = 0;
+
+    g_print ("durations %8.8s: ", GST_PAD_NAME (pad));
+    while (seek_formats[i].name) {
+      gboolean res;
+      gint64 value;
+      GstFormat format;
+
+      format = seek_formats[i].format;
+      res = gst_pad_query (pad, GST_PAD_QUERY_TOTAL, &format, &value);
+      if (res) {
+        g_print ("%s %13lld | ", seek_formats[i].name, value);
+      }
+      else {
+        g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*");
+      }
+      i++;
     }
-    i++;
+    g_print (" %s:%s\n", GST_DEBUG_PAD_NAME (pad));
+  
+    walk = g_list_next (walk);
   }
-  g_print (" %s:%s\n", GST_DEBUG_PAD_NAME (pad));
 }
 
 G_GNUC_UNUSED static void
-query_positions (GstPad *pad)
+query_positions ()
 {
-  gint i = 0;
-
-  g_print ("positions %8.8s: ", GST_PAD_NAME (pad));
-  while (seek_formats[i].name) {
-    gboolean res;
-    gint64 value;
-    GstFormat format;
-
-    format = seek_formats[i].format;
-    res = gst_pad_query (pad, GST_PAD_QUERY_POSITION, &format, &value);
-    if (res) {
-      g_print ("%s %13lld | ", seek_formats[i].name, value);
-      if (seek_formats[i].format == GST_FORMAT_TIME)
-       position = value;
-    }
-    else {
-      g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*");
+  GList *walk = seekable_pads;
+
+  while (walk) {
+    GstPad *pad = GST_PAD (walk->data);
+    gint i = 0;
+
+    g_print ("positions %8.8s: ", GST_PAD_NAME (pad));
+    while (seek_formats[i].name) {
+      gboolean res;
+      gint64 value;
+      GstFormat format;
+
+      format = seek_formats[i].format;
+      res = gst_pad_query (pad, GST_PAD_QUERY_POSITION, &format, &value);
+      if (res) {
+        g_print ("%s %13lld | ", seek_formats[i].name, value);
+      }
+      else {
+        g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*");
+      }
+      i++;
     }
-    i++;
+    g_print (" %s:%s\n", GST_DEBUG_PAD_NAME (pad));
+
+    walk = g_list_next (walk);
   }
-  g_print (" %s:%s\n", GST_DEBUG_PAD_NAME (pad));
 }
 
 static gboolean
 update_scale (gpointer data) 
 {
-  GList *walk = seekable_pads;
   GstClock *clock;
+  guint64 position;
+  GstFormat format = GST_FORMAT_TIME;
 
+  duration = 0;
   clock = gst_bin_get_clock (GST_BIN (pipeline));
 
-  g_print ("clock:                  %13llu  (%s)\n", gst_clock_get_time (clock), gst_object_get_name (GST_OBJECT (clock)));
-
-  while (walk) {
-    GstPad *pad = GST_PAD (walk->data);
-
-    query_durations (pad);
-    query_positions (pad);
+  if (seekable_pads) {
+    GstPad *pad = GST_PAD (seekable_pads->data);
+    gst_pad_query (pad, GST_PAD_QUERY_TOTAL, &format, &duration);
+  }
+  position = gst_clock_get_time (clock);
 
-    walk = g_list_next (walk);
+  if (stats) {
+    g_print ("clock:                  %13llu  (%s)\n", position, gst_object_get_name (GST_OBJECT (clock)));
+    query_durations ();
+    query_positions ();
+    query_rates ();
   }
-  query_rates ();
 
   if (duration > 0) {
     gtk_adjustment_set_value (adjustment, position * 100.0 / duration);
@@ -633,12 +678,17 @@ main (int argc, char **argv)
   GtkWidget *window, *hbox, *vbox, 
             *play_button, *pause_button, *stop_button, 
            *hscale;
-
-  gst_init (&argc, &argv);
+  struct poptOption options[] = {
+    {"stats",  's',  POPT_ARG_NONE|POPT_ARGFLAG_STRIP,   &stats,   0,
+           "Show pad stats", NULL},
+    POPT_TABLEEND
+  };
+               
+  gst_init_with_popt_table (&argc, &argv, options);
   gtk_init (&argc, &argv);
 
   if (argc != 3) {
-    g_print ("usage: %s <type 0=mp3 1=avi 2=mpeg1 3=mpegparse 4=vorbis 5=sid 6=flac> <filename>\n", argv[0]);
+    g_print ("usage: %s <type 0=mp3 1=avi 2=mpeg1 3=mpegparse 4=vorbis 5=sid 6=flac 7=wav> <filename>\n", argv[0]);
     exit (-1);
   }
 
@@ -658,6 +708,8 @@ main (int argc, char **argv)
     pipeline = make_flac_pipeline (argv[2]);
   else if (atoi (argv[1]) == 7) 
     pipeline = make_wav_pipeline (argv[2]);
+  else if (atoi (argv[1]) == 8) 
+    pipeline = make_mod_pipeline (argv[2]);
 
   /* initialize gui elements ... */
   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
index d6e1cf2..b7b3752 100644 (file)
@@ -7,13 +7,14 @@ static GList *rate_pads = NULL;
 static GList *seekable_elements = NULL;
 
 static GstElement *pipeline;
-static guint64 duration, position;
 static GtkAdjustment *adjustment;
+static gboolean stats = FALSE;
+static guint64 duration;
 
 static guint update_id;
 
-#define SOURCE "gnomevfssrc"
-//#define SOURCE "filesrc"
+//#define SOURCE "gnomevfssrc"
+#define SOURCE "filesrc"
 
 #define UPDATE_INTERVAL 500
 
@@ -36,6 +37,8 @@ make_spider_pipeline (const gchar *location, gboolean thread)
   a_thread = gst_thread_new ("a_thread");
   a_queue = gst_element_factory_make ("queue", "a_queue");
   audiosink = gst_element_factory_make ("osssink", "a_sink");
+  //g_object_set (G_OBJECT (audiosink), "fragment", 0x00180008, NULL);
+
   v_thread = gst_thread_new ("v_thread");
   v_queue = gst_element_factory_make ("queue", "v_queue");
   videosink = gst_element_factory_make ("xvideosink", "v_sink");
@@ -134,76 +137,87 @@ query_rates (void)
 }
 
 G_GNUC_UNUSED static void
-query_durations (GstElement *element)
+query_durations ()
 {
-  gint i = 0;
-
-  g_print ("durations %8.8s: ", GST_ELEMENT_NAME (element));
-  while (seek_formats[i].name) {
-    gboolean res;
-    gint64 value;
-    GstFormat format;
-
-    format = seek_formats[i].format;
-    res = gst_element_query (element, GST_PAD_QUERY_TOTAL, &format, &value);
-    if (res) {
-      g_print ("%s %13lld | ", seek_formats[i].name, value);
-      if (seek_formats[i].format == GST_FORMAT_TIME)
-       duration = value;
-    }
-    else {
-      g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*");
+  GList *walk = seekable_elements;
+
+  while (walk) {
+    GstElement *element = GST_ELEMENT (walk->data);
+    gint i = 0;
+
+    g_print ("durations %8.8s: ", GST_ELEMENT_NAME (element));
+    while (seek_formats[i].name) {
+      gboolean res;
+      gint64 value;
+      GstFormat format;
+
+      format = seek_formats[i].format;
+      res = gst_element_query (element, GST_PAD_QUERY_TOTAL, &format, &value);
+      if (res) {
+        g_print ("%s %13lld | ", seek_formats[i].name, value);
+      }
+      else {
+        g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*");
+      }
+      i++;
     }
-    i++;
+    g_print (" %s\n", GST_ELEMENT_NAME (element));
+    walk = g_list_next (walk);
   }
-  g_print (" %s\n", GST_ELEMENT_NAME (element));
 }
 
 G_GNUC_UNUSED static void
-query_positions (GstElement *element)
+query_positions ()
 {
-  gint i = 0;
-
-  g_print ("positions %8.8s: ", GST_ELEMENT_NAME (element));
-  while (seek_formats[i].name) {
-    gboolean res;
-    gint64 value;
-    GstFormat format;
-
-    format = seek_formats[i].format;
-    res = gst_element_query (element, GST_PAD_QUERY_POSITION, &format, &value);
-    if (res) {
-      g_print ("%s %13lld | ", seek_formats[i].name, value);
-    }
-    else {
-      g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*");
+  GList *walk = seekable_elements;
+
+  while (walk) {
+    GstElement *element = GST_ELEMENT (walk->data);
+    gint i = 0;
+
+    g_print ("positions %8.8s: ", GST_ELEMENT_NAME (element));
+    while (seek_formats[i].name) {
+      gboolean res;
+      gint64 value;
+      GstFormat format;
+
+      format = seek_formats[i].format;
+      res = gst_element_query (element, GST_PAD_QUERY_POSITION, &format, &value);
+      if (res) {
+        g_print ("%s %13lld | ", seek_formats[i].name, value);
+      }
+      else {
+        g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*");
+      }
+      i++;
     }
-    i++;
+    g_print (" %s\n", GST_ELEMENT_NAME (element));
+    walk = g_list_next (walk);
   }
-  g_print (" %s\n", GST_ELEMENT_NAME (element));
 }
 
 static gboolean
 update_scale (gpointer data) 
 {
-  GList *walk = seekable_elements;
   GstClock *clock;
+  guint64 position;
+  GstFormat format = GST_FORMAT_TIME;
 
+  duration = 0;
   clock = gst_bin_get_clock (GST_BIN (pipeline));
 
+  if (seekable_elements) {
+    GstElement *element = GST_ELEMENT (seekable_elements->data);
+    gst_element_query (element, GST_PAD_QUERY_TOTAL, &format, &duration);
+  }
   position = gst_clock_get_time (clock);
-  g_print ("clock:                  %13llu  (%s)\n", position, gst_object_get_name (GST_OBJECT (clock)));
-
-  while (walk) {
-    GstElement *element = GST_ELEMENT (walk->data);
 
-    query_durations (element);
-    query_positions (element);
-
-    walk = g_list_next (walk);
+  if (stats) {
+    g_print ("clock:                  %13llu  (%s)\n", position, gst_object_get_name (GST_OBJECT (clock)));
+    query_durations ();
+    query_positions ();
+    query_rates ();
   }
-  query_rates ();
-
   if (duration > 0) {
     gtk_adjustment_set_value (adjustment, position * 100.0 / duration);
   }
@@ -216,9 +230,6 @@ iterate (gpointer data)
 {
   gboolean res = TRUE;
 
-  if (GST_FLAG_IS_SET (data, GST_BIN_SELF_SCHEDULABLE))
-    return TRUE;
-
   res = gst_bin_iterate (GST_BIN (data));
   if (!res) {
     gtk_timeout_remove (update_id);
@@ -259,7 +270,8 @@ stop_seek (GtkWidget *widget, GdkEventButton *event, gpointer user_data)
   }
 
   gst_element_set_state (pipeline, GST_STATE_PLAYING);
-  gtk_idle_add ((GtkFunction) iterate, pipeline);
+  if (!GST_FLAG_IS_SET (pipeline, GST_BIN_SELF_SCHEDULABLE))
+    gtk_idle_add ((GtkFunction) iterate, pipeline);
   update_id = gtk_timeout_add (UPDATE_INTERVAL, (GtkFunction) update_scale, pipeline);
 
   return FALSE;
@@ -270,7 +282,8 @@ play_cb (GtkButton * button, gpointer data)
 {
   if (gst_element_get_state (pipeline) != GST_STATE_PLAYING) {
     gst_element_set_state (pipeline, GST_STATE_PLAYING);
-    gtk_idle_add ((GtkFunction) iterate, pipeline);
+    if (!GST_FLAG_IS_SET (pipeline, GST_BIN_SELF_SCHEDULABLE))
+      gtk_idle_add ((GtkFunction) iterate, pipeline);
     update_id = gtk_timeout_add (UPDATE_INTERVAL, (GtkFunction) update_scale, pipeline);
   }
 }
@@ -303,6 +316,8 @@ main (int argc, char **argv)
   struct poptOption options[] = {
     {"threaded",  't',  POPT_ARG_NONE|POPT_ARGFLAG_STRIP,   &threaded,   0,
          "Run the pipeline in a toplevel thread", NULL},
+    {"stats",  's',  POPT_ARG_NONE|POPT_ARGFLAG_STRIP,   &stats,   0,
+         "Show element stats", NULL},
      POPT_TABLEEND
     };
 
index 575fac1..ff7b7c4 100644 (file)
@@ -8,8 +8,9 @@ static GList *rate_pads = NULL;
 static GList *seekable_elements = NULL;
 
 static GstElement *pipeline;
-static guint64 duration, position;
+static guint64 duration;
 static GtkAdjustment *adjustment;
+static gboolean stats = FALSE;
 
 static guint update_id;
 
@@ -58,6 +59,37 @@ setup_dynamic_connection (GstElement *element, const gchar *padname, GstPad *tar
 }
 
 static GstElement*
+make_mod_pipeline (const gchar *location) 
+{
+  GstElement *pipeline;
+  GstElement *src, *decoder, *audiosink;
+  GstPad *seekable;
+  
+  pipeline = gst_pipeline_new ("app");
+
+  src = gst_element_factory_make (SOURCE, "src");
+  decoder = gst_element_factory_make ("modplug", "decoder");
+  audiosink = gst_element_factory_make ("osssink", "sink");
+  //g_object_set (G_OBJECT (audiosink), "sync", FALSE, NULL);
+
+  g_object_set (G_OBJECT (src), "location", location, NULL);
+
+  gst_bin_add (GST_BIN (pipeline), src);
+  gst_bin_add (GST_BIN (pipeline), decoder);
+  gst_bin_add (GST_BIN (pipeline), audiosink);
+
+  gst_element_connect (src, decoder);
+  gst_element_connect (decoder, audiosink);
+
+  seekable = gst_element_get_pad (decoder, "src");
+  seekable_pads = g_list_prepend (seekable_pads, seekable);
+  rate_pads = g_list_prepend (rate_pads, seekable);
+  rate_pads = g_list_prepend (rate_pads, gst_element_get_pad (decoder, "sink"));
+
+  return pipeline;
+}
+
+static GstElement*
 make_wav_pipeline (const gchar *location) 
 {
   GstElement *pipeline;
@@ -452,76 +484,89 @@ query_rates (void)
 }
 
 G_GNUC_UNUSED static void
-query_durations (GstPad *pad)
+query_durations ()
 {
-  gint i = 0;
-
-  g_print ("durations %8.8s: ", GST_PAD_NAME (pad));
-  while (seek_formats[i].name) {
-    gboolean res;
-    gint64 value;
-    GstFormat format;
-
-    format = seek_formats[i].format;
-    res = gst_pad_query (pad, GST_PAD_QUERY_TOTAL, &format, &value);
-    if (res) {
-      g_print ("%s %13lld | ", seek_formats[i].name, value);
-      if (seek_formats[i].format == GST_FORMAT_TIME)
-       duration = value;
-    }
-    else {
-      g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*");
+  GList *walk = seekable_pads;
+
+  while (walk) {
+    GstPad *pad = GST_PAD (walk->data);
+    gint i = 0;
+
+    g_print ("durations %8.8s: ", GST_PAD_NAME (pad));
+    while (seek_formats[i].name) {
+      gboolean res;
+      gint64 value;
+      GstFormat format;
+
+      format = seek_formats[i].format;
+      res = gst_pad_query (pad, GST_PAD_QUERY_TOTAL, &format, &value);
+      if (res) {
+        g_print ("%s %13lld | ", seek_formats[i].name, value);
+      }
+      else {
+        g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*");
+      }
+      i++;
     }
-    i++;
+    g_print (" %s:%s\n", GST_DEBUG_PAD_NAME (pad));
+  
+    walk = g_list_next (walk);
   }
-  g_print (" %s:%s\n", GST_DEBUG_PAD_NAME (pad));
 }
 
 G_GNUC_UNUSED static void
-query_positions (GstPad *pad)
+query_positions ()
 {
-  gint i = 0;
-
-  g_print ("positions %8.8s: ", GST_PAD_NAME (pad));
-  while (seek_formats[i].name) {
-    gboolean res;
-    gint64 value;
-    GstFormat format;
-
-    format = seek_formats[i].format;
-    res = gst_pad_query (pad, GST_PAD_QUERY_POSITION, &format, &value);
-    if (res) {
-      g_print ("%s %13lld | ", seek_formats[i].name, value);
-      if (seek_formats[i].format == GST_FORMAT_TIME)
-       position = value;
-    }
-    else {
-      g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*");
+  GList *walk = seekable_pads;
+
+  while (walk) {
+    GstPad *pad = GST_PAD (walk->data);
+    gint i = 0;
+
+    g_print ("positions %8.8s: ", GST_PAD_NAME (pad));
+    while (seek_formats[i].name) {
+      gboolean res;
+      gint64 value;
+      GstFormat format;
+
+      format = seek_formats[i].format;
+      res = gst_pad_query (pad, GST_PAD_QUERY_POSITION, &format, &value);
+      if (res) {
+        g_print ("%s %13lld | ", seek_formats[i].name, value);
+      }
+      else {
+        g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*");
+      }
+      i++;
     }
-    i++;
+    g_print (" %s:%s\n", GST_DEBUG_PAD_NAME (pad));
+
+    walk = g_list_next (walk);
   }
-  g_print (" %s:%s\n", GST_DEBUG_PAD_NAME (pad));
 }
 
 static gboolean
 update_scale (gpointer data) 
 {
-  GList *walk = seekable_pads;
   GstClock *clock;
+  guint64 position;
+  GstFormat format = GST_FORMAT_TIME;
 
+  duration = 0;
   clock = gst_bin_get_clock (GST_BIN (pipeline));
 
-  g_print ("clock:                  %13llu  (%s)\n", gst_clock_get_time (clock), gst_object_get_name (GST_OBJECT (clock)));
-
-  while (walk) {
-    GstPad *pad = GST_PAD (walk->data);
-
-    query_durations (pad);
-    query_positions (pad);
+  if (seekable_pads) {
+    GstPad *pad = GST_PAD (seekable_pads->data);
+    gst_pad_query (pad, GST_PAD_QUERY_TOTAL, &format, &duration);
+  }
+  position = gst_clock_get_time (clock);
 
-    walk = g_list_next (walk);
+  if (stats) {
+    g_print ("clock:                  %13llu  (%s)\n", position, gst_object_get_name (GST_OBJECT (clock)));
+    query_durations ();
+    query_positions ();
+    query_rates ();
   }
-  query_rates ();
 
   if (duration > 0) {
     gtk_adjustment_set_value (adjustment, position * 100.0 / duration);
@@ -633,12 +678,17 @@ main (int argc, char **argv)
   GtkWidget *window, *hbox, *vbox, 
             *play_button, *pause_button, *stop_button, 
            *hscale;
-
-  gst_init (&argc, &argv);
+  struct poptOption options[] = {
+    {"stats",  's',  POPT_ARG_NONE|POPT_ARGFLAG_STRIP,   &stats,   0,
+           "Show pad stats", NULL},
+    POPT_TABLEEND
+  };
+               
+  gst_init_with_popt_table (&argc, &argv, options);
   gtk_init (&argc, &argv);
 
   if (argc != 3) {
-    g_print ("usage: %s <type 0=mp3 1=avi 2=mpeg1 3=mpegparse 4=vorbis 5=sid 6=flac> <filename>\n", argv[0]);
+    g_print ("usage: %s <type 0=mp3 1=avi 2=mpeg1 3=mpegparse 4=vorbis 5=sid 6=flac 7=wav> <filename>\n", argv[0]);
     exit (-1);
   }
 
@@ -658,6 +708,8 @@ main (int argc, char **argv)
     pipeline = make_flac_pipeline (argv[2]);
   else if (atoi (argv[1]) == 7) 
     pipeline = make_wav_pipeline (argv[2]);
+  else if (atoi (argv[1]) == 8) 
+    pipeline = make_mod_pipeline (argv[2]);
 
   /* initialize gui elements ... */
   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
index d6e1cf2..b7b3752 100644 (file)
@@ -7,13 +7,14 @@ static GList *rate_pads = NULL;
 static GList *seekable_elements = NULL;
 
 static GstElement *pipeline;
-static guint64 duration, position;
 static GtkAdjustment *adjustment;
+static gboolean stats = FALSE;
+static guint64 duration;
 
 static guint update_id;
 
-#define SOURCE "gnomevfssrc"
-//#define SOURCE "filesrc"
+//#define SOURCE "gnomevfssrc"
+#define SOURCE "filesrc"
 
 #define UPDATE_INTERVAL 500
 
@@ -36,6 +37,8 @@ make_spider_pipeline (const gchar *location, gboolean thread)
   a_thread = gst_thread_new ("a_thread");
   a_queue = gst_element_factory_make ("queue", "a_queue");
   audiosink = gst_element_factory_make ("osssink", "a_sink");
+  //g_object_set (G_OBJECT (audiosink), "fragment", 0x00180008, NULL);
+
   v_thread = gst_thread_new ("v_thread");
   v_queue = gst_element_factory_make ("queue", "v_queue");
   videosink = gst_element_factory_make ("xvideosink", "v_sink");
@@ -134,76 +137,87 @@ query_rates (void)
 }
 
 G_GNUC_UNUSED static void
-query_durations (GstElement *element)
+query_durations ()
 {
-  gint i = 0;
-
-  g_print ("durations %8.8s: ", GST_ELEMENT_NAME (element));
-  while (seek_formats[i].name) {
-    gboolean res;
-    gint64 value;
-    GstFormat format;
-
-    format = seek_formats[i].format;
-    res = gst_element_query (element, GST_PAD_QUERY_TOTAL, &format, &value);
-    if (res) {
-      g_print ("%s %13lld | ", seek_formats[i].name, value);
-      if (seek_formats[i].format == GST_FORMAT_TIME)
-       duration = value;
-    }
-    else {
-      g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*");
+  GList *walk = seekable_elements;
+
+  while (walk) {
+    GstElement *element = GST_ELEMENT (walk->data);
+    gint i = 0;
+
+    g_print ("durations %8.8s: ", GST_ELEMENT_NAME (element));
+    while (seek_formats[i].name) {
+      gboolean res;
+      gint64 value;
+      GstFormat format;
+
+      format = seek_formats[i].format;
+      res = gst_element_query (element, GST_PAD_QUERY_TOTAL, &format, &value);
+      if (res) {
+        g_print ("%s %13lld | ", seek_formats[i].name, value);
+      }
+      else {
+        g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*");
+      }
+      i++;
     }
-    i++;
+    g_print (" %s\n", GST_ELEMENT_NAME (element));
+    walk = g_list_next (walk);
   }
-  g_print (" %s\n", GST_ELEMENT_NAME (element));
 }
 
 G_GNUC_UNUSED static void
-query_positions (GstElement *element)
+query_positions ()
 {
-  gint i = 0;
-
-  g_print ("positions %8.8s: ", GST_ELEMENT_NAME (element));
-  while (seek_formats[i].name) {
-    gboolean res;
-    gint64 value;
-    GstFormat format;
-
-    format = seek_formats[i].format;
-    res = gst_element_query (element, GST_PAD_QUERY_POSITION, &format, &value);
-    if (res) {
-      g_print ("%s %13lld | ", seek_formats[i].name, value);
-    }
-    else {
-      g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*");
+  GList *walk = seekable_elements;
+
+  while (walk) {
+    GstElement *element = GST_ELEMENT (walk->data);
+    gint i = 0;
+
+    g_print ("positions %8.8s: ", GST_ELEMENT_NAME (element));
+    while (seek_formats[i].name) {
+      gboolean res;
+      gint64 value;
+      GstFormat format;
+
+      format = seek_formats[i].format;
+      res = gst_element_query (element, GST_PAD_QUERY_POSITION, &format, &value);
+      if (res) {
+        g_print ("%s %13lld | ", seek_formats[i].name, value);
+      }
+      else {
+        g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*");
+      }
+      i++;
     }
-    i++;
+    g_print (" %s\n", GST_ELEMENT_NAME (element));
+    walk = g_list_next (walk);
   }
-  g_print (" %s\n", GST_ELEMENT_NAME (element));
 }
 
 static gboolean
 update_scale (gpointer data) 
 {
-  GList *walk = seekable_elements;
   GstClock *clock;
+  guint64 position;
+  GstFormat format = GST_FORMAT_TIME;
 
+  duration = 0;
   clock = gst_bin_get_clock (GST_BIN (pipeline));
 
+  if (seekable_elements) {
+    GstElement *element = GST_ELEMENT (seekable_elements->data);
+    gst_element_query (element, GST_PAD_QUERY_TOTAL, &format, &duration);
+  }
   position = gst_clock_get_time (clock);
-  g_print ("clock:                  %13llu  (%s)\n", position, gst_object_get_name (GST_OBJECT (clock)));
-
-  while (walk) {
-    GstElement *element = GST_ELEMENT (walk->data);
 
-    query_durations (element);
-    query_positions (element);
-
-    walk = g_list_next (walk);
+  if (stats) {
+    g_print ("clock:                  %13llu  (%s)\n", position, gst_object_get_name (GST_OBJECT (clock)));
+    query_durations ();
+    query_positions ();
+    query_rates ();
   }
-  query_rates ();
-
   if (duration > 0) {
     gtk_adjustment_set_value (adjustment, position * 100.0 / duration);
   }
@@ -216,9 +230,6 @@ iterate (gpointer data)
 {
   gboolean res = TRUE;
 
-  if (GST_FLAG_IS_SET (data, GST_BIN_SELF_SCHEDULABLE))
-    return TRUE;
-
   res = gst_bin_iterate (GST_BIN (data));
   if (!res) {
     gtk_timeout_remove (update_id);
@@ -259,7 +270,8 @@ stop_seek (GtkWidget *widget, GdkEventButton *event, gpointer user_data)
   }
 
   gst_element_set_state (pipeline, GST_STATE_PLAYING);
-  gtk_idle_add ((GtkFunction) iterate, pipeline);
+  if (!GST_FLAG_IS_SET (pipeline, GST_BIN_SELF_SCHEDULABLE))
+    gtk_idle_add ((GtkFunction) iterate, pipeline);
   update_id = gtk_timeout_add (UPDATE_INTERVAL, (GtkFunction) update_scale, pipeline);
 
   return FALSE;
@@ -270,7 +282,8 @@ play_cb (GtkButton * button, gpointer data)
 {
   if (gst_element_get_state (pipeline) != GST_STATE_PLAYING) {
     gst_element_set_state (pipeline, GST_STATE_PLAYING);
-    gtk_idle_add ((GtkFunction) iterate, pipeline);
+    if (!GST_FLAG_IS_SET (pipeline, GST_BIN_SELF_SCHEDULABLE))
+      gtk_idle_add ((GtkFunction) iterate, pipeline);
     update_id = gtk_timeout_add (UPDATE_INTERVAL, (GtkFunction) update_scale, pipeline);
   }
 }
@@ -303,6 +316,8 @@ main (int argc, char **argv)
   struct poptOption options[] = {
     {"threaded",  't',  POPT_ARG_NONE|POPT_ARGFLAG_STRIP,   &threaded,   0,
          "Run the pipeline in a toplevel thread", NULL},
+    {"stats",  's',  POPT_ARG_NONE|POPT_ARGFLAG_STRIP,   &stats,   0,
+         "Show element stats", NULL},
      POPT_TABLEEND
     };
 
index d6e1cf2..b7b3752 100644 (file)
@@ -7,13 +7,14 @@ static GList *rate_pads = NULL;
 static GList *seekable_elements = NULL;
 
 static GstElement *pipeline;
-static guint64 duration, position;
 static GtkAdjustment *adjustment;
+static gboolean stats = FALSE;
+static guint64 duration;
 
 static guint update_id;
 
-#define SOURCE "gnomevfssrc"
-//#define SOURCE "filesrc"
+//#define SOURCE "gnomevfssrc"
+#define SOURCE "filesrc"
 
 #define UPDATE_INTERVAL 500
 
@@ -36,6 +37,8 @@ make_spider_pipeline (const gchar *location, gboolean thread)
   a_thread = gst_thread_new ("a_thread");
   a_queue = gst_element_factory_make ("queue", "a_queue");
   audiosink = gst_element_factory_make ("osssink", "a_sink");
+  //g_object_set (G_OBJECT (audiosink), "fragment", 0x00180008, NULL);
+
   v_thread = gst_thread_new ("v_thread");
   v_queue = gst_element_factory_make ("queue", "v_queue");
   videosink = gst_element_factory_make ("xvideosink", "v_sink");
@@ -134,76 +137,87 @@ query_rates (void)
 }
 
 G_GNUC_UNUSED static void
-query_durations (GstElement *element)
+query_durations ()
 {
-  gint i = 0;
-
-  g_print ("durations %8.8s: ", GST_ELEMENT_NAME (element));
-  while (seek_formats[i].name) {
-    gboolean res;
-    gint64 value;
-    GstFormat format;
-
-    format = seek_formats[i].format;
-    res = gst_element_query (element, GST_PAD_QUERY_TOTAL, &format, &value);
-    if (res) {
-      g_print ("%s %13lld | ", seek_formats[i].name, value);
-      if (seek_formats[i].format == GST_FORMAT_TIME)
-       duration = value;
-    }
-    else {
-      g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*");
+  GList *walk = seekable_elements;
+
+  while (walk) {
+    GstElement *element = GST_ELEMENT (walk->data);
+    gint i = 0;
+
+    g_print ("durations %8.8s: ", GST_ELEMENT_NAME (element));
+    while (seek_formats[i].name) {
+      gboolean res;
+      gint64 value;
+      GstFormat format;
+
+      format = seek_formats[i].format;
+      res = gst_element_query (element, GST_PAD_QUERY_TOTAL, &format, &value);
+      if (res) {
+        g_print ("%s %13lld | ", seek_formats[i].name, value);
+      }
+      else {
+        g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*");
+      }
+      i++;
     }
-    i++;
+    g_print (" %s\n", GST_ELEMENT_NAME (element));
+    walk = g_list_next (walk);
   }
-  g_print (" %s\n", GST_ELEMENT_NAME (element));
 }
 
 G_GNUC_UNUSED static void
-query_positions (GstElement *element)
+query_positions ()
 {
-  gint i = 0;
-
-  g_print ("positions %8.8s: ", GST_ELEMENT_NAME (element));
-  while (seek_formats[i].name) {
-    gboolean res;
-    gint64 value;
-    GstFormat format;
-
-    format = seek_formats[i].format;
-    res = gst_element_query (element, GST_PAD_QUERY_POSITION, &format, &value);
-    if (res) {
-      g_print ("%s %13lld | ", seek_formats[i].name, value);
-    }
-    else {
-      g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*");
+  GList *walk = seekable_elements;
+
+  while (walk) {
+    GstElement *element = GST_ELEMENT (walk->data);
+    gint i = 0;
+
+    g_print ("positions %8.8s: ", GST_ELEMENT_NAME (element));
+    while (seek_formats[i].name) {
+      gboolean res;
+      gint64 value;
+      GstFormat format;
+
+      format = seek_formats[i].format;
+      res = gst_element_query (element, GST_PAD_QUERY_POSITION, &format, &value);
+      if (res) {
+        g_print ("%s %13lld | ", seek_formats[i].name, value);
+      }
+      else {
+        g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*");
+      }
+      i++;
     }
-    i++;
+    g_print (" %s\n", GST_ELEMENT_NAME (element));
+    walk = g_list_next (walk);
   }
-  g_print (" %s\n", GST_ELEMENT_NAME (element));
 }
 
 static gboolean
 update_scale (gpointer data) 
 {
-  GList *walk = seekable_elements;
   GstClock *clock;
+  guint64 position;
+  GstFormat format = GST_FORMAT_TIME;
 
+  duration = 0;
   clock = gst_bin_get_clock (GST_BIN (pipeline));
 
+  if (seekable_elements) {
+    GstElement *element = GST_ELEMENT (seekable_elements->data);
+    gst_element_query (element, GST_PAD_QUERY_TOTAL, &format, &duration);
+  }
   position = gst_clock_get_time (clock);
-  g_print ("clock:                  %13llu  (%s)\n", position, gst_object_get_name (GST_OBJECT (clock)));
-
-  while (walk) {
-    GstElement *element = GST_ELEMENT (walk->data);
 
-    query_durations (element);
-    query_positions (element);
-
-    walk = g_list_next (walk);
+  if (stats) {
+    g_print ("clock:                  %13llu  (%s)\n", position, gst_object_get_name (GST_OBJECT (clock)));
+    query_durations ();
+    query_positions ();
+    query_rates ();
   }
-  query_rates ();
-
   if (duration > 0) {
     gtk_adjustment_set_value (adjustment, position * 100.0 / duration);
   }
@@ -216,9 +230,6 @@ iterate (gpointer data)
 {
   gboolean res = TRUE;
 
-  if (GST_FLAG_IS_SET (data, GST_BIN_SELF_SCHEDULABLE))
-    return TRUE;
-
   res = gst_bin_iterate (GST_BIN (data));
   if (!res) {
     gtk_timeout_remove (update_id);
@@ -259,7 +270,8 @@ stop_seek (GtkWidget *widget, GdkEventButton *event, gpointer user_data)
   }
 
   gst_element_set_state (pipeline, GST_STATE_PLAYING);
-  gtk_idle_add ((GtkFunction) iterate, pipeline);
+  if (!GST_FLAG_IS_SET (pipeline, GST_BIN_SELF_SCHEDULABLE))
+    gtk_idle_add ((GtkFunction) iterate, pipeline);
   update_id = gtk_timeout_add (UPDATE_INTERVAL, (GtkFunction) update_scale, pipeline);
 
   return FALSE;
@@ -270,7 +282,8 @@ play_cb (GtkButton * button, gpointer data)
 {
   if (gst_element_get_state (pipeline) != GST_STATE_PLAYING) {
     gst_element_set_state (pipeline, GST_STATE_PLAYING);
-    gtk_idle_add ((GtkFunction) iterate, pipeline);
+    if (!GST_FLAG_IS_SET (pipeline, GST_BIN_SELF_SCHEDULABLE))
+      gtk_idle_add ((GtkFunction) iterate, pipeline);
     update_id = gtk_timeout_add (UPDATE_INTERVAL, (GtkFunction) update_scale, pipeline);
   }
 }
@@ -303,6 +316,8 @@ main (int argc, char **argv)
   struct poptOption options[] = {
     {"threaded",  't',  POPT_ARG_NONE|POPT_ARGFLAG_STRIP,   &threaded,   0,
          "Run the pipeline in a toplevel thread", NULL},
+    {"stats",  's',  POPT_ARG_NONE|POPT_ARGFLAG_STRIP,   &stats,   0,
+         "Show element stats", NULL},
      POPT_TABLEEND
     };