summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--voctocore/videomix.py48
1 files changed, 42 insertions, 6 deletions
diff --git a/voctocore/videomix.py b/voctocore/videomix.py
index e67a7b1..8cc3cb9 100644
--- a/voctocore/videomix.py
+++ b/voctocore/videomix.py
@@ -1,4 +1,4 @@
-import sys, inspect
+import sys, inspect, math
from pprint import pprint
from gi.repository import GLib, Gst
@@ -11,15 +11,27 @@ class Videomix:
# create audio and video mixer
mixerbin = self.createMixer()
- self.pipeline.add(mixerbin)
+
+ # collection of video-sources to connect to the quadmix
+ quadmixSources = []
# create camera sources
for camberabin in self.createDummyCamSources():
- # link camerasource to the mixers
- self.pipeline.add(camberabin)
- camberabin.get_by_name('video_src').link(self.pipeline.get_by_name('livevideo'))
+ # link camerasource to audiomixer
camberabin.get_by_name('audio_src').link(self.pipeline.get_by_name('liveaudio'))
+ # inject a ×2 distributor and link one end to the live-mixer
+ distributor = self.createDistributor(camberabin.get_by_name('video_src'))
+ distributor.get_by_name('a').link(self.pipeline.get_by_name('livevideo'))
+
+ # collect the other end to add it later to the quadmix
+ quadmixSources.append(distributor.get_by_name('b'))
+
+ # would generate pause & slides with another generator which only
+ # yields if the respective fil are there and which only have a video-pad
+
+ self.addVideosToQuadmix(quadmixSources, self.pipeline.get_by_name('quadmix'))
+
# demonstrate some control
liveaudio = self.pipeline.get_by_name('liveaudio')
liveaudio.set_property('active-pad', liveaudio.get_static_pad('sink_0'))
@@ -31,11 +43,33 @@ class Videomix:
self.pipeline.set_state(Gst.State.PLAYING)
def createMixer(self):
- return Gst.parse_bin_from_description("""
+ mixerbin = Gst.parse_bin_from_description("""
videomixer name=livevideo ! autovideosink
input-selector name=liveaudio ! autoaudiosink
+
+ videomixer name=quadmix ! autovideosink
+ """, False)
+ self.pipeline.add(mixerbin)
+ return mixerbin
+
+ def addVideosToQuadmix(self, videosources, quadmix):
+ count = len(videosources)
+ rows = math.ceil(math.sqrt(count))
+ cols = math.ceil(count / rows)
+ for videosource in videosources:
+ # define size somewhere, scale and place here
+ videosource.link(quadmix)
+
+ def createDistributor(self, videosource):
+ distributor = Gst.parse_bin_from_description("""
+ tee name=t
+ t. ! queue name=a
+ t. ! queue name=b
""", False)
+ self.pipeline.add(distributor)
+ videosource.link(distributor.get_by_name('t'))
+ return distributor
def createDummyCamSources(self):
uris = ('file:///home/peter/122.mp4', 'file:///home/peter/10025.mp4',)
@@ -51,6 +85,7 @@ class Videomix:
camberabin.get_by_name('input').set_property('uri', uri)
# pass bin upstream
+ self.pipeline.add(camberabin)
yield camberabin
@@ -68,4 +103,5 @@ class Videomix:
camberabin.get_by_name('input').set_property('subdevice', cam)
# pass bin upstream
+ self.pipeline.add(camberabin)
yield camberabin