Nikolay Sivov : mf/evr: Implement stream state change events.
Alexandre Julliard
julliard at winehq.org
Fri Oct 16 15:55:39 CDT 2020
Module: wine
Branch: master
Commit: 5a68001d695dd21348d9045be00ae9b8e2abf926
URL: https://source.winehq.org/git/wine.git/?a=commit;h=5a68001d695dd21348d9045be00ae9b8e2abf926
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Fri Oct 16 16:38:11 2020 +0300
mf/evr: Implement stream state change events.
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/mf/evr.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++------
1 file changed, 84 insertions(+), 8 deletions(-)
diff --git a/dlls/mf/evr.c b/dlls/mf/evr.c
index 0cd13c25501..957d0e0f797 100644
--- a/dlls/mf/evr.c
+++ b/dlls/mf/evr.c
@@ -35,6 +35,13 @@ enum video_renderer_flags
EVR_PRESENTER_INITED_SERVICES = 0x8,
};
+enum video_renderer_state
+{
+ EVR_STATE_STOPPED = 0,
+ EVR_STATE_RUNNING,
+ EVR_STATE_PAUSED,
+};
+
enum video_stream_flags
{
EVR_STREAM_PREROLLING = 0x1,
@@ -77,6 +84,7 @@ struct video_renderer
IMFTransform *mixer;
IMFVideoPresenter *presenter;
unsigned int flags;
+ unsigned int state;
struct video_stream **streams;
size_t stream_size;
@@ -1338,30 +1346,98 @@ static ULONG WINAPI video_renderer_clock_sink_Release(IMFClockStateSink *iface)
static HRESULT WINAPI video_renderer_clock_sink_OnClockStart(IMFClockStateSink *iface, MFTIME systime, LONGLONG offset)
{
- FIXME("%p, %s, %s.\n", iface, debugstr_time(systime), debugstr_time(offset));
+ struct video_renderer *renderer = impl_from_IMFClockStateSink(iface);
+ size_t i;
- return E_NOTIMPL;
+ TRACE("%p, %s, %s.\n", iface, debugstr_time(systime), debugstr_time(offset));
+
+ EnterCriticalSection(&renderer->cs);
+
+ for (i = 0; i < renderer->stream_count; ++i)
+ {
+ struct video_stream *stream = renderer->streams[i];
+
+ 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;
+
+ LeaveCriticalSection(&renderer->cs);
+
+ return S_OK;
}
static HRESULT WINAPI video_renderer_clock_sink_OnClockStop(IMFClockStateSink *iface, MFTIME systime)
{
- FIXME("%p, %s.\n", iface, debugstr_time(systime));
+ struct video_renderer *renderer = impl_from_IMFClockStateSink(iface);
+ size_t i;
- return E_NOTIMPL;
+ TRACE("%p, %s.\n", iface, debugstr_time(systime));
+
+ EnterCriticalSection(&renderer->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;
+
+ LeaveCriticalSection(&renderer->cs);
+
+ return S_OK;
}
static HRESULT WINAPI video_renderer_clock_sink_OnClockPause(IMFClockStateSink *iface, MFTIME systime)
{
- FIXME("%p, %s.\n", iface, debugstr_time(systime));
+ struct video_renderer *renderer = impl_from_IMFClockStateSink(iface);
+ size_t i;
- return E_NOTIMPL;
+ TRACE("%p, %s.\n", iface, debugstr_time(systime));
+
+ EnterCriticalSection(&renderer->cs);
+
+ 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);
+
+ return S_OK;
}
static HRESULT WINAPI video_renderer_clock_sink_OnClockRestart(IMFClockStateSink *iface, MFTIME systime)
{
- FIXME("%p, %s.\n", iface, debugstr_time(systime));
+ struct video_renderer *renderer = impl_from_IMFClockStateSink(iface);
+ size_t i;
- return E_NOTIMPL;
+ TRACE("%p, %s.\n", iface, debugstr_time(systime));
+
+ EnterCriticalSection(&renderer->cs);
+
+ for (i = 0; i < renderer->stream_count; ++i)
+ {
+ struct video_stream *stream = renderer->streams[i];
+ IMFMediaEventQueue_QueueEventParamVar(stream->event_queue, MEStreamSinkStarted, &GUID_NULL, S_OK, NULL);
+ }
+ renderer->state = EVR_STATE_RUNNING;
+
+ LeaveCriticalSection(&renderer->cs);
+
+ return S_OK;
}
static HRESULT WINAPI video_renderer_clock_sink_OnClockSetRate(IMFClockStateSink *iface, MFTIME systime, float rate)
More information about the wine-cvs
mailing list