From: Ziqing Hui <zhui@codeweavers.com> --- dlls/mf/tests/mf.c | 4 ---- dlls/mfreadwrite/tests/mfplat.c | 4 ---- dlls/winegstreamer/media_sink.c | 35 +++++++++++++++++++++++++++++++-- 3 files changed, 33 insertions(+), 10 deletions(-) diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index dc4b29090cc..cece1502499 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -8998,10 +8998,8 @@ static void test_mpeg4_media_sink(void) ok(clock2 == (void *)0xdeadbeef, "Unexpected pointer %p.\n", clock2); hr = IMFMediaSink_SetPresentationClock(sink, NULL); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IMFMediaSink_SetPresentationClock(sink, clock); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); clock2 = NULL; @@ -9097,10 +9095,8 @@ static void test_mpeg4_media_sink(void) ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); hr = IMFMediaSink_SetPresentationClock(sink, NULL); - todo_wine ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); hr = IMFMediaSink_SetPresentationClock(sink, clock); - todo_wine ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); hr = IMFMediaSink_GetPresentationClock(sink, NULL); diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c index 6743347993d..b258b10441e 100644 --- a/dlls/mfreadwrite/tests/mfplat.c +++ b/dlls/mfreadwrite/tests/mfplat.c @@ -1788,7 +1788,6 @@ static void test_sink_writer_get_object(void) ok(!sink, "Unexpected sink %p.\n", sink); hr = IMFSinkWriter_BeginWriting(writer); - todo_wine ok(hr == S_OK, "BeginWriting returned %#lx.\n", hr); /* Get media sink after BeginWriting. */ @@ -1936,10 +1935,8 @@ static void test_sink_writer_sample_process(void) /* BeginWriting after adding stream. */ hr = IMFSinkWriter_BeginWriting(writer); - todo_wine ok(hr == S_OK, "BeginWriting returned %#lx.\n", hr); hr = IMFSinkWriter_BeginWriting(writer); - todo_wine ok(hr == MF_E_INVALIDREQUEST, "BeginWriting returned %#lx.\n", hr); /* WriteSample. */ @@ -1953,7 +1950,6 @@ static void test_sink_writer_sample_process(void) hr = IMFSample_SetSampleDuration(sample, 333333); ok(hr == S_OK, "SetSampleDuration returned %#lx.\n", hr); hr = IMFSinkWriter_WriteSample(writer, 0, sample); - todo_wine ok(hr == S_OK, "WriteSample returned %#lx.\n", hr); IMFSample_Release(sample); } diff --git a/dlls/winegstreamer/media_sink.c b/dlls/winegstreamer/media_sink.c index 21e4d6f3cd3..0fc220d35b8 100644 --- a/dlls/winegstreamer/media_sink.c +++ b/dlls/winegstreamer/media_sink.c @@ -91,6 +91,7 @@ struct media_sink IMFByteStream *bytestream; IMFMediaEventQueue *event_queue; + IMFPresentationClock *clock; struct list stream_sinks; @@ -698,6 +699,22 @@ static HRESULT media_sink_finalize(struct media_sink *media_sink, IMFAsyncResult return hr; } +static void media_sink_set_presentation_clock(struct media_sink *media_sink, IMFPresentationClock *clock) +{ + if (media_sink->clock) + { + IMFPresentationClock_RemoveClockStateSink(media_sink->clock, &media_sink->IMFClockStateSink_iface); + IMFPresentationClock_Release(media_sink->clock); + } + + media_sink->clock = clock; + if (media_sink->clock) + { + IMFPresentationClock_AddRef(media_sink->clock); + IMFPresentationClock_AddClockStateSink(media_sink->clock, &media_sink->IMFClockStateSink_iface); + } +} + static HRESULT WINAPI media_sink_QueryInterface(IMFFinalizableMediaSink *iface, REFIID riid, void **obj) { struct media_sink *media_sink = impl_from_IMFFinalizableMediaSink(iface); @@ -891,9 +908,21 @@ static HRESULT WINAPI media_sink_GetStreamSinkById(IMFFinalizableMediaSink *ifac static HRESULT WINAPI media_sink_SetPresentationClock(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); + + EnterCriticalSection(&media_sink->cs); + + if (media_sink->state == STATE_SHUTDOWN) + hr = MF_E_SHUTDOWN; + else + media_sink_set_presentation_clock(media_sink, clock); + + LeaveCriticalSection(&media_sink->cs); + + return hr; } static HRESULT WINAPI media_sink_GetPresentationClock(IMFFinalizableMediaSink *iface, IMFPresentationClock **clock) @@ -918,6 +947,8 @@ static HRESULT WINAPI media_sink_Shutdown(IMFFinalizableMediaSink *iface) return MF_E_SHUTDOWN; } + media_sink_set_presentation_clock(media_sink, NULL); + LIST_FOR_EACH_ENTRY_SAFE(stream_sink, next, &media_sink->stream_sinks, struct stream_sink, entry) { list_remove(&stream_sink->entry); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10231