Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/TurtleArt/tagplay.py
diff options
context:
space:
mode:
Diffstat (limited to 'TurtleArt/tagplay.py')
-rw-r--r--TurtleArt/tagplay.py87
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)