home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / share / gst-python / 0.10 / examples / play.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-04-20  |  11.5 KB  |  298 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import pygtk
  5. pygtk.require('2.0')
  6. import sys
  7. import gobject
  8. import pygst
  9. pygst.require('0.10')
  10. import gst
  11. import gst.interfaces as gst
  12. import gtk
  13.  
  14. class GstPlayer:
  15.     
  16.     def __init__(self, videowidget):
  17.         self.playing = False
  18.         self.player = gst.element_factory_make('playbin', 'player')
  19.         self.videowidget = videowidget
  20.         self.on_eos = False
  21.         bus = self.player.get_bus()
  22.         bus.enable_sync_message_emission()
  23.         bus.add_signal_watch()
  24.         bus.connect('sync-message::element', self.on_sync_message)
  25.         bus.connect('message', self.on_message)
  26.  
  27.     
  28.     def on_sync_message(self, bus, message):
  29.         if message.structure is None:
  30.             return None
  31.         if message.structure.get_name() == 'prepare-xwindow-id':
  32.             gtk.gdk.display_get_default().sync()
  33.             self.videowidget.set_sink(message.src)
  34.             message.src.set_property('force-aspect-ratio', True)
  35.         
  36.  
  37.     
  38.     def on_message(self, bus, message):
  39.         t = message.type
  40.         if t == gst.MESSAGE_ERROR:
  41.             (err, debug) = message.parse_error()
  42.             print 'Error: %s' % err, debug
  43.             if self.on_eos:
  44.                 self.on_eos()
  45.             
  46.             self.playing = False
  47.         elif t == gst.MESSAGE_EOS:
  48.             if self.on_eos:
  49.                 self.on_eos()
  50.             
  51.             self.playing = False
  52.         
  53.  
  54.     
  55.     def set_location(self, location):
  56.         self.player.set_property('uri', location)
  57.  
  58.     
  59.     def query_position(self):
  60.         '''Returns a (position, duration) tuple'''
  61.         
  62.         try:
  63.             (position, format) = self.player.query_position(gst.FORMAT_TIME)
  64.         except:
  65.             position = gst.CLOCK_TIME_NONE
  66.  
  67.         
  68.         try:
  69.             (duration, format) = self.player.query_duration(gst.FORMAT_TIME)
  70.         except:
  71.             duration = gst.CLOCK_TIME_NONE
  72.  
  73.         return (position, duration)
  74.  
  75.     
  76.     def seek(self, location):
  77.         '''
  78.         @param location: time to seek to, in nanoseconds
  79.         '''
  80.         gst.debug('seeking to %r' % location)
  81.         event = gst.event_new_seek(1, gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_ACCURATE, gst.SEEK_TYPE_SET, location, gst.SEEK_TYPE_NONE, 0)
  82.         res = self.player.send_event(event)
  83.         if res:
  84.             gst.info('setting new stream time to 0')
  85.             self.player.set_new_stream_time(0x0L)
  86.         else:
  87.             gst.error('seek to %r failed' % location)
  88.  
  89.     
  90.     def pause(self):
  91.         gst.info('pausing player')
  92.         self.player.set_state(gst.STATE_PAUSED)
  93.         self.playing = False
  94.  
  95.     
  96.     def play(self):
  97.         gst.info('playing player')
  98.         self.player.set_state(gst.STATE_PLAYING)
  99.         self.playing = True
  100.  
  101.     
  102.     def stop(self):
  103.         self.player.set_state(gst.STATE_NULL)
  104.         gst.info('stopped player')
  105.  
  106.     
  107.     def get_state(self, timeout = 1):
  108.         return self.player.get_state(timeout = timeout)
  109.  
  110.     
  111.     def is_playing(self):
  112.         return self.playing
  113.  
  114.  
  115.  
  116. class VideoWidget(gtk.DrawingArea):
  117.     
  118.     def __init__(self):
  119.         gtk.DrawingArea.__init__(self)
  120.         self.imagesink = None
  121.         self.unset_flags(gtk.DOUBLE_BUFFERED)
  122.  
  123.     
  124.     def do_expose_event(self, event):
  125.         if self.imagesink:
  126.             self.imagesink.expose()
  127.             return False
  128.         return True
  129.  
  130.     
  131.     def set_sink(self, sink):
  132.         if not self.window.xid:
  133.             raise AssertionError
  134.         self.imagesink = sink
  135.         self.imagesink.set_xwindow_id(self.window.xid)
  136.  
  137.  
  138.  
  139. class PlayerWindow(gtk.Window):
  140.     UPDATE_INTERVAL = 500
  141.     
  142.     def __init__(self):
  143.         gtk.Window.__init__(self)
  144.         self.set_default_size(410, 325)
  145.         self.create_ui()
  146.         self.player = GstPlayer(self.videowidget)
  147.         
  148.         def on_eos():
  149.             self.player.seek(0x0L)
  150.             self.play_toggled()
  151.  
  152.         
  153.         self.player.on_eos = lambda *x: on_eos()
  154.         self.update_id = -1
  155.         self.changed_id = -1
  156.         self.seek_timeout_id = -1
  157.         self.p_position = gst.CLOCK_TIME_NONE
  158.         self.p_duration = gst.CLOCK_TIME_NONE
  159.         
  160.         def on_delete_event():
  161.             self.player.stop()
  162.             gtk.main_quit()
  163.  
  164.         self.connect(('delete-event',), (lambda : on_delete_event()))
  165.  
  166.     
  167.     def load_file(self, location):
  168.         self.player.set_location(location)
  169.  
  170.     
  171.     def create_ui(self):
  172.         vbox = gtk.VBox()
  173.         self.add(vbox)
  174.         self.videowidget = VideoWidget()
  175.         vbox.pack_start(self.videowidget)
  176.         hbox = gtk.HBox()
  177.         vbox.pack_start(hbox, fill = False, expand = False)
  178.         self.pause_image = gtk.image_new_from_stock(gtk.STOCK_MEDIA_PAUSE, gtk.ICON_SIZE_BUTTON)
  179.         self.pause_image.show()
  180.         self.play_image = gtk.image_new_from_stock(gtk.STOCK_MEDIA_PLAY, gtk.ICON_SIZE_BUTTON)
  181.         self.play_image.show()
  182.         self.button = button = gtk.Button()
  183.         button.add(self.play_image)
  184.         button.set_property('can-default', True)
  185.         button.set_focus_on_click(False)
  186.         button.show()
  187.         hbox.pack_start(button, False)
  188.         button.set_property('has-default', True)
  189.         button.connect(('clicked',), (lambda : self.play_toggled()))
  190.         self.adjustment = gtk.Adjustment(0, 0, 100, 0.1, 1, 1)
  191.         hscale = gtk.HScale(self.adjustment)
  192.         hscale.set_digits(2)
  193.         hscale.set_update_policy(gtk.UPDATE_CONTINUOUS)
  194.         hscale.connect('button-press-event', self.scale_button_press_cb)
  195.         hscale.connect('button-release-event', self.scale_button_release_cb)
  196.         hscale.connect('format-value', self.scale_format_value_cb)
  197.         hbox.pack_start(hscale)
  198.         self.hscale = hscale
  199.         self.videowidget.connect_after(('realize',), (lambda : self.play_toggled()))
  200.  
  201.     
  202.     def play_toggled(self):
  203.         self.button.remove(self.button.child)
  204.         if self.player.is_playing():
  205.             self.player.pause()
  206.             self.button.add(self.play_image)
  207.         else:
  208.             self.player.play()
  209.             if self.update_id == -1:
  210.                 self.update_id = gobject.timeout_add(self.UPDATE_INTERVAL, self.update_scale_cb)
  211.             
  212.             self.button.add(self.pause_image)
  213.  
  214.     
  215.     def scale_format_value_cb(self, scale, value):
  216.         if self.p_duration == -1:
  217.             real = 0
  218.         else:
  219.             real = value * self.p_duration / 100
  220.         seconds = real / gst.SECOND
  221.         return '%02d:%02d' % (seconds / 60, seconds % 60)
  222.  
  223.     
  224.     def scale_button_press_cb(self, widget, event):
  225.         gst.debug('starting seek')
  226.         self.button.set_sensitive(False)
  227.         self.was_playing = self.player.is_playing()
  228.         if self.was_playing:
  229.             self.player.pause()
  230.         
  231.         if self.update_id != -1:
  232.             gobject.source_remove(self.update_id)
  233.             self.update_id = -1
  234.         
  235.         if self.changed_id == -1:
  236.             self.changed_id = self.hscale.connect('value-changed', self.scale_value_changed_cb)
  237.         
  238.  
  239.     
  240.     def scale_value_changed_cb(self, scale):
  241.         real = long(scale.get_value() * self.p_duration / 100)
  242.         gst.debug('value changed, perform seek to %r' % real)
  243.         self.player.seek(real)
  244.         self.player.get_state(timeout = 50 * gst.MSECOND)
  245.  
  246.     
  247.     def scale_button_release_cb(self, widget, event):
  248.         widget.disconnect(self.changed_id)
  249.         self.changed_id = -1
  250.         self.button.set_sensitive(True)
  251.         if self.seek_timeout_id != -1:
  252.             gobject.source_remove(self.seek_timeout_id)
  253.             self.seek_timeout_id = -1
  254.         else:
  255.             gst.debug('released slider, setting back to playing')
  256.             if self.was_playing:
  257.                 self.player.play()
  258.             
  259.         if self.update_id != -1:
  260.             self.error('Had a previous update timeout id')
  261.         else:
  262.             self.update_id = gobject.timeout_add(self.UPDATE_INTERVAL, self.update_scale_cb)
  263.  
  264.     
  265.     def update_scale_cb(self):
  266.         (self.p_position, self.p_duration) = self.player.query_position()
  267.         if self.p_position != gst.CLOCK_TIME_NONE:
  268.             value = self.p_position * 100 / self.p_duration
  269.             self.adjustment.set_value(value)
  270.         
  271.         return True
  272.  
  273.  
  274.  
  275. def main(args):
  276.     
  277.     def usage():
  278.         sys.stderr.write('usage: %s URI-OF-MEDIA-FILE\n' % args[0])
  279.         sys.exit(1)
  280.  
  281.     gobject.type_register(PlayerWindow)
  282.     gobject.type_register(VideoWidget)
  283.     w = PlayerWindow()
  284.     if len(args) != 2:
  285.         usage()
  286.     
  287.     if not gst.uri_is_valid(args[1]):
  288.         sys.stderr.write('Error: Invalid URI: %s\n' % args[1])
  289.         sys.exit(1)
  290.     
  291.     w.load_file(args[1])
  292.     w.show_all()
  293.     gtk.main()
  294.  
  295. if __name__ == '__main__':
  296.     sys.exit(main(sys.argv))
  297.  
  298.