summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xvoctocore/experiments/failovertest2.py57
1 files changed, 50 insertions, 7 deletions
diff --git a/voctocore/experiments/failovertest2.py b/voctocore/experiments/failovertest2.py
index 919b946..19a8833 100755
--- a/voctocore/experiments/failovertest2.py
+++ b/voctocore/experiments/failovertest2.py
@@ -2,6 +2,7 @@
from os import path
+import threading
import gi
gi.require_version('Gst', '1.0')
from gi.repository import GObject, Gst
@@ -53,6 +54,7 @@ class FramegrabberSource(Gst.Bin):
class FailoverFilter(Gst.Bin):
+ failcount = 1
def __init__(self):
super().__init__()
@@ -72,12 +74,14 @@ class FailoverFilter(Gst.Bin):
self.failpad = self.switch.get_request_pad('sink_%u')
# Set properties
- self.switch.set_property('active-pad', self.goodpad)
+ self.switch.set_property('active-pad', self.failpad)
self.capsfilter.set_property('caps', Gst.Caps.from_string('video/x-raw,format=I420,width=640,height=480'))
# Connect signal handlers
- self.queue.connect('underrun', self.on_queue)
- self.queue.connect('running', self.on_queue)
+ self.queue.connect('underrun', self.underrun)
+ self.queue.connect('overrun', self.overrun)
+ self.queue.connect('running', self.running)
+ self.queue.connect('pushing', self.pushing)
# Link elements
self.queue.get_static_pad('src').link(self.goodpad)
@@ -91,12 +95,51 @@ class FailoverFilter(Gst.Bin):
self.add_pad(
Gst.GhostPad.new('src', self.switch.get_static_pad('src'))
)
+
+ # Start watchdog
+ self.watchdog()
+
+ def watchdog(self):
+ self.watchdogtimer = threading.Timer(0.5, self.watchdog)
+ self.watchdogtimer.start()
+
+ if self.failcount == 0:
+ print("watchdog switching to goodpad")
+ self.switch.set_property('active-pad', self.goodpad)
+ else:
+ print("watchdog switching to failpad")
+ self.switch.set_property('active-pad', self.failpad)
+
+ def underrun(self, queue):
+ level = queue.get_property('current-level-buffers')
+
+ failbin = queue.get_parent()
+ if level == 0:
+ failbin.failcount += 1
+
+ print('underrun(), level=', level, 'failcount=', failbin.failcount)
+
+ def overrun(self, queue):
+ level = queue.get_property('current-level-buffers')
+
+ failbin = queue.get_parent()
+ if level > 0:
+ failbin.failcount = 0
+
+ print('overrun(), level=', level, 'failcount=', failbin.failcount)
- def on_queue(self, queue):
+ def running(self, queue):
level = queue.get_property('current-level-buffers')
- print('on_queue()', level)
- switch = queue.get_parent().get_by_name("sw")
- switch.set_property('active-pad', switch.get_static_pad('sink_1' if level == 0 else 'sink_0'))
+ print('running(), level=', level)
+
+ def pushing(self, queue):
+ level = queue.get_property('current-level-buffers')
+
+ failbin = queue.get_parent()
+ if level == 0:
+ failbin.failcount += 1
+
+ print('pushing(), level=', level, 'failcount=', failbin.failcount)
class VideomixerWithDisplay(Gst.Bin):
def __init__(self):