pad: add gst_pad_get_stream_id() utility function
authorTim-Philipp Müller <tim@centricular.net>
Sat, 19 Jan 2013 12:51:56 +0000 (12:51 +0000)
committerTim-Philipp Müller <tim@centricular.net>
Sat, 19 Jan 2013 12:51:56 +0000 (12:51 +0000)
API: gst_pad_get_stream_id()

docs/gst/gstreamer-sections.txt
gst/gstutils.c
gst/gstutils.h
tests/check/gst/gstpad.c
win32/common/libgstreamer.def

index 02306c1..a2717b6 100644 (file)
@@ -1772,6 +1772,8 @@ gst_pad_create_stream_id
 gst_pad_create_stream_id_printf
 gst_pad_create_stream_id_printf_valist
 
+gst_pad_get_stream_id
+
 GstPadForwardFunction
 gst_pad_forward
 <SUBSECTION Core>
index 7c20a72..8968024 100644 (file)
@@ -3707,3 +3707,43 @@ gst_pad_create_stream_id (GstPad * pad, GstElement * parent,
 {
   return gst_pad_create_stream_id_printf (pad, parent, stream_id, NULL);
 }
+
+/**
+ * gst_pad_get_stream_id:
+ * @pad: A source #GstPad
+ *
+ * Returns the current stream-id for the @pad, or %NULL if none has been
+ * set yet, i.e. the pad has not received a stream-start event yet.
+ *
+ * This is a convenience wrapper around gst_pad_get_sticky_event() and
+ * gst_event_parse_stream_start().
+ *
+ * The returned stream-id string should be treated as an opaque string, its
+ * contents should not be interpreted.
+ *
+ * Returns: a newly-allocated copy of the stream-idfor @pad, or %NULL.
+ *     g_free() the returned string when no longer needed.
+ *
+ * Since: 1.2
+ */
+gchar *
+gst_pad_get_stream_id (GstPad * pad)
+{
+  const gchar *stream_id = NULL;
+  GstEvent *event;
+  gchar *ret = NULL;
+
+  g_return_val_if_fail (GST_IS_PAD (pad), NULL);
+
+  event = gst_pad_get_sticky_event (pad, GST_EVENT_STREAM_START, 0);
+  if (event != NULL) {
+    gst_event_parse_stream_start (event, &stream_id);
+    ret = g_strdup (stream_id);
+    gst_event_unref (event);
+    GST_LOG_OBJECT (pad, "pad has stream-id '%s'", ret);
+  } else {
+    GST_DEBUG_OBJECT (pad, "pad has not received a stream-start event yet");
+  }
+
+  return ret;
+}
index aa216dc..219e607 100644 (file)
@@ -892,6 +892,8 @@ gchar *                 gst_pad_create_stream_id               (GstPad * pad, Gs
 gchar *                 gst_pad_create_stream_id_printf        (GstPad * pad, GstElement * parent, const gchar *stream_id, ...);
 gchar *                 gst_pad_create_stream_id_printf_valist (GstPad * pad, GstElement * parent, const gchar *stream_id, va_list var_args);
 
+gchar *                 gst_pad_get_stream_id           (GstPad * pad);
+
 /* bin functions */
 void                    gst_bin_add_many                (GstBin *bin, GstElement *element_1, ...) G_GNUC_NULL_TERMINATED;
 void                    gst_bin_remove_many             (GstBin *bin, GstElement *element_1, ...) G_GNUC_NULL_TERMINATED;
index 61275f4..2a6d348 100644 (file)
@@ -1479,15 +1479,24 @@ GST_START_TEST (test_sticky_events)
   GstPad *srcpad, *sinkpad;
   GstCaps *caps;
   GstSegment seg;
+  gchar *id;
 
   /* make unlinked srcpad */
   srcpad = gst_pad_new ("src", GST_PAD_SRC);
   fail_unless (srcpad != NULL);
   gst_pad_set_active (srcpad, TRUE);
 
+  /* test stream-start */
+  fail_unless (gst_pad_get_stream_id (srcpad) == NULL);
+
   /* push an event, it should be sticky on the srcpad */
   gst_pad_push_event (srcpad, gst_event_new_stream_start ("test"));
 
+  /* let's see if it stuck */
+  id = gst_pad_get_stream_id (srcpad);
+  fail_unless_equals_string (id, "test");
+  g_free (id);
+
   /* make a caps event */
   caps = gst_caps_new_empty_simple ("foo/bar");
   gst_pad_push_event (srcpad, gst_event_new_caps (caps));
index c3a444f..5582376 100644 (file)
@@ -680,6 +680,7 @@ EXPORTS
        gst_pad_get_peer
        gst_pad_get_range
        gst_pad_get_sticky_event
+       gst_pad_get_stream_id
        gst_pad_get_type
        gst_pad_has_current_caps
        gst_pad_is_active