layer: call timeline_element_set_timeline in layer_set_timeline.
authorMathieu Duponchelle <mathieu.duponchelle@opencreed.com>
Tue, 7 Apr 2015 20:48:27 +0000 (22:48 +0200)
committerMathieu Duponchelle <mathieu.duponchelle@opencreed.com>
Wed, 8 Apr 2015 21:35:01 +0000 (23:35 +0200)
Summary:
Otherwise if there was still a reference to the layer when it
is removed from the timeline, it fails when the last reference
is released, because timeline_element_set_timeline calls
timeline_remove_element, which tries to remove the element from
an already disposed hashtable.

Reviewers: thiblahute

Differential Revision: http://phabricator.freedesktop.org/D82

ges/ges-layer.c

index 8b08eea..b48d3b4 100644 (file)
@@ -351,7 +351,8 @@ ges_layer_remove_clip (GESLayer * layer, GESClip * clip)
   /* inform the clip it's no longer in a layer */
   ges_clip_set_layer (clip, NULL);
   /* so neither in a timeline */
-  ges_timeline_element_set_timeline (GES_TIMELINE_ELEMENT (clip), NULL);
+  if (layer->timeline)
+    ges_timeline_element_set_timeline (GES_TIMELINE_ELEMENT (clip), NULL);
 
   /* Remove our reference to the clip */
   gst_object_unref (clip);
@@ -686,7 +687,13 @@ ges_layer_get_timeline (GESLayer * layer)
 void
 ges_layer_set_timeline (GESLayer * layer, GESTimeline * timeline)
 {
+  GList *tmp;
+
   GST_DEBUG ("layer:%p, timeline:%p", layer, timeline);
 
+  for (tmp = layer->priv->clips_start; tmp; tmp = tmp->next) {
+    ges_timeline_element_set_timeline (tmp->data, timeline);
+  }
+
   layer->timeline = timeline;
 }