project: Handle assets that are being loaded
authorThibault Saunier <thibault.saunier@collabora.com>
Fri, 11 Jan 2013 14:49:02 +0000 (11:49 -0300)
committerThibault Saunier <thibault.saunier@collabora.com>
Mon, 14 Jan 2013 12:02:26 +0000 (09:02 -0300)
API:
    ges_project_get_loading_assets

docs/libs/ges-sections.txt
ges/ges-asset.c
ges/ges-base-xml-formatter.c
ges/ges-internal.h
ges/ges-pitivi-formatter.c
ges/ges-project.c
ges/ges-project.h
ges/ges-timeline-layer.c
tests/check/ges/project.c

index 7d34af3..44349d5 100644 (file)
@@ -1065,6 +1065,7 @@ ges_project_get_uri
 ges_project_new
 ges_project_add_encoding_profile
 ges_project_list_encoding_profiles
+ges_project_get_loading_assets
 <SUBSECTION Standard>
 GESProjectPrivate
 GES_PROJECT
index 798265e..990c2f9 100644 (file)
@@ -952,7 +952,8 @@ ges_asset_extract (GESAsset * self, GError ** error)
   if (extractable == NULL)
     return NULL;
 
-  ges_extractable_set_asset (extractable, self);
+  if (ges_extractable_get_asset (extractable) == NULL)
+    ges_extractable_set_asset (extractable, self);
 
   return extractable;
 }
index 958991a..40268b1 100644 (file)
@@ -586,7 +586,6 @@ new_asset_cb (GESAsset * source, GAsyncResult * res, PendingAsset * passet)
 
   /* And now add to the project */
   ges_project_add_asset (self->project, asset);
-
   gst_object_unref (self);
 
   _free_pending_asset (priv, passet);
@@ -668,8 +667,11 @@ ges_base_xml_formatter_add_asset (GESBaseXmlFormatter * self,
   passet->formatter = gst_object_ref (self);
   if (properties)
     passet->properties = gst_structure_copy (properties);
+
   ges_asset_request_async (extractable_type, id, NULL,
       (GAsyncReadyCallback) new_asset_cb, passet);
+  ges_project_add_loading_asset (GES_FORMATTER (self)->project,
+      extractable_type, id);
   priv->pending_assets = g_list_prepend (priv->pending_assets, passet);
 }
 
index c555111..71deb19 100644 (file)
@@ -135,6 +135,9 @@ G_GNUC_INTERNAL  gboolean ges_project_set_loaded                  (GESProject *
 G_GNUC_INTERNAL  gchar * ges_project_try_updating_id              (GESProject *self,
                                                                    GESAsset *asset,
                                                                    GError *error);
+G_GNUC_INTERNAL  void ges_project_add_loading_asset               (GESProject *project,
+                                                                   GType extractable_type,
+                                                                   const gchar *id);
 
 /************************************************
  *                                              *
index 8bc2787..780d479 100644 (file)
@@ -553,6 +553,9 @@ list_sources (GESFormatter * self)
     g_hash_table_insert (priv->sources_table, g_strdup (id), table);
     g_hash_table_insert (priv->source_uris, g_strdup (filename),
         g_strdup (filename));
+    if (self->project)
+      ges_project_create_asset (self->project, filename,
+          GES_TYPE_TIMELINE_FILE_SOURCE);
   }
 
   xmlXPathFreeObject (xpathObj);
index e44be21..2948737 100644 (file)
@@ -54,6 +54,8 @@ G_DEFINE_TYPE (GESProject, ges_project, GES_TYPE_ASSET);
 struct _GESProjectPrivate
 {
   GHashTable *assets;
+  /* Set of asset ID being loaded */
+  GHashTable *loading_assets;
   GESAsset *formatter_asset;
 
   GList *formatters;
@@ -248,6 +250,8 @@ _dispose (GObject * object)
 
   if (priv->assets)
     g_hash_table_unref (priv->assets);
+  if (priv->loading_assets)
+    g_hash_table_unref (priv->loading_assets);
   if (priv->formatter_asset)
     gst_object_unref (priv->formatter_asset);
 
@@ -419,6 +423,8 @@ ges_project_init (GESProject * project)
   priv->encoding_profiles = NULL;
   priv->assets = g_hash_table_new_full (g_str_hash, g_str_equal,
       g_free, gst_object_unref);
+  priv->loading_assets = g_hash_table_new_full (g_str_hash, g_str_equal,
+      g_free, gst_object_unref);
 }
 
 gchar *
@@ -464,6 +470,7 @@ new_asset_cb (GESAsset * source, GAsyncResult * res, GESProject * project)
   if (error) {
     possible_id = ges_project_try_updating_id (project, source, error);
     if (possible_id == NULL) {
+      g_hash_table_remove (project->priv->loading_assets, id);
       g_signal_emit (project, _signals[ERROR_LOADING_ASSET], 0, error, id,
           ges_asset_get_extractable_type (source));
 
@@ -502,6 +509,17 @@ ges_project_set_loaded (GESProject * project, GESFormatter * formatter)
   return TRUE;
 }
 
+void
+ges_project_add_loading_asset (GESProject * project, GType extractable_type,
+    const gchar * id)
+{
+  GESAsset *asset;
+
+  if ((asset = ges_asset_cache_lookup (extractable_type, id)))
+    g_hash_table_insert (project->priv->loading_assets, g_strdup (id),
+        gst_object_ref (asset));
+}
+
 /**************************************
  *                                    *
  *         API Implementation         *
@@ -529,12 +547,14 @@ ges_project_create_asset (GESProject * project, const gchar * id,
   g_return_val_if_fail (g_type_is_a (extractable_type, GES_TYPE_EXTRACTABLE),
       FALSE);
 
-  if (g_hash_table_lookup (project->priv->assets, id))
+  if (g_hash_table_lookup (project->priv->assets, id) ||
+      g_hash_table_lookup (project->priv->loading_assets, id))
     return FALSE;
 
   /* TODO Add a GCancellable somewhere in our API */
   ges_asset_request_async (extractable_type, id, NULL,
       (GAsyncReadyCallback) new_asset_cb, project);
+  ges_project_add_loading_asset (project, extractable_type, id);
 
   return TRUE;
 }
@@ -561,6 +581,7 @@ ges_project_add_asset (GESProject * project, GESAsset * asset)
   g_hash_table_insert (project->priv->assets,
       g_strdup (ges_asset_get_id (asset)), gst_object_ref (asset));
 
+  g_hash_table_remove (project->priv->loading_assets, ges_asset_get_id (asset));
   GST_DEBUG_OBJECT (project, "Asset added: %s", ges_asset_get_id (asset));
   g_signal_emit (project, _signals[ASSET_ADDED_SIGNAL], 0, asset);
 
@@ -584,7 +605,6 @@ ges_project_remove_asset (GESProject * project, GESAsset * asset)
   g_return_val_if_fail (GES_IS_PROJECT (project), FALSE);
 
   ret = g_hash_table_remove (project->priv->assets, ges_asset_get_id (asset));
-
   g_signal_emit (project, _signals[ASSET_REMOVED_SIGNAL], 0, asset);
 
   return ret;
@@ -866,3 +886,30 @@ ges_project_list_encoding_profiles (GESProject * project)
 
   return project->priv->encoding_profiles;
 }
+
+/**
+ * ges_project_get_loading_assets:
+ * @project: A #GESProject
+ *
+ * Get the assets that are being loaded
+ *
+ * Returns: (transfer full) (element-type GES.Asset): A set of loading asset
+ * that will be added to @project. Note that those Asset are *not* loaded yet,
+ * and thus can not be used
+ */
+GList *
+ges_project_get_loading_assets (GESProject * project)
+{
+  GHashTableIter iter;
+  gpointer key, value;
+
+  GList *ret = NULL;
+
+  g_return_val_if_fail (GES_IS_PROJECT (project), NULL);
+
+  g_hash_table_iter_init (&iter, project->priv->loading_assets);
+  while (g_hash_table_iter_next (&iter, &key, &value))
+    ret = g_list_prepend (ret, gst_object_ref (value));
+
+  return ret;
+}
index a47919b..86ef44c 100644 (file)
@@ -96,9 +96,12 @@ gboolean ges_project_create_asset  (GESProject * project,
                                     const gchar *id,
                                     GType extractable_type);
 
+GList * ges_project_get_loading_assets          (GESProject * project);
+
 gboolean ges_project_add_encoding_profile       (GESProject *project,
                                                  GstEncodingProfile *profile);
 const GList *ges_project_list_encoding_profiles (GESProject *project);
+
 G_END_DECLS
 
 #endif  /* _GES_PROJECT */
index 1b9c328..e6a131a 100644 (file)
@@ -259,7 +259,10 @@ new_asset_cb (GESAsset * source, GAsyncResult * res, NewAssetUData * udata)
         return;
       }
     }
-    GST_ERROR ("Asset could not be created for uri");
+
+    GST_ERROR ("Asset could not be created for uri %s, error: %s",
+        ges_asset_get_id (asset), error->message);
+
   } else {
     GESProject *project = udata->layer->timeline ?
         GES_PROJECT (ges_extractable_get_asset (GES_EXTRACTABLE
@@ -585,7 +588,7 @@ ges_timeline_layer_add_asset (GESTimelineLayer * layer,
   GST_DEBUG_OBJECT (layer, "Adding asset %s with: start: %" GST_TIME_FORMAT
       " inpoint: %" GST_TIME_FORMAT " duration: %" GST_TIME_FORMAT " rate %d"
       " track types: %d (%s)", ges_asset_get_id (asset), GST_TIME_ARGS (start),
-      GST_TIME_ARGS (inpoint), GST_TIME_ARGS (duration), track_types,
+      GST_TIME_ARGS (inpoint), GST_TIME_ARGS (duration), rate, track_types,
       ges_track_type_name (track_types));
 
   tlobj = GES_TIMELINE_OBJECT (ges_asset_extract (asset, NULL));
index d09f822..bc8059c 100644 (file)
@@ -294,6 +294,8 @@ GST_START_TEST (test_project_load_xges)
   GST_LOG ("Loading project");
   timeline = GES_TIMELINE (ges_asset_extract (GES_ASSET (project), NULL));
   fail_unless (GES_IS_TIMELINE (timeline));
+  assert_equals_int (g_list_length (ges_project_get_loading_assets (project)),
+      1);
 
   g_main_loop_run (mainloop);
   GST_LOG ("Test first loading");