All pastes #792548 Raw Edit

Stuff

public text v1 · immutable
·published 2007-11-21 14:42 UTC
rendered paste body
import 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 ()