diff options
author | Matthew Waters <matthew@centricular.com> | 2020-02-04 05:59:37 +0300 |
---|---|---|
committer | Matthew Waters <matthew@centricular.com> | 2020-02-11 03:37:18 +0300 |
commit | 259196448e2c0131d8f7b508120f7e4050f5f585 (patch) | |
tree | 36b3d8e5ffc4ef36c14392d3d6afdd64315db6ba | |
parent | 9b664e60d94b3fb43b810ebd87838c2d8ac91e44 (diff) |
glviewconvert: also remove GL buffers on a reset
Fixes a possible memory leak on renegotiation
-rw-r--r-- | gst-libs/gst/gl/gstglviewconvert.c | 34 |
1 files changed, 28 insertions, 6 deletions
diff --git a/gst-libs/gst/gl/gstglviewconvert.c b/gst-libs/gst/gl/gstglviewconvert.c index 89f2e50e6..ce4fad0cb 100644 --- a/gst-libs/gst/gl/gstglviewconvert.c +++ b/gst-libs/gst/gl/gstglviewconvert.c @@ -324,6 +324,27 @@ gst_gl_view_convert_new (void) return convert; } +static void +_reset_gl (GstGLContext * context, GstGLViewConvert * viewconvert) +{ + const GstGLFuncs *gl = context->gl_vtable; + + if (viewconvert->priv->vao) { + gl->DeleteVertexArrays (1, &viewconvert->priv->vao); + viewconvert->priv->vao = 0; + } + + if (viewconvert->priv->vertex_buffer) { + gl->DeleteBuffers (1, &viewconvert->priv->vertex_buffer); + viewconvert->priv->vertex_buffer = 0; + } + + if (viewconvert->priv->vbo_indices) { + gl->DeleteBuffers (1, &viewconvert->priv->vbo_indices); + viewconvert->priv->vbo_indices = 0; + } +} + /** * gst_gl_view_convert_set_context: * @viewconvert: a #GstGLViewConvert @@ -1336,13 +1357,14 @@ void gst_gl_view_convert_reset (GstGLViewConvert * viewconvert) { g_return_if_fail (GST_IS_GL_VIEW_CONVERT (viewconvert)); - if (viewconvert->shader) - gst_object_unref (viewconvert->shader); - viewconvert->shader = NULL; - if (viewconvert->fbo) - gst_object_unref (viewconvert->fbo); - viewconvert->fbo = NULL; + gst_clear_object (&viewconvert->shader); + gst_clear_object (&viewconvert->fbo); + + if (viewconvert->context) { + gst_gl_context_thread_add (viewconvert->context, + (GstGLContextThreadFunc) _reset_gl, viewconvert); + } viewconvert->initted = FALSE; viewconvert->reconfigure = FALSE; |