From 4b842184348049a22bc0375fb0ad0013938d7272 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Sun, 27 May 2012 22:55:12 -0400 Subject: [PATCH 01/14] track: Make sure to remove the proper TrackObject from the GSequence --- ges/ges-track.c | 46 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/ges/ges-track.c b/ges/ges-track.c index a44348c7cf..6de3520cac 100644 --- a/ges/ges-track.c +++ b/ges/ges-track.c @@ -399,6 +399,49 @@ remove_object_internal (GESTrack * track, GESTrackObject * object) return TRUE; } +static GSequenceIter * +lookup_trackobj_it (GSequence * seq, GESTrackObject * object) +{ + GSequenceIter *iter, *tmpiter; + GESTrackObject *found, *tmptckobj; + + iter = g_sequence_lookup (seq, object, + (GCompareDataFunc) objects_start_compare, NULL); + + found = g_sequence_get (iter); + + /* We have the same TrackObject so we are all fine */ + if (found == object) + return iter; + + if (!g_sequence_iter_is_end (iter)) { + /* Looking frontward for the good TrackObject */ + tmpiter = iter; + while ((tmpiter = g_sequence_iter_next (tmpiter))) { + if (g_sequence_iter_is_end (tmpiter)) + break; + + tmptckobj = g_sequence_get (tmpiter); + if (tmptckobj == object) + return tmpiter; + } + } + + if (!g_sequence_iter_is_begin (iter)) { + /* Looking backward for the good TrackObject */ + tmpiter = iter; + while ((tmpiter = g_sequence_iter_prev (tmpiter))) { + tmptckobj = g_sequence_get (tmpiter); + if (tmptckobj == object) + return tmpiter; + } + } + + GST_ERROR_OBJECT (object, "TrackObject not found this should never happen"); + + return NULL; +} + static void dispose_tckobjs_foreach (GESTrackObject * tckobj, GESTrack * track) { @@ -818,8 +861,7 @@ ges_track_remove_object (GESTrack * track, GESTrackObject * object) priv = track->priv; if (remove_object_internal (track, object) == TRUE) { - it = g_sequence_lookup (priv->tckobjs_by_start, object, - (GCompareDataFunc) objects_start_compare, NULL); + it = lookup_trackobj_it (priv->tckobjs_by_start, object); g_sequence_remove (it); resort_and_fill_gaps (track); From 90a4af02fc76e3aa082b7858ecd45178d0bd3e40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 30 May 2012 11:24:29 +0200 Subject: [PATCH 02/14] configure: Don't check for OBJC compiler --- configure.ac | 2 -- 1 file changed, 2 deletions(-) diff --git a/configure.ac b/configure.ac index 0497c96d1e..affb46b105 100644 --- a/configure.ac +++ b/configure.ac @@ -98,8 +98,6 @@ AC_PROG_CXX dnl determine if c++ is available on this system AC_CHECK_PROG(HAVE_CXX, $CXX, yes, no) -AS_PROG_OBJC - dnl check if the compiler supports '-c' and '-o' options AM_PROG_CC_C_O From c09ac4e24883f2a927a2c4ee7520107f9deb98db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 30 May 2012 11:27:43 +0200 Subject: [PATCH 03/14] Automatic update of common submodule From 11f0cd5 to ff4cad1 --- common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common b/common index 11f0cd5a3f..ff4cad1bef 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 11f0cd5a3fba36f85cf3e434150bfe66b1bf08d4 +Subproject commit ff4cad1befdff0762433009dc3749a2f265f657e From aae5dcd6f80d2edb251ef70e104e2be53daa467b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 30 May 2012 12:33:40 +0200 Subject: [PATCH 04/14] Automatic update of common submodule From ff4cad1 to 1e6c5ea --- common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common b/common index ff4cad1bef..1e6c5ead21 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit ff4cad1befdff0762433009dc3749a2f265f657e +Subproject commit 1e6c5ead21037df6cb4917d62c1d4a7de0368df0 From 32b65e82b7a5b5b340765827d00b0ef5099b7128 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 30 May 2012 12:42:18 +0200 Subject: [PATCH 05/14] Automatic update of common submodule From 1e6c5ea to 96f075b --- common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common b/common index 1e6c5ead21..96f075beeb 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 1e6c5ead21037df6cb4917d62c1d4a7de0368df0 +Subproject commit 96f075beebb0183329dd69ddc661b2425145f0ec From f153738373272df57d134475afc381b33fe6b074 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Fri, 1 Jun 2012 10:23:17 +0200 Subject: [PATCH 06/14] Automatic update of common submodule From 96f075b to b098abb --- common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common b/common index 96f075beeb..b098abb386 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 96f075beebb0183329dd69ddc661b2425145f0ec +Subproject commit b098abb386f35132b8fbef711dd67a2245af3c4d From 341183a9ac32523918854027067cb0c15d1c6d24 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Wed, 6 Jun 2012 18:20:11 +0200 Subject: [PATCH 07/14] Automatic update of common submodule From b098abb to b811047 --- common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common b/common index b098abb386..b811047a49 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit b098abb386f35132b8fbef711dd67a2245af3c4d +Subproject commit b811047a49ae74adc08357af335f57f727948a3b From 4a424e83fd36bde3d969490d244ce14703d13a68 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Fri, 8 Jun 2012 14:27:34 +0200 Subject: [PATCH 08/14] Automatic update of common submodule From b811047 to 3baf58a --- common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common b/common index b811047a49..3baf58a140 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit b811047a49ae74adc08357af335f57f727948a3b +Subproject commit 3baf58a140fb1219c917cbae1070c4734e30f028 From b102df2d4d35fa48500b684407c081a1d848a6e6 Mon Sep 17 00:00:00 2001 From: Volodymyr Rudyi Date: Sun, 8 Apr 2012 00:08:43 +0300 Subject: [PATCH 09/14] ges-formatter: Removed assert to allow saving projects with empty timeline Removed assert in ges-formatter.c to allow saving projects with empty timeline. --- ges/ges-formatter.c | 9 --------- 1 file changed, 9 deletions(-) diff --git a/ges/ges-formatter.c b/ges/ges-formatter.c index b481f8c428..4c1f495b98 100644 --- a/ges/ges-formatter.c +++ b/ges/ges-formatter.c @@ -470,15 +470,6 @@ ges_formatter_save_to_uri (GESFormatter * formatter, GESTimeline * timeline, const gchar * uri) { GESFormatterClass *klass = GES_FORMATTER_GET_CLASS (formatter); - GList *layers; - - /* Saving an empty timeline is not allowed */ - /* FIXME : Having a ges_timeline_is_empty() would be more efficient maybe */ - layers = ges_timeline_get_layers (timeline); - - g_return_val_if_fail (layers != NULL, FALSE); - g_list_foreach (layers, (GFunc) g_object_unref, NULL); - g_list_free (layers); if (klass->save_to_uri) return klass->save_to_uri (formatter, timeline, uri); From 963cce240cf59531faad010ac17a8b49fd2ec091 Mon Sep 17 00:00:00 2001 From: Volodymyr Rudyi Date: Sun, 8 Apr 2012 00:30:03 +0300 Subject: [PATCH 10/14] ges-pitivi-formatter: Fixed loading of projects with empty timeline Because 'project-loaded' signal was triggered from track object loading callback in case with projects that have empty timeline this signal was never emitted. --- ges/ges-pitivi-formatter.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/ges/ges-pitivi-formatter.c b/ges/ges-pitivi-formatter.c index 0ad06f4f0f..b12387ab4a 100644 --- a/ges/ges-pitivi-formatter.c +++ b/ges/ges-pitivi-formatter.c @@ -1101,9 +1101,20 @@ load_pitivi_file_from_uri (GESFormatter * self, return FALSE; } - if (!make_timeline_objects (self)) { - GST_ERROR ("Couldn't deserialise the project properly"); - return FALSE; + + + /* If there are no timeline objects to load we should emit + * 'project-loaded' signal. + */ + if (!g_hash_table_size (priv->timeline_objects_table)) { + GESFormatterClass *klass = GES_FORMATTER_GET_CLASS (self); + + klass->project_loaded (self, GES_PITIVI_FORMATTER (self)->priv->timeline); + } else { + if (!make_timeline_objects (self)) { + GST_ERROR ("Couldn't deserialise the project properly"); + return FALSE; + } } xmlXPathFreeContext (priv->xpathCtx); From 76c7ba52646f4187a7433255820a55ab05d0695e Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Sun, 1 Jul 2012 19:34:53 -0400 Subject: [PATCH 11/14] formatter: Add a timeline protected field --- ges/ges-formatter.c | 2 ++ ges/ges-formatter.h | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/ges/ges-formatter.c b/ges/ges-formatter.c index 4c1f495b98..c0c7f9b154 100644 --- a/ges/ges-formatter.c +++ b/ges/ges-formatter.c @@ -341,6 +341,7 @@ ges_formatter_load (GESFormatter * formatter, GESTimeline * timeline) { GESFormatterClass *klass; + formatter->timeline = timeline; klass = GES_FORMATTER_GET_CLASS (formatter); if (klass->load) @@ -411,6 +412,7 @@ ges_formatter_load_from_uri (GESFormatter * formatter, GESTimeline * timeline, G_CALLBACK (discovery_error_cb), formatter); if (klass->load_from_uri) { ges_timeline_enable_update (timeline, FALSE); + formatter->timeline = timeline; ret = klass->load_from_uri (formatter, timeline, uri); ges_timeline_enable_update (timeline, TRUE); } diff --git a/ges/ges-formatter.h b/ges/ges-formatter.h index 2cc6dda18c..bc2b7232f0 100644 --- a/ges/ges-formatter.h +++ b/ges/ges-formatter.h @@ -55,8 +55,11 @@ struct _GESFormatter { /*< private >*/ GESFormatterPrivate *priv; + /*< protected >*/ + GESTimeline *timeline; + /* Padding for API extension */ - gpointer _ges_reserved[GES_PADDING]; + gpointer _ges_reserved[GES_PADDING - 1]; }; typedef gboolean (*GESFormatterCanLoadURIMethod) (const gchar * uri); From 2d13b12878eec52251e4af4a78d3f743f6f2fbc0 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Sun, 1 Jul 2012 19:39:57 -0400 Subject: [PATCH 12/14] pitivi-formatter: Make use of the Formatter:timeline protected field --- ges/ges-pitivi-formatter.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/ges/ges-pitivi-formatter.c b/ges/ges-pitivi-formatter.c index b12387ab4a..2abc06a9d0 100644 --- a/ges/ges-pitivi-formatter.c +++ b/ges/ges-pitivi-formatter.c @@ -560,7 +560,7 @@ create_tracks (GESFormatter * self) GESPitiviFormatterPrivate *priv = GES_PITIVI_FORMATTER (self)->priv; GList *tracks = NULL; - tracks = ges_timeline_get_tracks (priv->timeline); + tracks = ges_timeline_get_tracks (self->timeline); GST_DEBUG ("Creating tracks, current number of tracks %d", g_list_length (tracks)); @@ -584,11 +584,11 @@ create_tracks (GESFormatter * self) priv->tracka = ges_track_audio_raw_new (); priv->trackv = ges_track_video_raw_new (); - if (!ges_timeline_add_track (priv->timeline, priv->trackv)) { + if (!ges_timeline_add_track (self->timeline, priv->trackv)) { return FALSE; } - if (!ges_timeline_add_track (priv->timeline, priv->tracka)) { + if (!ges_timeline_add_track (self->timeline, priv->tracka)) { return FALSE; } @@ -811,7 +811,7 @@ track_object_added_cb (GESTimelineObject * object, GESFormatterClass *klass = GES_FORMATTER_GET_CLASS (formatter); klass->project_loaded (GES_FORMATTER (formatter), - formatter->priv->timeline); + GES_FORMATTER (formatter)->timeline); } } @@ -1068,7 +1068,6 @@ load_pitivi_file_from_uri (GESFormatter * self, g_object_set (layer, "auto-transition", TRUE, NULL); g_hash_table_insert (priv->layers_table, prio, layer); - priv->timeline = timeline; g_object_set (layer, "priority", (gint32) 0, NULL); if (!ges_timeline_add_layer (timeline, layer)) { @@ -1109,7 +1108,7 @@ load_pitivi_file_from_uri (GESFormatter * self, if (!g_hash_table_size (priv->timeline_objects_table)) { GESFormatterClass *klass = GES_FORMATTER_GET_CLASS (self); - klass->project_loaded (self, GES_PITIVI_FORMATTER (self)->priv->timeline); + klass->project_loaded (self, self->timeline); } else { if (!make_timeline_objects (self)) { GST_ERROR ("Couldn't deserialise the project properly"); From b13942c5b51f93226c058aab90ffda401fd6829b Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Sun, 1 Jul 2012 19:57:30 -0400 Subject: [PATCH 13/14] formatter: Make the emit_loaded a real method and not a virtual method + Modify formatter subclasses accordingly API:ges_formatter_emit_loaded This API wasn't released so it could still be changed --- ges/ges-formatter.c | 25 ++++++++++++++++--------- ges/ges-formatter.h | 6 ++++-- ges/ges-pitivi-formatter.c | 14 ++++---------- 3 files changed, 24 insertions(+), 21 deletions(-) diff --git a/ges/ges-formatter.c b/ges/ges-formatter.c index c0c7f9b154..6199e6189e 100644 --- a/ges/ges-formatter.c +++ b/ges/ges-formatter.c @@ -39,8 +39,8 @@ * Support for saving or loading new formats can be added by creating a subclass of * #GESFormatter and implement the various vmethods of #GESFormatterClass. * - * Note that subclasses should call project_loaded wen they are done loading - * a project. + * Note that subclasses should call ges_formatter_project_loaded when they are done + * loading a project. **/ #include @@ -76,9 +76,6 @@ static gboolean default_can_save_uri (const gchar * uri); static void discovery_error_cb (GESTimeline * timeline, GESTimelineFileSource * tfs, GError * error, GESFormatter * formatter); -static gboolean project_loaded (GESFormatter * formatter, - GESTimeline * timeline); - enum { SOURCE_MOVED_SIGNAL, @@ -123,7 +120,6 @@ ges_formatter_class_init (GESFormatterClass * klass) klass->load_from_uri = load_from_uri; klass->save_to_uri = save_to_uri; klass->update_source_uri = NULL; - klass->project_loaded = project_loaded; } static void @@ -594,11 +590,22 @@ discovery_error_cb (GESTimeline * timeline, } } -static gboolean -project_loaded (GESFormatter * formatter, GESTimeline * timeline) +/*< protected >*/ +/** + * ges_formatter_emit_loaded: + * @formatter: The #GESFormatter from which to emit the "project-loaded" signal + * + * Emits the "loaded" signal. This method should be called by sublasses when + * the project is fully loaded. + * + * Returns: %TRUE if the signale could be emitted %FALSE otherwize + */ +gboolean +ges_formatter_emit_loaded (GESFormatter * formatter) { GST_INFO_OBJECT (formatter, "Emit project loaded"); - g_signal_emit (formatter, ges_formatter_signals[LOADED_SIGNAL], 0, timeline); + g_signal_emit (formatter, ges_formatter_signals[LOADED_SIGNAL], 0, + formatter->timeline); return TRUE; } diff --git a/ges/ges-formatter.h b/ges/ges-formatter.h index bc2b7232f0..80d18546b3 100644 --- a/ges/ges-formatter.h +++ b/ges/ges-formatter.h @@ -140,7 +140,6 @@ typedef gboolean (*GESFormatterLoadedMethod) (GESFormatter *formatter, * @save_to_uri: class method to serialize data to a URI * @update_source_uri: virtual method to specify that a source has moved, and thus its URI * must be set to its new location (specified by the user) - * @project_loaded: Must be called by subclasses when done loading a project * * GES Formatter class. Override the vmethods to implement the formatter functionnality. */ @@ -153,7 +152,6 @@ struct _GESFormatterClass { GESFormatterLoadFromURIMethod load_from_uri; GESFormatterSaveToURIMethod save_to_uri; GESFormatterSourceMovedMethod update_source_uri; - GESFormatterLoadedMethod project_loaded; /*< private >*/ /* FIXME : formatter name */ @@ -188,6 +186,10 @@ gboolean ges_formatter_update_source_uri (GESFormatter * formatter, GESTimelineFileSource * source, gchar * new_uri); +/*< protected >*/ +gboolean +ges_formatter_emit_loaded (GESFormatter * formatter); + /* Non-standard methods. WILL BE DEPRECATED */ gboolean ges_formatter_load (GESFormatter * formatter, GESTimeline * timeline); diff --git a/ges/ges-pitivi-formatter.c b/ges/ges-pitivi-formatter.c index 2abc06a9d0..b4d4059c8a 100644 --- a/ges/ges-pitivi-formatter.c +++ b/ges/ges-pitivi-formatter.c @@ -807,12 +807,8 @@ track_object_added_cb (GESTimelineObject * object, g_hash_table_steal (props_table, "current-formatter"); priv->sources_to_load = g_list_remove (priv->sources_to_load, object); - if (!priv->sources_to_load) { - GESFormatterClass *klass = GES_FORMATTER_GET_CLASS (formatter); - - klass->project_loaded (GES_FORMATTER (formatter), - GES_FORMATTER (formatter)->timeline); - } + if (!priv->sources_to_load) + ges_formatter_emit_loaded (GES_FORMATTER (formatter)); } if (lockedstr && !g_strcmp0 (lockedstr, "(bool)False")) @@ -909,7 +905,7 @@ make_source (GESFormatter * self, GList * reflist, GHashTable * source_table) if (!(layer = g_hash_table_lookup (priv->layers_table, &prio))) { layer = ges_timeline_layer_new (); g_object_set (layer, "auto-transition", TRUE, "priority", prio, NULL); - ges_timeline_add_layer (priv->timeline, layer); + ges_timeline_add_layer (self->timeline, layer); g_hash_table_insert (priv->layers_table, g_memdup (&prio, sizeof (guint64)), layer); } @@ -1106,9 +1102,7 @@ load_pitivi_file_from_uri (GESFormatter * self, * 'project-loaded' signal. */ if (!g_hash_table_size (priv->timeline_objects_table)) { - GESFormatterClass *klass = GES_FORMATTER_GET_CLASS (self); - - klass->project_loaded (self, self->timeline); + ges_formatter_emit_loaded (self); } else { if (!make_timeline_objects (self)) { GST_ERROR ("Couldn't deserialise the project properly"); From aa923e60e6b912996848cdce77e60fd4963c60ff Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Sun, 1 Jul 2012 20:03:37 -0400 Subject: [PATCH 14/14] docs: Add the new ges_formatter_emit_loaded API to the docs + Fix sections --- docs/libs/ges-sections.txt | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/docs/libs/ges-sections.txt b/docs/libs/ges-sections.txt index 2fc7619d4e..6622aa0628 100644 --- a/docs/libs/ges-sections.txt +++ b/docs/libs/ges-sections.txt @@ -791,16 +791,6 @@ ges_formatter_new_for_uri ges_formatter_can_load_uri ges_formatter_can_save_uri ges_formatter_update_source_uri - -ges_formatter_get_type -GES_FORMATTER -GES_FORMATTER_CLASS -GES_FORMATTER_GET_CLASS -GES_IS_FORMATTER -GES_IS_FORMATTER_CLASS -GES_TYPE_FORMATTER - -GESFormatterPrivate ges_formatter_load ges_formatter_save ges_formatter_set_data @@ -810,6 +800,18 @@ GESFormatterCanLoadURIMethod GESFormatterCanSaveURIMethod GESFormatterLoadMethod GESFormatterSaveMethod + +ges_formatter_emit_loaded + +GES_FORMATTER +GES_FORMATTER_CLASS +GES_FORMATTER_GET_CLASS +GES_IS_FORMATTER +GES_IS_FORMATTER_CLASS +GES_TYPE_FORMATTER + +ges_formatter_get_type +GESFormatterPrivate