hacking
authorBrandon Lewis <brandon.lewis@collabora.co.uk>
Tue, 25 May 2010 11:44:57 +0000 (13:44 +0200)
committerEdward Hervey <edward.hervey@collabora.co.uk>
Wed, 9 Jun 2010 09:28:07 +0000 (11:28 +0200)
docs/libs/ges-sections.txt
ges/ges-timeline-layer.c
ges/ges-timeline-transition.c
ges/ges-track-transition.c
tests/examples/transition.c

index 63b447b1090ba2166289106d5cd839004c643e50..2b78b59c58996657ac729bc57815ca543b1a8c48 100644 (file)
@@ -89,6 +89,20 @@ GES_IS_TRACK_FILESOURCE_CLASS
 ges_track_filesource_get_type
 </SECTION>
 
+<SECTION>
+<FILE>ges-track-transition</FILE>
+<TITLE>GESTrackTransition</TITLE>
+GESTrackTransition
+GESTrackTransitionClass
+GES_IS_TRACK_TRANSITION
+GES_IS_TRACK_TRANSITION_CLASS
+GES_TRACK_TRANSITION
+GES_TRACK_TRANSITION_CLASS
+GES_TRACK_TRANSITION_GET_CLASS
+GES_TYPE_TRACK_TRANSITION
+ges_track_transition_get_type
+ges_track_transition_new
+</SECTION>
 
 
 <SECTION>
@@ -257,7 +271,6 @@ GES_IS_CUSTOM_TIMELINE_SOURCE_CLASS
 GES_TYPE_CUSTOM_TIMELINE_SOURCE
 </SECTION>
 
-
 <SECTION>
 <FILE>ges-simple-timeline-layer</FILE>
 <TITLE>GESSimpleTimelineLayer</TITLE>
index 4aa57d21629643998c67d4e1a8af48b9bac91f00..663ddb1775cb8075ce2d409da99eccf3602707ee 100644 (file)
@@ -224,7 +224,13 @@ ges_timeline_layer_add_object (GESTimelineLayer * layer,
   ges_timeline_object_set_layer (object, layer);
 
   /* Set the priority. */
-  ges_timeline_object_set_priority (object, layer->min_gnl_priority);
+  if (GES_TIMELINE_OBJECT_PRIORITY (object) > (layer->max_gnl_priority)) {
+    ges_timeline_object_set_priority (object, layer->max_gnl_priority);
+  }
+
+  else if (GES_TIMELINE_OBJECT_PRIORITY (object) < (layer->min_gnl_priority)) {
+    ges_timeline_object_set_priority (object, layer->min_gnl_priority);
+  }
 
   /* emit 'object-added' */
   g_signal_emit (layer, ges_timeline_layer_signals[OBJECT_ADDED], 0, object);
index 67e40e167a7ee7316972bf52e4e779893f124f86..ec29f4957aee445cf9c8c38e8f333cfbc9ea330d 100644 (file)
 
 #include "ges-internal.h"
 #include "ges-timeline-transition.h"
+#include "ges-track-transition.h"
 
 G_DEFINE_TYPE (GESTimelineTransition, ges_timeline_transition,
     GES_TYPE_TIMELINE_OBJECT);
 
+static GESTrackObject *ges_tl_transition_create_track_object (GESTimelineObject
+    *, GESTrack *);
+
 static void
 ges_timeline_transition_get_property (GObject * object,
     guint property_id, GValue * value, GParamSpec * pspec)
@@ -65,11 +69,15 @@ static void
 ges_timeline_transition_class_init (GESTimelineTransitionClass * klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GESTimelineObjectClass *timobj_class = GES_TIMELINE_OBJECT_CLASS (klass);
 
   object_class->get_property = ges_timeline_transition_get_property;
   object_class->set_property = ges_timeline_transition_set_property;
   object_class->dispose = ges_timeline_transition_dispose;
   object_class->finalize = ges_timeline_transition_finalize;
+
+  timobj_class->create_track_object = ges_tl_transition_create_track_object;
+  timobj_class->need_fill_track = FALSE;
 }
 
 static void
@@ -77,6 +85,20 @@ ges_timeline_transition_init (GESTimelineTransition * self)
 {
 }
 
+static GESTrackObject *
+ges_tl_transition_create_track_object (GESTimelineObject * obj,
+    GESTrack * track)
+{
+  GESTimelineTransition *transition = (GESTimelineTransition *) obj;
+  GESTrackObject *res;
+
+  GST_DEBUG ("Creating a GESTrackTransition");
+
+  res = GES_TRACK_OBJECT (ges_track_transition_new ());
+
+  return res;
+}
+
 GESTimelineTransition *
 ges_timeline_transition_new (void)
 {
index 6ababc77c803744b12008df523a32477be6799db..33bd2b03e934f6e473b700538c123ab29458313a 100644 (file)
@@ -56,12 +56,64 @@ ges_track_transition_finalize (GObject * object)
   G_OBJECT_CLASS (ges_track_transition_parent_class)->dispose (object);
 }
 
+GstPad *
+link_element_to_mixer (GstElement * element, GstElement * mixer)
+{
+  GstPad *sinkpad = gst_element_get_request_pad (mixer, "sink_%d");
+  GstPad *srcpad = gst_element_get_static_pad (element, "src");
+
+  g_assert (sinkpad);
+  g_assert (srcpad);
+
+  gst_pad_link (srcpad, sinkpad);
+
+  return sinkpad;
+}
+
 static gboolean
 ges_track_transition_create_gnl_object (GESTrackObject * object)
 {
-  object->gnlobject = gst_element_factory_make ("gnloperation", NULL);
+  object->gnlobject = gst_element_factory_make ("gnloperation",
+      "transition-operation");
+  g_object_set (object->gnlobject, "priority", 0, NULL);
+
+  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");
+    GstElement *mixer = gst_element_factory_make ("videomixer", NULL);
+
+    gst_bin_add_many (GST_BIN (topbin), iconva, iconvb, mixer, oconv, NULL);
+    GstPad *a_pad = link_element_to_mixer (iconva, mixer);
+    GstPad *b_pad = link_element_to_mixer (iconvb, mixer);
+    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);
+
+    //g_object_set(a_pad, "alpha", 0.5, NULL);
+    g_object_set (b_pad, "alpha", 0.5, NULL);
+
+    return TRUE;
+  }
+
+  return FALSE;
 
-  return TRUE;
 }
 
 static void
index bbc5b9ae5d833575b3c09937c53e281f82da1bae..548d240d1c06d239e754ce28da13705c13fe35d4 100644 (file)
@@ -46,6 +46,41 @@ notify_max_duration_cb (GObject * object)
   g_print ("got here\n");
 }
 
+GESTimelineObject *
+make_source (char *path, guint64 start, guint64 duration, gint priority)
+{
+  char *uri = g_strdup_printf ("file://%s", path);
+
+  GESTimelineObject *ret =
+      GES_TIMELINE_OBJECT (ges_timeline_filesource_new (uri));
+
+  g_object_set (ret, "start", start, "duration", duration,
+      "priority", priority, "in-point", 0, NULL);
+
+  g_free (uri);
+
+  return ret;
+}
+
+gboolean
+print_transition_data (GESTimelineObject * tr)
+{
+  if (!tr)
+    return FALSE;
+
+  GESTrackObject *trackobj = GES_TRACK_OBJECT (tr->trackobjects->data);
+  GstElement *gnlobj = trackobj->gnlobject;
+  guint64 start, duration;
+  gint priority;
+  char *name;
+
+  g_object_get (gnlobj, "start", &start, "duration", &duration,
+      "priority", &priority, "name", &name, NULL);
+  g_print ("gnlobject for %s: %ld %ld %d\n", name, start, duration, priority);
+
+  return FALSE;
+}
+
 int
 main (int argc, char **argv)
 {
@@ -55,8 +90,7 @@ main (int argc, char **argv)
   GESTimeline *timeline;
   GESTrack *trackv;
   GESTimelineLayer *layer1;
-  GESTimelineFileSource *srca, *srcb;
-  GESCustomTimelineSource *src;
+  GESTimelineObject *srca, *srcb;
   GMainLoop *mainloop;
   gint type;
   gchar *uri = NULL;
@@ -87,6 +121,8 @@ main (int argc, char **argv)
     exit (0);
   }
 
+  guint64 tdur = (guint64) transition_duration * GST_SECOND;
+
   g_option_context_free (ctx);
 
   ges_init ();
@@ -101,42 +137,30 @@ main (int argc, char **argv)
   ges_timeline_add_track (timeline, trackv);
 
   layer1 = GES_TIMELINE_LAYER (ges_timeline_layer_new ());
-  g_object_set (layer1, "priority", 1, NULL);
+  g_object_set (layer1, "priority", 0, NULL);
 
   if (!ges_timeline_add_layer (timeline, layer1))
     return -1;
 
-  uri = g_strdup_printf ("file://%s", argv[1]);
-  srca = ges_timeline_filesource_new (uri);
-
   guint64 aduration = (guint64) (atof (argv[2]) * GST_SECOND);
-  g_object_set (srca, "start", 0, "duration", aduration, NULL);
-  g_signal_connect (srca, "notify::max_duration",
-      G_CALLBACK (notify_max_duration_cb), NULL);
-
-  g_free (uri);
-
-  uri = g_strdup_printf ("file://%s", argv[3]);
-  srcb = ges_timeline_filesource_new (uri);
   guint64 bduration = (guint64) (atof (argv[4]) * GST_SECOND);
-  g_object_set (srcb, "start", aduration, "duration", bduration, NULL);
-  g_signal_connect (srcb, "notify::max_duration",
-      G_CALLBACK (notify_max_duration_cb), NULL);
-
-  g_free (uri);
-
-  ges_timeline_layer_add_object (layer1, GES_TIMELINE_OBJECT (srca));
-  ges_timeline_layer_add_object (layer1, GES_TIMELINE_OBJECT (srcb));
+  guint64 tstart = aduration - tdur;
+  srca = make_source (argv[1], 0, aduration, 1);
+  srcb = make_source (argv[3], tstart, bduration, 2);
+  ges_timeline_layer_add_object (layer1, srca);
+  ges_timeline_layer_add_object (layer1, srcb);
+  g_timeout_add_seconds (1, (GSourceFunc) print_transition_data, srca);
+  g_timeout_add_seconds (1, (GSourceFunc) print_transition_data, srcb);
 
-  GESTimelineTransition *tr;
+  GESTimelineTransition *tr = NULL;
 
-  guint64 tdur = (guint64) transition_duration * GST_SECOND;
   if (tdur != 0) {
-    g_print ("creating transition of %f duration (%ld ns)",
-        transition_duration, tdur);
+    g_print ("creating transition at %ld of %f duration (%ld ns)\n",
+        tstart, transition_duration, tdur);
     tr = ges_timeline_transition_new ();
+    g_object_set (tr, "start", tstart, "duration", tdur, "in-point", 0, NULL);
     ges_timeline_layer_add_object (layer1, GES_TIMELINE_OBJECT (tr));
-    g_object_set (tr, "start", aduration - tdur, "duration", tdur, NULL);
+    g_timeout_add_seconds (1, (GSourceFunc) print_transition_data, tr);
   }
 
   mainloop = g_main_loop_new (NULL, FALSE);