diff options
Diffstat (limited to 'voctocore/experiments/shmsrc.py')
-rw-r--r-- | voctocore/experiments/shmsrc.py | 115 |
1 files changed, 0 insertions, 115 deletions
diff --git a/voctocore/experiments/shmsrc.py b/voctocore/experiments/shmsrc.py deleted file mode 100644 index 742767b..0000000 --- a/voctocore/experiments/shmsrc.py +++ /dev/null @@ -1,115 +0,0 @@ -#!/usr/bin/python3 -import time -from gi.repository import GLib, Gst - -class ShmSrc(Gst.Bin): - last_buffer_arrived = 0 - is_in_failstate = True - - def __init__(self, socket, caps): - super().__init__() - - # Create elements - self.shmsrc = Gst.ElementFactory.make('shmsrc', None) - self.identity1 = Gst.ElementFactory.make('identity', None) - self.identity2 = Gst.ElementFactory.make('identity', None) - self.switch = Gst.ElementFactory.make('input-selector', None) - self.failsrc = Gst.ElementFactory.make('videotestsrc', None) - - # Add elements to Bin - self.add(self.shmsrc) - self.add(self.identity1) - self.add(self.identity2) - self.add(self.switch) - self.add(self.failsrc) - - # Get Switcher-Pads - self.goodpad = self.switch.get_request_pad('sink_%u') - self.failpad = self.switch.get_request_pad('sink_%u') - - # Set properties - self.shmsrc.set_property('socket-path', socket) - self.shmsrc.set_property('is-live', True) - self.shmsrc.set_property('do-timestamp', True) - #self.identity1.set_property('sync', True) - self.identity2.set_property('sync', True) - self.switch.set_property('active-pad', self.failpad) - self.failsrc.set_property('pattern', 'snow') - - # Link elements - self.shmsrc.link_filtered(self.identity1, caps) - self.identity1.get_static_pad('src').link(self.goodpad) - - self.failsrc.link_filtered(self.identity2, caps) - self.identity2.get_static_pad('src').link(self.failpad) - - # Install pad probes - self.shmsrc.get_static_pad('src').add_probe(Gst.PadProbeType.BLOCK | Gst.PadProbeType.EVENT_DOWNSTREAM, self.event_probe, None) - self.shmsrc.get_static_pad('src').add_probe(Gst.PadProbeType.BLOCK | Gst.PadProbeType.BUFFER, self.data_probe, None) - - # Install Watchdog - GLib.timeout_add(500, self.watchdog) - - # Add Ghost Pads - self.add_pad( - Gst.GhostPad.new('sink', self.switch.get_static_pad('src')) - ) - - def do_handle_message(self, msg): - if msg.type == Gst.MessageType.ERROR: - print("do_handle_message(): dropping error") - return - - print("do_handle_message()", msg.src, msg.type) - Gst.Bin.do_handle_message(self, msg) - - def event_probe(self, pad, info, ud): - e = info.get_event() - if e.type == Gst.EventType.EOS: - self.switch_to_failstate() - return Gst.PadProbeReturn.DROP - - return Gst.PadProbeReturn.PASS - - - def data_probe(self, pad, info, ud): - self.last_buffer_arrived = time.time() - self.switch_to_goodstate() - return Gst.PadProbeReturn.PASS - - def watchdog(self): - if self.last_buffer_arrived + 0.1 < time.time(): - print("watchdog()::timeout") - self.switch_to_failstate() - - if self.last_buffer_arrived + 3 < time.time() and round(time.time() % 3) == 0: - print("watchdog()::restart") - self.restart() - - return True - - def restart(self): - self.shmsrc.set_state(Gst.State.NULL) - - # this somehow solves parts of the multi-output-timestamping-issue - # starting the 2nd src n seconds after the program started freezes it for n seconds - self.shmsrc.set_start_time(0) - self.shmsrc.set_base_time(self.get_parent().get_base_time()) - - self.shmsrc.set_state(Gst.State.PLAYING) - - def switch_to_goodstate(self): - if not self.is_in_failstate: - return - - print("switch_to_goodstate()") - self.is_in_failstate = False - self.switch.set_property('active-pad', self.goodpad) - - def switch_to_failstate(self): - if self.is_in_failstate: - return - - print("switch_to_failstate()") - self.is_in_failstate = True - self.switch.set_property('active-pad', self.failpad) |