GstPad *ghostedpad; /* Pad (to be) ghosted */
GstPad *staticpad; /* The only pad. We keep an extra ref */
+ GMutex seek_lock;
GstEvent *seek_event;
gulong probeid;
};
static gboolean
nle_source_control_element_func (NleSource * source, GstElement * element);
+static GstStateChangeReturn nle_source_change_state (GstElement * element,
+ GstStateChange transition);
static void
nle_source_class_init (NleSourceClass * klass)
"Wim Taymans <wim.taymans@gmail.com>, Edward Hervey <bilboed@bilboed.com>");
gstelement_class->send_event = GST_DEBUG_FUNCPTR (nle_source_send_event);
+ gstelement_class->change_state = GST_DEBUG_FUNCPTR (nle_source_change_state);
parent_class = g_type_class_ref (NLE_TYPE_OBJECT);
GST_OBJECT_FLAG_SET (source, NLE_OBJECT_SOURCE);
source->element = NULL;
source->priv = nle_source_get_instance_private (source);
+ g_mutex_init (&source->priv->seek_lock);
GST_DEBUG_OBJECT (source, "Setting GstBin async-handling to TRUE");
g_object_set (G_OBJECT (source), "async-handling", TRUE, NULL);
priv->staticpad = NULL;
}
+ g_mutex_lock (&priv->seek_lock);
if (priv->seek_event) {
gst_event_unref (priv->seek_event);
priv->seek_event = NULL;
}
+ g_mutex_unlock (&priv->seek_lock);
G_OBJECT_CLASS (parent_class)->dispose (object);
}
switch (GST_EVENT_TYPE (event)) {
case GST_EVENT_SEEK:
+ g_mutex_lock (&source->priv->seek_lock);
source->priv->seek_event = event;
+ g_mutex_unlock (&source->priv->seek_lock);
break;
default:
res = GST_ELEMENT_CLASS (parent_class)->send_event (element, event);
{
NleSourcePrivate *priv = source->priv;
+ g_mutex_lock (&priv->seek_lock);
if (priv->seek_event) {
GstEvent *seek_event = priv->seek_event;
priv->seek_event = NULL;
GST_ELEMENT_ERROR (source, RESOURCE, SEEK,
(NULL), ("Sending initial seek to upstream element failed"));
}
+ g_mutex_unlock (&priv->seek_lock);
GST_OBJECT_LOCK (source);
if (priv->probeid) {
return TRUE;
}
+
+static GstStateChangeReturn
+nle_source_change_state (GstElement * element, GstStateChange transition)
+{
+ NleSourcePrivate *priv = NLE_SOURCE (element)->priv;
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ g_mutex_lock (&priv->seek_lock);
+ gst_clear_event (&priv->seek_event);
+ g_mutex_unlock (&priv->seek_lock);
+ break;
+ default:
+ break;
+ }
+
+ return GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+}