gstevent: Add function for checking event name by GQuark

Avoids doing string<=>quark conversions in the sticky event handling path.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/455>
This commit is contained in:
Edward Hervey 2020-05-01 17:30:20 +02:00
parent 1d0bda8005
commit 7a207da733
3 changed files with 29 additions and 3 deletions

View file

@ -407,6 +407,29 @@ gst_event_has_name (GstEvent * event, const gchar * name)
return gst_structure_has_name (GST_EVENT_STRUCTURE (event), name);
}
/**
* gst_event_has_name_id:
* @event: The #GstEvent.
* @name: name to check as a GQuark
*
* Checks if @event has the given @name. This function is usually used to
* check the name of a custom event.
*
* Returns: %TRUE if @name matches the name of the event structure.
*
* Since: 1.18
*/
gboolean
gst_event_has_name_id (GstEvent * event, GQuark name)
{
g_return_val_if_fail (GST_IS_EVENT (event), FALSE);
if (GST_EVENT_STRUCTURE (event) == NULL)
return FALSE;
return (GST_EVENT_STRUCTURE (event)->name == name);
}
/**
* gst_event_get_seqnum:
* @event: A #GstEvent.

View file

@ -517,6 +517,9 @@ GstStructure * gst_event_writable_structure (GstEvent *event);
GST_API
gboolean gst_event_has_name (GstEvent *event, const gchar *name);
GST_API
gboolean gst_event_has_name_id (GstEvent *event, GQuark name);
/* identifiers for events and messages */
GST_API

View file

@ -5220,7 +5220,7 @@ store_sticky_event (GstPad * pad, GstEvent * event)
GstEventType type;
GArray *events;
gboolean res = FALSE;
const gchar *name = NULL;
GQuark name_id = 0;
gboolean insert = TRUE;
type = GST_EVENT_TYPE (event);
@ -5248,7 +5248,7 @@ store_sticky_event (GstPad * pad, GstEvent * event)
goto eos;
if (type & GST_EVENT_TYPE_STICKY_MULTI)
name = gst_structure_get_name (gst_event_get_structure (event));
name_id = gst_structure_get_name_id (gst_event_get_structure (event));
events = pad->priv->events;
len = events->len;
@ -5261,7 +5261,7 @@ store_sticky_event (GstPad * pad, GstEvent * event)
if (type == GST_EVENT_TYPE (ev->event)) {
/* matching types, check matching name if needed */
if (name && !gst_event_has_name (ev->event, name))
if (name_id && !gst_event_has_name_id (ev->event, name_id))
continue;
/* overwrite */