ges/ges-track-transition.c: factor out code which produces video bin into a
authorBrandon Lewis <brandon.lewis@collabora.co.uk>
Fri, 28 May 2010 00:31:42 +0000 (02:31 +0200)
committerEdward Hervey <edward.hervey@collabora.co.uk>
Wed, 9 Jun 2010 09:28:09 +0000 (11:28 +0200)
seprate routine

ges/ges-track-transition.c

index 678a216db018866f2c4541d18ae61fdc3e15752b..2f41885d49d1bf2c0c6bedccdb29289b39e50734 100644 (file)
@@ -136,6 +136,80 @@ link_element_to_mixer_with_smpte (GstBin * bin, GstElement * element,
   return G_OBJECT (smptealpha);
 }
 
+static GstElement *
+create_video_bin (GESTrackTransition * self)
+{
+  GstElement *topbin = gst_bin_new ("transition-bin");
+  GstElement *iconva = gst_element_factory_make ("ffmpegcolorspace",
+      "tr-csp-a");
+  GstElement *iconvb = gst_element_factory_make ("ffmpegcolorspace",
+      "tr-csp-b");
+  GstElement *oconv = gst_element_factory_make ("ffmpegcolorspace",
+      "tr-csp-output");
+
+  gst_bin_add_many (GST_BIN (topbin), iconva, iconvb, oconv, NULL);
+
+  GObject *target = NULL;
+  gchar *propname = NULL;
+  GstElement *mixer = NULL;
+
+  mixer = gst_element_factory_make ("videomixer", NULL);
+  g_object_set (G_OBJECT (mixer), "background", 1, NULL);
+  gst_bin_add (GST_BIN (topbin), mixer);
+
+  if (self->type) {
+    link_element_to_mixer_with_smpte (GST_BIN (topbin), iconva, mixer,
+        self->type);
+    target = link_element_to_mixer_with_smpte (GST_BIN (topbin), iconvb,
+        mixer, self->type);
+    propname = "position";
+    self->start_value = 1.0;
+    self->end_value = 0.0;
+  } else {
+    link_element_to_mixer (iconva, mixer);
+    target = link_element_to_mixer (iconvb, mixer);
+    propname = "alpha";
+    self->start_value = 0.0;
+    self->end_value = 1.0;
+  }
+
+  gst_element_link (mixer, oconv);
+
+  GstPad *sinka_target = gst_element_get_static_pad (iconva, "sink");
+  GstPad *sinkb_target = gst_element_get_static_pad (iconvb, "sink");
+  GstPad *src_target = gst_element_get_static_pad (oconv, "src");
+
+  GstPad *sinka = gst_ghost_pad_new ("sinka", sinka_target);
+  GstPad *sinkb = gst_ghost_pad_new ("sinkb", sinkb_target);
+  GstPad *src = gst_ghost_pad_new ("src", src_target);
+
+  gst_element_add_pad (topbin, src);
+  gst_element_add_pad (topbin, sinka);
+  gst_element_add_pad (topbin, sinkb);
+
+  /* set up interpolation */
+
+  g_object_set (target, propname, (gfloat) 0.0, NULL);
+
+  GstController *controller;
+  controller = gst_object_control_properties (target, propname, NULL);
+  GstInterpolationControlSource *control_source;
+  control_source = gst_interpolation_control_source_new ();
+  gst_controller_set_control_source (controller,
+      propname, GST_CONTROL_SOURCE (control_source));
+  gst_interpolation_control_source_set_interpolation_mode (control_source,
+      GST_INTERPOLATE_LINEAR);
+
+  self->controller = controller;
+  self->control_source = control_source;
+
+  GST_LOG ("controller created, updating");
+  ges_track_transition_update_controller (self,
+      ((GESTrackObject *) self)->gnlobject);
+
+  return topbin;
+}
+
 static gboolean
 ges_track_transition_create_gnl_object (GESTrackObject * object)
 {
@@ -152,82 +226,14 @@ ges_track_transition_create_gnl_object (GESTrackObject * object)
       G_CALLBACK (gnlobject_duration_cb), object);
 
   if ((object->track->type) == GES_TRACK_TYPE_VIDEO) {
-    GstElement *topbin = gst_bin_new ("transition-bin");
-    GstElement *iconva = gst_element_factory_make ("ffmpegcolorspace",
-        "tr-csp-a");
-    GstElement *iconvb = gst_element_factory_make ("ffmpegcolorspace",
-        "tr-csp-b");
-    GstElement *oconv = gst_element_factory_make ("ffmpegcolorspace",
-        "tr-csp-output");
-
-    gst_bin_add_many (GST_BIN (topbin), iconva, iconvb, oconv, NULL);
-
-    GObject *target = NULL;
-    gchar *propname = NULL;
-    GstElement *mixer = NULL;
-
-    mixer = gst_element_factory_make ("videomixer", NULL);
-    g_object_set (G_OBJECT (mixer), "background", 1, NULL);
-    gst_bin_add (GST_BIN (topbin), mixer);
-
-    if (self->type) {
-      link_element_to_mixer_with_smpte (GST_BIN (topbin), iconva, mixer,
-          self->type);
-      target = link_element_to_mixer_with_smpte (GST_BIN (topbin), iconvb,
-          mixer, self->type);
-      propname = "position";
-      self->start_value = 1.0;
-      self->end_value = 0.0;
-    } else {
-      link_element_to_mixer (iconva, mixer);
-      target = link_element_to_mixer (iconvb, mixer);
-      propname = "alpha";
-      self->start_value = 0.0;
-      self->end_value = 1.0;
-    }
-
-    gst_element_link (mixer, oconv);
-
-    GstPad *sinka_target = gst_element_get_static_pad (iconva, "sink");
-    GstPad *sinkb_target = gst_element_get_static_pad (iconvb, "sink");
-    GstPad *src_target = gst_element_get_static_pad (oconv, "src");
-
-    GstPad *sinka = gst_ghost_pad_new ("sinka", sinka_target);
-    GstPad *sinkb = gst_ghost_pad_new ("sinkb", sinkb_target);
-    GstPad *src = gst_ghost_pad_new ("src", src_target);
-
-    gst_element_add_pad (topbin, src);
-    gst_element_add_pad (topbin, sinka);
-    gst_element_add_pad (topbin, sinkb);
-
-    gst_bin_add (GST_BIN (object->gnlobject), topbin);
-
-    /* set up interpolation */
-
-    g_object_set (target, propname, (gfloat) 0.0, NULL);
-
-    GstController *controller;
-    controller = gst_object_control_properties (target, propname, NULL);
-    GstInterpolationControlSource *control_source;
-    control_source = gst_interpolation_control_source_new ();
-    gst_controller_set_control_source (controller,
-        propname, GST_CONTROL_SOURCE (control_source));
-    gst_interpolation_control_source_set_interpolation_mode (control_source,
-        GST_INTERPOLATE_LINEAR);
-
-    self->controller = controller;
-    self->control_source = control_source;
-
-    GST_LOG ("controller created, updating");
-    ges_track_transition_update_controller (self, object->gnlobject);
-
+    gst_bin_add (GST_BIN (object->gnlobject), create_video_bin (self));
     return TRUE;
   }
 
   return FALSE;
-
 }
 
+
 static void
 ges_track_transition_class_init (GESTrackTransitionClass * klass)
 {