TimelineObject: add ges_timeline_object_get_effects API
authorThibault Saunier <thibault.saunier@collabora.co.uk>
Mon, 31 Jan 2011 10:32:14 +0000 (11:32 +0100)
committerEdward Hervey <edward.hervey@collabora.co.uk>
Fri, 6 May 2011 08:39:00 +0000 (10:39 +0200)
tests: Test the new TimelineObject API

docs: add the corresponding fonction

docs/libs/ges-sections.txt
ges/ges-timeline-object.c
ges/ges-timeline-object.h
tests/check/ges/effects.c

index 37b4184..52cfa8c 100644 (file)
@@ -280,6 +280,7 @@ ges_timeline_object_set_duration
 ges_timeline_object_get_layer
 ges_timeline_object_find_track_object
 ges_timeline_object_add_track_object
+ges_timeline_object_get_effects 
 <SUBSECTION Standard>
 GES_TIMELINE_OBJECT_DURATION
 GES_TIMELINE_OBJECT_INPOINT
index 903ef53..49f968c 100644 (file)
@@ -792,6 +792,35 @@ sort_track_effects (gpointer a, gpointer b, GESTimelineObject * object)
   return 0;
 }
 
+/**
+* ges_timeline_object_get_effects:
+*
+* @object: The origin #GESTimelineObject
+*
+* Returns: a #GList of the #GESTrackOperation that are applied on
+* @object order by ascendant priorities.
+* The refcount of the objects will be increased. The user will have to
+* unref each #GESTrackOperation and free the #GList.
+*/
+GList *
+ges_timeline_object_get_effects (GESTimelineObject * object)
+{
+  GList *tmp, *ret;
+  guint i;
+
+  ret = NULL;
+
+  for (tmp = object->priv->trackobjects, i = 0;
+      i < object->priv->nb_effects; tmp = tmp->next, i++) {
+    if (GES_IS_TRACK_EFFECT (tmp->data)) {
+      ret = g_list_insert_sorted_with_data (ret, tmp->data,
+          (GCompareDataFunc) sort_track_effects, object);
+      g_object_ref (tmp->data);
+    }
+  }
+
+  return ret;
+}
 
 /*
  * PROPERTY NOTIFICATIONS FROM TRACK OBJECTS
index b76c4fd..c6b2344 100644 (file)
@@ -241,6 +241,9 @@ gboolean
 ges_timeline_object_add_track_object (GESTimelineObject *object, GESTrackObject
     *trobj);
 
+GList *
+ges_timeline_object_get_effects (GESTimelineObject *object);
+
 G_END_DECLS
 
 #endif /* _GES_TIMELINE_OBJECT */
index 051218c..f26e9fa 100644 (file)
@@ -81,6 +81,76 @@ GST_START_TEST (test_add_effect_to_tl_object)
 
 GST_END_TEST;
 
+GST_START_TEST (test_get_effects_from_tl)
+{
+  GESTimeline *timeline;
+  GESTimelineLayer *layer;
+  GESTrack *track_video;
+  GESTrackEffect *track_effect, *track_effect1, *track_effect2;
+  GESTimelineTestSource *source;
+  GList *effects, *tmp = NULL;
+  gint effect_prio = -1;
+
+  ges_init ();
+
+  timeline = ges_timeline_new ();
+  layer = (GESTimelineLayer *) ges_simple_timeline_layer_new ();
+  track_video = ges_track_video_raw_new ();
+
+  ges_timeline_add_track (timeline, track_video);
+  ges_timeline_add_layer (timeline, layer);
+
+  source = ges_timeline_test_source_new ();
+
+  g_object_set (source, "duration", 10 * GST_SECOND, NULL);
+
+  ges_simple_timeline_layer_add_object ((GESSimpleTimelineLayer *) (layer),
+      (GESTimelineObject *) source, 0);
+
+
+  GST_DEBUG ("Create effect");
+  track_effect = ges_track_effect_new_from_bin_desc ("identity");
+  track_effect1 = ges_track_effect_new_from_bin_desc ("identity");
+  track_effect2 = ges_track_effect_new_from_bin_desc ("identity");
+
+  fail_unless (GES_IS_TRACK_EFFECT (track_effect));
+  fail_unless (GES_IS_TRACK_EFFECT (track_effect1));
+  fail_unless (GES_IS_TRACK_EFFECT (track_effect2));
+
+  fail_unless (ges_timeline_object_add_track_object (GES_TIMELINE_OBJECT
+          (source), GES_TRACK_OBJECT (track_effect)));
+  fail_unless (ges_track_add_object (track_video,
+          GES_TRACK_OBJECT (track_effect)));
+
+  fail_unless (ges_timeline_object_add_track_object (GES_TIMELINE_OBJECT
+          (source), GES_TRACK_OBJECT (track_effect1)));
+  fail_unless (ges_track_add_object (track_video,
+          GES_TRACK_OBJECT (track_effect1)));
+
+  fail_unless (ges_timeline_object_add_track_object (GES_TIMELINE_OBJECT
+          (source), GES_TRACK_OBJECT (track_effect2)));
+  fail_unless (ges_track_add_object (track_video,
+          GES_TRACK_OBJECT (track_effect2)));
+
+  effects = ges_timeline_object_get_effects (GES_TIMELINE_OBJECT (source));
+
+  for (tmp = effects; tmp; tmp = tmp->next) {
+    int priority = GES_TRACK_OBJECT (tmp->data)->priority;
+    fail_unless (priority > effect_prio);
+    fail_unless (GES_IS_TRACK_EFFECT (tmp->data));
+    effect_prio = priority;
+
+    g_object_unref (tmp->data);
+  }
+  g_list_free (effects);
+
+  ges_timeline_layer_remove_object (layer, (GESTimelineObject *) source);
+
+  g_object_unref (timeline);
+}
+
+GST_END_TEST;
+
 static Suite *
 ges_suite (void)
 {
@@ -91,6 +161,7 @@ ges_suite (void)
 
   tcase_add_test (tc_chain, test_effect_basic);
   tcase_add_test (tc_chain, test_add_effect_to_tl_object);
+  tcase_add_test (tc_chain, test_get_effects_from_tl);
 
   return s;
 }