[PATCH 2/3] mf/evr: Notify mixer and presenter on clock state changes.

Nikolay Sivov nsivov at codeweavers.com
Mon Oct 26 09:20:22 CDT 2020


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/mf/evr.c | 68 ++++++++++++++++++++++++++++++++++++---------------
 1 file changed, 48 insertions(+), 20 deletions(-)

diff --git a/dlls/mf/evr.c b/dlls/mf/evr.c
index 537d859d229..1b18e1c07a3 100644
--- a/dlls/mf/evr.c
+++ b/dlls/mf/evr.c
@@ -860,7 +860,6 @@ static HRESULT WINAPI video_renderer_sink_GetStreamSinkById(IMFMediaSink *iface,
             *stream = &renderer->streams[i]->IMFStreamSink_iface;
             IMFStreamSink_AddRef(*stream);
         }
-
     }
     LeaveCriticalSection(&renderer->cs);
 
@@ -1382,21 +1381,30 @@ static HRESULT WINAPI video_renderer_clock_sink_OnClockStart(IMFClockStateSink *
 
     EnterCriticalSection(&renderer->cs);
 
-    for (i = 0; i < renderer->stream_count; ++i)
+    if (renderer->state == EVR_STATE_STOPPED)
     {
-        struct video_stream *stream = renderer->streams[i];
+        IMFTransform_ProcessMessage(renderer->mixer, MFT_MESSAGE_NOTIFY_BEGIN_STREAMING, 0);
+        IMFVideoPresenter_ProcessMessage(renderer->presenter, MFVP_MESSAGE_BEGINSTREAMING, 0);
 
-        IMFMediaEventQueue_QueueEventParamVar(stream->event_queue, MEStreamSinkStarted, &GUID_NULL, S_OK, NULL);
+        for (i = 0; i < renderer->stream_count; ++i)
+        {
+            struct video_stream *stream = renderer->streams[i];
 
-        EnterCriticalSection(&stream->cs);
-        if (!(stream->flags & EVR_STREAM_PREROLLED))
-            IMFMediaEventQueue_QueueEventParamVar(stream->event_queue, MEStreamSinkRequestSample,
-                    &GUID_NULL, S_OK, NULL);
-        stream->flags |= EVR_STREAM_PREROLLED;
-        LeaveCriticalSection(&stream->cs);
+            IMFMediaEventQueue_QueueEventParamVar(stream->event_queue, MEStreamSinkStarted, &GUID_NULL, S_OK, NULL);
+
+            EnterCriticalSection(&stream->cs);
+            if (!(stream->flags & EVR_STREAM_PREROLLED))
+                IMFMediaEventQueue_QueueEventParamVar(stream->event_queue, MEStreamSinkRequestSample,
+                        &GUID_NULL, S_OK, NULL);
+            stream->flags |= EVR_STREAM_PREROLLED;
+            LeaveCriticalSection(&stream->cs);
+        }
     }
+
     renderer->state = EVR_STATE_RUNNING;
 
+    IMFVideoPresenter_OnClockStart(renderer->presenter, systime, offset);
+
     LeaveCriticalSection(&renderer->cs);
 
     return S_OK;
@@ -1411,16 +1419,28 @@ static HRESULT WINAPI video_renderer_clock_sink_OnClockStop(IMFClockStateSink *i
 
     EnterCriticalSection(&renderer->cs);
 
-    for (i = 0; i < renderer->stream_count; ++i)
+    IMFVideoPresenter_OnClockStop(renderer->presenter, systime);
+
+    IMFTransform_ProcessMessage(renderer->mixer, MFT_MESSAGE_COMMAND_FLUSH, 0);
+    IMFVideoPresenter_ProcessMessage(renderer->presenter, MFVP_MESSAGE_FLUSH, 0);
+
+    if (renderer->state == EVR_STATE_RUNNING ||
+            renderer->state == EVR_STATE_PAUSED)
     {
-        struct video_stream *stream = renderer->streams[i];
-        IMFMediaEventQueue_QueueEventParamVar(stream->event_queue, MEStreamSinkStopped, &GUID_NULL, S_OK, NULL);
+        IMFTransform_ProcessMessage(renderer->mixer, MFT_MESSAGE_NOTIFY_END_STREAMING, 0);
+        IMFVideoPresenter_ProcessMessage(renderer->presenter, MFVP_MESSAGE_ENDSTREAMING, 0);
 
-        EnterCriticalSection(&stream->cs);
-        stream->flags &= ~EVR_STREAM_PREROLLED;
-        LeaveCriticalSection(&stream->cs);
+        for (i = 0; i < renderer->stream_count; ++i)
+        {
+            struct video_stream *stream = renderer->streams[i];
+            IMFMediaEventQueue_QueueEventParamVar(stream->event_queue, MEStreamSinkStopped, &GUID_NULL, S_OK, NULL);
+
+            EnterCriticalSection(&stream->cs);
+            stream->flags &= ~EVR_STREAM_PREROLLED;
+            LeaveCriticalSection(&stream->cs);
+        }
+        renderer->state = EVR_STATE_STOPPED;
     }
-    renderer->state = EVR_STATE_STOPPED;
 
     LeaveCriticalSection(&renderer->cs);
 
@@ -1436,11 +1456,17 @@ static HRESULT WINAPI video_renderer_clock_sink_OnClockPause(IMFClockStateSink *
 
     EnterCriticalSection(&renderer->cs);
 
-    for (i = 0; i < renderer->stream_count; ++i)
+    IMFVideoPresenter_OnClockPause(renderer->presenter, systime);
+
+    if (renderer->state == EVR_STATE_RUNNING)
     {
-        struct video_stream *stream = renderer->streams[i];
-        IMFMediaEventQueue_QueueEventParamVar(stream->event_queue, MEStreamSinkPaused, &GUID_NULL, S_OK, NULL);
+        for (i = 0; i < renderer->stream_count; ++i)
+        {
+            struct video_stream *stream = renderer->streams[i];
+            IMFMediaEventQueue_QueueEventParamVar(stream->event_queue, MEStreamSinkPaused, &GUID_NULL, S_OK, NULL);
+        }
     }
+
     renderer->state = EVR_STATE_PAUSED;
 
     LeaveCriticalSection(&renderer->cs);
@@ -1457,6 +1483,8 @@ static HRESULT WINAPI video_renderer_clock_sink_OnClockRestart(IMFClockStateSink
 
     EnterCriticalSection(&renderer->cs);
 
+    IMFVideoPresenter_OnClockRestart(renderer->presenter, systime);
+
     for (i = 0; i < renderer->stream_count; ++i)
     {
         struct video_stream *stream = renderer->streams[i];
-- 
2.28.0




More information about the wine-devel mailing list