summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2009-05-27 14:32:51 +0200
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2009-05-27 14:32:51 +0200
commit4e8f547f9828ff8ffaafe0c7990ef098b5f25342 (patch)
treebcc36b9afd1ea3e9c0e750d088a667870df9fc2a
parentdb6f445620c98df8568ec421ce422f9bb5206324 (diff)
API: Add gst_message_{new,parse}_tag_full() to get/set the source pad
Fixes bug #582588.
-rw-r--r--docs/gst/gstreamer-sections.txt2
-rw-r--r--gst/gstmessage.c81
-rw-r--r--gst/gstmessage.h2
-rw-r--r--gst/gstutils.c6
-rw-r--r--win32/common/libgstbase.def1
-rw-r--r--win32/common/libgstreamer.def2
6 files changed, 88 insertions, 6 deletions
diff --git a/docs/gst/gstreamer-sections.txt b/docs/gst/gstreamer-sections.txt
index e06b618700..08e0a95d51 100644
--- a/docs/gst/gstreamer-sections.txt
+++ b/docs/gst/gstreamer-sections.txt
@@ -1108,7 +1108,9 @@ gst_message_parse_warning
gst_message_new_info
gst_message_parse_info
gst_message_new_tag
+gst_message_new_tag_full
gst_message_parse_tag
+gst_message_parse_tag_full
gst_message_new_buffering
gst_message_parse_buffering
gst_message_set_buffering_stats
diff --git a/gst/gstmessage.c b/gst/gstmessage.c
index cad07e5e98..848af21dfd 100644
--- a/gst/gstmessage.c
+++ b/gst/gstmessage.c
@@ -473,6 +473,39 @@ gst_message_new_tag (GstObject * src, GstTagList * tag_list)
}
/**
+ * gst_message_new_tag_full:
+ * @src: The object originating the message.
+ * @pad: The originating pad for the tag.
+ * @tag_list: The tag list for the message.
+ *
+ * Create a new tag message. The message will take ownership of the tag list.
+ * The message is posted by elements that discovered a new taglist.
+ *
+ * Returns: The new tag message.
+ *
+ * Since: 0.10.24
+ *
+ * MT safe.
+ */
+GstMessage *
+gst_message_new_tag_full (GstObject * src, GstPad * pad, GstTagList * tag_list)
+{
+ GstMessage *message;
+ GstStructure *s;
+
+ g_return_val_if_fail (GST_IS_STRUCTURE (tag_list), NULL);
+ g_return_val_if_fail (pad == NULL || GST_IS_PAD (pad), NULL);
+
+ s = (GstStructure *) tag_list;
+ if (pad)
+ gst_structure_set (s, "source-pad", GST_TYPE_PAD, pad, NULL);
+
+ message = gst_message_new_custom (GST_MESSAGE_TAG, src, s);
+
+ return message;
+}
+
+/**
* gst_message_new_buffering:
* @src: The object originating the message.
* @percent: The buffering percent
@@ -970,11 +1003,57 @@ gst_message_get_structure (GstMessage * message)
void
gst_message_parse_tag (GstMessage * message, GstTagList ** tag_list)
{
+ GstStructure *ret;
+
+ g_return_if_fail (GST_IS_MESSAGE (message));
+ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_TAG);
+ g_return_if_fail (tag_list != NULL);
+
+ ret = gst_structure_copy (message->structure);
+ gst_structure_remove_field (ret, "source-pad");
+
+ *tag_list = (GstTagList *) ret;
+}
+
+/**
+ * gst_message_parse_tag_full:
+ * @message: A valid #GstMessage of type GST_MESSAGE_TAG.
+ * @pad: Location where the originating pad is stored, unref after usage
+ * @tag_list: Return location for the tag-list.
+ *
+ * Extracts the tag list from the GstMessage. The tag list returned in the
+ * output argument is a copy; the caller must free it when done.
+ *
+ * Since: 0.10.24
+ *
+ * MT safe.
+ */
+void
+gst_message_parse_tag_full (GstMessage * message, GstPad ** pad,
+ GstTagList ** tag_list)
+{
+ GstStructure *ret;
+
g_return_if_fail (GST_IS_MESSAGE (message));
g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_TAG);
g_return_if_fail (tag_list != NULL);
- *tag_list = (GstTagList *) gst_structure_copy (message->structure);
+ ret = gst_structure_copy (message->structure);
+
+ if (gst_structure_has_field (ret, "source-pad") && pad) {
+ const GValue *v;
+
+ v = gst_structure_get_value (ret, "source-pad");
+ if (v && G_VALUE_HOLDS (v, GST_TYPE_PAD))
+ *pad = g_value_dup_object (v);
+ else
+ *pad = NULL;
+ } else if (pad) {
+ *pad = NULL;
+ }
+ gst_structure_remove_field (ret, "source-pad");
+
+ *tag_list = (GstTagList *) ret;
}
/**
diff --git a/gst/gstmessage.h b/gst/gstmessage.h
index 6ed1790b26..5790315d55 100644
--- a/gst/gstmessage.h
+++ b/gst/gstmessage.h
@@ -360,7 +360,9 @@ void gst_message_parse_info (GstMessage *message, GError **gerror, gchar **de
/* TAG */
GstMessage * gst_message_new_tag (GstObject * src, GstTagList * tag_list);
+GstMessage * gst_message_new_tag_full (GstObject * src, GstPad *pad, GstTagList * tag_list);
void gst_message_parse_tag (GstMessage *message, GstTagList **tag_list);
+void gst_message_parse_tag_full (GstMessage *message, GstPad **pad, GstTagList **tag_list);
/* BUFFERING */
GstMessage * gst_message_new_buffering (GstObject * src, gint percent);
diff --git a/gst/gstutils.c b/gst/gstutils.c
index 602822ce56..0d7edc5bca 100644
--- a/gst/gstutils.c
+++ b/gst/gstutils.c
@@ -3081,11 +3081,9 @@ gst_element_found_tags_for_pad (GstElement * element,
g_return_if_fail (list != NULL);
gst_pad_push_event (pad, gst_event_new_tag (gst_tag_list_copy (list)));
- /* FIXME 0.11: Set the pad as source to make it possible to detect for
- * which pad the tags are actually found.
- */
+ /* FIXME 0.11: Set the pad as source. */
gst_element_post_message (element,
- gst_message_new_tag (GST_OBJECT (element), list));
+ gst_message_new_tag_full (GST_OBJECT (element), pad, list));
}
static void
diff --git a/win32/common/libgstbase.def b/win32/common/libgstbase.def
index c3e89b21c7..12ecb7dac3 100644
--- a/win32/common/libgstbase.def
+++ b/win32/common/libgstbase.def
@@ -5,7 +5,6 @@ EXPORTS
gst_adapter_copy
gst_adapter_flush
gst_adapter_get_type
- gst_adapter_masked_scan_uint32
gst_adapter_new
gst_adapter_peek
gst_adapter_prev_timestamp
diff --git a/win32/common/libgstreamer.def b/win32/common/libgstreamer.def
index 1db6f107a1..aa161fa23c 100644
--- a/win32/common/libgstreamer.def
+++ b/win32/common/libgstreamer.def
@@ -490,6 +490,7 @@ EXPORTS
gst_message_new_stream_status
gst_message_new_structure_change
gst_message_new_tag
+ gst_message_new_tag_full
gst_message_new_warning
gst_message_parse_async_start
gst_message_parse_buffering
@@ -507,6 +508,7 @@ EXPORTS
gst_message_parse_stream_status
gst_message_parse_structure_change
gst_message_parse_tag
+ gst_message_parse_tag_full
gst_message_parse_warning
gst_message_set_buffering_stats
gst_message_set_seqnum