diff options
Diffstat (limited to 'TurtleArt/tagplay.py')
-rw-r--r-- | TurtleArt/tagplay.py | 87 |
1 files changed, 41 insertions, 46 deletions
diff --git a/TurtleArt/tagplay.py b/TurtleArt/tagplay.py index 627b2c7..bc38b6e 100644 --- a/TurtleArt/tagplay.py +++ b/TurtleArt/tagplay.py @@ -30,15 +30,15 @@ import gi gi.require_version('Gtk', '3.0') from gi.repository import GObject +from gi.repository import Gst, GstVideo + GObject.threads_init() +Gst.init(None) -import pygst -import gst -import gst.interfaces +from gi.repository import GdkX11 from gi.repository import Gtk from gi.repository import Gdk - def play_audio_from_file(lc, file_path): """ Called from Show block of audio media """ if lc.gplay is not None and lc.gplay.player is not None: @@ -117,7 +117,6 @@ class Gplay(): self.bin = Gtk.Window() self.videowidget = VideoWidget() - print self.videowidget self.bin.add(self.videowidget) self.bin.set_type_hint(Gdk.WindowTypeHint.NORMAL) self.bin.set_decorated(False) @@ -137,20 +136,11 @@ class Gplay(): def _player_error_cb(self, widget, message, detail): self.player.stop() - self.player.set_uri(None) logging.debug('Error: %s - %s' % (message, detail)) - def _player_stream_info_cb(self, widget, stream_info): - if not len(stream_info) or self.got_stream_info: - return - + def _player_stream_info_cb(self, widget, playbin): GST_STREAM_TYPE_VIDEO = 2 - - only_audio = True - for item in stream_info: - if item.props.type == GST_STREAM_TYPE_VIDEO: - only_audio = False - self.only_audio = only_audio + self.only_audio = playbin.props.n_video == 0 self.got_stream_info = True def start(self, file_path=None): @@ -173,9 +163,9 @@ class Gplay(): self.player.set_uri(self.playlist[0]) self.currentplaying = 0 self.play_toggled() - self.show_all() - except: - logging.error('Error playing %s' % (self.playlist[0])) + self.bin.show_all() + except Exception, e: + logging.error('Error playing %s: %s' % (self.playlist[0], e)) return False def play_toggled(self): @@ -200,7 +190,7 @@ class GstPlayer(GObject.GObject): self.playing = False self.error = False - self.player = gst.element_factory_make('playbin2', 'player') + self.player = Gst.ElementFactory.make('playbin', 'player') videowidget.realize() self.videowidget = videowidget @@ -217,42 +207,45 @@ class GstPlayer(GObject.GObject): self.player.set_property('uri', uri) def on_sync_message(self, bus, message): - if message.structure is None: + structure = message.get_structure() + if structure is None: return - if message.structure.get_name() == 'prepare-xwindow-id': - self.videowidget.set_sink(message.src, self.videowidget_xid) - message.src.set_property('force-aspect-ratio', True) + + if structure.get_name() == 'prepare-window-handle': + print "I am bernie" + message.src.set_window_handle(self.videowidget_xid) + message.src.force_aspect_ratio = True def on_message(self, bus, message): t = message.type - if t == gst.MESSAGE_ERROR: + if t == Gst.MessageType.ERROR: err, debug = message.parse_error() logging.debug('Error: %s - %s' % (err, debug)) self.error = True self.emit('eos') self.playing = False self.emit('error', str(err), str(debug)) - elif t == gst.MESSAGE_EOS: + elif t == Gst.MessageType.EOS: self.emit('eos') self.playing = False - elif t == gst.MESSAGE_STATE_CHANGED: + elif t == Gst.MessageType.STATE_CHANGED: old, new, pen = message.parse_state_changed() - if old == gst.STATE_READY and new == gst.STATE_PAUSED: - self.emit('stream-info', - self.player.props.stream_info_value_array) + if old == Gst.State.READY and new == Gst.State.PAUSED: + self.emit('stream-info', self.player) + # else: # logging.debug(message.type) def _init_video_sink(self): - self.bin = gst.Bin() - videoscale = gst.element_factory_make('videoscale') + self.bin = Gst.Bin() + videoscale = Gst.ElementFactory.make('videoscale', None) self.bin.add(videoscale) - pad = videoscale.get_pad('sink') - ghostpad = gst.GhostPad('sink', pad) + pad = videoscale.get_static_pad('sink') + ghostpad = Gst.GhostPad.new('sink', pad) self.bin.add_pad(ghostpad) videoscale.set_property('method', 0) - caps_string = 'video/x-raw-yuv, ' + caps_string = 'video/x-raw, ' r = self.videowidget.get_allocation() if r.width > 500 and r.height > 500: # Sigh... xvimagesink on the XOs will scale the video to fit @@ -263,31 +256,33 @@ class GstPlayer(GObject.GObject): caps_string += 'width=%d, height=%d' % (w, h) else: caps_string += 'width=480, height=360' - caps = gst.Caps(caps_string) - self.filter = gst.element_factory_make('capsfilter', 'filter') + caps = Gst.Caps.from_string(caps_string) + self.filter = Gst.ElementFactory.make('capsfilter', 'filter') self.bin.add(self.filter) self.filter.set_property('caps', caps) - conv = gst.element_factory_make('ffmpegcolorspace', 'conv') + conv = Gst.ElementFactory.make('videoconvert', 'conv') self.bin.add(conv) - videosink = gst.element_factory_make('autovideosink') + videosink = Gst.ElementFactory.make('autovideosink', None) self.bin.add(videosink) - gst.element_link_many(videoscale, self.filter, conv, videosink) + videoscale.link(self.filter) + self.filter.link(conv) + conv.link(videosink) self.player.set_property('video-sink', self.bin) def pause(self): - self.player.set_state(gst.STATE_PAUSED) + self.player.set_state(Gst.State.PAUSED) self.playing = False logging.debug('pausing player') def play(self): - self.player.set_state(gst.STATE_PLAYING) + self.player.set_state(Gst.State.PLAYING) self.playing = True self.error = False logging.debug('playing player') def stop(self): - self.player.set_state(gst.STATE_NULL) + self.player.set_state(Gst.State.NULL) self.playing = False logging.debug('stopped player') # return False @@ -301,19 +296,19 @@ class GstPlayer(GObject.GObject): class VideoWidget(Gtk.DrawingArea): def __init__(self): - GObject.GObject.__init__(self) - print self - help (self) + Gtk.DrawingArea.__init__(self) self.set_events(Gdk.EventMask.EXPOSURE_MASK) self.imagesink = None self.set_double_buffered(False) self.set_app_paintable(True) + def do_expose_event(self, event): if self.imagesink: self.imagesink.expose() return False else: return True + def set_sink(self, sink, xid): self.imagesink = sink self.imagesink.set_xwindow_id(xid) |