From: Yuxuan Shui yshui@codeweavers.com
--- dlls/mf/session.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/dlls/mf/session.c b/dlls/mf/session.c index b5b631fb00a..b3312fda333 100644 --- a/dlls/mf/session.c +++ b/dlls/mf/session.c @@ -845,8 +845,14 @@ static void session_clear_presentation(struct media_session *session) { list_remove(&sink->entry);
- if (sink->sink) + 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)