From 1d6cdbdc90459fe95e953ee45afa2f8fb8d544b1 Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Tue, 16 Mar 2021 17:56:51 +0900 Subject: [PATCH] mediafoundation: Fix resource leak IMFActivate would hold its internal objects unless user call ShutdownObject(), even if we release the IMFActivate. Here internal objects may include Direct3D objects, such as texture, device handle for example. Part-of: --- sys/mediafoundation/gstmfsourcereader.cpp | 9 +++++++++ sys/mediafoundation/gstmftransform.cpp | 5 +++++ 2 files changed, 14 insertions(+) diff --git a/sys/mediafoundation/gstmfsourcereader.cpp b/sys/mediafoundation/gstmfsourcereader.cpp index 3d6dd63c4e..78572f3c4c 100644 --- a/sys/mediafoundation/gstmfsourcereader.cpp +++ b/sys/mediafoundation/gstmfsourcereader.cpp @@ -74,6 +74,7 @@ struct _GstMFSourceReader /* protected by lock */ GstQueueArray *queue; + IMFActivate *activate; IMFMediaSource *source; IMFSourceReader *reader; @@ -307,6 +308,8 @@ gst_mf_source_reader_open (GstMFSourceReader * self, IMFActivate * activate) return FALSE; } + self->activate = activate; + activate->AddRef (); self->source = source.Detach (); self->reader = reader.Detach (); @@ -332,6 +335,12 @@ gst_mf_source_reader_close (GstMFSourceReader * self) { gst_clear_caps (&self->supported_caps); + if (self->activate) { + self->activate->ShutdownObject (); + self->activate->Release (); + self->activate = NULL; + } + if (self->media_types) { g_list_free_full (self->media_types, (GDestroyNotify) gst_mf_stream_media_type_free); diff --git a/sys/mediafoundation/gstmftransform.cpp b/sys/mediafoundation/gstmftransform.cpp index c6424535eb..10b0c2f5ae 100644 --- a/sys/mediafoundation/gstmftransform.cpp +++ b/sys/mediafoundation/gstmftransform.cpp @@ -1040,6 +1040,11 @@ gst_mf_transform_close (GstMFTransform * object) gst_mf_transform_flush (object); + /* Otherwise IMFTransform will be alive even after we release the IMFTransform + * below */ + if (object->activate) + object->activate->ShutdownObject (); + if (object->callback_object) { object->callback_object->Release (); object->callback_object = nullptr;