Seeking backwards has been implemented.


git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@2522 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/java/src/com/tightvnc/rfbplayer/FbsInputStream.java b/java/src/com/tightvnc/rfbplayer/FbsInputStream.java
index 4057aca..2e90bc4 100644
--- a/java/src/com/tightvnc/rfbplayer/FbsInputStream.java
+++ b/java/src/com/tightvnc/rfbplayer/FbsInputStream.java
@@ -30,6 +30,7 @@
   protected long startTime;
   protected long timeOffset;
   protected long seekOffset;
+  protected boolean seekBackwards;
   protected boolean paused;
   protected double playbackSpeed;
 
@@ -57,6 +58,7 @@
     startTime = System.currentTimeMillis();
     timeOffset = 0;
     seekOffset = -1;
+    seekBackwards = false;
     paused = false;
     playbackSpeed = 1.0;
 
@@ -105,6 +107,7 @@
     startTime = -1;
     timeOffset = 0;
     seekOffset = -1;
+    seekBackwards = false;
     paused = false;
     playbackSpeed = 1.0;
 
@@ -128,6 +131,9 @@
   public synchronized void setTimeOffset(long pos)
   {
     seekOffset = (long)(pos / playbackSpeed);
+    if (seekOffset < timeOffset) {
+      seekBackwards = true;
+    }
     notify();
   }
 
@@ -147,6 +153,16 @@
     return (seekOffset >= 0);
   }
 
+  public long getSeekOffset()
+  {
+    return seekOffset;
+  }
+
+  public boolean isPaused()
+  {
+    return paused;
+  }
+
   public synchronized void pausePlayback()
   {
     paused = true;
@@ -171,6 +187,11 @@
 
   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();