Public feed #598885

Miscellany

public text v1 · immutable
Raw Edit
·published 2007-07-01 17:57 UTC
rendered paste body
import pygst
pygst.require('0.10')
import gst
import gobject
gobject.threads_init()

class VideoResampler(gst.BaseTransform):

 
    __gsttemplates__ = (
        gst.PadTemplate ("sink",
                         gst.PAD_SINK,
                         gst.PAD_ALWAYS,
                         gst.caps_new_any()),
        gst.PadTemplate ("src",
                         gst.PAD_SRC,
                         gst.PAD_ALWAYS,
                         gst.caps_new_any())
        )

    def __init__(self, rate=1.0):
        gst.BaseTransform.__init__(self)
        self.set_in_place(True)
        self.rate = rate
        self.start = gst.CLOCK_TIME_NONE

    def do_event(self, event):
        if event.type == gst.EVENT_NEWSEGMENT:
            # we need to modify the duration !
            update, rate, format, start, stop, position = event.parse_new_segment()
            # store start position
            self.start = start
            if stop == gst.CLOCK_TIME_NONE or stop == -1:
                return True
            # update the new stop position
            stop = long(start + float(stop - start) / self.rate)
            event = gst.event_new_new_segment(update, rate, format,
                                              start, stop, position)
            self.get_pad("src").push_event(event)
            return False
        return True

    def do_transform_ip(self, buffer):
        print gst.TIME_ARGS(buffer.timestamp), gst.TIME_ARGS(buffer.duration)

        if buffer.timestamp == gst.CLOCK_TIME_NONE:
            return gst.FLOW_OK
        if not buffer.timestamp == self.start:
            # modify the timestamp
            buffer.timestamp = long((buffer.timestamp - self.start) / self.rate)

        # modify the duration
        if not buffer.duration == gst.CLOCK_TIME_NONE:
            buffer.duration = long(buffer.duration / self.rate)

        print gst.TIME_ARGS(buffer.timestamp), gst.TIME_ARGS(buffer.duration)

        return gst.FLOW_OK

gobject.type_register(VideoResampler)

if __name__ == "__main__":
    # test pipeline
    p = gst.Pipeline()
    src = gst.element_factory_make("videotestsrc")
    overl = gst.element_factory_make("timeoverlay")
    # SET THE RATE HERE !!!
    # 1.0 == normal play
    # > 1.0 == faster
    # < 1.0 == slower
    rs = VideoResampler(2.0)
    vrate = gst.element_factory_make("videorate")
    sink = gst.element_factory_make("xvimagesink")

    p.add(src, overl, rs, vrate, sink)
    gst.element_link_many(src, overl, rs, vrate, sink)

    ml = gobject.MainLoop()

    p.set_state(gst.STATE_PLAYING)

    ml.run()