aboutsummaryrefslogtreecommitdiffstats
path: root/java/src
diff options
context:
space:
mode:
authorConstantin Kaplinsky <const@tightvnc.com>2002-08-16 16:01:37 +0000
committerConstantin Kaplinsky <const@tightvnc.com>2002-08-16 16:01:37 +0000
commitd8770f6408e97ff8feb0ea28a2b5ebf111f9cdcd (patch)
tree046f5a40566c968016f1af98be1472cacbcafdb3 /java/src
parente4ac49ae39d16bb33d7d164413ca3c14e80c8a29 (diff)
downloadtigervnc-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.java21
-rw-r--r--java/src/com/tightvnc/rfbplayer/RfbPlayer.java17
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);
+ }
}
}