From: Yuxuan Shui yshui@codeweavers.com
--- dlls/mf/session.c | 7 +++++++ 1 file changed, 7 insertions(+)
diff --git a/dlls/mf/session.c b/dlls/mf/session.c index b5b631fb00a..e3f6612b487 100644 --- a/dlls/mf/session.c +++ b/dlls/mf/session.c @@ -846,7 +846,14 @@ static void session_clear_presentation(struct media_session *session) list_remove(&sink->entry);
if (sink->sink) + { + /* The way we use media sinks, makes them hold references to themselves. For example, + * we call `BeginGetEvent` on `IMFMediaEventGenerator`s with the generators themselves + * as states. This creates reference cycles which must be broken by calling + * `IMFMediaSink_Shutdown`, to prevent references from leaking. */ + IMFMediaSink_Shutdown(sink->sink); IMFMediaSink_Release(sink->sink); + } if (sink->preroll) IMFMediaSinkPreroll_Release(sink->preroll); if (sink->event_generator)