Index: /OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegDecoder.hpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegDecoder.hpp (revision 10392)
+++ /OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegDecoder.hpp (revision 10809)
@@ -69,4 +69,7 @@
     bool readNextPacket();
     void rewind();
+    void seek(double time);
+    void pause();
+    void resume();
 
     void loop(bool loop);
@@ -85,6 +88,8 @@
     {
         NORMAL,
+        PAUSE,
         END_OF_STREAM,
-        REWINDING
+        REWINDING,
+        SEEKING
     };
 
@@ -98,5 +103,8 @@
     bool readNextPacketEndOfStream();
     bool readNextPacketRewinding();
+    bool readNextPacketSeeking();
+    bool readNextPacketPause();
     void rewindButDontFlushQueues();
+    void seekButDontFlushQueues(double time);
 
     FormatContextPtr    m_format_context;
Index: /OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegImageStream.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegImageStream.cpp (revision 10538)
+++ /OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegImageStream.cpp (revision 10809)
@@ -129,4 +129,9 @@
 {
     m_commands->push(CMD_REWIND);
+}
+
+void FFmpegImageStream::seek(double time) {
+    m_seek_time = time;
+    m_commands->push(CMD_SEEK);
 }
 
@@ -235,4 +240,8 @@
         return true;
 
+    case CMD_SEEK:
+        cmdSeek(m_seek_time);
+        return true;
+
     case CMD_STOP:
         return false;
@@ -255,4 +264,6 @@
         if (! m_decoder->video_decoder().isRunning())
             m_decoder->video_decoder().start();
+
+        m_decoder->resume();
     }
 
@@ -266,5 +277,5 @@
     if (_status == PLAYING)
     {
-
+        m_decoder->pause();
     }
 
@@ -279,4 +290,8 @@
 }
 
+void FFmpegImageStream::cmdSeek(double time) 
+{
+    m_decoder->seek(time);
+}
 
 
Index: /OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegImageStream.hpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegImageStream.hpp (revision 9910)
+++ /OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegImageStream.hpp (revision 10809)
@@ -31,4 +31,5 @@
         virtual void pause();
         virtual void rewind();
+        virtual void seek(double time);
         virtual void quit(bool waitForThreadToExit = true);
 
@@ -45,5 +46,6 @@
             CMD_PAUSE,
             CMD_STOP,
-            CMD_REWIND
+            CMD_REWIND,
+            CMD_SEEK
         };
 
@@ -61,4 +63,5 @@
         void cmdPause();
         void cmdRewind();
+        void cmdSeek(double time);
 
         static void publishNewFrame(const FFmpegDecoderVideo &, void * user_data);
@@ -70,4 +73,5 @@
         Condition        m_frame_published_cond;
         bool            m_frame_published_flag;
+        double           m_seek_time;
     };
 
Index: /OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegDecoder.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegDecoder.cpp (revision 10422)
+++ /OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegDecoder.cpp (revision 10809)
@@ -167,4 +167,7 @@
         return readNextPacketNormal();
 
+    case PAUSE:
+        return false;
+
     case END_OF_STREAM:
         return readNextPacketEndOfStream();
@@ -172,4 +175,7 @@
     case REWINDING:
         return readNextPacketRewinding();
+
+    case SEEKING:
+        return readNextPacketSeeking();
 
     default:
@@ -190,6 +196,30 @@
 }
 
-
-
+void FFmpegDecoder::seek(double time) 
+{
+    m_pending_packet.clear();
+
+    flushAudioQueue();
+    flushVideoQueue();
+    seekButDontFlushQueues(time);
+}
+
+void FFmpegDecoder::pause() 
+{
+    m_pending_packet.clear();
+
+    flushAudioQueue();
+    flushVideoQueue();
+    m_state = PAUSE;
+}
+
+void FFmpegDecoder::resume() 
+{
+    m_pending_packet.clear();
+
+    flushAudioQueue();
+    flushVideoQueue();
+    m_state = NORMAL;
+}
 
 void FFmpegDecoder::findAudioStream()
@@ -347,4 +377,27 @@
 }
 
+bool FFmpegDecoder::readNextPacketSeeking() 
+{
+    const FFmpegPacket packet(FFmpegPacket::PACKET_FLUSH);
+
+    if (m_audio_queue.timedPush(packet, 10) && m_video_queue.timedPush(packet, 10))
+        m_state = NORMAL;
+
+    return false;    
+}
+
+void FFmpegDecoder::seekButDontFlushQueues(double time)
+{
+    const AVRational AvTimeBaseQ = { 1, AV_TIME_BASE }; // = AV_TIME_BASE_Q
+
+    const int64_t pos = int64_t(m_clocks.getStartTime()+time * double(AV_TIME_BASE));
+    const int64_t seek_target = av_rescale_q(pos, AvTimeBaseQ, m_video_stream->time_base);
+
+    if (av_seek_frame(m_format_context.get(), m_video_index, seek_target, 0/*AVSEEK_FLAG_BYTE |*/ /*AVSEEK_FLAG_BACKWARD*/) < 0)
+        throw std::runtime_error("av_seek_frame failed()");
+
+    m_state = SEEKING;    
+}
+
 
 
Index: /OpenSceneGraph/trunk/examples/osgmovie/osgmovie.cpp
===================================================================
--- /OpenSceneGraph/trunk/examples/osgmovie/osgmovie.cpp (revision 10799)
+++ /OpenSceneGraph/trunk/examples/osgmovie/osgmovie.cpp (revision 10809)
@@ -119,4 +119,5 @@
     bool            _trackMouse;
     ImageStreamList _imageStreamList;
+    unsigned int    _seekIncr;
 
 };
@@ -238,4 +239,21 @@
                 return true;
             }
+            else if (ea.getKey()=='>')
+            {
+                for(ImageStreamList::iterator itr=_imageStreamList.begin();
+                    itr!=_imageStreamList.end();
+                    ++itr)
+                {
+                    std::cout<<"Seeking"<<std::endl;
+                    if(_seekIncr > 3) _seekIncr = 0;
+                    double length = (*itr)->getLength();
+                    double t_pos = (length/4.0f)*_seekIncr;
+                    //(*itr)->rewind();
+                    (*itr)->seek(t_pos);
+                    (*itr)->play();
+                    _seekIncr++;
+                }
+                return true;
+            }
             else if (ea.getKey()=='L')
             {
@@ -310,4 +328,5 @@
     usage.addKeyboardMouseBinding("-","Decrease speed of movie");
     usage.addKeyboardMouseBinding("o","Display frame rate of movie");
+    usage.addKeyboardMouseBinding(">","Advance the movie using seek");
 }
 
