[PATCH v2 0/3] MR10231: winegstreamer: Implement presentation clock functions for media sink.
This is needed by MF sink writer. -- v2: winegstreamer: Implement media_sink_GetPresentationClock. winegstreamer: Implement media_sink_SetPresentationClock. https://gitlab.winehq.org/wine/wine/-/merge_requests/10231
From: Ziqing Hui <zhui@codeweavers.com> --- dlls/mf/tests/mf.c | 42 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index 8bc3f83019c..dc4b29090cc 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -8788,7 +8788,7 @@ static void test_mpeg4_media_sink(void) IMFMediaType *audio_type, *video_type, *media_type, *media_type_out; DWORD id, count, flags, width = 96, height = 96; IMFMediaTypeHandler *type_handler = NULL; - IMFPresentationClock *clock; + IMFPresentationClock *clock, *clock2; IMFStreamSink *stream_sink; HRESULT hr; GUID guid; @@ -8986,14 +8986,33 @@ static void test_mpeg4_media_sink(void) /* Test PresentationClock. */ hr = MFCreatePresentationClock(&clock); 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); + hr = IMFMediaSink_SetPresentationClock(sink, NULL); todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine hr = IMFMediaSink_SetPresentationClock(sink, clock); todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - IMFPresentationClock_Release(clock); + + 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); + } /* Test stream. */ hr = IMFMediaSink_GetStreamSinkByIndex(sink_audio, 0, &stream_sink); @@ -9077,7 +9096,24 @@ static void test_mpeg4_media_sink(void) todo_wine 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); + 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); + IMFMediaTypeHandler_Release(type_handler); + IMFPresentationClock_Release(clock); IMFMediaSink_Release(sink); IMFMediaSink_Release(sink_video); IMFMediaSink_Release(sink_audio); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10231
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
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
This merge request was approved by Rémi Bernon. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10231
participants (3)
-
Rémi Bernon (@rbernon) -
Ziqing Hui -
Ziqing Hui (@zhui)