track-object: Add method to copy a TrackObject
authorThibault Saunier <thibault.saunier@collabora.com>
Thu, 19 Apr 2012 04:34:59 +0000 (00:34 -0400)
committerThibault Saunier <thibault.saunier@collabora.com>
Tue, 24 Apr 2012 00:25:08 +0000 (20:25 -0400)
API: ges_track_object_copy

ges/ges-internal.h
ges/ges-track-object.c

index a104dae0d9e9433a5edb0f0fa74bf6b9dcb0af64..192ca93fe0fe94060dc4389e2f2a8e012ffb59b1 100644 (file)
 #define __GES_INTERNAL_H__
 
 #include <gst/gst.h>
+#include "ges-track-object.h"
 
 GST_DEBUG_CATEGORY_EXTERN (_ges_debug);
 #define GST_CAT_DEFAULT _ges_debug
 
+GESTrackObject *
+ges_track_object_copy (GESTrackObject * object, gboolean deep);
+
 #endif /* __GES_INTERNAL_H__ */
index 7318f96d4dac96acfec1cdd4c034dd6c8e849b5f..be21798046e9ee8718f1e62a94fcbb4509110470 100644 (file)
@@ -1498,3 +1498,49 @@ ges_track_object_set_max_duration (GESTrackObject * object, guint64 maxduration)
 
   object->priv->maxduration = maxduration;
 }
+
+GESTrackObject *
+ges_track_object_copy (GESTrackObject * object, gboolean deep)
+{
+  GESTrackObject *ret = NULL;
+  GParameter *params;
+  GParamSpec **specs;
+  guint n, n_specs, n_params;
+  GValue val = { 0 };
+
+  g_return_val_if_fail (GES_IS_TRACK_OBJECT (object), NULL);
+
+  specs =
+      g_object_class_list_properties (G_OBJECT_GET_CLASS (object), &n_specs);
+  params = g_new0 (GParameter, n_specs);
+  n_params = 0;
+
+  for (n = 0; n < n_specs; ++n) {
+    if (g_strcmp0 (specs[n]->name, "parent") &&
+        (specs[n]->flags & G_PARAM_READWRITE) == G_PARAM_READWRITE) {
+      params[n_params].name = g_intern_string (specs[n]->name);
+      g_value_init (&params[n_params].value, specs[n]->value_type);
+      g_object_get_property (G_OBJECT (object), specs[n]->name,
+          &params[n_params].value);
+      ++n_params;
+    }
+  }
+
+  ret = g_object_newv (G_TYPE_FROM_INSTANCE (object), n_params, params);
+  g_free (specs);
+  g_free (params);
+
+  if (deep == FALSE)
+    return ret;
+
+  ensure_gnl_object (ret);
+  specs = ges_track_object_list_children_properties (object, &n_specs);
+  for (n = 0; n < n_specs; ++n) {
+    g_value_init (&val, specs[n]->value_type);
+    g_object_get_property (G_OBJECT (object), specs[n]->name, &val);
+    ges_track_object_set_child_property_by_pspec (ret, specs[n], &val);
+    g_value_unset (&val);
+  }
+
+  return ret;
+}