mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-23 17:14:23 +00:00
[192/906] complete differencematte filter.. I did it quickly, probably still needs some work
This commit is contained in:
parent
3faa943819
commit
8024aa7483
3 changed files with 168 additions and 34 deletions
|
@ -359,6 +359,19 @@ const gchar *interpolate_fragment_source =
|
||||||
"gl_FragColor = blendcolor + (1.0 - blendcolor.a) * basecolor;"
|
"gl_FragColor = blendcolor + (1.0 - blendcolor.a) * basecolor;"
|
||||||
"}";
|
"}";
|
||||||
|
|
||||||
|
const gchar *texture_interp_fragment_source =
|
||||||
|
"#extension GL_ARB_texture_rectangle : enable\n"
|
||||||
|
"uniform sampler2DRect base;"
|
||||||
|
"uniform sampler2DRect blend;"
|
||||||
|
"uniform sampler2DRect alpha;"
|
||||||
|
"void main () {"
|
||||||
|
"vec4 basecolor = texture2DRect (base, gl_TexCoord[0].st);"
|
||||||
|
"vec4 blendcolor = texture2DRect (blend, gl_TexCoord[0].st);"
|
||||||
|
"vec4 alphacolor = texture2DRect (alpha, gl_TexCoord[0].st);"
|
||||||
|
// "gl_FragColor = alphacolor;"
|
||||||
|
"gl_FragColor = (alphacolor * blendcolor) + (1.0 - alphacolor) * basecolor;"
|
||||||
|
"}";
|
||||||
|
|
||||||
const gchar *difference_fragment_source =
|
const gchar *difference_fragment_source =
|
||||||
"#extension GL_ARB_texture_rectangle : enable\n"
|
"#extension GL_ARB_texture_rectangle : enable\n"
|
||||||
"uniform sampler2DRect saved;"
|
"uniform sampler2DRect saved;"
|
||||||
|
|
|
@ -37,6 +37,7 @@ const gchar *luma_to_curve_fragment_source;
|
||||||
const gchar *rgb_to_curve_fragment_source;
|
const gchar *rgb_to_curve_fragment_source;
|
||||||
const gchar *sin_fragment_source;
|
const gchar *sin_fragment_source;
|
||||||
const gchar *interpolate_fragment_source;
|
const gchar *interpolate_fragment_source;
|
||||||
|
const gchar *texture_interp_fragment_source;
|
||||||
const gchar *difference_fragment_source;
|
const gchar *difference_fragment_source;
|
||||||
|
|
||||||
#endif /* __GST_GL_EFFECTS_SOURCES_H__ */
|
#endif /* __GST_GL_EFFECTS_SOURCES_H__ */
|
||||||
|
|
|
@ -46,6 +46,7 @@ struct _GstGLDifferenceMatte
|
||||||
GLuint savedbgtexture;
|
GLuint savedbgtexture;
|
||||||
GLuint newbgtexture;
|
GLuint newbgtexture;
|
||||||
GLuint midtexture[4];
|
GLuint midtexture[4];
|
||||||
|
GLuint intexture;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GstGLDifferenceMatteClass
|
struct _GstGLDifferenceMatteClass
|
||||||
|
@ -96,8 +97,17 @@ gst_gl_differencematte_init_gl_resources (GstGLFilter *filter)
|
||||||
GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (filter);
|
GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (filter);
|
||||||
gint i;
|
gint i;
|
||||||
|
|
||||||
for (i=0; i<3; i++)
|
for (i=0; i<4; i++) {
|
||||||
|
glGenTextures (1, &differencematte->midtexture[i]);
|
||||||
|
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, differencematte->midtexture[i]);
|
||||||
|
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8,
|
||||||
|
filter->width, filter->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
||||||
|
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
|
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
differencematte->shader[i] = gst_gl_shader_new ();
|
differencematte->shader[i] = gst_gl_shader_new ();
|
||||||
|
}
|
||||||
|
|
||||||
g_return_if_fail (
|
g_return_if_fail (
|
||||||
gst_gl_shader_compile_and_check (differencematte->shader[0],
|
gst_gl_shader_compile_and_check (differencematte->shader[0],
|
||||||
|
@ -109,12 +119,13 @@ gst_gl_differencematte_init_gl_resources (GstGLFilter *filter)
|
||||||
GST_GL_SHADER_FRAGMENT_SOURCE));
|
GST_GL_SHADER_FRAGMENT_SOURCE));
|
||||||
|
|
||||||
g_return_if_fail (
|
g_return_if_fail (
|
||||||
gst_gl_shader_compile_and_check (differencematte->shader[1],
|
gst_gl_shader_compile_and_check (differencematte->shader[2],
|
||||||
vconv9_fragment_source,
|
vconv9_fragment_source,
|
||||||
GST_GL_SHADER_FRAGMENT_SOURCE));
|
GST_GL_SHADER_FRAGMENT_SOURCE));
|
||||||
|
|
||||||
g_return_if_fail (
|
g_return_if_fail (
|
||||||
gst_gl_shader_compile_and_check (differencematte->shader[1],
|
gst_gl_shader_compile_and_check (differencematte->shader[3],
|
||||||
interpolate_fragment_source,
|
texture_interp_fragment_source,
|
||||||
GST_GL_SHADER_FRAGMENT_SOURCE));
|
GST_GL_SHADER_FRAGMENT_SOURCE));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,8 +138,10 @@ gst_gl_differencematte_reset_gl_resources (GstGLFilter *filter)
|
||||||
|
|
||||||
glDeleteTextures (1, &differencematte->savedbgtexture);
|
glDeleteTextures (1, &differencematte->savedbgtexture);
|
||||||
glDeleteTextures (1, &differencematte->newbgtexture);
|
glDeleteTextures (1, &differencematte->newbgtexture);
|
||||||
for (i=0; i<3; i++)
|
for (i=0; i<4; i++) {
|
||||||
g_object_unref (differencematte->shader[i]);
|
g_object_unref (differencematte->shader[i]);
|
||||||
|
glDeleteTextures (1, &differencematte->midtexture[i]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -258,33 +271,6 @@ gst_gl_differencematte_save_texture (gint width, gint height, guint texture, gpo
|
||||||
gst_gl_differencematte_draw_texture (differencematte, texture);
|
gst_gl_differencematte_draw_texture (differencematte, texture);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
gst_gl_differencematte_callback (gint width, gint height, guint texture, gpointer stuff)
|
|
||||||
{
|
|
||||||
GstGLDifferenceMatte* differencematte = GST_GL_DIFFERENCEMATTE (stuff);
|
|
||||||
|
|
||||||
glMatrixMode (GL_PROJECTION);
|
|
||||||
glLoadIdentity ();
|
|
||||||
|
|
||||||
gst_gl_shader_use (differencematte->shader[0]);
|
|
||||||
|
|
||||||
glActiveTexture (GL_TEXTURE0);
|
|
||||||
glEnable (GL_TEXTURE_RECTANGLE_ARB);
|
|
||||||
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, texture);
|
|
||||||
glDisable(GL_TEXTURE_RECTANGLE_ARB);
|
|
||||||
|
|
||||||
gst_gl_shader_set_uniform_1i (differencematte->shader[0], "current", 0);
|
|
||||||
|
|
||||||
glActiveTexture (GL_TEXTURE2);
|
|
||||||
glEnable (GL_TEXTURE_RECTANGLE_ARB);
|
|
||||||
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, differencematte->savedbgtexture);
|
|
||||||
glDisable (GL_TEXTURE_RECTANGLE_ARB);
|
|
||||||
|
|
||||||
gst_gl_shader_set_uniform_1i (differencematte->shader[0], "saved", 2);
|
|
||||||
|
|
||||||
gst_gl_differencematte_draw_texture (differencematte, texture);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void init_pixbuf_texture (GstGLDisplay *display, gpointer data)
|
static void init_pixbuf_texture (GstGLDisplay *display, gpointer data)
|
||||||
{
|
{
|
||||||
GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (data);
|
GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (data);
|
||||||
|
@ -310,6 +296,126 @@ static void init_pixbuf_texture (GstGLDisplay *display, gpointer data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_gl_differencematte_diff (gint width, gint height, guint texture, gpointer stuff)
|
||||||
|
{
|
||||||
|
GstGLDifferenceMatte* differencematte = GST_GL_DIFFERENCEMATTE (stuff);
|
||||||
|
|
||||||
|
glMatrixMode (GL_PROJECTION);
|
||||||
|
glLoadIdentity ();
|
||||||
|
|
||||||
|
gst_gl_shader_use (differencematte->shader[0]);
|
||||||
|
|
||||||
|
glActiveTexture (GL_TEXTURE0);
|
||||||
|
glEnable (GL_TEXTURE_RECTANGLE_ARB);
|
||||||
|
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, texture);
|
||||||
|
glDisable(GL_TEXTURE_RECTANGLE_ARB);
|
||||||
|
|
||||||
|
gst_gl_shader_set_uniform_1i (differencematte->shader[0], "current", 0);
|
||||||
|
|
||||||
|
glActiveTexture (GL_TEXTURE2);
|
||||||
|
glEnable (GL_TEXTURE_RECTANGLE_ARB);
|
||||||
|
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, differencematte->savedbgtexture);
|
||||||
|
glDisable (GL_TEXTURE_RECTANGLE_ARB);
|
||||||
|
|
||||||
|
gst_gl_shader_set_uniform_1i (differencematte->shader[0], "saved", 2);
|
||||||
|
|
||||||
|
gst_gl_differencematte_draw_texture (differencematte, texture);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_gl_differencematte_hblur (gint width, gint height, guint texture, gpointer stuff)
|
||||||
|
{
|
||||||
|
GstGLDifferenceMatte* differencematte = GST_GL_DIFFERENCEMATTE (stuff);
|
||||||
|
gfloat gauss_kernel[9] = {
|
||||||
|
0.026995, 0.064759, 0.120985,
|
||||||
|
0.176033, 0.199471, 0.176033,
|
||||||
|
0.120985, 0.064759, 0.026995
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
glMatrixMode (GL_PROJECTION);
|
||||||
|
glLoadIdentity ();
|
||||||
|
|
||||||
|
gst_gl_shader_use (differencematte->shader[1]);
|
||||||
|
|
||||||
|
glActiveTexture (GL_TEXTURE0);
|
||||||
|
glEnable (GL_TEXTURE_RECTANGLE_ARB);
|
||||||
|
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, texture);
|
||||||
|
glDisable(GL_TEXTURE_RECTANGLE_ARB);
|
||||||
|
|
||||||
|
gst_gl_shader_set_uniform_1i (differencematte->shader[1], "tex", 0);
|
||||||
|
|
||||||
|
gst_gl_shader_set_uniform_1fv (differencematte->shader[1], "kernel", 9, gauss_kernel);
|
||||||
|
gst_gl_shader_set_uniform_1f (differencematte->shader[1], "norm_const", 0.977016f);
|
||||||
|
gst_gl_shader_set_uniform_1f (differencematte->shader[1], "norm_offset", 0.0f);
|
||||||
|
|
||||||
|
gst_gl_differencematte_draw_texture (differencematte, texture);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_gl_differencematte_vblur (gint width, gint height, guint texture, gpointer stuff)
|
||||||
|
{
|
||||||
|
GstGLDifferenceMatte* differencematte = GST_GL_DIFFERENCEMATTE (stuff);
|
||||||
|
gfloat gauss_kernel[9] = {
|
||||||
|
0.026995, 0.064759, 0.120985,
|
||||||
|
0.176033, 0.199471, 0.176033,
|
||||||
|
0.120985, 0.064759, 0.026995
|
||||||
|
};
|
||||||
|
|
||||||
|
glMatrixMode (GL_PROJECTION);
|
||||||
|
glLoadIdentity ();
|
||||||
|
|
||||||
|
gst_gl_shader_use (differencematte->shader[2]);
|
||||||
|
|
||||||
|
glActiveTexture (GL_TEXTURE0);
|
||||||
|
glEnable (GL_TEXTURE_RECTANGLE_ARB);
|
||||||
|
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, texture);
|
||||||
|
glDisable(GL_TEXTURE_RECTANGLE_ARB);
|
||||||
|
|
||||||
|
gst_gl_shader_set_uniform_1i (differencematte->shader[2], "tex", 0);
|
||||||
|
|
||||||
|
gst_gl_shader_set_uniform_1fv (differencematte->shader[2], "kernel", 9, gauss_kernel);
|
||||||
|
gst_gl_shader_set_uniform_1f (differencematte->shader[2], "norm_const", 0.977016f);
|
||||||
|
gst_gl_shader_set_uniform_1f (differencematte->shader[2], "norm_offset", 0.0f);
|
||||||
|
|
||||||
|
gst_gl_differencematte_draw_texture (differencematte, texture);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_gl_differencematte_interp (gint width, gint height, guint texture, gpointer stuff)
|
||||||
|
{
|
||||||
|
GstGLDifferenceMatte* differencematte = GST_GL_DIFFERENCEMATTE (stuff);
|
||||||
|
|
||||||
|
glMatrixMode (GL_PROJECTION);
|
||||||
|
glLoadIdentity ();
|
||||||
|
|
||||||
|
gst_gl_shader_use (differencematte->shader[3]);
|
||||||
|
|
||||||
|
glActiveTexture (GL_TEXTURE0);
|
||||||
|
glEnable (GL_TEXTURE_RECTANGLE_ARB);
|
||||||
|
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, texture);
|
||||||
|
glDisable(GL_TEXTURE_RECTANGLE_ARB);
|
||||||
|
|
||||||
|
gst_gl_shader_set_uniform_1i (differencematte->shader[3], "base", 0);
|
||||||
|
|
||||||
|
glActiveTexture (GL_TEXTURE1);
|
||||||
|
glEnable (GL_TEXTURE_RECTANGLE_ARB);
|
||||||
|
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, differencematte->newbgtexture);
|
||||||
|
glDisable (GL_TEXTURE_RECTANGLE_ARB);
|
||||||
|
|
||||||
|
gst_gl_shader_set_uniform_1i (differencematte->shader[3], "blend", 1);
|
||||||
|
|
||||||
|
glActiveTexture (GL_TEXTURE2);
|
||||||
|
glEnable (GL_TEXTURE_RECTANGLE_ARB);
|
||||||
|
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, differencematte->midtexture[2]);
|
||||||
|
glDisable (GL_TEXTURE_RECTANGLE_ARB);
|
||||||
|
|
||||||
|
gst_gl_shader_set_uniform_1i (differencematte->shader[3], "alpha", 2);
|
||||||
|
|
||||||
|
gst_gl_differencematte_draw_texture (differencematte, texture);
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_gl_differencematte_filter (GstGLFilter* filter, GstGLBuffer* inbuf,
|
gst_gl_differencematte_filter (GstGLFilter* filter, GstGLBuffer* inbuf,
|
||||||
GstGLBuffer* outbuf)
|
GstGLBuffer* outbuf)
|
||||||
|
@ -318,6 +424,8 @@ gst_gl_differencematte_filter (GstGLFilter* filter, GstGLBuffer* inbuf,
|
||||||
GdkPixbuf *pixbuf;
|
GdkPixbuf *pixbuf;
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
|
|
||||||
|
differencematte->intexture = inbuf->texture;
|
||||||
|
|
||||||
if (differencematte->bg_has_changed && (differencematte->location != NULL)) {
|
if (differencematte->bg_has_changed && (differencematte->location != NULL)) {
|
||||||
pixbuf = gdk_pixbuf_new_from_file (differencematte->location, &error);
|
pixbuf = gdk_pixbuf_new_from_file (differencematte->location, &error);
|
||||||
if (pixbuf) {
|
if (pixbuf) {
|
||||||
|
@ -343,8 +451,20 @@ gst_gl_differencematte_filter (GstGLFilter* filter, GstGLBuffer* inbuf,
|
||||||
differencematte->bg_has_changed = FALSE;
|
differencematte->bg_has_changed = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_gl_filter_render_to_target (filter, inbuf->texture, outbuf->texture,
|
gst_gl_filter_render_to_target (filter, inbuf->texture, differencematte->midtexture[0],
|
||||||
gst_gl_differencematte_callback, differencematte);
|
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);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue