Index: OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegClocks.cpp
===================================================================
--- OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegClocks.cpp (revision 10851)
+++ OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegClocks.cpp (revision 10892)
@@ -40,5 +40,4 @@
     m_audio_delay(0.0),
     m_audio_disabled(false),
-    m_rewind(false),
     m_paused(false),
     m_last_current_time(0.0)
@@ -60,4 +59,7 @@
     m_frame_time = start_time;
 
+    m_pause_time = 0;
+    m_seek_time = 0;
+    
     m_audio_buffer_end_pts = start_time;
     m_audio_timer.setStartTick();
@@ -69,37 +71,39 @@
         m_paused = true;
     else
+    {
         m_paused = false;
-}
-
-
-
-void FFmpegClocks::rewindAudio()
-{
-    ScopedLock lock(m_mutex);
-
+        if(!m_audio_disabled) m_audio_timer.setStartTick();
+    }
+}
+
+
+
+void FFmpegClocks::rewind()
+{
+    ScopedLock lock(m_mutex);
+
+    m_pause_time = 0;
+    m_seek_time = 0;
+    
     m_audio_buffer_end_pts = m_start_time;
     m_audio_timer.setStartTick();
 
-    m_rewind = ! m_rewind;
-}
-
-
-
-void FFmpegClocks::rewindVideo()
-{
-    ScopedLock lock(m_mutex);
+    m_last_frame_delay = 0.040;
+    m_frame_time = m_start_time;
 
     if (m_audio_disabled)
         return;
 
-    m_video_clock = m_start_time;
-
+    m_video_clock = m_start_time;    
+}
+
+void FFmpegClocks::seek(double seek_time)
+{
+    ScopedLock lock(m_mutex);
+    
+    m_video_clock = seek_time;
     m_last_frame_delay = 0.040;
-    m_last_frame_pts = m_start_time - m_last_frame_delay;
-    m_frame_time = m_start_time;
-
-    m_rewind = ! m_rewind;
-}
-
+    m_frame_time = seek_time;
+}
 
 
@@ -180,6 +184,11 @@
 
     // If incorrect delay, use previous one
+    
     if (delay <= 0.0 || delay >= 1.0)
+    {
         delay = m_last_frame_delay;
+        if(!m_audio_disabled) m_frame_time = pts - delay;
+    }
+    
 
     // Save for next time
@@ -194,7 +203,5 @@
 
     const double audio_time = getAudioTime();
-    const double actual_delay = (! m_rewind) ?
-        clamp(m_frame_time - audio_time, -0.5*delay, 2.5*delay) :
-        m_last_actual_delay; // when rewinding audio or video (but the other has yet to be), get the last used delay
+    const double actual_delay = clamp(m_frame_time - audio_time, -0.5*delay, 2.5*delay);
 
     //m_frame_time += delay;
@@ -225,5 +232,5 @@
 void FFmpegClocks::setSeekTime(double seek_time)
 {
-    m_seek_time = getAudioTime() - seek_time;
+    m_seek_time += getAudioTime() - seek_time;
 }
 
@@ -232,5 +239,8 @@
 double FFmpegClocks::getAudioTime() const
 {
-    return m_audio_buffer_end_pts + m_audio_timer.time_s() - m_pause_time - m_audio_delay;
+    if(m_audio_disabled)
+        return m_audio_buffer_end_pts + m_audio_timer.time_s() - m_pause_time - m_audio_delay - m_seek_time;
+    else
+        return m_audio_buffer_end_pts + m_audio_timer.time_s() - m_audio_delay;
 }
 
@@ -239,5 +249,5 @@
 {
     if(!m_paused)
-        m_last_current_time = getAudioTime() - m_seek_time; // synced with audio
+        m_last_current_time = getAudioTime();
     
     return m_last_current_time;  
