From e72efeccd1bdc62a8a0a4a0ab9559708c880cb80 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Tue, 21 Apr 2009 13:42:01 +0200 Subject: [PATCH] GstMessage: Add STREAM_STATUS message methods Add methods to handle the stream_status message types. --- docs/gst/gstreamer-sections.txt | 12 ++++- gst/gstmessage.c | 109 ++++++++++++++++++++++++++++++++++++++++ gst/gstmessage.h | 34 +++++++++++++ win32/common/libgstreamer.def | 5 ++ 4 files changed, 159 insertions(+), 1 deletion(-) diff --git a/docs/gst/gstreamer-sections.txt b/docs/gst/gstreamer-sections.txt index b261c47..83bfa67 100644 --- a/docs/gst/gstreamer-sections.txt +++ b/docs/gst/gstreamer-sections.txt @@ -1043,7 +1043,6 @@ gst_iterator_result_get_type GstMessage GstMessage GstMessageType -GstStructureChangeType GST_MESSAGE_SRC GST_MESSAGE_TIMESTAMP GST_MESSAGE_TYPE @@ -1094,10 +1093,19 @@ gst_message_new_latency gst_message_new_async_start gst_message_parse_async_start gst_message_new_async_done + +GstStructureChangeType gst_message_new_structure_change gst_message_parse_structure_change gst_message_new_request_state gst_message_parse_request_state + +GstStreamStatusType +gst_message_new_stream_status +gst_message_parse_stream_status +gst_message_set_stream_status_object +gst_message_get_stream_status_object + GstMessageClass GST_MESSAGE @@ -1109,10 +1117,12 @@ GST_IS_MESSAGE_CLASS GST_MESSAGE_GET_CLASS GST_TYPE_MESSAGE_TYPE GST_TYPE_STRUCTURE_CHANGE_TYPE +GST_TYPE_STREAM_STATUS_TYPE gst_message_get_type gst_message_type_get_type gst_structure_change_type_get_type +gst_stream_status_type_get_type GST_MESSAGE_COND GST_MESSAGE_GET_LOCK GST_MESSAGE_LOCK diff --git a/gst/gstmessage.c b/gst/gstmessage.c index 3078ccf..e2226d6 100644 --- a/gst/gstmessage.c +++ b/gst/gstmessage.c @@ -1458,3 +1458,112 @@ gst_message_parse_request_state (GstMessage * message, GstState * state) *state = g_value_get_enum (gst_structure_id_get_value (message->structure, GST_QUARK (NEW_STATE))); } + +/** + * gst_message_new_stream_status: + * @src: The object originating the message. + * @type: The stream status type. + * @owner: The owner element of @src. + * + * Create a new stream status message. This message is posted when a streaming + * thread is created/destroyed or when the state changed. + * + * Returns: The new stream status message. + * + * MT safe. + * + * Since: 0.10.24. + */ +GstMessage * +gst_message_new_stream_status (GstObject * src, GstStreamStatusType type, + GstElement * owner) +{ + GstMessage *message; + GstStructure *structure; + + structure = gst_structure_empty_new ("GstMessageStreamStatus"); + gst_structure_id_set (structure, + GST_QUARK (TYPE), GST_TYPE_STREAM_STATUS_TYPE, (gint) type, + GST_QUARK (OWNER), GST_TYPE_ELEMENT, owner, NULL); + message = gst_message_new_custom (GST_MESSAGE_STREAM_STATUS, src, structure); + + return message; +} + +/** + * gst_message_parse_stream_status: + * @message: A valid #GstMessage of type GST_MESSAGE_STREAM_STATUS. + * @type: A pointer to hold the status type + * @owner: The owner element of the message source + * + * Extracts the stream status type and owner the GstMessage. + * + * Since: 0.10.24. + * + * MT safe. + */ +void +gst_message_parse_stream_status (GstMessage * message, + GstStreamStatusType * type, GstElement ** owner) +{ + const GValue *owner_gvalue; + + g_return_if_fail (GST_IS_MESSAGE (message)); + g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_STREAM_STATUS); + + owner_gvalue = + gst_structure_id_get_value (message->structure, GST_QUARK (OWNER)); + g_return_if_fail (owner_gvalue != NULL); + + if (type) + *type = g_value_get_enum (gst_structure_id_get_value (message->structure, + GST_QUARK (TYPE))); + if (owner) + *owner = (GstElement *) g_value_get_object (owner_gvalue); +} + +/** + * gst_message_set_stream_status_object: + * @message: A valid #GstMessage of type GST_MESSAGE_STREAM_STATUS. + * @object: the object controlling the streaming + * + * Configures the object handling the streaming thread. This is usually a + * GstTask object but other objects might be added in the future. + * + * Since: 0.10.24 + */ +void +gst_message_set_stream_status_object (GstMessage * message, + const GValue * object) +{ + g_return_if_fail (GST_IS_MESSAGE (message)); + g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_STREAM_STATUS); + + gst_structure_id_set_value (message->structure, GST_QUARK (OBJECT), object); +} + +/** + * gst_message_get_stream_status_object: + * @message: A valid #GstMessage of type GST_MESSAGE_STREAM_STATUS. + * + * Extracts the object managing the streaming thread from @message. + * + * Returns: a GValue containing the object that manages the streaming thread. + * This object is usually of type GstTask but other types can be added in the + * future. The object remains valid as long as @message is valid. + * + * Since: 0.10.24 + */ +const GValue * +gst_message_get_stream_status_object (GstMessage * message) +{ + const GValue *result; + + g_return_val_if_fail (GST_IS_MESSAGE (message), NULL); + g_return_val_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_STREAM_STATUS, + NULL); + + result = gst_structure_id_get_value (message->structure, GST_QUARK (OBJECT)); + + return result; +} diff --git a/gst/gstmessage.h b/gst/gstmessage.h index 6b9aea3..6ed1790 100644 --- a/gst/gstmessage.h +++ b/gst/gstmessage.h @@ -198,6 +198,32 @@ typedef enum { } GstStructureChangeType; /** + * GstStreamStatusType: + * @GST_STREAM_STATUS_TYPE_CREATE: A new thread need to be created. + * @GST_STREAM_STATUS_TYPE_ENTER: a thread entered its loop function + * @GST_STREAM_STATUS_TYPE_LEAVE: a thread left its loop function + * @GST_STREAM_STATUS_TYPE_DESTROY: a thread is destroyed + * @GST_STREAM_STATUS_TYPE_START: a thread is started + * @GST_STREAM_STATUS_TYPE_PAUSE: a thread is paused + * @GST_STREAM_STATUS_TYPE_STOP: a thread is stopped + * + * The type of a #GstMessageStreamStatus. The stream status messages inform the + * application of new streaming threads and their status. + * + * Since: 0.10.24 + */ +typedef enum { + GST_STREAM_STATUS_TYPE_CREATE = 0, + GST_STREAM_STATUS_TYPE_ENTER = 1, + GST_STREAM_STATUS_TYPE_LEAVE = 2, + GST_STREAM_STATUS_TYPE_DESTROY = 3, + + GST_STREAM_STATUS_TYPE_START = 8, + GST_STREAM_STATUS_TYPE_PAUSE = 9, + GST_STREAM_STATUS_TYPE_STOP = 10 +} GstStreamStatusType; + +/** * GstMessage: * @mini_object: the parent structure * @type: the #GstMessageType of the message @@ -405,6 +431,14 @@ GstMessage * gst_message_new_structure_change (GstObject * src, GstStructureCh void gst_message_parse_structure_change (GstMessage *message, GstStructureChangeType *type, GstElement **owner, gboolean *busy); +/* STREAM STATUS */ +GstMessage * gst_message_new_stream_status (GstObject * src, GstStreamStatusType type, + GstElement *owner); +void gst_message_parse_stream_status (GstMessage *message, GstStreamStatusType *type, + GstElement **owner); +void gst_message_set_stream_status_object (GstMessage *message, const GValue *object); +const GValue * gst_message_get_stream_status_object (GstMessage *message); + /* REQUEST_STATE */ GstMessage * gst_message_new_request_state (GstObject * src, GstState state); void gst_message_parse_request_state (GstMessage * message, GstState *state); diff --git a/win32/common/libgstreamer.def b/win32/common/libgstreamer.def index 2de554e..19eab26 100644 --- a/win32/common/libgstreamer.def +++ b/win32/common/libgstreamer.def @@ -446,6 +446,7 @@ EXPORTS gst_marshal_VOID__POINTER_OBJECT gst_marshal_VOID__UINT_BOXED gst_message_get_seqnum + gst_message_get_stream_status_object gst_message_get_structure gst_message_get_type gst_message_new_application @@ -467,6 +468,7 @@ EXPORTS gst_message_new_segment_start gst_message_new_state_changed gst_message_new_state_dirty + gst_message_new_stream_status gst_message_new_structure_change gst_message_new_tag gst_message_new_warning @@ -483,11 +485,13 @@ EXPORTS gst_message_parse_segment_done gst_message_parse_segment_start gst_message_parse_state_changed + gst_message_parse_stream_status gst_message_parse_structure_change gst_message_parse_tag gst_message_parse_warning gst_message_set_buffering_stats gst_message_set_seqnum + gst_message_set_stream_status_object gst_message_type_get_name gst_message_type_get_type gst_message_type_to_quark @@ -815,6 +819,7 @@ EXPORTS gst_static_pad_template_get_type gst_stream_error_get_type gst_stream_error_quark + gst_stream_status_type_get_type gst_structure_change_type_get_type gst_structure_copy gst_structure_empty_new -- 2.7.4