qtitem: don't potentially leak a large number of buffers
authorMatthew Waters <matthew@centricular.com>
Thu, 3 Jun 2021 10:33:45 +0000 (20:33 +1000)
committerMatthew Waters <matthew@centricular.com>
Thu, 3 Jun 2021 10:33:45 +0000 (20:33 +1000)
The only other place where these queued buffers are removed, is in
setCaps() but that is not called at all on shutdown so this list of
buffers could not be removed.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1004>

ext/qt/qtitem.cc

index 726296d..1b0ba5a 100644 (file)
@@ -141,6 +141,8 @@ QtGLVideoItem::QtGLVideoItem()
 
 QtGLVideoItem::~QtGLVideoItem()
 {
+  GstBuffer *tmp_buffer;
+
   /* Before destroying the priv info, make sure
    * no qmlglsink's will call in again, and that
    * any ongoing calls are done by invalidating the proxy
@@ -157,6 +159,15 @@ QtGLVideoItem::~QtGLVideoItem()
   if (this->priv->display)
     gst_object_unref(this->priv->display);
 
+  while ((tmp_buffer = (GstBuffer*) g_queue_pop_head (&this->priv->potentially_unbound_buffers))) {
+    GST_TRACE ("old buffer %p should be unbound now, unreffing", tmp_buffer);
+    gst_buffer_unref (tmp_buffer);
+  }
+  while ((tmp_buffer = (GstBuffer*) g_queue_pop_head (&this->priv->bound_buffers))) {
+    GST_TRACE ("old buffer %p should be unbound now, unreffing", tmp_buffer);
+    gst_buffer_unref (tmp_buffer);
+  }
+
   gst_buffer_replace (&this->priv->buffer, NULL);
 
   gst_caps_replace (&this->priv->caps, NULL);