G_GNUC_INTERNAL GESAutoTransition *
ges_timeline_get_auto_transition_at_end (GESTimeline * timeline, GESTrackElement * source);
+G_GNUC_INTERNAL gboolean ges_timeline_is_disposed (GESTimeline* timeline);
+
G_GNUC_INTERNAL gboolean
ges_timeline_edit (GESTimeline * timeline, GESTimelineElement * element,
GList * layers, gint64 new_layer_priority, GESEditMode mode, GESEdge edge,
GCond commited_cond;
GThread *valid_thread;
+ gboolean disposed;
GstStreamCollection *stream_collection;
};
}
}
+gboolean
+ges_timeline_is_disposed (GESTimeline * timeline)
+{
+ return timeline->priv->disposed;
+}
+
static void
ges_timeline_dispose (GObject * object)
{
GESTimelinePrivate *priv = tl->priv;
GList *tmp, *groups;
+ priv->disposed = TRUE;
while (tl->layers) {
GESLayer *layer = (GESLayer *) tl->layers->data;
ges_timeline_remove_layer (GES_TIMELINE (object), layer);
g_return_val_if_fail (GES_IS_TIMELINE (timeline), FALSE);
g_return_val_if_fail (GES_IS_LAYER (layer), FALSE);
- CHECK_THREAD (timeline);
+
+ if (!timeline->priv->disposed)
+ CHECK_THREAD (timeline);
GST_DEBUG ("timeline:%p, layer:%p", timeline, layer);
g_return_val_if_fail (GES_IS_TRACK (track), FALSE);
g_return_val_if_fail (GES_IS_TRACK_ELEMENT (object), FALSE);
- CHECK_THREAD (track);
+ if (!track->priv->timeline
+ || !ges_timeline_is_disposed (track->priv->timeline))
+ CHECK_THREAD (track);
return remove_element_internal (track, object, TRUE);
}