Maarten Lankhorst : winegstreamer: Fix seeking for real.

Alexandre Julliard julliard at winehq.org
Thu Nov 25 11:18:51 CST 2010


Module: wine
Branch: master
Commit: 36fb590efd7c1d27d44b81553bf6151c61454fec
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=36fb590efd7c1d27d44b81553bf6151c61454fec

Author: Maarten Lankhorst <m.b.lankhorst at gmail.com>
Date:   Fri Nov 12 21:43:44 2010 +0100

winegstreamer: Fix seeking for real.

---

 dlls/winegstreamer/gstdemux.c |   19 +++++++++++--------
 1 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c
index 6c9aca0..7c2398b 100644
--- a/dlls/winegstreamer/gstdemux.c
+++ b/dlls/winegstreamer/gstdemux.c
@@ -326,7 +326,7 @@ static gboolean gst_base_src_perform_seek(GSTImpl *This, GstEvent *event)
             gst_pad_activate_push(This->my_src, 0);
     }
 
-    TRACE("++++++++++++++++ perform byte seek ------------------\n");
+    This->nextofs = This->start = cur;
 
     /* and prepare to continue streaming */
     if (flush) {
@@ -829,11 +829,15 @@ static gboolean activate_push(GstPad *pad, gboolean activate) {
     EnterCriticalSection(&This->filter.csFilter);
     if (!activate) {
         TRACE("Deactivating\n");
+        if (!This->initial)
+            IAsyncReader_BeginFlush(This->pInputPin.pReader);
         if (This->push_thread) {
             WaitForSingleObject(This->push_thread, -1);
             CloseHandle(This->push_thread);
             This->push_thread = NULL;
         }
+        if (!This->initial)
+            IAsyncReader_EndFlush(This->pInputPin.pReader);
         if (This->filter.state == State_Stopped)
             This->nextofs = This->start;
     } else if (!This->push_thread) {
@@ -968,6 +972,7 @@ static HRESULT GST_Connect(GSTInPin *pPin, IPin *pConnectPin, ALLOCATOR_PROPERTI
         gst_pad_query_duration(This->ppPins[0]->their_src, &format, &duration);
         for (i = 0; i < This->cStreams; ++i) {
             This->ppPins[i]->seek.llDuration = This->ppPins[i]->seek.llStop = duration / 100;
+            This->ppPins[i]->seek.llCurrent = 0;
             if (!This->ppPins[i]->seek.llDuration)
                 This->ppPins[i]->seek.dwCapabilities = 0;
             WaitForSingleObject(This->ppPins[i]->caps_event, -1);
@@ -1134,11 +1139,8 @@ static HRESULT WINAPI GST_Stop(IBaseFilter *iface) {
 
     TRACE("()\n");
 
-    if (This->gstfilter) {
-        IAsyncReader_BeginFlush(This->pInputPin.pReader);
+    if (This->gstfilter)
         gst_element_set_state(This->gstfilter, GST_STATE_READY);
-        IAsyncReader_EndFlush(This->pInputPin.pReader);
-    }
     return S_OK;
 }
 
@@ -1313,6 +1315,7 @@ static HRESULT WINAPI GST_Seeking_GetCurrentPosition(IMediaSeeking *iface, REFER
         return E_NOTIMPL;
     }
     *pos /= 100;
+    This->seek.llCurrent = *pos;
     return S_OK;
 }
 
@@ -1339,8 +1342,10 @@ static HRESULT WINAPI GST_Seeking_SetPositions(IMediaSeeking *iface, REFERENCE_T
 
     hr = SourceSeekingImpl_SetPositions(iface, pCur, curflags, pStop, stopflags);
     if (!This->their_src)
-        return This->seek.llDuration ? hr : E_NOTIMPL;
+        return hr;
 
+    curtype = type_from_flags(curflags);
+    stoptype = type_from_flags(stopflags);
     if (curflags & AM_SEEKING_SeekToKeyFrame)
         f |= GST_SEEK_FLAG_KEY_UNIT;
     if (curflags & AM_SEEKING_Segment)
@@ -1348,8 +1353,6 @@ static HRESULT WINAPI GST_Seeking_SetPositions(IMediaSeeking *iface, REFERENCE_T
     if (!(curflags & AM_SEEKING_NoFlush))
         f |= GST_SEEK_FLAG_FLUSH;
 
-    curtype = type_from_flags(curflags);
-    stoptype = type_from_flags(stopflags);
     e = gst_event_new_seek(This->seek.dRate, GST_FORMAT_TIME, f, curtype, pCur ? *pCur * 100 : -1, stoptype, pStop ? *pStop * 100 : -1);
     if (gst_pad_push_event(This->my_sink, e))
         return S_OK;




More information about the wine-cvs mailing list