mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-05 06:58:56 +00:00
Add sequence numbers to events and messages. See #559250.
Original commit message from CVS: 2008-11-04 Andy Wingo <wingo@pobox.com> Add sequence numbers to events and messages. See #559250. * gst/gstutils.c (gst_util_seqnum_next, gst_util_seqnum_compare): New functions. * gst/gstevent.h: * gst/gstevent.c (_gst_event_copy, gst_event_new): Initialize new events with a new sequence number, and copy it when copying. (gst_event_get_seqnum, gst_event_set_seqnum): Accessors for an event's sequence number. * gst/gstmessage.h: * gst/gstmessage.c (_gst_message_copy, gst_message_new_custom): (gst_event_get_seqnum, gst_event_set_seqnum): As with events, so with messages. * docs/gst/gstreamer-sections.txt: Add new functions to the docs.
This commit is contained in:
parent
c6cc3bbca8
commit
5f5fbbdd7d
9 changed files with 212 additions and 7 deletions
15
ChangeLog
15
ChangeLog
|
@ -1,3 +1,18 @@
|
||||||
|
2008-11-04 Andy Wingo <wingo@pobox.com>
|
||||||
|
|
||||||
|
* gst/gstevent.h:
|
||||||
|
* gst/gstevent.c (_gst_event_copy, gst_event_new): Initialize new
|
||||||
|
events with a new sequence number, and copy it when copying.
|
||||||
|
(gst_event_get_seqnum, gst_event_set_seqnum): Accessors for an
|
||||||
|
event's sequence number.
|
||||||
|
|
||||||
|
* gst/gstmessage.h:
|
||||||
|
* gst/gstmessage.c (_gst_message_copy, gst_message_new_custom):
|
||||||
|
(gst_event_get_seqnum, gst_event_set_seqnum): As with events, so
|
||||||
|
with messages.
|
||||||
|
|
||||||
|
* docs/gst/gstreamer-sections.txt: Add new functions to the docs.
|
||||||
|
|
||||||
2008-11-04 Wim Taymans <wim.taymans@collabora.co.uk>
|
2008-11-04 Wim Taymans <wim.taymans@collabora.co.uk>
|
||||||
|
|
||||||
* docs/manual/advanced-position.xml:
|
* docs/manual/advanced-position.xml:
|
||||||
|
|
|
@ -665,6 +665,9 @@ gst_event_new_custom
|
||||||
gst_event_get_structure
|
gst_event_get_structure
|
||||||
gst_event_has_name
|
gst_event_has_name
|
||||||
|
|
||||||
|
gst_event_get_seqnum
|
||||||
|
gst_event_set_seqnum
|
||||||
|
|
||||||
gst_event_new_flush_start
|
gst_event_new_flush_start
|
||||||
gst_event_new_flush_stop
|
gst_event_new_flush_stop
|
||||||
|
|
||||||
|
@ -1044,6 +1047,8 @@ gst_message_unref
|
||||||
gst_message_copy
|
gst_message_copy
|
||||||
gst_message_get_structure
|
gst_message_get_structure
|
||||||
gst_message_make_writable
|
gst_message_make_writable
|
||||||
|
gst_message_get_seqnum
|
||||||
|
gst_message_set_seqnum
|
||||||
|
|
||||||
gst_message_new_eos
|
gst_message_new_eos
|
||||||
gst_message_new_error
|
gst_message_new_error
|
||||||
|
@ -2335,6 +2340,8 @@ gst_type_register_static_full
|
||||||
gst_util_dump_mem
|
gst_util_dump_mem
|
||||||
gst_util_uint64_scale
|
gst_util_uint64_scale
|
||||||
gst_util_uint64_scale_int
|
gst_util_uint64_scale_int
|
||||||
|
gst_util_seqnum_next
|
||||||
|
gst_util_seqnum_compare
|
||||||
gst_util_set_object_arg
|
gst_util_set_object_arg
|
||||||
gst_util_set_value_from_string
|
gst_util_set_value_from_string
|
||||||
gst_util_get_timestamp
|
gst_util_get_timestamp
|
||||||
|
|
|
@ -85,6 +85,8 @@
|
||||||
#include "gstutils.h"
|
#include "gstutils.h"
|
||||||
#include "gstquark.h"
|
#include "gstquark.h"
|
||||||
|
|
||||||
|
#define GST_EVENT_SEQNUM(e) ((GstEvent*)e)->abidata.seqnum
|
||||||
|
|
||||||
static void gst_event_init (GTypeInstance * instance, gpointer g_class);
|
static void gst_event_init (GTypeInstance * instance, gpointer g_class);
|
||||||
static void gst_event_class_init (gpointer g_class, gpointer class_data);
|
static void gst_event_class_init (gpointer g_class, gpointer class_data);
|
||||||
static void gst_event_finalize (GstEvent * event);
|
static void gst_event_finalize (GstEvent * event);
|
||||||
|
@ -270,6 +272,7 @@ _gst_event_copy (GstEvent * event)
|
||||||
|
|
||||||
GST_EVENT_TYPE (copy) = GST_EVENT_TYPE (event);
|
GST_EVENT_TYPE (copy) = GST_EVENT_TYPE (event);
|
||||||
GST_EVENT_TIMESTAMP (copy) = GST_EVENT_TIMESTAMP (event);
|
GST_EVENT_TIMESTAMP (copy) = GST_EVENT_TIMESTAMP (event);
|
||||||
|
GST_EVENT_SEQNUM (copy) = GST_EVENT_SEQNUM (event);
|
||||||
|
|
||||||
if (GST_EVENT_SRC (event)) {
|
if (GST_EVENT_SRC (event)) {
|
||||||
GST_EVENT_SRC (copy) = gst_object_ref (GST_EVENT_SRC (event));
|
GST_EVENT_SRC (copy) = gst_object_ref (GST_EVENT_SRC (event));
|
||||||
|
@ -295,6 +298,7 @@ gst_event_new (GstEventType type)
|
||||||
event->type = type;
|
event->type = type;
|
||||||
event->src = NULL;
|
event->src = NULL;
|
||||||
event->structure = NULL;
|
event->structure = NULL;
|
||||||
|
GST_EVENT_SEQNUM (event) = gst_util_seqnum_next ();
|
||||||
|
|
||||||
return event;
|
return event;
|
||||||
}
|
}
|
||||||
|
@ -378,6 +382,60 @@ gst_event_has_name (GstEvent * event, const gchar * name)
|
||||||
return gst_structure_has_name (event->structure, name);
|
return gst_structure_has_name (event->structure, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_event_get_seqnum:
|
||||||
|
* @event: A #GstEvent.
|
||||||
|
*
|
||||||
|
* Retrieve the sequence number of a event.
|
||||||
|
*
|
||||||
|
* Events have ever-incrementing sequence numbers, which may also be set
|
||||||
|
* explicitly via gst_event_set_seqnum(). Sequence numbers are typically used to
|
||||||
|
* indicate that a event corresponds to some other set of events or messages,
|
||||||
|
* for example an EOS event corresponding to a SEEK event. It is considered good
|
||||||
|
* practice to make this correspondence when possible, though it is not
|
||||||
|
* required.
|
||||||
|
*
|
||||||
|
* Note that events and messages share the same sequence number incrementor;
|
||||||
|
* two events or messages will never not have the same sequence number unless
|
||||||
|
* that correspondence was made explicitly.
|
||||||
|
*
|
||||||
|
* Returns: The event's sequence number.
|
||||||
|
*
|
||||||
|
* MT safe.
|
||||||
|
*
|
||||||
|
* Since: 0.10.22
|
||||||
|
*/
|
||||||
|
guint32
|
||||||
|
gst_event_get_seqnum (GstEvent * event)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (GST_IS_EVENT (event), -1);
|
||||||
|
|
||||||
|
return GST_EVENT_SEQNUM (event);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_event_set_seqnum:
|
||||||
|
* @event: A #GstEvent.
|
||||||
|
* @seqnum: A sequence number.
|
||||||
|
*
|
||||||
|
* Set the sequence number of a event.
|
||||||
|
*
|
||||||
|
* This function might be called by the creator of a event to indicate that the
|
||||||
|
* event relates to other events or messages. See gst_event_get_seqnum() for
|
||||||
|
* more information.
|
||||||
|
*
|
||||||
|
* MT safe.
|
||||||
|
*
|
||||||
|
* Since: 0.10.22
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
gst_event_set_seqnum (GstEvent * event, guint32 seqnum)
|
||||||
|
{
|
||||||
|
g_return_if_fail (GST_IS_EVENT (event));
|
||||||
|
|
||||||
|
GST_EVENT_SEQNUM (event) = seqnum;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_event_new_flush_start:
|
* gst_event_new_flush_start:
|
||||||
*
|
*
|
||||||
|
|
|
@ -305,7 +305,10 @@ struct _GstEvent {
|
||||||
GstStructure *structure;
|
GstStructure *structure;
|
||||||
|
|
||||||
/*< private >*/
|
/*< private >*/
|
||||||
gpointer _gst_reserved;
|
union {
|
||||||
|
guint32 seqnum;
|
||||||
|
gpointer _gst_reserved;
|
||||||
|
} abidata;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GstEventClass {
|
struct _GstEventClass {
|
||||||
|
@ -369,6 +372,10 @@ const GstStructure *
|
||||||
|
|
||||||
gboolean gst_event_has_name (GstEvent *event, const gchar *name);
|
gboolean gst_event_has_name (GstEvent *event, const gchar *name);
|
||||||
|
|
||||||
|
/* identifiers for events and messages */
|
||||||
|
guint32 gst_event_get_seqnum (GstEvent *event);
|
||||||
|
void gst_event_set_seqnum (GstEvent *event, guint32 seqnum);
|
||||||
|
|
||||||
/* flush events */
|
/* flush events */
|
||||||
GstEvent * gst_event_new_flush_start (void);
|
GstEvent * gst_event_new_flush_start (void);
|
||||||
GstEvent * gst_event_new_flush_stop (void);
|
GstEvent * gst_event_new_flush_stop (void);
|
||||||
|
|
|
@ -60,6 +60,8 @@
|
||||||
#include "gstquark.h"
|
#include "gstquark.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define GST_MESSAGE_SEQNUM(e) ((GstMessage*)e)->abidata.ABI.seqnum
|
||||||
|
|
||||||
static void gst_message_init (GTypeInstance * instance, gpointer g_class);
|
static void gst_message_init (GTypeInstance * instance, gpointer g_class);
|
||||||
static void gst_message_class_init (gpointer g_class, gpointer class_data);
|
static void gst_message_class_init (gpointer g_class, gpointer class_data);
|
||||||
static void gst_message_finalize (GstMessage * message);
|
static void gst_message_finalize (GstMessage * message);
|
||||||
|
@ -247,6 +249,7 @@ _gst_message_copy (GstMessage * message)
|
||||||
GST_MESSAGE_COND (copy) = GST_MESSAGE_COND (message);
|
GST_MESSAGE_COND (copy) = GST_MESSAGE_COND (message);
|
||||||
GST_MESSAGE_TYPE (copy) = GST_MESSAGE_TYPE (message);
|
GST_MESSAGE_TYPE (copy) = GST_MESSAGE_TYPE (message);
|
||||||
GST_MESSAGE_TIMESTAMP (copy) = GST_MESSAGE_TIMESTAMP (message);
|
GST_MESSAGE_TIMESTAMP (copy) = GST_MESSAGE_TIMESTAMP (message);
|
||||||
|
GST_MESSAGE_SEQNUM (copy) = GST_MESSAGE_SEQNUM (message);
|
||||||
|
|
||||||
if (GST_MESSAGE_SRC (message)) {
|
if (GST_MESSAGE_SRC (message)) {
|
||||||
GST_MESSAGE_SRC (copy) = gst_object_ref (GST_MESSAGE_SRC (message));
|
GST_MESSAGE_SRC (copy) = gst_object_ref (GST_MESSAGE_SRC (message));
|
||||||
|
@ -300,9 +303,65 @@ gst_message_new_custom (GstMessageType type, GstObject * src,
|
||||||
}
|
}
|
||||||
message->structure = structure;
|
message->structure = structure;
|
||||||
|
|
||||||
|
GST_MESSAGE_SEQNUM (message) = gst_util_seqnum_next ();
|
||||||
|
|
||||||
return message;
|
return message;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_message_get_seqnum:
|
||||||
|
* @message: A #GstMessage.
|
||||||
|
*
|
||||||
|
* Retrieve the sequence number of a message.
|
||||||
|
*
|
||||||
|
* Messages have ever-incrementing sequence numbers, which may also be set
|
||||||
|
* explicitly via gst_message_set_seqnum(). Sequence numbers are typically used
|
||||||
|
* to indicate that a message corresponds to some other set of messages or
|
||||||
|
* events, for example a SEGMENT_DONE message corresponding to a SEEK event. It
|
||||||
|
* is considered good practice to make this correspondence when possible, though
|
||||||
|
* it is not required.
|
||||||
|
*
|
||||||
|
* Note that events and messages share the same sequence number incrementor;
|
||||||
|
* two events or messages will never not have the same sequence number unless
|
||||||
|
* that correspondence was made explicitly.
|
||||||
|
*
|
||||||
|
* Returns: The message's sequence number.
|
||||||
|
*
|
||||||
|
* Since: 0.10.22
|
||||||
|
*
|
||||||
|
* MT safe.
|
||||||
|
*/
|
||||||
|
guint32
|
||||||
|
gst_message_get_seqnum (GstMessage * message)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (GST_IS_MESSAGE (message), -1);
|
||||||
|
|
||||||
|
return GST_MESSAGE_SEQNUM (message);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_message_set_seqnum:
|
||||||
|
* @message: A #GstMessage.
|
||||||
|
* @seqnum: A sequence number.
|
||||||
|
*
|
||||||
|
* Set the sequence number of a message.
|
||||||
|
*
|
||||||
|
* This function might be called by the creator of a message to indicate that
|
||||||
|
* the message relates to other messages or events. See gst_message_get_seqnum()
|
||||||
|
* for more information.
|
||||||
|
*
|
||||||
|
* Since: 0.10.22
|
||||||
|
*
|
||||||
|
* MT safe.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
gst_message_set_seqnum (GstMessage * message, guint32 seqnum)
|
||||||
|
{
|
||||||
|
g_return_if_fail (GST_IS_MESSAGE (message));
|
||||||
|
|
||||||
|
GST_MESSAGE_SEQNUM (message) = seqnum;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_message_new_eos:
|
* gst_message_new_eos:
|
||||||
* @src: The object originating the message.
|
* @src: The object originating the message.
|
||||||
|
|
|
@ -219,7 +219,13 @@ struct _GstMessage
|
||||||
GstStructure *structure;
|
GstStructure *structure;
|
||||||
|
|
||||||
/*< private > */
|
/*< private > */
|
||||||
gpointer _gst_reserved[GST_PADDING];
|
union {
|
||||||
|
struct {
|
||||||
|
guint32 seqnum;
|
||||||
|
} ABI;
|
||||||
|
/* + 0 to mark ABI change for future greppage */
|
||||||
|
gpointer _gst_reserved[GST_PADDING + 0];
|
||||||
|
} abidata;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GstMessageClass {
|
struct _GstMessageClass {
|
||||||
|
@ -284,6 +290,10 @@ gst_message_ref (GstMessage * msg)
|
||||||
*/
|
*/
|
||||||
#define gst_message_make_writable(msg) GST_MESSAGE (gst_mini_object_make_writable (GST_MINI_OBJECT (msg)))
|
#define gst_message_make_writable(msg) GST_MESSAGE (gst_mini_object_make_writable (GST_MINI_OBJECT (msg)))
|
||||||
|
|
||||||
|
/* identifiers for events and messages */
|
||||||
|
guint32 gst_message_get_seqnum (GstMessage *message);
|
||||||
|
void gst_message_set_seqnum (GstMessage *message, guint32 seqnum);
|
||||||
|
|
||||||
/* EOS */
|
/* EOS */
|
||||||
GstMessage * gst_message_new_eos (GstObject * src);
|
GstMessage * gst_message_new_eos (GstObject * src);
|
||||||
|
|
||||||
|
|
|
@ -575,6 +575,52 @@ overflow:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_util_seqnum_next:
|
||||||
|
*
|
||||||
|
* Return a constantly incrementing sequence number.
|
||||||
|
*
|
||||||
|
* This function is used internally to GStreamer to be able to determine which
|
||||||
|
* events and messages are "the same". For example, elements may set the seqnum
|
||||||
|
* on a segment-done message to be the same as that of the last seek event, to
|
||||||
|
* indicate that event and the message correspond to the same segment.
|
||||||
|
*
|
||||||
|
* Returns: A constantly incrementing 32-bit unsigned integer, which might
|
||||||
|
* overflow back to 0 at some point. Use gst_util_seqnum_compare() to make sure
|
||||||
|
* you handle wraparound correctly.
|
||||||
|
*
|
||||||
|
* Since: 0.10.22
|
||||||
|
*/
|
||||||
|
guint32
|
||||||
|
gst_util_seqnum_next (void)
|
||||||
|
{
|
||||||
|
static gint counter = -1;
|
||||||
|
gint ret;
|
||||||
|
|
||||||
|
ret = g_atomic_int_exchange_and_add (&counter, 1);
|
||||||
|
return (guint32) (ret + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_util_seqnum_compare:
|
||||||
|
* @s1: A sequence number.
|
||||||
|
* @s2: Another sequence number.
|
||||||
|
*
|
||||||
|
* Compare two sequence numbers, handling wraparound.
|
||||||
|
*
|
||||||
|
* The current implementation just returns (gint32)(@s1 - @s2).
|
||||||
|
*
|
||||||
|
* Returns: A negative number if @s1 is before @s2, 0 if they are equal, or a
|
||||||
|
* positive number if @s1 is after @s2.
|
||||||
|
*
|
||||||
|
* Since: 0.10.22
|
||||||
|
*/
|
||||||
|
gint32
|
||||||
|
gst_util_seqnum_compare (guint32 s1, guint32 s2)
|
||||||
|
{
|
||||||
|
return (gint32) (s1 - s2);
|
||||||
|
}
|
||||||
|
|
||||||
/* -----------------------------------------------------
|
/* -----------------------------------------------------
|
||||||
*
|
*
|
||||||
* The following code will be moved out of the main
|
* The following code will be moved out of the main
|
||||||
|
|
|
@ -67,6 +67,9 @@ guint64 gst_util_uint64_scale (guint64 val, guint64 num, guint64 denom);
|
||||||
|
|
||||||
guint64 gst_util_uint64_scale_int (guint64 val, gint num, gint denom);
|
guint64 gst_util_uint64_scale_int (guint64 val, gint num, gint denom);
|
||||||
|
|
||||||
|
guint32 gst_util_seqnum_next (void);
|
||||||
|
gint32 gst_util_seqnum_compare (guint32 s1, guint32 s2);
|
||||||
|
|
||||||
void gst_print_pad_caps (GString *buf, gint indent, GstPad *pad);
|
void gst_print_pad_caps (GString *buf, gint indent, GstPad *pad);
|
||||||
void gst_print_element_args (GString *buf, gint indent, GstElement *element);
|
void gst_print_element_args (GString *buf, gint indent, GstElement *element);
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
/* #undef GST_GCOV_ENABLED */
|
/* #undef GST_GCOV_ENABLED */
|
||||||
|
|
||||||
/* Default errorlevel to use */
|
/* Default errorlevel to use */
|
||||||
#define GST_LEVEL_DEFAULT GST_LEVEL_NONE
|
#define GST_LEVEL_DEFAULT GST_LEVEL_ERROR
|
||||||
|
|
||||||
/* GStreamer license */
|
/* GStreamer license */
|
||||||
#define GST_LICENSE "LGPL"
|
#define GST_LICENSE "LGPL"
|
||||||
|
@ -33,7 +33,7 @@
|
||||||
#define GST_MAJORMINOR "0.10"
|
#define GST_MAJORMINOR "0.10"
|
||||||
|
|
||||||
/* package name in plugins */
|
/* package name in plugins */
|
||||||
#define GST_PACKAGE_NAME "GStreamer source release"
|
#define GST_PACKAGE_NAME "GStreamer CVS/prerelease"
|
||||||
|
|
||||||
/* package origin */
|
/* package origin */
|
||||||
#define GST_PACKAGE_ORIGIN "Unknown package origin"
|
#define GST_PACKAGE_ORIGIN "Unknown package origin"
|
||||||
|
@ -197,13 +197,13 @@
|
||||||
#define PACKAGE_NAME "GStreamer"
|
#define PACKAGE_NAME "GStreamer"
|
||||||
|
|
||||||
/* Define to the full name and version of this package. */
|
/* Define to the full name and version of this package. */
|
||||||
#define PACKAGE_STRING "GStreamer 0.10.21"
|
#define PACKAGE_STRING "GStreamer 0.10.21.1"
|
||||||
|
|
||||||
/* Define to the one symbol short name of this package. */
|
/* Define to the one symbol short name of this package. */
|
||||||
#define PACKAGE_TARNAME "gstreamer"
|
#define PACKAGE_TARNAME "gstreamer"
|
||||||
|
|
||||||
/* Define to the version of this package. */
|
/* Define to the version of this package. */
|
||||||
#define PACKAGE_VERSION "0.10.21"
|
#define PACKAGE_VERSION "0.10.21.1"
|
||||||
|
|
||||||
/* Define the plugin directory */
|
/* Define the plugin directory */
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
|
@ -219,7 +219,7 @@
|
||||||
#undef USE_POISONING
|
#undef USE_POISONING
|
||||||
|
|
||||||
/* Version number of package */
|
/* Version number of package */
|
||||||
#define VERSION "0.10.21"
|
#define VERSION "0.10.21.1"
|
||||||
|
|
||||||
/* Define to 1 if your processor stores words with the most significant byte
|
/* Define to 1 if your processor stores words with the most significant byte
|
||||||
first (like Motorola and SPARC, unlike Intel and VAX). */
|
first (like Motorola and SPARC, unlike Intel and VAX). */
|
||||||
|
|
Loading…
Reference in a new issue