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;    
+}
+
 
 
