ges: Avoid to always commit when a project is loaded
authorThibault Saunier <tsaunier@gnome.org>
Fri, 19 Sep 2014 15:12:18 +0000 (17:12 +0200)
committerThibault Saunier <tsaunier@gnome.org>
Fri, 31 Oct 2014 10:58:12 +0000 (11:58 +0100)
In case we are not in a PLAYING state and the project is loaded, the
only thing that should be done is to fill the gaps and this way when the
composition get to PLAYING, their initialization will be enough to get
everything on track.

ges/ges-internal.h
ges/ges-project.c
ges/ges-timeline.c
ges/ges-track.c

index e8a9c980e35660f6096a2299cd01a7420b57a82e..54dd87705ce38433de6c0c4fcc2c955e9719b8e2 100644 (file)
@@ -100,6 +100,14 @@ gboolean
 timeline_remove_element       (GESTimeline *timeline,
                                GESTimelineElement *element);
 
+G_GNUC_INTERNAL
+void
+timeline_fill_gaps            (GESTimeline *timeline);
+
+G_GNUC_INTERNAL
+void
+track_resort_and_fill_gaps    (GESTrack *track);
+
 G_GNUC_INTERNAL void
 ges_asset_cache_init (void);
 
index 9dcd7705587af122fb5a362a256a9340fdbda06d..7556396eda0086efc4ce32515db20e368da63b5c 100644 (file)
@@ -540,7 +540,12 @@ gboolean
 ges_project_set_loaded (GESProject * project, GESFormatter * formatter)
 {
   GST_INFO_OBJECT (project, "Emit project loaded");
-  ges_timeline_commit (formatter->timeline);
+  if (GST_STATE (formatter->timeline) < GST_STATE_PAUSED) {
+    timeline_fill_gaps (formatter->timeline);
+  } else {
+    ges_timeline_commit (formatter->timeline);
+  }
+
   g_signal_emit (project, _signals[LOADED_SIGNAL], 0, formatter->timeline);
 
   /* We are now done with that formatter */
index 5c221a3872771e381b172ab6a03e799b64fc6d73..c59d6d8c76853f1033b40c3dab71188f40e58280 100644 (file)
@@ -2474,6 +2474,16 @@ timeline_remove_element (GESTimeline * timeline, GESTimelineElement * element)
   return g_hash_table_remove (timeline->priv->all_elements, element->name);
 }
 
+void
+timeline_fill_gaps (GESTimeline * timeline)
+{
+  GList *tmp;
+
+  for (tmp = timeline->tracks; tmp; tmp = tmp->next) {
+    track_resort_and_fill_gaps (tmp->data);
+  }
+}
+
 /**** API *****/
 /**
  * ges_timeline_new:
index eb24417f385b0db1d939cee5c6fb521af65453c9..5897284dd0455c149a934bf46f605a6188bf3fe3 100644 (file)
@@ -237,8 +237,8 @@ update_gaps (GESTrack * track)
   g_list_free_full (gaps, (GDestroyNotify) free_gap);
 }
 
-static inline void
-resort_and_fill_gaps (GESTrack * track)
+void
+track_resort_and_fill_gaps (GESTrack * track)
 {
   g_sequence_sort (track->priv->trackelements_by_start,
       (GCompareDataFunc) element_start_compare, NULL);
@@ -691,7 +691,7 @@ ges_track_set_timeline (GESTrack * track, GESTimeline * timeline)
   GST_DEBUG ("track:%p, timeline:%p", track, timeline);
 
   track->priv->timeline = timeline;
-  resort_and_fill_gaps (track);
+  track_resort_and_fill_gaps (track);
 }
 
 /**
@@ -907,7 +907,7 @@ ges_track_remove_element (GESTrack * track, GESTrackElement * object)
 
   it = g_hash_table_lookup (priv->trackelements_iter, object);
   g_sequence_remove (it);
-  resort_and_fill_gaps (track);
+  track_resort_and_fill_gaps (track);
 
   if (remove_object_internal (track, object) == TRUE) {
     ges_timeline_element_set_timeline (GES_TIMELINE_ELEMENT (object), NULL);
@@ -990,7 +990,7 @@ ges_track_commit (GESTrack * track)
 {
   g_return_val_if_fail (GES_IS_TRACK (track), FALSE);
 
-  resort_and_fill_gaps (track);
+  track_resort_and_fill_gaps (track);
 
   return nle_object_commit (NLE_OBJECT (track->priv->composition), TRUE);
 }