[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