summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorSeungha Yang <seungha@centricular.com>2021-03-16 17:56:51 +0900
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>2021-03-16 09:47:41 +0000
commit1d6cdbdc90459fe95e953ee45afa2f8fb8d544b1 (patch)
treefdc8b9323fdf72f022d9ae20cd2fe9556331c979 /sys
parent58e451325b4dbccefaca0326b6109aad97a84c98 (diff)
downloadgstreamer-plugins-bad-1d6cdbdc90459fe95e953ee45afa2f8fb8d544b1.tar.gz
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: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2087>
Diffstat (limited to 'sys')
-rw-r--r--sys/mediafoundation/gstmfsourcereader.cpp9
-rw-r--r--sys/mediafoundation/gstmftransform.cpp5
2 files changed, 14 insertions, 0 deletions
diff --git a/sys/mediafoundation/gstmfsourcereader.cpp b/sys/mediafoundation/gstmfsourcereader.cpp
index 3d6dd63c4..78572f3c4 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 c6424535e..10b0c2f5a 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;