From: Yuxuan Shui <yshui(a)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) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/4170