gl: fix multi gl object leaks
authorWang Xin-yu (王昕宇) <comicfans44@gmail.com>
Wed, 23 Jul 2014 02:25:31 +0000 (10:25 +0800)
committerMatthew Waters <ystreet00@gmail.com>
Thu, 24 Jul 2014 01:50:23 +0000 (11:50 +1000)
1. fix FBO leaks in decide_allocation
2. fix texture leaks in decide_allocation and reset
3. fix texture leaks in FBO incomplete error path

ext/gl/gstgleffects.c
ext/gl/gstglmixer.c
gst-libs/gst/gl/gstglcolorconvert.c
gst-libs/gst/gl/gstglfilter.c
gst-libs/gst/gl/gstglframebuffer.c

index 4027e9cb0f962299d8c10e06120d89147158b3b5..c142821590918a02f9add24ff96c31de16a797b6 100644 (file)
@@ -197,6 +197,12 @@ gst_gl_effects_init_gl_resources (GstGLFilter * filter)
   gint i = 0;
 
   for (i = 0; i < NEEDED_TEXTURES; i++) {
+
+    if (effects->midtexture[i]) {
+      gl->DeleteTextures (1, &effects->midtexture[i]);
+      effects->midtexture[i] = 0;
+    }
+
     gl->GenTextures (1, &effects->midtexture[i]);
     gl->BindTexture (GL_TEXTURE_2D, effects->midtexture[i]);
     gl->TexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8,
index 626eb967c7a7b1004a3dd37e0df1e9dff8aa860f..0d4d7e92ba169bf2e51e5e6a5386bc471851fc05 100644 (file)
@@ -641,6 +641,12 @@ gst_gl_mixer_decide_allocation (GstGLMixer * mix, GstQuery * query)
   out_width = GST_VIDEO_INFO_WIDTH (&vagg->info);
   out_height = GST_VIDEO_INFO_HEIGHT (&vagg->info);
 
+  if (mix->fbo) {
+    gst_gl_context_del_fbo (mix->context, mix->fbo, mix->depthbuffer);
+    mix->fbo = 0;
+    mix->depthbuffer = 0;
+  }
+
   if (!gst_gl_context_gen_fbo (mix->context, out_width, out_height,
           &mix->fbo, &mix->depthbuffer))
     goto context_error;
index 42cc95d94e68f5608d14b74703052133761b4ec5..dc433531ba30148ed8dcb0e51762cfe65b89386b 100644 (file)
@@ -1137,6 +1137,9 @@ _init_convert_fbo (GstGLColorConvert * convert)
   if (!gst_gl_context_check_framebuffer_status (convert->context)) {
     gst_gl_context_set_error (convert->context,
         "GL framebuffer status incomplete");
+
+    gl->DeleteTextures (1, &fake_texture);
+
     return FALSE;
   }
 
index 1f8ccd951ecaaa0e009600b80def55b5445c5d98..397e8664856fa582d47525d600a8e50d5ecd25a6 100644 (file)
@@ -268,6 +268,17 @@ gst_gl_filter_reset (GstGLFilter * filter)
       gst_gl_context_del_fbo (filter->context, filter->fbo,
           filter->depthbuffer);
     }
+
+    if (filter->in_tex_id) {
+      gst_gl_context_del_texture (filter->context, &filter->in_tex_id);
+      filter->in_tex_id = 0;
+    }
+
+    if (filter->out_tex_id) {
+      gst_gl_context_del_texture (filter->context, &filter->out_tex_id);
+      filter->out_tex_id = 0;
+    }
+
     gst_object_unref (filter->context);
     filter->context = NULL;
   }
@@ -1070,6 +1081,21 @@ gst_gl_filter_decide_allocation (GstBaseTransform * trans, GstQuery * query)
   out_width = GST_VIDEO_INFO_WIDTH (&filter->out_info);
   out_height = GST_VIDEO_INFO_HEIGHT (&filter->out_info);
 
+  if (filter->fbo) {
+    gst_gl_context_del_fbo (filter->context, filter->fbo, filter->depthbuffer);
+    filter->fbo = 0;
+    filter->depthbuffer = 0;
+  }
+
+  if (filter->in_tex_id) {
+    gst_gl_context_del_texture (filter->context, &filter->in_tex_id);
+    filter->in_tex_id = 0;
+  }
+
+  if (filter->out_tex_id) {
+    gst_gl_context_del_texture (filter->context, &filter->out_tex_id);
+    filter->out_tex_id = 0;
+  }
   //blocking call, generate a FBO
   if (!gst_gl_context_gen_fbo (filter->context, out_width, out_height,
           &filter->fbo, &filter->depthbuffer))
index 2de236bca3bb3002dd3176f7abaef06a2bd1c332..6cde96ce70b0eac2a4bac62711decc0823c71f8f 100644 (file)
@@ -149,6 +149,9 @@ gst_gl_framebuffer_generate (GstGLFramebuffer * frame, gint width, gint height,
   if (gl->CheckFramebufferStatus (GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
     gst_gl_context_set_error (frame->context,
         "GL framebuffer status incomplete");
+
+    gl->DeleteTextures (1, &fake_texture);
+
     return FALSE;
   }