Author: dmeyer
Date: Tue Aug 22 20:12:23 2006
New Revision: 1891
Modified:
trunk/WIP/player/src/backends/gstreamer/child.py
trunk/WIP/player/src/backends/gstreamer/player.py
trunk/WIP/player/src/backends/mplayer/player.py
trunk/WIP/player/src/backends/xine/child.py
trunk/WIP/player/src/backends/xine/player.py
trunk/WIP/player/src/generic.py
trunk/WIP/player/src/ptypes.py
trunk/WIP/player/test/play.py
Log:
make seeking work with all player
Modified: trunk/WIP/player/src/backends/gstreamer/child.py
==============================================================================
--- trunk/WIP/player/src/backends/gstreamer/child.py (original)
+++ trunk/WIP/player/src/backends/gstreamer/child.py Tue Aug 22 20:12:23 2006
@@ -10,6 +10,7 @@
kaa.notifier.init('gtk', x11=False)
from kaa.player.utils import Player
+from kaa.player.ptypes import *
from gst_types import Status
@@ -20,8 +21,8 @@
self._gst = None
self._status_object = Status(self._send_status)
self._status_last = None
-
-
+ self._streaminfo = {}
+
def get_status(self):
return self._status_object.get_status()
@@ -72,7 +73,10 @@
return True
# print e, e.code, e.domain
return True
- # print msg
+ if msg.type == gst.MESSAGE_TAG:
+ taglist = msg.parse_tag()
+ for key in taglist.keys():
+ self._streaminfo[key] = taglist[key]
return True
@@ -92,18 +96,18 @@
def open(self, uri):
self._gst.set_property('uri', uri)
- self._gst.set_state(gst.STATE_PLAYING)
self.status = Status.OPENING
+ self._streaminfo = {}
+
+
+ def play(self):
+ self._gst.set_state(gst.STATE_PLAYING)
def pause(self):
self._gst.set_state(gst.STATE_PAUSED)
- def resume(self):
- self._gst.set_state(gst.STATE_PLAYING)
-
-
def stop(self):
self._gst.set_state(gst.STATE_NULL)
self.status = Status.IDLE
@@ -113,5 +117,17 @@
sys.exit(0)
+ def seek(self, value, type):
+ pos = 0
+ if type == SEEK_RELATIVE:
+ pos = self._gst.query_position(gst.FORMAT_TIME)[0] + value *
1000000000
+ if type == SEEK_ABSOLUTE:
+ pos = value * 1000000000
+ if type == SEEK_PERCENTAGE and 'duration' in self._streaminfo:
+ pos = (self._streaminfo['duration'] / 100) * value
+ self._gst.seek(1.0, gst.FORMAT_TIME,
+ gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_ACCURATE,
+ gst.SEEK_TYPE_SET, pos, gst.SEEK_TYPE_NONE, 0)
+
player = GStreamer(sys.argv[1])
kaa.notifier.loop()
Modified: trunk/WIP/player/src/backends/gstreamer/player.py
==============================================================================
--- trunk/WIP/player/src/backends/gstreamer/player.py (original)
+++ trunk/WIP/player/src/backends/gstreamer/player.py Tue Aug 22 20:12:23 2006
@@ -25,10 +25,10 @@
def _span(self):
script = os.path.join(os.path.dirname(__file__), 'child.py')
- self.player = ChildProcess(self, script, str(self._instance_id))
- self.player.signals["completed"].connect_weak(self._exited)
-
self.player.set_stop_command(kaa.notifier.WeakCallback(self._end_child))
- self.player.start()
+ self._gst = ChildProcess(self, script, str(self._instance_id))
+ self._gst.signals["completed"].connect_weak(self._exited)
+ self._gst.set_stop_command(kaa.notifier.WeakCallback(self._end_child))
+ self._gst.start()
self._state = STATE_IDLE
@@ -38,7 +38,7 @@
def _end_child(self):
self._state = STATE_SHUTDOWN
- self.player.die()
+ self._gst.die()
# child handling
@@ -62,9 +62,10 @@
self._mrl = mrl
if self._state == STATE_NOT_RUNNING:
self._span()
+ self._position = 0.0
- def play(self, video=True):
+ def play(self):
"""
Start playing. If playback is paused, resume. If not wait
async until either the playing has started or an error
@@ -73,32 +74,30 @@
wid = None
if self._window:
wid = self._window.get_id()
- self.player.setup(wid=wid)
-
- self._position = 0.0
-
- self.player.open(self._mrl)
+ self._gst.setup(wid=wid)
+ self._gst.open(self._mrl)
+ self._gst.play()
self._state = STATE_OPENING
return
def pause(self):
- self.player.pause()
+ self._gst.pause()
self._state = STATE_PAUSED
def resume(self):
- self.player.resume()
+ self._gst.play()
self._state = STATE_PLAYING
def stop(self):
- self.player.stop()
+ self._gst.stop()
def die(self):
self.stop()
- self.player.die()
+ self._gst.die()
self._state = STATE_SHUTDOWN
@@ -114,6 +113,10 @@
return self._position
+ def seek(self, value, type):
+ self._gst.seek(value, type)
+
+
def nav_command(self, input):
return False
Modified: trunk/WIP/player/src/backends/mplayer/player.py
==============================================================================
--- trunk/WIP/player/src/backends/mplayer/player.py (original)
+++ trunk/WIP/player/src/backends/mplayer/player.py Tue Aug 22 20:12:23 2006
@@ -423,14 +423,9 @@
if self.get_state() == STATE_PAUSED:
self._slave_cmd("pause")
- def seek_relative(self, offset):
- self._slave_cmd("seek %f 0" % offset)
-
- def seek_absolute(self, position):
- self._slave_cmd("seek %f 2" % position)
-
- def seek_percentage(self, percent):
- self._slave_cmd("seek %f 1" % percent)
+ def seek(self, value, type):
+ s = [SEEK_RELATIVE, SEEK_PERCENTAGE, SEEK_ABSOLUTE]
+ self._slave_cmd("seek %f %s" % (value, s.index(type)))
def stop(self):
self.die()
Modified: trunk/WIP/player/src/backends/xine/child.py
==============================================================================
--- trunk/WIP/player/src/backends/xine/child.py (original)
+++ trunk/WIP/player/src/backends/xine/child.py Tue Aug 22 20:12:23 2006
@@ -10,7 +10,7 @@
from kaa.config import Group, Var
from kaa.player.utils import Player
-
+from kaa.player.ptypes import *
# Config group for xine player
config = Group(desc = 'Options for xine player', schema = [
@@ -56,6 +56,7 @@
if not self._stream:
return
+ # FIXME: this gets not updated very often, I have no idea why
t = self._stream.get_pos_length()
status = self._stream.get_status()
speed = self._stream.get_parameter(xine.PARAM_SPEED)
@@ -64,7 +65,6 @@
# Where status is one of XINE_STATUS_ constants, and speed
# is one of XINE_SPEED constants.
cur_status = (t[0], t[1], t[2], status, speed)
-
if cur_status != self._status_last:
self._status_last = cur_status
self.parent.set_status(*cur_status)
@@ -235,7 +235,7 @@
print "Open failed:", self._stream.get_error()
return
self.parent.set_stream_info(True, self._get_stream_info())
- self._status.start(0.1)
+ self._status.start(0.001)
def osd_update(self, alpha, visible, invalid_regions):
@@ -265,13 +265,13 @@
self._stream.set_parameter(xine.PARAM_SPEED, xine.SPEED_NORMAL)
- def seek(self, whence, value):
- if whence == 0:
+ def seek(self, value, type):
+ if type == SEEK_RELATIVE:
self._stream.seek_relative(value)
- elif whence == 1:
+ if type == SEEK_ABSOLUTE:
self._stream.seek_absolute(value)
- elif whence == 2:
- self._stream.play(pos = value)
+ if type == SEEK_PERCENTAGE:
+ self._stream.play(pos = (value / 100.0) * 65535)
def stop(self):
Modified: trunk/WIP/player/src/backends/xine/player.py
==============================================================================
--- trunk/WIP/player/src/backends/xine/player.py (original)
+++ trunk/WIP/player/src/backends/xine/player.py Tue Aug 22 20:12:23 2006
@@ -191,7 +191,7 @@
self._mrl = "%s:%s" % (scheme, path)
- def play(self, video=True):
+ def play(self):
if not self._xine:
self._spawn()
@@ -222,17 +222,8 @@
self._xine.die()
- def seek_relative(self, offset):
- self._xine.seek(0, offset)
-
-
- def seek_absolute(self, position):
- self._xine.seek(1, position)
-
-
- def seek_percentage(self, percent):
- pos = (percent / 100.0) * 65535
- self._xine.seek(2, pos)
+ def seek(self, value, type):
+ self._xine.seek(value, type)
def get_info(self):
Modified: trunk/WIP/player/src/generic.py
==============================================================================
--- trunk/WIP/player/src/generic.py (original)
+++ trunk/WIP/player/src/generic.py Tue Aug 22 20:12:23 2006
@@ -263,27 +263,15 @@
@required_states(STATE_IDLE, STATE_PLAYING, STATE_PAUSED)
- def seek_relative(self, offset):
+ def seek(self, value, type=SEEK_RELATIVE):
"""
- Seek relative.
+ Seek. Possible types are SEEK_RELATIVE, SEEK_ABSOLUTE and
SEEK_PERCENTAGE.
"""
- self._player.seek_relative(offset)
-
-
- @required_states(STATE_IDLE, STATE_PLAYING, STATE_PAUSED)
- def seek_absolute(self, position):
- """
- Seek absolute.
- """
- self._player.seek_absolute(position)
-
-
- @required_states(STATE_IDLE, STATE_PLAYING, STATE_PAUSED)
- def seek_percentage(self, percent):
- """
- Seek percentage.
- """
- self._player.seek_percent(position)
+ if self.get_state() == STATE_IDLE:
+ # FIXME: make it possible to seek between open() and play() and
+ # add STATE_IDLE to required_states.
+ return False
+ self._player.seek(value, type)
def get_position(self):
Modified: trunk/WIP/player/src/ptypes.py
==============================================================================
--- trunk/WIP/player/src/ptypes.py (original)
+++ trunk/WIP/player/src/ptypes.py Tue Aug 22 20:12:23 2006
@@ -44,3 +44,8 @@
STATE_PLAYING = 'STATE_PLAYING'
STATE_PAUSED = 'STATE_PAUSED'
STATE_SHUTDOWN = 'STATE_SHUTDOWN'
+
+SEEK_RELATIVE = 'SEEK_RELATIVE'
+SEEK_ABSOLUTE = 'SEEK_ABSOLUTE'
+SEEK_PERCENTAGE = 'SEEK_PERCENTAGE'
+
Modified: trunk/WIP/player/test/play.py
==============================================================================
--- trunk/WIP/player/test/play.py (original)
+++ trunk/WIP/player/test/play.py Tue Aug 22 20:12:23 2006
@@ -22,6 +22,8 @@
player.pause_toggle()
elif key == "q":
player.stop()
+ elif key in ("up", "down", "left", "right"):
+ player.seek({"up": 60, "down": -60, "left": -10, "right": 10}[key])
elif key == "f" and player.get_window():
win = player.get_window()
win.set_fullscreen(not win.get_fullscreen())
@@ -40,4 +42,10 @@
kaa.notifier.OneShotTimer(next, 'xine').start(0)
+def print_pos():
+ print '\r', player.get_position(),
+ sys.stdout.flush()
+ return True
+
+kaa.notifier.Timer(print_pos).start(0.1)
kaa.main()
-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Freevo-cvslog mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog