All pastes #628438 Raw Edit

Untitled

public text v1 · immutable
·published 2007-07-21 08:48 UTC
rendered paste body
import sys
import gobject
gobject.threads_init ()
import gst

class PlayScaled (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_message_eos_cb)
        self.bus.connect ("message::error", self._bus_message_error_cb)

        self.src = gst.element_factory_make ("filesrc")
        self.src.props.location = sys.argv [1]
        self.pipeline.add (self.src)

        self.decodebin = gst.element_factory_make ("decodebin")
        self.decodebin.connect ("new-decoded-pad", self._new_decoded_pad_cb)
        self.pipeline.add (self.decodebin)

        self.src.link (self.decodebin)

    def _bus_message_eos_cb (self, bus, message):
        print "EOS"
        self.loop.quit ()

    def _bus_message_error_cb (self, bus, message):
        print "ERROR", message
        self.loop.quit ()

    def _new_decoded_pad_cb (self, decodebin, pad, no_more):
        caps = pad.get_caps ()
        capsstr = str (caps)
        print "NEW PAD", str (pad), str (pad.get_caps ())
        if capsstr.startswith ("image/") or capsstr.startswith ("video/"):
            fcaps = gst.Caps (caps [0].get_name () + ", width=200, height=200")
            capsfilter = gst.element_factory_make ("capsfilter")
            capsfilter.props.caps = fcaps
            self.pipeline.add (capsfilter)
            videoscale = gst.element_factory_make ("videoscale")
            self.pipeline.add (videoscale)
            pad.link (videoscale.get_pad ("sink"))
            videoscale.link (capsfilter)
            csp = gst.element_factory_make ("ffmpegcolorspace")
            self.pipeline.add (csp)
            capsfilter.link (csp)
            sink = gst.element_factory_make ("ximagesink")
            self.pipeline.add (sink)
            csp.link (sink)

            for e in (videoscale, capsfilter, csp, sink):
                e.set_state (gst.STATE_PLAYING)

    def play (self):
        self.pipeline.set_state (gst.STATE_PLAYING)
        self.loop.run ()
        self.pipeline.set_state (gst.STATE_NULL)

PlayScaled ().play ()