struct _GESProjectPrivate
{
GHashTable *assets;
+ /* Set of asset ID being loaded */
+ GHashTable *loading_assets;
GESAsset *formatter_asset;
GList *formatters;
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);
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 *
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));
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 *
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;
}
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);
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;
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;
+}
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
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));