Nikolay Sivov : mf: Release presentation clock on sample grabber shutdown.
Alexandre Julliard
julliard at winehq.org
Wed Apr 22 15:29:27 CDT 2020
Module: wine
Branch: master
Commit: e49c550bdc76a0418f60a9adddb324a61743b8d0
URL: https://source.winehq.org/git/wine.git/?a=commit;h=e49c550bdc76a0418f60a9adddb324a61743b8d0
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Wed Apr 22 16:32:14 2020 +0300
mf: Release presentation clock on sample grabber shutdown.
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/mf/samplegrabber.c | 48 +++++++++++++++++++++++++++---------------------
dlls/mf/tests/mf.c | 5 +++--
2 files changed, 30 insertions(+), 23 deletions(-)
diff --git a/dlls/mf/samplegrabber.c b/dlls/mf/samplegrabber.c
index bd5859d4f4..1919ce6220 100644
--- a/dlls/mf/samplegrabber.c
+++ b/dlls/mf/samplegrabber.c
@@ -956,6 +956,31 @@ static HRESULT WINAPI sample_grabber_sink_GetStreamSinkById(IMFMediaSink *iface,
return hr;
}
+static void sample_grabber_set_presentation_clock(struct sample_grabber *grabber, IMFPresentationClock *clock)
+{
+ if (grabber->clock)
+ {
+ IMFPresentationClock_RemoveClockStateSink(grabber->clock, &grabber->IMFClockStateSink_iface);
+ IMFPresentationClock_Release(grabber->clock);
+ if (grabber->timer)
+ {
+ IMFTimer_Release(grabber->timer);
+ grabber->timer = NULL;
+ }
+ }
+ grabber->clock = clock;
+ if (grabber->clock)
+ {
+ IMFPresentationClock_AddRef(grabber->clock);
+ IMFPresentationClock_AddClockStateSink(grabber->clock, &grabber->IMFClockStateSink_iface);
+ if (FAILED(IMFPresentationClock_QueryInterface(grabber->clock, &IID_IMFTimer, (void **)&grabber->timer)))
+ {
+ WARN("Failed to get IMFTimer interface.\n");
+ grabber->timer = NULL;
+ }
+ }
+}
+
static HRESULT WINAPI sample_grabber_sink_SetPresentationClock(IMFMediaSink *iface, IMFPresentationClock *clock)
{
struct sample_grabber *grabber = impl_from_IMFMediaSink(iface);
@@ -968,27 +993,7 @@ static HRESULT WINAPI sample_grabber_sink_SetPresentationClock(IMFMediaSink *ifa
if (SUCCEEDED(hr = IMFSampleGrabberSinkCallback_OnSetPresentationClock(sample_grabber_get_callback(grabber),
clock)))
{
- if (grabber->clock)
- {
- IMFPresentationClock_RemoveClockStateSink(grabber->clock, &grabber->IMFClockStateSink_iface);
- IMFPresentationClock_Release(grabber->clock);
- if (grabber->timer)
- {
- IMFTimer_Release(grabber->timer);
- grabber->timer = NULL;
- }
- }
- grabber->clock = clock;
- if (grabber->clock)
- {
- IMFPresentationClock_AddRef(grabber->clock);
- IMFPresentationClock_AddClockStateSink(grabber->clock, &grabber->IMFClockStateSink_iface);
- if (FAILED(IMFPresentationClock_QueryInterface(grabber->clock, &IID_IMFTimer, (void **)&grabber->timer)))
- {
- WARN("Failed to get IMFTimer interface.\n");
- grabber->timer = NULL;
- }
- }
+ sample_grabber_set_presentation_clock(grabber, clock);
}
LeaveCriticalSection(&grabber->cs);
@@ -1035,6 +1040,7 @@ static HRESULT WINAPI sample_grabber_sink_Shutdown(IMFMediaSink *iface)
grabber->is_shut_down = TRUE;
if (SUCCEEDED(hr = IMFSampleGrabberSinkCallback_OnShutdown(sample_grabber_get_callback(grabber))))
{
+ sample_grabber_set_presentation_clock(grabber, 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 9e6b45e2f6..ae9f58a4bc 100644
--- a/dlls/mf/tests/mf.c
+++ b/dlls/mf/tests/mf.c
@@ -2102,8 +2102,6 @@ static void test_sample_grabber(void)
ok(hr == S_OK, "Failed to set time source, hr %#x.\n", hr);
IMFPresentationTimeSource_Release(time_source);
- IMFPresentationClock_Release(clock);
-
hr = IMFMediaSink_GetCharacteristics(sink, &flags);
ok(hr == S_OK, "Failed to get sink flags, hr %#x.\n", hr);
@@ -2221,8 +2219,10 @@ static void test_sample_grabber(void)
hr = IMFStreamSink_GetEvent(stream, MF_EVENT_FLAG_NO_WAIT, &event);
ok(hr == MF_E_NO_EVENTS_AVAILABLE, "Unexpected hr %#x.\n", hr);
+ EXPECT_REF(clock, 3);
hr = IMFMediaSink_Shutdown(sink);
ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr);
+ EXPECT_REF(clock, 1);
hr = IMFMediaEventGenerator_GetEvent(eg, MF_EVENT_FLAG_NO_WAIT, &event);
ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
@@ -2355,6 +2355,7 @@ static void test_sample_grabber(void)
IMFActivate_Release(activate);
IMFMediaType_Release(media_type);
+ IMFPresentationClock_Release(clock);
hr = MFShutdown();
ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr);
More information about the wine-cvs
mailing list