Esempio n. 1
0
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;
}