static gboolean gst_gl_differencematte_filter (GstGLFilter * filter, GstGLBuffer * inbuf, GstGLBuffer * outbuf) { GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (filter); differencematte->intexture = inbuf->texture; if (differencematte->bg_has_changed && (differencematte->location != NULL)) { if (!gst_gl_differencematte_loader (filter)) differencematte->pixbuf = NULL; /* if loader failed then display is turned off */ gst_gl_display_thread_add (filter->display, init_pixbuf_texture, differencematte); /* save current frame, needed to calculate difference between * this frame and next ones */ gst_gl_filter_render_to_target (filter, inbuf->texture, differencematte->savedbgtexture, gst_gl_differencematte_save_texture, differencematte); if (differencematte->pixbuf) { free (differencematte->pixbuf); differencematte->pixbuf = NULL; } differencematte->bg_has_changed = FALSE; } if (differencematte->savedbgtexture != 0) { gst_gl_filter_render_to_target (filter, inbuf->texture, differencematte->midtexture[0], gst_gl_differencematte_diff, differencematte); gst_gl_filter_render_to_target (filter, differencematte->midtexture[0], differencematte->midtexture[1], gst_gl_differencematte_hblur, differencematte); gst_gl_filter_render_to_target (filter, differencematte->midtexture[1], differencematte->midtexture[2], gst_gl_differencematte_vblur, differencematte); gst_gl_filter_render_to_target (filter, inbuf->texture, outbuf->texture, gst_gl_differencematte_interp, differencematte); } else { gst_gl_filter_render_to_target (filter, inbuf->texture, outbuf->texture, gst_gl_differencematte_identity, differencematte); } return TRUE; }
static gboolean gst_gl_differencematte_filter_texture (GstGLFilter * filter, guint in_tex, guint out_tex) { GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (filter); differencematte->intexture = in_tex; if (differencematte->bg_has_changed && (differencematte->location != NULL)) { if (!gst_gl_differencematte_loader (filter)) differencematte->pixbuf = NULL; /* if loader failed then context is turned off */ gst_gl_context_thread_add (GST_GL_BASE_FILTER (filter)->context, init_pixbuf_texture, differencematte); /* save current frame, needed to calculate difference between * this frame and next ones */ gst_gl_filter_render_to_target (filter, TRUE, in_tex, differencematte->savedbgtexture, gst_gl_differencematte_identity, differencematte); if (differencematte->pixbuf) { free (differencematte->pixbuf); differencematte->pixbuf = NULL; } differencematte->bg_has_changed = FALSE; } if (differencematte->savedbgtexture != 0) { gst_gl_filter_render_to_target (filter, TRUE, in_tex, differencematte->midtexture[0], gst_gl_differencematte_diff, differencematte); gst_gl_filter_render_to_target (filter, FALSE, differencematte->midtexture[0], differencematte->midtexture[1], gst_gl_differencematte_hblur, differencematte); gst_gl_filter_render_to_target (filter, FALSE, differencematte->midtexture[1], differencematte->midtexture[2], gst_gl_differencematte_vblur, differencematte); gst_gl_filter_render_to_target (filter, TRUE, in_tex, out_tex, gst_gl_differencematte_interp, differencematte); } else { gst_gl_filter_render_to_target (filter, TRUE, in_tex, out_tex, gst_gl_differencematte_identity, differencematte); } return TRUE; }