glwindow_cocoa: fix a leak of the GstNSView
authorAndoni Morales Alastruey <ylatuya@gmail.com>
Fri, 8 Jul 2022 18:49:21 +0000 (20:49 +0200)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Mon, 11 Jul 2022 11:25:54 +0000 (11:25 +0000)
This leak is also causing a leak of the GstGLCAOpenGLLayer
which leaks the GstGLWrappedContext and the GstGLDisplay

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2736>

subprojects/gst-plugins-base/gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m

index b58ef63..a151a60 100644 (file)
@@ -92,6 +92,7 @@ static gboolean gst_gl_window_cocoa_controls_viewport (GstGLWindow * window);
 struct _GstGLWindowCocoaPrivate
 {
   gpointer internal_win_id;
+  gpointer internal_view;
   gpointer external_view;
   gboolean visible;
   gint preferred_width;
@@ -222,6 +223,7 @@ gst_gl_window_cocoa_create_window (GstGLWindowCocoa *window_cocoa)
       backing: NSBackingStoreBuffered defer: NO screen: nil gstWin: window_cocoa];
 
   priv->internal_win_id = (__bridge_retained gpointer)internal_win_id;
+  priv->internal_view = (__bridge gpointer)glView;
 
   GST_DEBUG ("NSWindow id: %"G_GUINTPTR_FORMAT, (guintptr) priv->internal_win_id);
 
@@ -247,12 +249,15 @@ static void
 _close_window (gpointer * data)
 {
   GstGLWindowCocoa *window_cocoa = GST_GL_WINDOW_COCOA (data);
-  GstGLNSWindow *internal_win_id =
-      (__bridge GstGLNSWindow *) window_cocoa->priv->internal_win_id;
+  GstGLNSView *view =
+      (__bridge GstGLNSView *) window_cocoa->priv->internal_view;
+
+  [view removeFromSuperview];
 
-  [[internal_win_id contentView] removeFromSuperview];
   CFBridgingRelease (window_cocoa->priv->internal_win_id);
+  CFBridgingRelease (window_cocoa->priv->internal_view);
   window_cocoa->priv->internal_win_id = NULL;
+  window_cocoa->priv->internal_view = NULL;
 }
 
 static void
@@ -293,8 +298,8 @@ gst_gl_window_cocoa_set_window_handle (GstGLWindow * window, guintptr handle)
           (__bridge GstGLNSWindow *)window_cocoa->priv->internal_win_id;
       NSView *external_view =
           (__bridge NSView *)window_cocoa->priv->external_view;
+      NSView *view = (__bridge NSView *)window_cocoa->priv->internal_view;
 
-      NSView *view = [internal_win_id contentView];
       [internal_win_id orderOut:internal_win_id];
 
       [external_view addSubview: view];
@@ -350,15 +355,12 @@ static void
 gst_gl_window_cocoa_queue_resize (GstGLWindow * window)
 {
   GstGLWindowCocoa *window_cocoa = GST_GL_WINDOW_COCOA (window);
-  GstGLNSView *view;
   GstGLWindowCocoaPrivate *priv = window_cocoa->priv;
-  GstGLNSWindow *internal_win_id = (__bridge GstGLNSWindow *)priv->internal_win_id;
+  GstGLNSView *view = (__bridge GstGLNSView *)priv->internal_view;
 
   if (!g_atomic_int_get (&window_cocoa->priv->view_ready))
     return;
 
-  view = (GstGLNSView *)[internal_win_id contentView];
-
   [view->layer queueResize];
 }
 
@@ -366,17 +368,14 @@ static void
 gst_gl_window_cocoa_draw (GstGLWindow * window)
 {
   GstGLWindowCocoa *window_cocoa = GST_GL_WINDOW_COCOA (window);
-  GstGLNSView *view;
   GstGLWindowCocoaPrivate *priv = window_cocoa->priv;
-  GstGLNSWindow *internal_win_id = (__bridge GstGLNSWindow *)priv->internal_win_id;
+  GstGLNSView *view = (__bridge GstGLNSView *)priv->internal_view;
 
   /* As the view is created asynchronously in the main thread we cannot know
    * exactly when it will be ready to draw to */
   if (!g_atomic_int_get (&window_cocoa->priv->view_ready))
     return;
 
-  view = (GstGLNSView *)[internal_win_id contentView];
-
   /* this redraws the GstGLCAOpenGLLayer which calls
    * gst_gl_window_cocoa_draw_thread(). Use an explicit CATransaction since we
    * don't know how often the main runloop is running.
@@ -545,9 +544,8 @@ static void
 _set_render_rectangle (gpointer data)
 {
  struct SetRenderRectangle *render = data;
- NSView *view;
  GstGLWindowCocoaPrivate *priv = render->window_cocoa->priv;
- GstGLNSWindow *internal_win_id = (__bridge GstGLNSWindow *)priv->internal_win_id;
+ GstGLNSView *view = (__bridge GstGLNSView *)priv->internal_view;
 
  GST_LOG_OBJECT (render->window_cocoa, "setting render rectangle %i,%i+%ix%i",
                  render->rect.x, render->rect.y, render->rect.w, render->rect.h);
@@ -555,7 +553,6 @@ _set_render_rectangle (gpointer data)
    return;
  }
 
- view = [internal_win_id contentView];
  NSRect newMainViewFrame = NSMakeRect(render->rect.x,
                                       render->rect.y,
                                       render->rect.w,