clip: Make sure to remove and re add effects when adding clips to layer
authorThibault Saunier <tsaunier@igalia.com>
Thu, 21 Feb 2019 20:24:51 +0000 (17:24 -0300)
committerThibault Saunier <tsaunier@gnome.org>
Fri, 15 Mar 2019 23:51:55 +0000 (23:51 +0000)
And make re add them in the same order.

And enhance tests to check that

ges/ges-clip.c
tests/check/python/test_clip.py

index a7110a1..ad02cdc 100644 (file)
@@ -939,6 +939,7 @@ ges_clip_create_track_elements (GESClip * clip, GESTrackType type)
   GList *result = NULL, *tmp, *children;
   GESClipClass *klass;
   guint max_prio, min_prio;
+  gboolean readding_effects_only = TRUE;
 
   g_return_val_if_fail (GES_IS_CLIP (clip), NULL);
 
@@ -955,18 +956,20 @@ ges_clip_create_track_elements (GESClip * clip, GESTrackType type)
   for (tmp = children; tmp; tmp = tmp->next) {
     GESTrackElement *child = GES_TRACK_ELEMENT (tmp->data);
 
-    if (!GES_IS_BASE_EFFECT (child) && !ges_track_element_get_track (child) &&
-        ges_track_element_get_track_type (child) & type) {
+    if (!ges_track_element_get_track (child)
+        && ges_track_element_get_track_type (child) & type) {
 
       GST_DEBUG_OBJECT (clip, "Removing for reusage: %" GST_PTR_FORMAT, child);
-      result = g_list_prepend (result, g_object_ref (child));
+      result = g_list_append (result, g_object_ref (child));
       ges_container_remove (GES_CONTAINER (clip), tmp->data);
+      if (!GES_IS_BASE_EFFECT (child))
+        readding_effects_only = FALSE;
     }
   }
   g_list_free_full (children, gst_object_unref);
 
-  if (!result) {
-    result = klass->create_track_elements (clip, type);
+  if (readding_effects_only) {
+    result = g_list_concat (result, klass->create_track_elements (clip, type));
   }
 
   _get_priority_range (GES_CONTAINER (clip), &min_prio, &max_prio);
index ce3fa6a..eeb7b8d 100644 (file)
@@ -143,31 +143,43 @@ class TestTrackElements(common.GESTest):
 
     def test_add_to_layer_with_effect_remove_add(self):
         timeline = GES.Timeline.new_audio_video()
-        self.assertEqual(len(timeline.get_tracks()), 2)
+        video_track, audio_track = timeline.get_tracks()
         layer = timeline.append_layer()
 
         test_clip = GES.TestClip()
         self.assertEqual(test_clip.get_children(True), [])
         self.assertTrue(layer.add_clip(test_clip))
         audio_source = test_clip.find_track_element(None, GES.AudioSource)
-        self.assertIsNotNone(audio_source)
+        video_source = test_clip.find_track_element(None, GES.VideoSource)
 
         self.assertTrue(test_clip.set_child_property("volume", 0.0))
         self.assertEqual(audio_source.get_child_property("volume")[1], 0.0)
 
         effect = GES.Effect.new("agingtv")
         test_clip.add(effect)
+        self.assertEqual(audio_source.props.track, audio_track)
+        self.assertEqual(video_source.props.track, video_track)
+        self.assertEqual(effect.props.track, video_track)
 
         children = test_clip.get_children(True)
         layer.remove_clip(test_clip)
         self.assertEqual(test_clip.get_children(True), children)
+        self.assertEqual(audio_source.props.track, None)
+        self.assertEqual(video_source.props.track, None)
+        self.assertEqual(effect.props.track, None)
 
         self.assertTrue(layer.add_clip(test_clip))
         self.assertEqual(test_clip.get_children(True), children)
+        self.assertEqual(audio_source.props.track, audio_track)
+        self.assertEqual(video_source.props.track, video_track)
+        self.assertEqual(effect.props.track, video_track)
 
         audio_source = test_clip.find_track_element(None, GES.AudioSource)
         self.assertFalse(audio_source is None)
         self.assertEqual(audio_source.get_child_property("volume")[1], 0.0)
+        self.assertEqual(audio_source.props.track, audio_track)
+        self.assertEqual(video_source.props.track, video_track)
+        self.assertEqual(effect.props.track, video_track)
 
     def test_effects_priority(self):
         timeline = GES.Timeline.new_audio_video()