Maarten Lankhorst : quartz: Remove position from filtergraph.

Alexandre Julliard julliard at winehq.org
Mon Nov 8 11:46:22 CST 2010


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

Author: Maarten Lankhorst <m.b.lankhorst at gmail.com>
Date:   Fri Nov  5 23:19:08 2010 +0100

quartz: Remove position from filtergraph.

---

 dlls/quartz/filtergraph.c |   59 ++++++++++++++++++++------------------------
 1 files changed, 27 insertions(+), 32 deletions(-)

diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c
index 8c7339b..44f87b2 100644
--- a/dlls/quartz/filtergraph.c
+++ b/dlls/quartz/filtergraph.c
@@ -203,7 +203,6 @@ typedef struct _IFilterGraphImpl {
     GUID timeformatseek;
     REFERENCE_TIME start_time;
     REFERENCE_TIME pause_time;
-    LONGLONG position;
     LONGLONG stop_position;
     LONG recursioncount;
 } IFilterGraphImpl;
@@ -1956,7 +1955,7 @@ static HRESULT WINAPI MediaControl_Run(IMediaControl *iface) {
         else
             This->start_time += now - This->pause_time;
     }
-    else This->position = This->start_time = 0;
+    else This->start_time = 0;
 
     SendFilterMessage(iface, SendRun, 0);
     This->state = State_Running;
@@ -1990,13 +1989,6 @@ static HRESULT WINAPI MediaControl_Stop(IMediaControl *iface) {
     if (This->state == State_Stopped) return S_OK;
 
     EnterCriticalSection(&This->cs);
-    if (This->state == State_Running && This->refClock)
-    {
-        LONGLONG time = This->start_time;
-        IReferenceClock_GetTime(This->refClock, &time);
-        This->position += time - This->start_time;
-    }
-
     if (This->state == State_Running) SendFilterMessage(iface, SendPause, 0);
     SendFilterMessage(iface, SendStop, 0);
     This->state = State_Stopped;
@@ -2319,10 +2311,8 @@ static HRESULT WINAPI FoundDuration(IFilterGraphImpl *This, IMediaSeeking *seek,
     if (FAILED(hr))
         return hr;
 
-    /* FIXME: Minimum or maximum duration? Assuming minimum */
-    if (duration > 0 && *pdur < duration)
+    if (*pdur < duration)
         *pdur = duration;
-
     return hr;
 }
 
@@ -2337,7 +2327,7 @@ static HRESULT WINAPI MediaSeeking_GetDuration(IMediaSeeking *iface,
         return E_POINTER;
 
     EnterCriticalSection(&This->cs);
-    *pDuration = -1;
+    *pDuration = 0;
     hr = all_renderers_seek(This, FoundDuration, (DWORD_PTR)pDuration);
     LeaveCriticalSection(&This->cs);
 
@@ -2361,37 +2351,45 @@ static HRESULT WINAPI MediaSeeking_GetStopPosition(IMediaSeeking *iface,
         hr = IMediaSeeking_GetDuration(iface, pStop);
     else
         *pStop = This->stop_position;
-
     LeaveCriticalSection(&This->cs);
 
     return hr;
 }
 
+static HRESULT WINAPI FoundCurrentPosition(IFilterGraphImpl *This, IMediaSeeking *seek, DWORD_PTR pposition)
+{
+    HRESULT hr;
+    LONGLONG pos = 0, *ppos = (LONGLONG*)pposition;
+
+    hr = IMediaSeeking_GetCurrentPosition(seek, &pos);
+    if (FAILED(hr))
+        return hr;
+
+    if (*ppos < 0 || pos < *ppos)
+        *ppos = pos;
+    return hr;
+}
+
 static HRESULT WINAPI MediaSeeking_GetCurrentPosition(IMediaSeeking *iface,
 						      LONGLONG *pCurrent) {
     ICOM_THIS_MULTI(IFilterGraphImpl, IMediaSeeking_vtbl, iface);
-    LONGLONG time = 0;
+    HRESULT hr;
 
     if (!pCurrent)
         return E_POINTER;
 
     EnterCriticalSection(&This->cs);
-    if (This->state == State_Running && This->refClock)
-    {
-        IReferenceClock_GetTime(This->refClock, &time);
-        if (time)
-            time += This->position - This->start_time;
-        if (time < This->position)
-            time = This->position;
-        *pCurrent = time;
+    *pCurrent = -1;
+    hr = all_renderers_seek(This, FoundCurrentPosition, (DWORD_PTR)pCurrent);
+    if (hr == E_NOTIMPL) {
+        *pCurrent = 0;
+        hr = S_OK;
     }
-    else
-        *pCurrent = This->position;
     LeaveCriticalSection(&This->cs);
 
     TRACE("Time: %u.%03u\n", (DWORD)(*pCurrent / 10000000), (DWORD)((*pCurrent / 10000)%1000));
 
-    return S_OK;
+    return hr;
 }
 
 static HRESULT WINAPI MediaSeeking_ConvertTimeFormat(IMediaSeeking *iface,
@@ -2435,11 +2433,8 @@ static HRESULT WINAPI MediaSeeking_SetPositions(IMediaSeeking *iface,
     state = This->state;
     TRACE("State: %s\n", state == State_Running ? "Running" : (state == State_Paused ? "Paused" : (state == State_Stopped ? "Stopped" : "UNKNOWN")));
 
-    if ((dwCurrentFlags & 0x7) == AM_SEEKING_AbsolutePositioning)
-    {
-        This->position = *pCurrent;
-    }
-    else if ((dwCurrentFlags & 0x7) != AM_SEEKING_NoPositioning)
+    if ((dwCurrentFlags & 0x7) != AM_SEEKING_AbsolutePositioning &&
+        (dwCurrentFlags & 0x7) != AM_SEEKING_NoPositioning)
         FIXME("Adjust method %x not handled yet!\n", dwCurrentFlags & 0x7);
 
     if ((dwStopFlags & 0x7) == AM_SEEKING_AbsolutePositioning)
@@ -5477,7 +5472,7 @@ HRESULT FilterGraph_create(IUnknown *pUnkOuter, LPVOID *ppObj)
     fimpl->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": IFilterGraphImpl.cs");
     fimpl->nItfCacheEntries = 0;
     memcpy(&fimpl->timeformatseek, &TIME_FORMAT_MEDIA_TIME, sizeof(GUID));
-    fimpl->start_time = fimpl->position = 0;
+    fimpl->start_time = fimpl->pause_time = 0;
     fimpl->stop_position = -1;
     fimpl->punkFilterMapper2 = NULL;
     fimpl->recursioncount = 0;




More information about the wine-cvs mailing list