summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Waters <matthew@centricular.com>2020-02-04 13:59:37 +1100
committerMatthew Waters <matthew@centricular.com>2020-02-11 11:37:18 +1100
commit259196448e2c0131d8f7b508120f7e4050f5f585 (patch)
tree36b3d8e5ffc4ef36c14392d3d6afdd64315db6ba
parent9b664e60d94b3fb43b810ebd87838c2d8ac91e44 (diff)
downloadgstreamer-plugins-base-259196448e2c0131d8f7b508120f7e4050f5f585.tar.gz
glviewconvert: also remove GL buffers on a reset
Fixes a possible memory leak on renegotiation
-rw-r--r--gst-libs/gst/gl/gstglviewconvert.c34
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;