[pitivi] Add video mixing support, needs some more loving though



commit 38397c0c90019c884cfadfeb3e8b2e2c47a59e58
Author: Edward Hervey <bilboed bilboed com>
Date:   Mon Jun 29 19:18:15 2009 +0200

    Add video mixing support, needs some more loving though

 pitivi/elements/mixer.py |   67 ++++++++++++++++++++++++++++++++++++++++++++++
 pitivi/timeline/track.py |    9 +++++-
 2 files changed, 75 insertions(+), 1 deletions(-)
---
diff --git a/pitivi/elements/mixer.py b/pitivi/elements/mixer.py
index c8908a3..75c4da9 100644
--- a/pitivi/elements/mixer.py
+++ b/pitivi/elements/mixer.py
@@ -107,3 +107,70 @@ class SmartAdderBin(gst.Bin):
 
 gobject.type_register(SmartAdderBin)
 gst.element_register(SmartAdderBin, 'smart-adder-bin')
+
+class SmartVideomixerBin(gst.Bin):
+
+    __gstdetails__ = (
+        "Smart Videomixer",
+        "Generic/Video",
+        "Convenience wrapper around videomixer, accepts anything",
+        "Edward Hervey <bilboed bilboed com>"
+        )
+
+    __gsttemplates__ = (
+        gst.PadTemplate("src", gst.PAD_SRC, gst.PAD_ALWAYS,
+                        gst.Caps("video/x-raw-yuv;video/x-raw-rgb")),
+        gst.PadTemplate("sink_%u", gst.PAD_SINK, gst.PAD_REQUEST,
+                        gst.Caps("video/x-raw-yuv;video/x-raw-rgb"))
+
+        )
+
+    def __init__(self):
+        gst.Bin.__init__(self)
+        self.videomixer = gst.element_factory_make("videomixer", "real-videomixer")
+        # FIXME : USE THE PROJECT SETTINGS FOR THESE CAPS !
+        csp = gst.element_factory_make("ffmpegcolorspace")
+        self.add(self.videomixer, csp)
+        self.videomixer.link(csp)
+        srcpad = gst.GhostPad("src", csp.get_pad("src"))
+        srcpad.set_active(True)
+        self.add_pad(srcpad)
+        self.pad_count = 0
+        self.inputs = {} # key:pad_name, value:(sinkpad, ffmpegcolorspace, videomixerpad)
+
+    def do_request_new_pad(self, template, name=None):
+        self.debug("template:%r, name:%r" % (template, name))
+        if name == None:
+            name = "sink_%u" % self.pad_count
+        if name in self.inputs.keys():
+            return None
+
+        csp = gst.element_factory_make("ffmpegcolorspace", "csp-%d" % self.pad_count)
+
+        self.add(csp)
+        csp.sync_state_with_parent()
+        videomixerpad = self.videomixer.get_request_pad("sink_%d")
+        csp.get_pad("src").link(videomixerpad)
+
+        pad = gst.GhostPad(name, csp.get_pad("sink"))
+        pad.set_active(True)
+        self.add_pad(pad)
+        self.inputs[name] = (pad, csp, videomixerpad)
+        self.pad_count += 1
+        return pad
+
+    def do_release_pad(self, pad):
+        self.debug("pad:%r" % pad)
+        name = pad.get_name()
+        if name in self.inputs.keys():
+            sinkpad, csp, videomixerpad = self.inputs.pop(name)
+            self.remove_pad(sinkpad)
+            csp.get_pad("src").unlink(videomixerpad)
+            self.videomixer.release_request_pad(videomixerpad)
+            csp.set_state(gst.STATE_NULL)
+            self.remove(csp)
+        self.debug("done")
+
+
+gobject.type_register(SmartVideomixerBin)
+gst.element_register(SmartVideomixerBin, 'smart-videomixer-bin')
diff --git a/pitivi/timeline/track.py b/pitivi/timeline/track.py
index 4c338ae..aaf5a49 100644
--- a/pitivi/timeline/track.py
+++ b/pitivi/timeline/track.py
@@ -28,7 +28,7 @@ from pitivi.log.loggable import Loggable
 from pitivi.stream import VideoStream, AudioStream
 from pitivi.factories.test import VideoTestSourceFactory, \
         AudioTestSourceFactory
-from pitivi.elements.mixer import SmartAdderBin
+from pitivi.elements.mixer import SmartAdderBin, SmartVideomixerBin
 
 class TrackError(Exception):
     pass
@@ -653,6 +653,13 @@ class Track(Signallable):
             gnl.props.expandable = True
             gnl.props.priority = 0
             return gnl
+        elif isinstance(stream, VideoStream):
+            gnl = gst.element_factory_make("gnloperation", "top-level-video-mixer")
+            m = SmartVideomixerBin()
+            gnl.add(m)
+            gnl.props.expandable = True
+            gnl.props.priority = 0
+            return gnl
         return None
 
     def _getStart(self):



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]