title: Video Transitions with GStreamer & GNonLin not working
body: <p>I've been trying to combine 2 videos together with gstreamer with a
  short transition (like smpte) between them using gstreamer &amp; gnonlin in python. However I can't get the gnloperation/smpte transition to work.</p>
  
  <h1>Goal</h1>
  
  <p>Below is a programme. I want it to play the first 4 sec of one file, and at 2 sec to start doing a smpte transition (that lasts for 2 seconds) to another file. (so the second file will start playing 2 seconds into the whole thing but be 'revealed' over the course of the 2 second transition), and after the transition is finished, the 2 sec of the 2nd file on it's own should be shown.</p>
  
  <p>This is based on <a href="http://notes.brooks.nu/gstreamer-video-crossfade-example/" rel="nofollow">another gstreamer/gnonlin script in python</a>. I have asked this question on <a href="http://lists.freedesktop.org/archives/gstreamer-devel/2011-July/032410.html" rel="nofollow">the gstreamer-devel list</a> (and <a href="http://lists.freedesktop.org/archives/gstreamer-devel/2011-July/032446.html" rel="nofollow">again</a>), and am trying here.</p>
  
  <h1>Problem</h1>
  
  <p>The transition doesn't finish. The transition runs for about 0.5 seconds, then video 1 plays for ~ 1.5 sec and then video 2 cuts in. I've tried changing the end position of the controller (e.g. to <code>controller.set("position", 0.5 * gst.SECOND, 0.0)</code>), and the
  transition completes in the 0.5 sec, but as soon as the transition finish, video 1 starts playing again for a little bit, then video 2 starts playing.</p>
  
  <p>Thinking that maybe the video transition is limited to 0.5 sec, I changed the gnloperation to 0.5 sec, however the same non-finishing problem persists, except that the transition only plays for about 0.3 sec, and part of the way through video 1 kicks in for a little bit, and then video 2 plays.</p>
  
  <h1>Script</h1>
  
  <pre><code>#! /usr/bin/python
  import gst, gobject
  gobject.threads_init()
  
  comp  = gst.element_factory_make("gnlcomposition", "composition")
  
  gsrc1 = gst.element_factory_make("gnlfilesource")
  gsrc1.props.location = "file:///home/rory/helmetcam/dingle-tom/vshort01.mov"
  gsrc1.props.start          = 0
  gsrc1.props.duration       = 4 * gst.SECOND
  gsrc1.props.media_start    = 0
  gsrc1.props.media_duration = 4 * gst.SECOND
  gsrc1.props.priority       = 3
  comp.add(gsrc1)
  
  
  gsrc2 = gst.element_factory_make("gnlfilesource")
  gsrc2.props.location = "file:///home/rory/helmetcam/dingle-tom/vshort02.mov"
  gsrc2.props.start          = 2 * gst.SECOND
  gsrc2.props.duration       = 6 * gst.SECOND
  gsrc2.props.media_start    = 0
  gsrc2.props.media_duration = 2 * gst.SECOND
  gsrc2.props.priority       = 2
  comp.add(gsrc2)
  
  
  bin = gst.Bin()
  alpha1 = gst.element_factory_make("alpha")
  queue = gst.element_factory_make("queue")
  smpte  = gst.element_factory_make("smptealpha")
  smpte.props.type = 21
  mixer  = gst.element_factory_make("videomixer")
  
  bin.add(alpha1, queue, smpte, mixer)
  alpha1.link(mixer)
  queue.link(smpte)
  smpte.link(mixer)
  
  controller = gst.Controller(smpte, "position")
  controller.set_interpolation_mode("position", gst.INTERPOLATE_LINEAR)
  controller.set("position", 0, 1.0)
  controller.set("position", 2.0 * gst.SECOND, 0.0)
  
  bin.add_pad(gst.GhostPad("sink1", alpha1.get_pad("sink")))
  bin.add_pad(gst.GhostPad("sink2", queue.get_pad("sink")))
  bin.add_pad(gst.GhostPad("src",   mixer.get_pad("src")))
  
  op = gst.element_factory_make("gnloperation")
  op.add(bin)
  op.props.start          = 2 * gst.SECOND
  op.props.duration       = 2 * gst.SECOND
  op.props.media_start    = 0
  op.props.media_duration = 2 * gst.SECOND
  op.props.priority       = 1
  comp.add(op)
  
  # create the backend
  color= gst.element_factory_make("ffmpegcolorspace")
  enc = gst.element_factory_make("theoraenc")
  mux = gst.element_factory_make("oggmux")
  sink = gst.element_factory_make("filesink")
  sink.props.location = "./transitions-between-two.ogv"
  pipeline = gst.Pipeline()
  pipeline.add(comp, color, enc, mux, sink)
  color.link(enc)
  enc.link(mux)
  mux.link(sink)
  
  def on_pad(comp, pad, elements):
      convpad = elements.get_compatible_pad(pad, pad.get_caps())
      pad.link(convpad)
  comp.connect("pad-added", on_pad, color)
  
  # now run the pipeline
  loop = gobject.MainLoop(is_running=True)
  bus = pipeline.get_bus()
  bus.add_signal_watch()
  def on_message(bus, message, loop):
      if message.type == gst.MESSAGE_EOS:
          loop.quit()
      elif message.type == gst.MESSAGE_ERROR:
          print message
          loop.quit()
  bus.connect("message", on_message, loop)
  pipeline.set_state(gst.STATE_PLAYING)
  loop.run()
  pipeline.set_state(gst.STATE_NULL)
  </code></pre>