Zebediah Figura : quartz/filtergraph: Clarify stream time tracking.

Alexandre Julliard julliard at winehq.org
Tue Oct 22 16:57:01 CDT 2019


Module: wine
Branch: master
Commit: 524783dfeb27424591b2c6e775bf8acf06a414df
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=524783dfeb27424591b2c6e775bf8acf06a414df

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Mon Oct 21 16:54:51 2019 -0500

quartz/filtergraph: Clarify stream time tracking.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/quartz/filtergraph.c       | 46 ++++++++++++++++++++---------------------
 dlls/quartz/tests/filtergraph.c |  4 ++--
 2 files changed, 24 insertions(+), 26 deletions(-)

diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c
index 9750e6fe84..d5442e21fc 100644
--- a/dlls/quartz/filtergraph.c
+++ b/dlls/quartz/filtergraph.c
@@ -202,8 +202,6 @@ typedef struct _IFilterGraphImpl {
     int nItfCacheEntries;
     BOOL defaultclock;
     GUID timeformatseek;
-    REFERENCE_TIME start_time;
-    REFERENCE_TIME pause_time;
     LONG recursioncount;
     IUnknown *pSite;
     LONG version;
@@ -211,6 +209,10 @@ typedef struct _IFilterGraphImpl {
     HANDLE message_thread, message_thread_ret;
     DWORD message_thread_id;
 
+    /* Respectively: the last timestamp at which we started streaming, and the
+     * current offset within the stream. */
+    REFERENCE_TIME stream_start, stream_elapsed;
+
     LONGLONG current_pos;
 } IFilterGraphImpl;
 
@@ -2519,16 +2521,14 @@ static HRESULT WINAPI MediaSeeking_GetCurrentPosition(IMediaSeeking *iface, LONG
 
     EnterCriticalSection(&graph->cs);
 
-    if (graph->state == State_Running && graph->refClock && graph->start_time >= 0)
+    if (graph->state == State_Running && graph->refClock)
     {
         REFERENCE_TIME time;
         IReferenceClock_GetTime(graph->refClock, &time);
         if (time)
-            ret += time - graph->start_time;
+            ret += time - graph->stream_start;
     }
 
-    if (graph->pause_time > 0)
-        ret += graph->pause_time;
     LeaveCriticalSection(&graph->cs);
 
     TRACE("Returning %s.\n", wine_dbgstr_longlong(ret));
@@ -2613,8 +2613,11 @@ static HRESULT WINAPI MediaSeeking_SetPositions(IMediaSeeking *iface, LONGLONG *
         }
     }
 
-    if ((current_flags & 0x7) != AM_SEEKING_NoPositioning)
-        graph->pause_time = graph->start_time = -1;
+    if ((current_flags & 0x7) != AM_SEEKING_NoPositioning && graph->refClock)
+    {
+        IReferenceClock_GetTime(graph->refClock, &graph->stream_start);
+        graph->stream_elapsed = 0;
+    }
 
     if (state == State_Running)
         IMediaControl_Run(&graph->IMediaControl_iface);
@@ -5232,13 +5235,13 @@ static HRESULT WINAPI MediaFilter_Pause(IMediaFilter *iface)
     if (graph->defaultclock && !graph->refClock)
         IFilterGraph2_SetDefaultSyncSource(&graph->IFilterGraph2_iface);
 
-    if (graph->state == State_Running && graph->refClock && graph->start_time >= 0)
+    if (graph->state == State_Running && graph->refClock)
     {
-        IReferenceClock_GetTime(graph->refClock, &graph->pause_time);
-        graph->current_pos += graph->pause_time - graph->start_time;
+        REFERENCE_TIME time;
+        IReferenceClock_GetTime(graph->refClock, &time);
+        graph->stream_elapsed += time - graph->stream_start;
+        graph->current_pos += graph->stream_elapsed;
     }
-    else
-        graph->pause_time = -1;
 
     SendFilterMessage(graph, SendPause, 0);
     graph->state = State_Paused;
@@ -5250,6 +5253,7 @@ static HRESULT WINAPI MediaFilter_Pause(IMediaFilter *iface)
 static HRESULT WINAPI MediaFilter_Run(IMediaFilter *iface, REFERENCE_TIME start)
 {
     IFilterGraphImpl *graph = impl_from_IMediaFilter(iface);
+    REFERENCE_TIME stream_start = start;
 
     TRACE("graph %p, start %s.\n", graph, wine_dbgstr_longlong(start));
 
@@ -5267,19 +5271,13 @@ static HRESULT WINAPI MediaFilter_Run(IMediaFilter *iface, REFERENCE_TIME start)
 
     if (!start && graph->refClock)
     {
-        REFERENCE_TIME now;
-        IReferenceClock_GetTime(graph->refClock, &now);
+        IReferenceClock_GetTime(graph->refClock, &graph->stream_start);
+        stream_start = graph->stream_start - graph->stream_elapsed;
         if (graph->state == State_Stopped)
-            graph->start_time = now + 500000;
-        else if (graph->pause_time >= 0)
-            graph->start_time += now - graph->pause_time;
-        else
-            graph->start_time = now;
+            stream_start += 500000;
     }
-    else
-        graph->start_time = start;
 
-    SendFilterMessage(graph, SendRun, (DWORD_PTR)&graph->start_time);
+    SendFilterMessage(graph, SendRun, (DWORD_PTR)&stream_start);
     graph->state = State_Running;
 
     LeaveCriticalSection(&graph->cs);
@@ -5726,7 +5724,7 @@ static HRESULT filter_graph_common_create(IUnknown *outer, void **out, BOOL thre
     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->pause_time = 0;
+    fimpl->stream_start = fimpl->stream_elapsed = 0;
     fimpl->punkFilterMapper2 = NULL;
     fimpl->recursioncount = 0;
     fimpl->version = 0;
diff --git a/dlls/quartz/tests/filtergraph.c b/dlls/quartz/tests/filtergraph.c
index 3ef610d76b..14f2dfaa7a 100644
--- a/dlls/quartz/tests/filtergraph.c
+++ b/dlls/quartz/tests/filtergraph.c
@@ -3947,12 +3947,12 @@ static void test_graph_seeking(void)
 
     hr = IMediaSeeking_GetCurrentPosition(seeking, &time);
     ok(hr == S_OK, "Got hr %#x.\n", hr);
-    todo_wine ok(abs(time - 1334 * 10000) < 40 * 10000,
+    ok(abs(time - 1334 * 10000) < 40 * 10000,
             "Expected about 1334ms, got %s.\n", wine_dbgstr_longlong(time));
     current = stop = 0xdeadbeef;
     hr = IMediaSeeking_GetPositions(seeking, &current, &stop);
     ok(hr == S_OK, "Got hr %#x.\n", hr);
-    todo_wine ok(abs(current - 1334 * 10000) < 40 * 10000,
+    ok(abs(current - 1334 * 10000) < 40 * 10000,
             "Expected about 1334ms, got %s.\n", wine_dbgstr_longlong(current));
     ok(stop == 8000 * 10000, "Got time %s.\n", wine_dbgstr_longlong(stop));
 




More information about the wine-cvs mailing list