From: Ziqing Hui <zhui@codeweavers.com> --- dlls/mf/tests/mf.c | 12 ++---------- dlls/winegstreamer/media_sink.c | 21 +++++++++++++++++++-- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index cece1502499..89877fa40ac 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -8988,12 +8988,10 @@ static void test_mpeg4_media_sink(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IMFMediaSink_GetPresentationClock(sink, NULL); - todo_wine ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); clock2 = (void *)0xdeadbeef; hr = IMFMediaSink_GetPresentationClock(sink, &clock2); - todo_wine ok(hr == MF_E_NO_CLOCK, "Unexpected hr %#lx.\n", hr); ok(clock2 == (void *)0xdeadbeef, "Unexpected pointer %p.\n", clock2); @@ -9004,13 +9002,9 @@ static void test_mpeg4_media_sink(void) clock2 = NULL; hr = IMFMediaSink_GetPresentationClock(sink, &clock2); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - if (hr == S_OK) - { - ok(clock2 == clock, "Unexpected pointer %p.\n", clock2); - IMFPresentationClock_Release(clock2); - } + ok(clock2 == clock, "Unexpected pointer %p.\n", clock2); + IMFPresentationClock_Release(clock2); /* Test stream. */ hr = IMFMediaSink_GetStreamSinkByIndex(sink_audio, 0, &stream_sink); @@ -9100,11 +9094,9 @@ static void test_mpeg4_media_sink(void) ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); hr = IMFMediaSink_GetPresentationClock(sink, NULL); - todo_wine ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); clock2 = (void *)0xdeadbeef; hr = IMFMediaSink_GetPresentationClock(sink, &clock2); - todo_wine ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); ok(clock2 == (void *)0xdeadbeef, "Unexpected pointer %p.\n", clock2); diff --git a/dlls/winegstreamer/media_sink.c b/dlls/winegstreamer/media_sink.c index 0fc220d35b8..4933d6f666f 100644 --- a/dlls/winegstreamer/media_sink.c +++ b/dlls/winegstreamer/media_sink.c @@ -927,9 +927,26 @@ static HRESULT WINAPI media_sink_SetPresentationClock(IMFFinalizableMediaSink *i static HRESULT WINAPI media_sink_GetPresentationClock(IMFFinalizableMediaSink *iface, IMFPresentationClock **clock) { - FIXME("iface %p, clock %p stub!\n", iface, clock); + struct media_sink *media_sink = impl_from_IMFFinalizableMediaSink(iface); + HRESULT hr = S_OK; - return E_NOTIMPL; + TRACE("iface %p, clock %p.\n", iface, clock); + + if (!clock) + return E_POINTER; + + EnterCriticalSection(&media_sink->cs); + + if (media_sink->state == STATE_SHUTDOWN) + hr = MF_E_SHUTDOWN; + else if (media_sink->clock) + IMFPresentationClock_AddRef((*clock = media_sink->clock)); + else + hr = MF_E_NO_CLOCK; + + LeaveCriticalSection(&media_sink->cs); + + return hr; } static HRESULT WINAPI media_sink_Shutdown(IMFFinalizableMediaSink *iface) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10231