mf/evr: Implement setting/getting sink clock.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2020-07-09 15:08:47 +03:00 committed by Alexandre Julliard
parent 65d3383be9
commit 747c8a38c4
1 changed files with 56 additions and 4 deletions

View File

@ -40,6 +40,8 @@ struct video_renderer
LONG refcount; LONG refcount;
IMFMediaEventQueue *event_queue; IMFMediaEventQueue *event_queue;
IMFPresentationClock *clock;
IMFTransform *mixer; IMFTransform *mixer;
IMFVideoPresenter *presenter; IMFVideoPresenter *presenter;
unsigned int flags; unsigned int flags;
@ -142,6 +144,8 @@ static ULONG WINAPI video_renderer_sink_Release(IMFMediaSink *iface)
IMFTransform_Release(renderer->mixer); IMFTransform_Release(renderer->mixer);
if (renderer->presenter) if (renderer->presenter)
IMFVideoPresenter_Release(renderer->presenter); IMFVideoPresenter_Release(renderer->presenter);
if (renderer->clock)
IMFPresentationClock_Release(renderer->clock);
DeleteCriticalSection(&renderer->cs); DeleteCriticalSection(&renderer->cs);
heap_free(renderer); heap_free(renderer);
} }
@ -201,18 +205,65 @@ static HRESULT WINAPI video_renderer_sink_GetStreamSinkById(IMFMediaSink *iface,
return E_NOTIMPL; return E_NOTIMPL;
} }
static void video_renderer_set_presentation_clock(struct video_renderer *renderer, IMFPresentationClock *clock)
{
if (renderer->clock)
{
IMFPresentationClock_RemoveClockStateSink(renderer->clock, &renderer->IMFClockStateSink_iface);
IMFPresentationClock_Release(renderer->clock);
}
renderer->clock = clock;
if (renderer->clock)
{
IMFPresentationClock_AddRef(renderer->clock);
IMFPresentationClock_AddClockStateSink(renderer->clock, &renderer->IMFClockStateSink_iface);
}
}
static HRESULT WINAPI video_renderer_sink_SetPresentationClock(IMFMediaSink *iface, IMFPresentationClock *clock) static HRESULT WINAPI video_renderer_sink_SetPresentationClock(IMFMediaSink *iface, IMFPresentationClock *clock)
{ {
FIXME("%p, %p.\n", iface, clock); struct video_renderer *renderer = impl_from_IMFMediaSink(iface);
HRESULT hr = S_OK;
return E_NOTIMPL; TRACE("%p, %p.\n", iface, clock);
EnterCriticalSection(&renderer->cs);
if (renderer->flags & EVR_SHUT_DOWN)
hr = MF_E_SHUTDOWN;
else
video_renderer_set_presentation_clock(renderer, clock);
LeaveCriticalSection(&renderer->cs);
return hr;
} }
static HRESULT WINAPI video_renderer_sink_GetPresentationClock(IMFMediaSink *iface, IMFPresentationClock **clock) static HRESULT WINAPI video_renderer_sink_GetPresentationClock(IMFMediaSink *iface, IMFPresentationClock **clock)
{ {
FIXME("%p, %p.\n", iface, clock); struct video_renderer *renderer = impl_from_IMFMediaSink(iface);
HRESULT hr = S_OK;
return E_NOTIMPL; TRACE("%p, %p.\n", iface, clock);
if (!clock)
return E_POINTER;
EnterCriticalSection(&renderer->cs);
if (renderer->flags & EVR_SHUT_DOWN)
hr = MF_E_SHUTDOWN;
else if (renderer->clock)
{
*clock = renderer->clock;
IMFPresentationClock_AddRef(*clock);
}
else
hr = MF_E_NO_CLOCK;
LeaveCriticalSection(&renderer->cs);
return hr;
} }
static HRESULT WINAPI video_renderer_sink_Shutdown(IMFMediaSink *iface) static HRESULT WINAPI video_renderer_sink_Shutdown(IMFMediaSink *iface)
@ -227,6 +278,7 @@ static HRESULT WINAPI video_renderer_sink_Shutdown(IMFMediaSink *iface)
EnterCriticalSection(&renderer->cs); EnterCriticalSection(&renderer->cs);
renderer->flags |= EVR_SHUT_DOWN; renderer->flags |= EVR_SHUT_DOWN;
IMFMediaEventQueue_Shutdown(renderer->event_queue); IMFMediaEventQueue_Shutdown(renderer->event_queue);
video_renderer_set_presentation_clock(renderer, NULL);
LeaveCriticalSection(&renderer->cs); LeaveCriticalSection(&renderer->cs);
return S_OK; return S_OK;