diff options
author | Constantin Kaplinsky <const@tightvnc.com> | 2002-08-16 16:01:37 +0000 |
---|---|---|
committer | Constantin Kaplinsky <const@tightvnc.com> | 2002-08-16 16:01:37 +0000 |
commit | d8770f6408e97ff8feb0ea28a2b5ebf111f9cdcd (patch) | |
tree | 046f5a40566c968016f1af98be1472cacbcafdb3 /java/src | |
parent | e4ac49ae39d16bb33d7d164413ca3c14e80c8a29 (diff) | |
download | tigervnc-d8770f6408e97ff8feb0ea28a2b5ebf111f9cdcd.tar.gz tigervnc-d8770f6408e97ff8feb0ea28a2b5ebf111f9cdcd.zip |
Seeking backwards has been implemented.
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@2522 3789f03b-4d11-0410-bbf8-ca57d06f2519
Diffstat (limited to 'java/src')
-rw-r--r-- | java/src/com/tightvnc/rfbplayer/FbsInputStream.java | 21 | ||||
-rw-r--r-- | java/src/com/tightvnc/rfbplayer/RfbPlayer.java | 17 |
2 files changed, 34 insertions, 4 deletions
diff --git a/java/src/com/tightvnc/rfbplayer/FbsInputStream.java b/java/src/com/tightvnc/rfbplayer/FbsInputStream.java index 4057aca9..2e90bc48 100644 --- a/java/src/com/tightvnc/rfbplayer/FbsInputStream.java +++ b/java/src/com/tightvnc/rfbplayer/FbsInputStream.java @@ -30,6 +30,7 @@ class FbsInputStream extends InputStream { protected long startTime; protected long timeOffset; protected long seekOffset; + protected boolean seekBackwards; protected boolean paused; protected double playbackSpeed; @@ -57,6 +58,7 @@ class FbsInputStream extends InputStream { startTime = System.currentTimeMillis(); timeOffset = 0; seekOffset = -1; + seekBackwards = false; paused = false; playbackSpeed = 1.0; @@ -105,6 +107,7 @@ class FbsInputStream extends InputStream { startTime = -1; timeOffset = 0; seekOffset = -1; + seekBackwards = false; paused = false; playbackSpeed = 1.0; @@ -128,6 +131,9 @@ class FbsInputStream extends InputStream { public synchronized void setTimeOffset(long pos) { seekOffset = (long)(pos / playbackSpeed); + if (seekOffset < timeOffset) { + seekBackwards = true; + } notify(); } @@ -147,6 +153,16 @@ class FbsInputStream extends InputStream { return (seekOffset >= 0); } + public long getSeekOffset() + { + return seekOffset; + } + + public boolean isPaused() + { + return paused; + } + public synchronized void pausePlayback() { paused = true; @@ -171,6 +187,11 @@ class FbsInputStream extends InputStream { private synchronized boolean fillBuffer() throws IOException { + // The reading thread should be interrupted on backward seeking. + if (seekBackwards) + throw new EOFException("[REWIND]"); + + // Just wait unless we are performing playback OR seeking. waitWhilePaused(); bufferSize = (int)readUnsigned32(); diff --git a/java/src/com/tightvnc/rfbplayer/RfbPlayer.java b/java/src/com/tightvnc/rfbplayer/RfbPlayer.java index c2fa6f69..32568047 100644 --- a/java/src/com/tightvnc/rfbplayer/RfbPlayer.java +++ b/java/src/com/tightvnc/rfbplayer/RfbPlayer.java @@ -161,12 +161,21 @@ public class RfbPlayer extends java.applet.Applet try { setPaused(!autoPlay); rfb.fbs.setSpeed(playbackSpeed); - setPos(initialTimeOffset); + if (initialTimeOffset > rfb.fbs.getTimeOffset()) + setPos(initialTimeOffset); // don't seek backwards here vc.processNormalProtocol(); } catch (EOFException e) { - initialTimeOffset = 0; - autoPlay = false; - rfb.newSession(url); + if (e.getMessage() != null && e.getMessage().equals("[REWIND]")) { + // A special type of EOFException allowing us to seek backwards. + initialTimeOffset = rfb.fbs.getSeekOffset(); + autoPlay = !rfb.fbs.isPaused(); + rfb.newSession(url); + } else { + // Return to the beginning after the playback is finished. + initialTimeOffset = 0; + autoPlay = false; + rfb.newSession(url); + } } } |