mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 07:58:51 +00:00
ges: Rework the ges_pitivi_get_sources method
+ Remove the URI parameter of ges_pitivi_get_sources + Rework how we handle the PitiviFormatterPrivate.source_table HashTable rename it to sources_table to make a difference between it and the source_table(s) it containes
This commit is contained in:
parent
31430b1e0a
commit
10803b553d
4 changed files with 40 additions and 83 deletions
|
@ -681,9 +681,6 @@
|
||||||
(of-object "GESPitiviFormatter")
|
(of-object "GESPitiviFormatter")
|
||||||
(c-name "ges_pitivi_formatter_get_sources")
|
(c-name "ges_pitivi_formatter_get_sources")
|
||||||
(return-type "GList*")
|
(return-type "GList*")
|
||||||
(parameters
|
|
||||||
'("const-gchar*" "uri")
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
;; From ges-timeline-effect.h
|
;; From ges-timeline-effect.h
|
||||||
|
|
|
@ -194,21 +194,19 @@ _wrap_ges_pitivi_formatter_get_sources(PyGObject *self, PyObject *args, PyObject
|
||||||
{
|
{
|
||||||
const GList *l, *list;
|
const GList *l, *list;
|
||||||
PyObject *py_list;
|
PyObject *py_list;
|
||||||
gchar *uri;
|
|
||||||
|
|
||||||
g_return_val_if_fail (GES_IS_PITIVI_FORMATTER (self->obj),PyList_New(0));
|
g_return_val_if_fail (GES_IS_PITIVI_FORMATTER (self->obj),PyList_New(0));
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(args, "s:GES.TrackObject.lookup_child", &uri))
|
|
||||||
return FALSE;
|
|
||||||
pyg_begin_allow_threads;
|
pyg_begin_allow_threads;
|
||||||
list = ges_pitivi_formatter_get_sources (GES_PITIVI_FORMATTER (self->obj), uri);
|
list = ges_pitivi_formatter_get_sources (GES_PITIVI_FORMATTER (self->obj));
|
||||||
pyg_end_allow_threads;
|
pyg_end_allow_threads;
|
||||||
|
|
||||||
py_list = PyList_New(0);
|
py_list = PyList_New(0);
|
||||||
for (l = list; l; l = l->next) {
|
for (l = list; l; l = l->next) {
|
||||||
gchar * source = (gchar *)l->data;
|
gchar * source = (gchar *)l->data;
|
||||||
PyList_Append(py_list, PyString_FromString(source));
|
GST_ERROR ("Adding %s", source);
|
||||||
Py_DECREF(source);
|
PyList_Append(py_list, PyString_FromString(source));
|
||||||
|
Py_DECREF(source);
|
||||||
}
|
}
|
||||||
|
|
||||||
return py_list;
|
return py_list;
|
||||||
|
|
|
@ -32,7 +32,10 @@ struct _GESPitiviFormatterPrivate
|
||||||
xmlXPathContextPtr xpathCtx;
|
xmlXPathContextPtr xpathCtx;
|
||||||
|
|
||||||
/* {"sourceId" : {"prop": "value"}} */
|
/* {"sourceId" : {"prop": "value"}} */
|
||||||
GHashTable *source_table;
|
GHashTable *sources_table;
|
||||||
|
|
||||||
|
/* Used as a set of the uris */
|
||||||
|
GHashTable *source_uris;
|
||||||
|
|
||||||
/* {trackId: {"factory_ref": factoryId, ""}
|
/* {trackId: {"factory_ref": factoryId, ""}
|
||||||
* if effect:
|
* if effect:
|
||||||
|
@ -113,7 +116,12 @@ ges_pitivi_formatter_init (GESPitiviFormatter * self)
|
||||||
priv->layers_table =
|
priv->layers_table =
|
||||||
g_hash_table_new_full (g_int_hash, g_str_equal, g_free, g_object_unref);
|
g_hash_table_new_full (g_int_hash, g_str_equal, g_free, g_object_unref);
|
||||||
|
|
||||||
priv->source_table = NULL;
|
priv->sources_table =
|
||||||
|
g_hash_table_new_full (g_str_hash, g_str_equal, g_free,
|
||||||
|
(GDestroyNotify) g_hash_table_destroy);
|
||||||
|
|
||||||
|
priv->source_uris =
|
||||||
|
g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
|
||||||
|
|
||||||
/* Saving context */
|
/* Saving context */
|
||||||
priv->saving_source_table =
|
priv->saving_source_table =
|
||||||
|
@ -127,9 +135,8 @@ ges_pitivi_formatter_finalize (GObject * object)
|
||||||
GESPitiviFormatter *self = GES_PITIVI_FORMATTER (object);
|
GESPitiviFormatter *self = GES_PITIVI_FORMATTER (object);
|
||||||
GESPitiviFormatterPrivate *priv = GES_PITIVI_FORMATTER (self)->priv;
|
GESPitiviFormatterPrivate *priv = GES_PITIVI_FORMATTER (self)->priv;
|
||||||
|
|
||||||
if (priv->source_table != NULL) {
|
g_hash_table_destroy (priv->sources_table);
|
||||||
g_hash_table_destroy (priv->source_table);
|
g_hash_table_destroy (priv->source_uris);
|
||||||
}
|
|
||||||
|
|
||||||
g_hash_table_destroy (priv->saving_source_table);
|
g_hash_table_destroy (priv->saving_source_table);
|
||||||
|
|
||||||
|
@ -482,66 +489,18 @@ save_pitivi_timeline_to_uri (GESFormatter * formatter,
|
||||||
}
|
}
|
||||||
|
|
||||||
GList *
|
GList *
|
||||||
ges_pitivi_formatter_get_sources (GESPitiviFormatter * formatter, gchar * uri)
|
ges_pitivi_formatter_get_sources (GESPitiviFormatter * formatter)
|
||||||
{
|
{
|
||||||
GList *source_list = NULL;
|
GList *sources = NULL;
|
||||||
xmlXPathContextPtr xpathCtx;
|
GHashTableIter iter;
|
||||||
xmlDocPtr doc;
|
gpointer key, value;
|
||||||
xmlXPathObjectPtr xpathObj;
|
|
||||||
int size, j;
|
|
||||||
xmlNodeSetPtr nodes;
|
|
||||||
|
|
||||||
if (!(doc = xmlParseFile (uri))) {
|
g_hash_table_iter_init (&iter, formatter->priv->source_uris);
|
||||||
GST_ERROR ("The xptv file for uri %s was badly formed or did not exist",
|
while (g_hash_table_iter_next (&iter, &key, &value)) {
|
||||||
uri);
|
sources = g_list_prepend (sources, g_strdup (value));
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
xpathCtx = xmlXPathNewContext (doc);
|
return sources;
|
||||||
|
|
||||||
xpathObj = xmlXPathEvalExpression ((const xmlChar *)
|
|
||||||
"/pitivi/factories/sources/source", xpathCtx);
|
|
||||||
|
|
||||||
nodes = xpathObj->nodesetval;
|
|
||||||
|
|
||||||
size = (nodes) ? nodes->nodeNr : 0;
|
|
||||||
for (j = 0; j < size; ++j) {
|
|
||||||
xmlAttr *cur_attr;
|
|
||||||
gchar *name, *value;
|
|
||||||
xmlNodePtr node;
|
|
||||||
|
|
||||||
node = nodes->nodeTab[j];
|
|
||||||
for (cur_attr = node->properties; cur_attr; cur_attr = cur_attr->next) {
|
|
||||||
name = (gchar *) cur_attr->name;
|
|
||||||
value = (gchar *) xmlGetProp (node, cur_attr->name);
|
|
||||||
if (!g_strcmp0 (name, (gchar *) "filename"))
|
|
||||||
source_list = g_list_append (source_list, g_strdup (value));
|
|
||||||
xmlFree (value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
xmlXPathFreeObject (xpathObj);
|
|
||||||
|
|
||||||
xpathObj = xmlXPathEvalExpression ((const xmlChar *)
|
|
||||||
"/pitivi/factories/sources/unused_source", xpathCtx);
|
|
||||||
|
|
||||||
nodes = xpathObj->nodesetval;
|
|
||||||
|
|
||||||
size = (nodes) ? nodes->nodeNr : 0;
|
|
||||||
for (j = 0; j < size; ++j) {
|
|
||||||
xmlNodePtr node;
|
|
||||||
|
|
||||||
node = nodes->nodeTab[j];
|
|
||||||
source_list =
|
|
||||||
g_list_append (source_list,
|
|
||||||
g_strdup ((gchar *) xmlNodeGetContent (node)));
|
|
||||||
}
|
|
||||||
|
|
||||||
xmlXPathFreeObject (xpathObj);
|
|
||||||
|
|
||||||
xmlXPathFreeContext (xpathCtx);
|
|
||||||
xmlFreeDoc (doc);
|
|
||||||
return source_list;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Project loading functions */
|
/* Project loading functions */
|
||||||
|
@ -608,20 +567,16 @@ create_tracks (GESFormatter * self)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GHashTable *
|
static void
|
||||||
list_sources (GESFormatter * self)
|
list_sources (GESFormatter * self)
|
||||||
{
|
{
|
||||||
GESPitiviFormatterPrivate *priv = GES_PITIVI_FORMATTER (self)->priv;
|
GESPitiviFormatterPrivate *priv = GES_PITIVI_FORMATTER (self)->priv;
|
||||||
xmlXPathObjectPtr xpathObj;
|
xmlXPathObjectPtr xpathObj;
|
||||||
GHashTable *table, *sources_table;
|
GHashTable *table;
|
||||||
int size, j;
|
int size, j;
|
||||||
gchar *id;
|
gchar *id, *filename;
|
||||||
xmlNodeSetPtr nodes;
|
xmlNodeSetPtr nodes;
|
||||||
|
|
||||||
sources_table =
|
|
||||||
g_hash_table_new_full (g_str_hash, g_str_equal, g_free,
|
|
||||||
(GDestroyNotify) g_hash_table_destroy);
|
|
||||||
|
|
||||||
xpathObj = xmlXPathEvalExpression ((const xmlChar *)
|
xpathObj = xmlXPathEvalExpression ((const xmlChar *)
|
||||||
"/pitivi/factories/sources/source", priv->xpathCtx);
|
"/pitivi/factories/sources/source", priv->xpathCtx);
|
||||||
nodes = xpathObj->nodesetval;
|
nodes = xpathObj->nodesetval;
|
||||||
|
@ -630,11 +585,13 @@ list_sources (GESFormatter * self)
|
||||||
for (j = 0; j < size; ++j) {
|
for (j = 0; j < size; ++j) {
|
||||||
table = get_nodes_infos (nodes->nodeTab[j]);
|
table = get_nodes_infos (nodes->nodeTab[j]);
|
||||||
id = (gchar *) g_hash_table_lookup (table, (gchar *) "id");
|
id = (gchar *) g_hash_table_lookup (table, (gchar *) "id");
|
||||||
g_hash_table_insert (sources_table, g_strdup (id), table);
|
filename = (gchar *) g_hash_table_lookup (table, (gchar *) "filename");
|
||||||
|
g_hash_table_insert (priv->sources_table, g_strdup (id), table);
|
||||||
|
g_hash_table_insert (priv->source_uris, g_strdup (filename),
|
||||||
|
g_strdup (filename));
|
||||||
}
|
}
|
||||||
|
|
||||||
xmlXPathFreeObject (xpathObj);
|
xmlXPathFreeObject (xpathObj);
|
||||||
return sources_table;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
@ -1031,7 +988,7 @@ make_timeline_objects (GESFormatter * self)
|
||||||
gchar *fac_id = (gchar *) tmp->data;
|
gchar *fac_id = (gchar *) tmp->data;
|
||||||
|
|
||||||
reflist = g_hash_table_lookup (priv->timeline_objects_table, fac_id);
|
reflist = g_hash_table_lookup (priv->timeline_objects_table, fac_id);
|
||||||
source_table = g_hash_table_lookup (priv->source_table, fac_id);
|
source_table = g_hash_table_lookup (priv->sources_table, fac_id);
|
||||||
make_source (self, reflist, source_table);
|
make_source (self, reflist, source_table);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1076,7 +1033,7 @@ load_pitivi_file_from_uri (GESFormatter * self,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
priv->source_table = list_sources (self);
|
list_sources (self);
|
||||||
|
|
||||||
if (!parse_timeline_objects (self)) {
|
if (!parse_timeline_objects (self)) {
|
||||||
GST_ERROR ("Couldn't find timeline objects markup in the xptv file");
|
GST_ERROR ("Couldn't find timeline objects markup in the xptv file");
|
||||||
|
@ -1104,6 +1061,8 @@ pitivi_formatter_update_source_uri (GESFormatter * formatter,
|
||||||
{
|
{
|
||||||
GESTimelineObject *tlobj = GES_TIMELINE_OBJECT (tfs);
|
GESTimelineObject *tlobj = GES_TIMELINE_OBJECT (tfs);
|
||||||
GESTimelineLayer *layer = ges_timeline_object_get_layer (tlobj);
|
GESTimelineLayer *layer = ges_timeline_object_get_layer (tlobj);
|
||||||
|
const gchar *uri = ges_timeline_filesource_get_uri (tfs);
|
||||||
|
GESPitiviFormatterPrivate *priv = GES_PITIVI_FORMATTER (formatter)->priv;
|
||||||
gboolean ret;
|
gboolean ret;
|
||||||
|
|
||||||
/*Keep a ref to it as we don't want it to be destroyed! */
|
/*Keep a ref to it as we don't want it to be destroyed! */
|
||||||
|
@ -1114,6 +1073,9 @@ pitivi_formatter_update_source_uri (GESFormatter * formatter,
|
||||||
g_object_set (tfs, "uri", new_uri, NULL);
|
g_object_set (tfs, "uri", new_uri, NULL);
|
||||||
ret = ges_timeline_layer_add_object (layer, tlobj);
|
ret = ges_timeline_layer_add_object (layer, tlobj);
|
||||||
|
|
||||||
|
/* FIXME handle the case of source uri updated more than 1 time */
|
||||||
|
g_hash_table_insert (priv->source_uris, g_strdup (uri), g_strdup (new_uri));
|
||||||
|
|
||||||
/* We do not need our reference anymore */
|
/* We do not need our reference anymore */
|
||||||
g_object_unref (tlobj);
|
g_object_unref (tlobj);
|
||||||
|
|
||||||
|
|
|
@ -58,6 +58,6 @@ GESPitiviFormatter *ges_pitivi_formatter_new (void);
|
||||||
|
|
||||||
gboolean ges_pitivi_formatter_set_sources (GESPitiviFormatter * formatter, GList * uris);
|
gboolean ges_pitivi_formatter_set_sources (GESPitiviFormatter * formatter, GList * uris);
|
||||||
|
|
||||||
GList * ges_pitivi_formatter_get_sources(GESPitiviFormatter * formatter, gchar * uri);
|
GList * ges_pitivi_formatter_get_sources(GESPitiviFormatter * formatter);
|
||||||
|
|
||||||
#endif /* _GES_PITIVI_FORMATTER */
|
#endif /* _GES_PITIVI_FORMATTER */
|
||||||
|
|
Loading…
Reference in a new issue