static GstStateChangeReturn nle_object_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: { GstObject *parent = gst_object_get_parent (GST_OBJECT (element)); /* Going to READY and if we are not in a composition, we need to make * sure that the object positioning state is properly commited */ if (parent) { gchar *name = gst_element_get_name (GST_ELEMENT (parent)); if (g_strcmp0 (name, "current-bin") && !NLE_OBJECT_IS_COMPOSITION (NLE_OBJECT (element))) { GST_INFO ("Adding nleobject to something that is not a composition," " commiting ourself"); nle_object_commit (NLE_OBJECT (element), FALSE); } g_free (name); gst_object_unref (parent); } } break; case GST_STATE_CHANGE_READY_TO_PAUSED: if (nle_object_prepare (NLE_OBJECT (element)) == GST_STATE_CHANGE_FAILURE) { ret = GST_STATE_CHANGE_FAILURE; goto beach; } break; default: break; } GST_DEBUG_OBJECT (element, "Calling parent change_state"); ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); GST_DEBUG_OBJECT (element, "Return from parent change_state was %d", ret); if (ret == GST_STATE_CHANGE_FAILURE) goto beach; switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: /* cleanup nleobject */ if (nle_object_cleanup (NLE_OBJECT (element)) == GST_STATE_CHANGE_FAILURE) ret = GST_STATE_CHANGE_FAILURE; break; default: break; } beach: return ret; }
void commit_and_wait (GstElement * comp, gboolean * ret) { gulong handler_id = g_signal_connect (comp, "commited", (GCallback) commited_cb, NULL); g_mutex_lock (&lock); *ret = nle_object_commit (NLE_OBJECT (comp), TRUE); g_cond_wait (&cond, &lock); g_mutex_unlock (&lock); g_signal_handler_disconnect (comp, handler_id); }
static GstElement * new_nle_src (const gchar * name, guint64 start, gint64 duration, gint priority) { GstElement *nlesource = NULL; nlesource = gst_element_factory_make_or_warn ("nlesource", name); fail_if (nlesource == NULL); g_object_set (G_OBJECT (nlesource), "start", start, "duration", duration, "inpoint", start, "priority", priority, NULL); nle_object_commit (NLE_OBJECT (nlesource), FALSE); return nlesource; }