glwindow_cocoa: fix a leak of the GstNSView

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>
This commit is contained in:
Andoni Morales Alastruey 2022-07-08 20:49:21 +02:00 committed by GStreamer Marge Bot
parent 7db2a3cf11
commit 94e1ddad43

View file

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