From: Nikolay Sivov nsivov@codeweavers.com
--- dlls/mf/samplegrabber.c | 33 ++++++++++++++++++++++++++------- dlls/mf/tests/mf.c | 5 ++--- 2 files changed, 28 insertions(+), 10 deletions(-)
diff --git a/dlls/mf/samplegrabber.c b/dlls/mf/samplegrabber.c index deb1ce09a55..5e5b6ad6d0e 100644 --- a/dlls/mf/samplegrabber.c +++ b/dlls/mf/samplegrabber.c @@ -655,34 +655,50 @@ static HRESULT WINAPI sample_grabber_stream_type_handler_GetCurrentMediaType(IMF IMFMediaType **media_type) { struct sample_grabber *grabber = impl_from_IMFMediaTypeHandler(iface); + HRESULT hr = S_OK;
TRACE("%p, %p.\n", iface, media_type);
if (!media_type) return E_POINTER;
+ EnterCriticalSection(&grabber->cs); + if (grabber->is_shut_down) - return MF_E_STREAMSINK_REMOVED; + { + hr = MF_E_STREAMSINK_REMOVED; + } + else + { + *media_type = grabber->current_media_type; + IMFMediaType_AddRef(*media_type); + }
- *media_type = grabber->current_media_type; - IMFMediaType_AddRef(*media_type); + LeaveCriticalSection(&grabber->cs);
- return S_OK; + return hr; }
static HRESULT WINAPI sample_grabber_stream_type_handler_GetMajorType(IMFMediaTypeHandler *iface, GUID *type) { struct sample_grabber *grabber = impl_from_IMFMediaTypeHandler(iface); + HRESULT hr;
TRACE("%p, %p.\n", iface, type);
if (!type) return E_POINTER;
+ EnterCriticalSection(&grabber->cs); + if (grabber->is_shut_down) - return MF_E_STREAMSINK_REMOVED; + hr = MF_E_STREAMSINK_REMOVED; + else + hr = IMFMediaType_GetMajorType(grabber->current_media_type, type);
- return IMFMediaType_GetMajorType(grabber->current_media_type, type); + LeaveCriticalSection(&grabber->cs); + + return hr; }
static const IMFMediaTypeHandlerVtbl sample_grabber_stream_type_handler_vtbl = @@ -867,7 +883,8 @@ static ULONG WINAPI sample_grabber_sink_Release(IMFMediaSink *iface) IMFSampleGrabberSinkCallback_Release(grabber->callback); if (grabber->callback2) IMFSampleGrabberSinkCallback2_Release(grabber->callback2); - IMFMediaType_Release(grabber->current_media_type); + if (grabber->current_media_type) + IMFMediaType_Release(grabber->current_media_type); IMFMediaType_Release(grabber->media_type); if (grabber->event_queue) IMFMediaEventQueue_Release(grabber->event_queue); @@ -1091,6 +1108,8 @@ static HRESULT WINAPI sample_grabber_sink_Shutdown(IMFMediaSink *iface) if (SUCCEEDED(hr = IMFSampleGrabberSinkCallback_OnShutdown(sample_grabber_get_callback(grabber)))) { sample_grabber_set_presentation_clock(grabber, NULL); + IMFMediaType_Release(grabber->current_media_type); + grabber->current_media_type = NULL; IMFMediaEventQueue_Shutdown(grabber->stream_event_queue); IMFMediaEventQueue_Shutdown(grabber->event_queue); } diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index 18c97b93593..8ec379be991 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -4697,10 +4697,9 @@ static void test_sample_grabber(void) ok(hr == S_OK, "Failed to get type count, hr %#lx.\n", hr);
ref = IMFMediaType_Release(media_type2); - todo_wine - ok(ref == 0, "Release returned %ld\n", ref); + ok(!ref, "Unexpected refcount %ld.\n", ref); ref = IMFMediaType_Release(media_type); - ok(ref == 0, "Release returned %ld\n", ref); + ok(!ref, "Unexpected refcount %ld.\n", ref);
hr = IMFMediaTypeHandler_GetMediaTypeByIndex(handler, 0, &media_type); ok(hr == MF_E_NO_MORE_TYPES, "Unexpected hr %#lx.\n", hr);
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mf/samplegrabber.c | 6 +++++- dlls/mf/tests/mf.c | 13 ++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/dlls/mf/samplegrabber.c b/dlls/mf/samplegrabber.c index 5e5b6ad6d0e..332b1a6e71d 100644 --- a/dlls/mf/samplegrabber.c +++ b/dlls/mf/samplegrabber.c @@ -1054,7 +1054,11 @@ static HRESULT WINAPI sample_grabber_sink_SetPresentationClock(IMFMediaSink *ifa
EnterCriticalSection(&grabber->cs);
- if (SUCCEEDED(hr = IMFSampleGrabberSinkCallback_OnSetPresentationClock(sample_grabber_get_callback(grabber), + if (grabber->is_shut_down) + { + hr = MF_E_SHUTDOWN; + } + else if (SUCCEEDED(hr = IMFSampleGrabberSinkCallback_OnSetPresentationClock(sample_grabber_get_callback(grabber), clock))) { sample_grabber_set_presentation_clock(grabber, clock); diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index 8ec379be991..84f5e69ac25 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -4649,9 +4649,16 @@ static void test_sample_grabber(void) EXPECT_REF(clock, 3); hr = IMFMediaSink_Shutdown(sink); ok(hr == S_OK, "Failed to shut down, hr %#lx.\n", hr); + EXPECT_REF(clock, 1); + + hr = IMFMediaSink_SetPresentationClock(sink, NULL); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); + + hr = IMFMediaSink_SetPresentationClock(sink, clock); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr);
ref = IMFPresentationClock_Release(clock); - ok(ref == 0, "Release returned %ld\n", ref); + ok(!ref, "Unexpected refcount %ld.\n", ref);
hr = IMFMediaEventGenerator_GetEvent(eg, MF_EVENT_FLAG_NO_WAIT, &event); ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); @@ -4730,9 +4737,9 @@ static void test_sample_grabber(void) IMFStreamSink_Release(stream);
ref = IMFActivate_Release(activate); - ok(ref == 0, "Release returned %ld\n", ref); + ok(!ref, "Unexpected refcount %ld.\n", ref); ref = IMFMediaSink_Release(sink); - ok(ref == 0, "Release returned %ld\n", ref); + ok(!ref, "Unexpected refcount %ld.\n", ref);
/* Rateless mode with MF_SAMPLEGRABBERSINK_IGNORE_CLOCK. */ hr = MFCreateMediaType(&media_type);
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mf/samplegrabber.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/mf/samplegrabber.c b/dlls/mf/samplegrabber.c index 332b1a6e71d..66ac7808cc7 100644 --- a/dlls/mf/samplegrabber.c +++ b/dlls/mf/samplegrabber.c @@ -1109,9 +1109,9 @@ static HRESULT WINAPI sample_grabber_sink_Shutdown(IMFMediaSink *iface) { grabber->is_shut_down = TRUE; sample_grabber_release_pending_items(grabber); + sample_grabber_set_presentation_clock(grabber, NULL); if (SUCCEEDED(hr = IMFSampleGrabberSinkCallback_OnShutdown(sample_grabber_get_callback(grabber)))) { - sample_grabber_set_presentation_clock(grabber, NULL); IMFMediaType_Release(grabber->current_media_type); grabber->current_media_type = NULL; IMFMediaEventQueue_Shutdown(grabber->stream_event_queue);
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mf/samplegrabber.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-)
diff --git a/dlls/mf/samplegrabber.c b/dlls/mf/samplegrabber.c index 66ac7808cc7..de599139736 100644 --- a/dlls/mf/samplegrabber.c +++ b/dlls/mf/samplegrabber.c @@ -1019,8 +1019,13 @@ static void sample_grabber_cancel_timer(struct sample_grabber *grabber) } }
-static void sample_grabber_set_presentation_clock(struct sample_grabber *grabber, IMFPresentationClock *clock) +static HRESULT sample_grabber_set_presentation_clock(struct sample_grabber *grabber, IMFPresentationClock *clock) { + HRESULT hr; + + if (FAILED(hr = IMFSampleGrabberSinkCallback_OnSetPresentationClock(sample_grabber_get_callback(grabber), clock))) + return hr; + if (grabber->clock) { sample_grabber_cancel_timer(grabber); @@ -1043,6 +1048,8 @@ static void sample_grabber_set_presentation_clock(struct sample_grabber *grabber grabber->timer = NULL; } } + + return hr; }
static HRESULT WINAPI sample_grabber_sink_SetPresentationClock(IMFMediaSink *iface, IMFPresentationClock *clock) @@ -1058,10 +1065,9 @@ static HRESULT WINAPI sample_grabber_sink_SetPresentationClock(IMFMediaSink *ifa { hr = MF_E_SHUTDOWN; } - else if (SUCCEEDED(hr = IMFSampleGrabberSinkCallback_OnSetPresentationClock(sample_grabber_get_callback(grabber), - clock))) + else { - sample_grabber_set_presentation_clock(grabber, clock); + hr = sample_grabber_set_presentation_clock(grabber, clock); }
LeaveCriticalSection(&grabber->cs); @@ -1109,8 +1115,9 @@ static HRESULT WINAPI sample_grabber_sink_Shutdown(IMFMediaSink *iface) { grabber->is_shut_down = TRUE; sample_grabber_release_pending_items(grabber); - sample_grabber_set_presentation_clock(grabber, NULL); - if (SUCCEEDED(hr = IMFSampleGrabberSinkCallback_OnShutdown(sample_grabber_get_callback(grabber)))) + if (SUCCEEDED(hr = sample_grabber_set_presentation_clock(grabber, NULL))) + hr = IMFSampleGrabberSinkCallback_OnShutdown(sample_grabber_get_callback(grabber)); + if (SUCCEEDED(hr)) { IMFMediaType_Release(grabber->current_media_type); grabber->current_media_type = NULL;