rendered paste bodyimport gobject
gobject.threads_init ()
import gst
import sys
class Switch (object):
def __init__ (self):
self.loop = gobject.MainLoop ()
self.pipeline = gst.Pipeline ()
self.bus = self.pipeline.get_bus ()
self.bus.add_signal_watch ()
self.bus.connect ("message::eos", self._bus_eos_cb)
self.bus.connect ("message::error", self._bus_error_cb)
self.src = gst.element_factory_make ("filesrc")
self.src.props.location = sys.argv [1]gdfg
self.queue = gst.element_factory_make ("queue")
self.queue.props.max_size_buffers = 0
self.mpegtsparse = gst.element_factory_make ("mpegtsparse")
self.mpegtsparse.connect ("pad-added", self._mpegtsparse_pad_added_cb)
self.mpegtsparse.connect ("pad-removed", self._mpegtsparse_pad_removed_cb)
self.mpegtsparse.props.program_numbers = str (sys.argv [2])
self.mpegtsparse.get_pad ("src").add_data_probe (self._mpegtsparse_shaddup_cb)
self.xvimagesink = gst.element_factory_make ("xvimagesink")
self.xvimagesink.props.sync = False
self.pipeline.add (self.src, self.queue, self.mpegtsparse, self.xvimagesink)
gst.element_link_many (self.src, self.queue, self.mpegtsparse)
self.have_video = False
def _mpegtsparse_shaddup_cb (self, pad, buffer):
return False
def _mpegtsparse_pad_added_cb (self, mpegtsparse, pad):
print "mpegtpsarse pad added", pad
program_number = pad.get_name ().split ("_")[1]
self.flutsdemux = gst.element_factory_make ("flutsdemux")
self.pipeline.add (self.flutsdemux)
self.flutsdemux.props.program_number = int (program_number)
self.flutsdemux.connect ("pad-added", self._flutsdemux_pad_added_cb)
self.flutsdemux.set_state (gst.STATE_PLAYING)
pad.link (self.flutsdemux.get_pad ("sink"))
def _mpegtsparse_pad_removed_cb (self, mpegtsparse, pad):
print "mpegtpsarse pad removed", pad
self.pipeline.remove (self.flutsdemux)
self.flutsdemux.set_state (gst.STATE_NULL)
self.flutsdemux = None
self.pipeline.remove (self.mpeg2dec)
self.mpeg2dec.set_state (gst.STATE_NULL)
self.mpeg2dec = None
self.have_video = False
def _flutsdemux_pad_added_cb (self, flutsdemux, pad):
if pad.get_name ().startswith ("video_") and not self.have_video:
print "linking flutsdemux pad", pad
self.mpeg2dec = gst.element_factory_make ("mpeg2dec")
self.pipeline.add (self.mpeg2dec)
self.mpeg2dec.link (self.xvimagesink)
self.mpeg2dec.set_state (gst.STATE_PLAYING)
pad.link (self.mpeg2dec.get_pad ("sink"))
self.have_video = True
def _bus_error_cb (self, bus, message):
print "ERROR", message
self.loop.quit ()
def _bus_eos_cb (self, bus, message):
print "ERROR", message
self.loop.quit ()
def _switch_channel_cb (self):
self.mpegtsparse.props.program_numbers = str (sys.argv [3])
def run (self):
self.pipeline.set_state (gst.STATE_PLAYING)
gobject.timeout_add (10000, self._switch_channel_cb)
try:
self.loop.run ()
finally:
self.pipeline.set_state (gst.STATE_NULL)
def main ():
Switch ().run ()
if __name__ == '__main__':
main ()