add create_element vmethod to GESTrackTransition
authorBrandon Lewis <brandon@collabora.co.uk>
Fri, 18 Jun 2010 10:55:30 +0000 (12:55 +0200)
committerEdward Hervey <edward.hervey@collabora.co.uk>
Fri, 9 Jul 2010 11:21:11 +0000 (13:21 +0200)
ges/ges-track-transition.c
ges/ges-track-transition.h

index 0a11559..436f3ee 100644 (file)
@@ -31,6 +31,9 @@
 
 G_DEFINE_TYPE (GESTrackTransition, ges_track_transition, GES_TYPE_TRACK_OBJECT);
 
+GstElement *ges_track_transition_create_element (GESTrackTransition * self,
+    GESTrack * track);
+
 static void
 ges_track_transition_update_vcontroller (GESTrackTransition * self,
     GstElement * gnlobj)
@@ -418,11 +421,16 @@ create_audio_bin (GESTrackTransition * self)
 static gboolean
 ges_track_transition_create_gnl_object (GESTrackObject * object)
 {
-  GESTrackTransition *self = GES_TRACK_TRANSITION (object);
-
+  GESTrackTransition *self;
+  GESTrackTransitionClass *klass;
+  GstElement *element;
+  gchar *name;
   static gint tnum = 0;
 
-  gchar *name = g_strdup_printf ("transition-operation%d", tnum++);
+  self = GES_TRACK_TRANSITION (object);
+  klass = GES_TRACK_TRANSITION_GET_CLASS (object);
+
+  name = g_strdup_printf ("transition-operation%d", tnum++);
   object->gnlobject = gst_element_factory_make ("gnloperation", name);
   g_free (name);
 
@@ -430,18 +438,27 @@ ges_track_transition_create_gnl_object (GESTrackObject * object)
   g_signal_connect (G_OBJECT (object->gnlobject), "notify::duration",
       G_CALLBACK (gnlobject_duration_cb), object);
 
-  if ((object->track->type) == GES_TRACK_TYPE_VIDEO) {
-    gst_bin_add (GST_BIN (object->gnlobject), create_video_bin (self));
-    return TRUE;
-  }
+  element = klass->create_element (self, object->track);
+  if (!GST_IS_ELEMENT (element))
+    return FALSE;
 
-  else if ((object->track->type) == GES_TRACK_TYPE_AUDIO) {
-    gst_bin_add (GST_BIN (object->gnlobject), create_audio_bin (self));
-    return TRUE;
+  gst_bin_add (GST_BIN (object->gnlobject), element);
+  return TRUE;
+}
+
+GstElement *
+ges_track_transition_create_element (GESTrackTransition * self,
+    GESTrack * track)
+{
+  if ((track->type) == GES_TRACK_TYPE_VIDEO) {
+    return create_video_bin (self);
   }
 
-  return FALSE;
+  else if ((track->type) == GES_TRACK_TYPE_AUDIO) {
+    return create_audio_bin (self);
+  }
 
+  return gst_element_factory_make ("identity", "invalid-track-type");
 }
 
 static void
@@ -456,6 +473,7 @@ ges_track_transition_class_init (GESTrackTransitionClass * klass)
   object_class->finalize = ges_track_transition_finalize;
 
   track_class->create_gnl_object = ges_track_transition_create_gnl_object;
+  klass->create_element = ges_track_transition_create_element;
 }
 
 static void
index b22c9fe..0da0318 100644 (file)
@@ -22,6 +22,7 @@
 #define _GES_TRACK_TRANSITION
 
 #include <glib-object.h>
+#include <gst/gst.h>
 #include <gst/controller/gstcontroller.h>
 #include <gst/controller/gstinterpolationcontrolsource.h>
 #include <ges/ges-types.h>
@@ -47,7 +48,7 @@ G_BEGIN_DECLS
 
 #define GES_TRACK_TRANSITION_GET_CLASS(obj) \
     (G_TYPE_INSTANCE_GET_CLASS ((obj), GES_TYPE_TRACK_TRANSITION,\
-        GESTrackTransitionClass)
+        GESTrackTransitionClass))
 
 /**
  * GESTrackTransition:
@@ -101,6 +102,7 @@ struct _GESTrackTransition
 struct _GESTrackTransitionClass {
     GESTrackObjectClass parent_class;
     /* <public> */
+    GstElement* (*create_element) (GESTrackTransition *self, GESTrack *track);
 };
 
 GType ges_track_transition_get_type (void);