Beispiel #1
0
void
gst_gl_effects_xray (GstGLEffects * effects)
{
  GstGLFilter *filter = GST_GL_FILTER (effects);

  /* map luma to xray curve */
  gst_gl_filter_render_to_target (filter, effects->intexture,
      effects->midtexture[0], gst_gl_effects_xray_step_one, effects);
  /* horizontal blur */
  gst_gl_filter_render_to_target (filter, effects->midtexture[0],
      effects->midtexture[1], gst_gl_effects_xray_step_two, effects);
  /* vertical blur */
  gst_gl_filter_render_to_target (filter, effects->midtexture[1],
      effects->midtexture[2], gst_gl_effects_xray_step_three, effects);
  /* detect edges with Sobel */
  /* the old version used edges from the blurred texture, this uses
   * the ones from original texture, still not sure what I like
   * more. This one gives better edges obviously but behaves badly
   * with noise */
  /* desaturate */
  gst_gl_filter_render_to_target (filter, effects->intexture,
      effects->midtexture[3], gst_gl_effects_xray_desaturate, effects);
  /* horizonal convolution */
  gst_gl_filter_render_to_target (filter, effects->midtexture[3],
      effects->midtexture[4], gst_gl_effects_xray_sobel_hconv, effects);
  /* vertical convolution */
  gst_gl_filter_render_to_target (filter, effects->midtexture[4],
      effects->midtexture[3], gst_gl_effects_xray_sobel_vconv, effects);
  /* gradient length */
  gst_gl_filter_render_to_target (filter, effects->midtexture[3],
      effects->midtexture[4], gst_gl_effects_xray_sobel_length, effects);
  /* multiply edges with the blurred image */
  gst_gl_filter_render_to_target (filter, effects->midtexture[4],
      effects->outtexture, gst_gl_effects_xray_step_five, effects);
}
Beispiel #2
0
static gboolean
gst_gl_filterblur_filter (GstGLFilter * filter, GstGLBuffer * inbuf,
                          GstGLBuffer * outbuf)
{
    GstGLFilterBlur *filterblur = GST_GL_FILTERBLUR (filter);

    gst_gl_filter_render_to_target (filter, inbuf->texture,
                                    filterblur->midtexture, gst_gl_filterblur_hcallback, filterblur);

    gst_gl_filter_render_to_target (filter, filterblur->midtexture,
                                    outbuf->texture, gst_gl_filterblur_vcallback, filterblur);

    return TRUE;
}
static gboolean
gst_gl_overlay_filter_texture (GstGLFilter * filter, guint in_tex,
    guint out_tex)
{
  GstGLOverlay *overlay = GST_GL_OVERLAY (filter);

  if (overlay->pbuf_has_changed && (overlay->location != NULL)) {
    if ((overlay->type_file = gst_gl_overlay_load_png (filter)) == 0)
      if ((overlay->type_file = gst_gl_overlay_load_jpeg (filter)) == 0)
        overlay->pixbuf = NULL;
    /* if loader failed then context is turned off */
    gst_gl_context_thread_add (filter->context, init_pixbuf_texture, overlay);
    if (overlay->pixbuf) {
      free (overlay->pixbuf);
      overlay->pixbuf = NULL;
    }

    overlay->pbuf_has_changed = FALSE;
  }

  gst_gl_filter_render_to_target (filter, TRUE, in_tex, out_tex,
      gst_gl_overlay_callback, overlay);

  return TRUE;
}
Beispiel #4
0
static gboolean
gst_gl_overlay_filter (GstGLFilter * filter, GstGLBuffer * inbuf,
    GstGLBuffer * outbuf)
{
  GstGLOverlay *overlay = GST_GL_OVERLAY (filter);

  if (overlay->pbuf_has_changed && (overlay->location != NULL)) {

    if (!gst_gl_overlay_loader (filter))
      overlay->pixbuf = NULL;

    /* if loader failed then display is turned off */
    gst_gl_display_thread_add (filter->display, init_pixbuf_texture, overlay);

    if (overlay->pixbuf) {
      free (overlay->pixbuf);
      overlay->pixbuf = NULL;
    }

    overlay->pbuf_has_changed = FALSE;
  }

  gst_gl_filter_render_to_target (filter, inbuf->texture, outbuf->texture,
      gst_gl_overlay_callback, overlay);

  return TRUE;
}
void
gst_gl_effects_squeeze (GstGLEffects * effects)
{
  GstGLFilter *filter = GST_GL_FILTER (effects);

  gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
      effects->outtexture, gst_gl_effects_squeeze_callback, effects);
}
/* attach target to a FBO, use shader, pass input as "tex" uniform to
 * the shader, render input to a quad */
void
gst_gl_filter_render_to_target_with_shader (GstGLFilter * filter,
    gboolean resize, GLuint input, GLuint target, GstGLShader * shader)
{
  filter->default_shader = shader;
  gst_gl_filter_render_to_target (filter, resize, input, target,
      _draw_with_shader_cb, filter);
}
void
gst_gl_effects_sobel (GstGLEffects * effects)
{
  GstGLFilter *filter = GST_GL_FILTER (effects);

  gst_gl_filter_render_to_target (filter, TRUE,
      effects->intexture, effects->midtexture[0],
      gst_gl_effects_sobel_callback_desaturate, effects);
  gst_gl_filter_render_to_target (filter, FALSE,
      effects->midtexture[0], effects->midtexture[1],
      gst_gl_effects_sobel_callback_hconv, effects);
  gst_gl_filter_render_to_target (filter, FALSE,
      effects->midtexture[1], effects->midtexture[0],
      gst_gl_effects_sobel_callback_vconv, effects);
  gst_gl_filter_render_to_target (filter, FALSE,
      effects->midtexture[0], effects->outtexture,
      gst_gl_effects_sobel_callback_length, effects);
}
static gboolean
gst_gl_deinterlace_filter_texture (GstGLFilter * filter, guint in_tex,
    guint out_tex)
{
  GstGLDeinterlace *deinterlace_filter = GST_GL_DEINTERLACE (filter);

  //blocking call, use a FBO
  gst_gl_filter_render_to_target (filter, TRUE, in_tex, out_tex,
      gst_gl_deinterlace_callback, deinterlace_filter);

  return TRUE;
}
static gboolean
gst_gl_deinterlace_filter_texture (GstGLFilter * filter, GstGLMemory * in_tex,
    GstGLMemory * out_tex)
{
  GstGLDeinterlace *deinterlace_filter = GST_GL_DEINTERLACE (filter);

  //blocking call, use a FBO
  gst_gl_filter_render_to_target (filter, in_tex, out_tex,
      deinterlace_filter->deinterlacefunc, deinterlace_filter);

  return TRUE;
}
static gboolean
gst_gl_filtershader_filter_texture (GstGLFilter * filter, GstGLMemory * in_tex,
    GstGLMemory * out_tex)
{
  GstGLFilterShader *filtershader = GST_GL_FILTERSHADER (filter);

  gst_gl_filter_render_to_target (filter, in_tex, out_tex,
      gst_gl_filtershader_hcallback, NULL);

  if (!filtershader->shader)
    return FALSE;

  return TRUE;
}
Beispiel #11
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;
}
Beispiel #12
0
static gboolean
gst_gl_filtersobel_filter (GstGLFilter * filter, GstGLBuffer * inbuf,
    GstGLBuffer * outbuf)
{
  GstGLFilterSobel *filtersobel = GST_GL_FILTERSOBEL (filter);

  gst_gl_filter_render_to_target_with_shader (filter, inbuf->texture,
      filtersobel->midtexture[0], filtersobel->desat);
  gst_gl_filter_render_to_target_with_shader (filter,
      filtersobel->midtexture[0], filtersobel->midtexture[1],
      filtersobel->hconv);
  gst_gl_filter_render_to_target_with_shader (filter,
      filtersobel->midtexture[1], filtersobel->midtexture[0],
      filtersobel->vconv);
  gst_gl_filter_render_to_target (filter, filtersobel->midtexture[0],
      outbuf->texture, gst_gl_filtersobel_length, filtersobel);
  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;
}
static gboolean
gst_gl_colorscale_filter_texture (GstGLFilter * filter, guint in_tex,
    guint out_tex)
{
  GstGLColorscale *colorscale;

  colorscale = GST_GL_COLORSCALE (filter);

  if (gst_gl_context_get_gl_api (GST_GL_BASE_FILTER (filter)->context) &
      (GST_GL_API_GLES2 | GST_GL_API_OPENGL3))
    gst_gl_filter_render_to_target_with_shader (filter, TRUE, in_tex, out_tex,
        colorscale->shader);

  if (gst_gl_context_get_gl_api (GST_GL_BASE_FILTER (filter)->context) &
      GST_GL_API_OPENGL)
    gst_gl_filter_render_to_target (filter, TRUE, in_tex, out_tex,
        gst_gl_colorscale_callback, colorscale);

  return TRUE;
}
static gboolean
gst_gl_colorscale_filter_texture (GstGLFilter * filter, guint in_tex,
    guint out_tex)
{
  GstGLColorscale *colorscale;

  colorscale = GST_GL_COLORSCALE (filter);

#if GST_GL_HAVE_GLES2
  if (gst_gl_context_get_gl_api (filter->context) & GST_GL_API_GLES2)
    gst_gl_filter_render_to_target_with_shader (filter, TRUE, in_tex, out_tex,
        colorscale->shader);
#endif

#if GST_GL_HAVE_OPENGL
  if (gst_gl_context_get_gl_api (filter->context) & GST_GL_API_OPENGL)
    gst_gl_filter_render_to_target (filter, TRUE, in_tex, out_tex,
        gst_gl_colorscale_callback, colorscale);
#endif

  return TRUE;
}