mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 05:16:13 +00:00
[453/906] blur: give up some accuracy for speed
Settle with 7x7 gaussian convolution kernels, maybe slightly less accurate than previous 9x9 but fast enough to be able to use it on i915. About a 20% percent speed gain (again, roughly measured with videotestsrc and glimagesink sync=false). No noticeable rendering difference with current effects.
This commit is contained in:
parent
a9aa0ab2ee
commit
17a33cd19a
8 changed files with 38 additions and 44 deletions
|
@ -21,7 +21,7 @@
|
||||||
#include <gstgleffects.h>
|
#include <gstgleffects.h>
|
||||||
|
|
||||||
static gboolean kernel_ready = FALSE;
|
static gboolean kernel_ready = FALSE;
|
||||||
static float gauss_kernel[9];
|
static float gauss_kernel[7];
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_gl_effects_glow_step_one (gint width, gint height, guint texture,
|
gst_gl_effects_glow_step_one (gint width, gint height, guint texture,
|
||||||
|
@ -70,12 +70,12 @@ gst_gl_effects_glow_step_two (gint width, gint height, guint texture,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!kernel_ready) {
|
if (!kernel_ready) {
|
||||||
fill_gaussian_kernel (gauss_kernel, 9, 10.0);
|
fill_gaussian_kernel (gauss_kernel, 7, 10.0);
|
||||||
kernel_ready = TRUE;
|
kernel_ready = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_return_if_fail (gst_gl_shader_compile_and_check (shader,
|
g_return_if_fail (gst_gl_shader_compile_and_check (shader,
|
||||||
hconv9_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
|
hconv7_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
|
||||||
|
|
||||||
glMatrixMode (GL_PROJECTION);
|
glMatrixMode (GL_PROJECTION);
|
||||||
glLoadIdentity ();
|
glLoadIdentity ();
|
||||||
|
@ -88,7 +88,7 @@ gst_gl_effects_glow_step_two (gint width, gint height, guint texture,
|
||||||
glDisable (GL_TEXTURE_RECTANGLE_ARB);
|
glDisable (GL_TEXTURE_RECTANGLE_ARB);
|
||||||
|
|
||||||
gst_gl_shader_set_uniform_1i (shader, "tex", 1);
|
gst_gl_shader_set_uniform_1i (shader, "tex", 1);
|
||||||
gst_gl_shader_set_uniform_1fv (shader, "kernel", 9, gauss_kernel);
|
gst_gl_shader_set_uniform_1fv (shader, "kernel", 7, gauss_kernel);
|
||||||
|
|
||||||
gst_gl_effects_draw_texture (effects, texture);
|
gst_gl_effects_draw_texture (effects, texture);
|
||||||
}
|
}
|
||||||
|
@ -108,7 +108,7 @@ gst_gl_effects_glow_step_three (gint width, gint height, guint texture,
|
||||||
}
|
}
|
||||||
|
|
||||||
g_return_if_fail (gst_gl_shader_compile_and_check (shader,
|
g_return_if_fail (gst_gl_shader_compile_and_check (shader,
|
||||||
vconv9_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
|
vconv7_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
|
||||||
|
|
||||||
glMatrixMode (GL_PROJECTION);
|
glMatrixMode (GL_PROJECTION);
|
||||||
glLoadIdentity ();
|
glLoadIdentity ();
|
||||||
|
@ -121,7 +121,7 @@ gst_gl_effects_glow_step_three (gint width, gint height, guint texture,
|
||||||
glDisable (GL_TEXTURE_RECTANGLE_ARB);
|
glDisable (GL_TEXTURE_RECTANGLE_ARB);
|
||||||
|
|
||||||
gst_gl_shader_set_uniform_1i (shader, "tex", 1);
|
gst_gl_shader_set_uniform_1i (shader, "tex", 1);
|
||||||
gst_gl_shader_set_uniform_1fv (shader, "kernel", 9, gauss_kernel);
|
gst_gl_shader_set_uniform_1fv (shader, "kernel", 7, gauss_kernel);
|
||||||
|
|
||||||
gst_gl_effects_draw_texture (effects, texture);
|
gst_gl_effects_draw_texture (effects, texture);
|
||||||
}
|
}
|
||||||
|
|
|
@ -348,50 +348,46 @@ const gchar *sep_sobel_vconv3_fragment_source =
|
||||||
" gl_FragColor = sum + vec4(0.5, 0.0, 0.0, 0.0);"
|
" gl_FragColor = sum + vec4(0.5, 0.0, 0.0, 0.0);"
|
||||||
"}";
|
"}";
|
||||||
|
|
||||||
/* horizontal convolution 9x9 */
|
/* horizontal convolution 7x7 */
|
||||||
const gchar *hconv9_fragment_source =
|
const gchar *hconv7_fragment_source =
|
||||||
"#extension GL_ARB_texture_rectangle : enable\n"
|
"#extension GL_ARB_texture_rectangle : enable\n"
|
||||||
"uniform sampler2DRect tex;"
|
"uniform sampler2DRect tex;"
|
||||||
"uniform float kernel[9];"
|
"uniform float kernel[7];"
|
||||||
"void main () {"
|
"void main () {"
|
||||||
" vec2 texturecoord[9];"
|
" vec2 texturecoord[7];"
|
||||||
" texturecoord[4] = gl_TexCoord[0].st;"
|
" texturecoord[3] = gl_TexCoord[0].st;"
|
||||||
" texturecoord[3] = texturecoord[4] - vec2(1.0, 0.0);"
|
|
||||||
" texturecoord[2] = texturecoord[3] - vec2(1.0, 0.0);"
|
" texturecoord[2] = texturecoord[3] - vec2(1.0, 0.0);"
|
||||||
" texturecoord[1] = texturecoord[2] - vec2(1.0, 0.0);"
|
" texturecoord[1] = texturecoord[2] - vec2(1.0, 0.0);"
|
||||||
" texturecoord[0] = texturecoord[1] - vec2(1.0, 0.0);"
|
" texturecoord[0] = texturecoord[1] - vec2(1.0, 0.0);"
|
||||||
|
" texturecoord[4] = texturecoord[3] + vec2(1.0, 0.0);"
|
||||||
" texturecoord[5] = texturecoord[4] + vec2(1.0, 0.0);"
|
" texturecoord[5] = texturecoord[4] + vec2(1.0, 0.0);"
|
||||||
" texturecoord[6] = texturecoord[5] + vec2(1.0, 0.0);"
|
" texturecoord[6] = texturecoord[5] + vec2(1.0, 0.0);"
|
||||||
" texturecoord[7] = texturecoord[6] + vec2(1.0, 0.0);"
|
|
||||||
" texturecoord[8] = texturecoord[7] + vec2(1.0, 0.0);"
|
|
||||||
" int i;"
|
" int i;"
|
||||||
" vec4 sum = vec4 (0.0);"
|
" vec4 sum = vec4 (0.0);"
|
||||||
" for (i = 0; i < 9; i++) { "
|
" for (i = 0; i < 7; i++) { "
|
||||||
" vec4 neighbor = texture2DRect(tex, texturecoord[i]); "
|
" vec4 neighbor = texture2DRect(tex, texturecoord[i]); "
|
||||||
" sum += neighbor * kernel[i];"
|
" sum += neighbor * kernel[i];"
|
||||||
" }"
|
" }"
|
||||||
" gl_FragColor = sum;"
|
" gl_FragColor = sum;"
|
||||||
"}";
|
"}";
|
||||||
|
|
||||||
/* vertical convolution 9x9 */
|
/* vertical convolution 7x7 */
|
||||||
const gchar *vconv9_fragment_source =
|
const gchar *vconv7_fragment_source =
|
||||||
"#extension GL_ARB_texture_rectangle : enable\n"
|
"#extension GL_ARB_texture_rectangle : enable\n"
|
||||||
"uniform sampler2DRect tex;"
|
"uniform sampler2DRect tex;"
|
||||||
"uniform float kernel[9];"
|
"uniform float kernel[7];"
|
||||||
"void main () {"
|
"void main () {"
|
||||||
" vec2 texturecoord[9];"
|
" vec2 texturecoord[7];"
|
||||||
" texturecoord[4] = gl_TexCoord[0].st;"
|
" texturecoord[3] = gl_TexCoord[0].st;"
|
||||||
" texturecoord[3] = texturecoord[4] - vec2(0.0, 1.0);"
|
|
||||||
" texturecoord[2] = texturecoord[3] - vec2(0.0, 1.0);"
|
" texturecoord[2] = texturecoord[3] - vec2(0.0, 1.0);"
|
||||||
" texturecoord[1] = texturecoord[2] - vec2(0.0, 1.0);"
|
" texturecoord[1] = texturecoord[2] - vec2(0.0, 1.0);"
|
||||||
" texturecoord[0] = texturecoord[1] - vec2(0.0, 1.0);"
|
" texturecoord[0] = texturecoord[1] - vec2(0.0, 1.0);"
|
||||||
|
" texturecoord[4] = texturecoord[3] + vec2(0.0, 1.0);"
|
||||||
" texturecoord[5] = texturecoord[4] + vec2(0.0, 1.0);"
|
" texturecoord[5] = texturecoord[4] + vec2(0.0, 1.0);"
|
||||||
" texturecoord[6] = texturecoord[5] + vec2(0.0, 1.0);"
|
" texturecoord[6] = texturecoord[5] + vec2(0.0, 1.0);"
|
||||||
" texturecoord[7] = texturecoord[6] + vec2(0.0, 1.0);"
|
|
||||||
" texturecoord[8] = texturecoord[7] + vec2(0.0, 1.0);"
|
|
||||||
" int i;"
|
" int i;"
|
||||||
" vec4 sum = vec4 (0.0);"
|
" vec4 sum = vec4 (0.0);"
|
||||||
" for (i = 0; i < 9; i++) { "
|
" for (i = 0; i < 7; i++) { "
|
||||||
" vec4 neighbor = texture2DRect(tex, texturecoord[i]);"
|
" vec4 neighbor = texture2DRect(tex, texturecoord[i]);"
|
||||||
" sum += neighbor * kernel[i];"
|
" sum += neighbor * kernel[i];"
|
||||||
" }"
|
" }"
|
||||||
|
|
|
@ -36,8 +36,8 @@ extern const gchar *sep_sobel_length_fragment_source;
|
||||||
extern const gchar *desaturate_fragment_source;
|
extern const gchar *desaturate_fragment_source;
|
||||||
extern const gchar *sep_sobel_hconv3_fragment_source;
|
extern const gchar *sep_sobel_hconv3_fragment_source;
|
||||||
extern const gchar *sep_sobel_vconv3_fragment_source;
|
extern const gchar *sep_sobel_vconv3_fragment_source;
|
||||||
extern const gchar *hconv9_fragment_source;
|
extern const gchar *hconv7_fragment_source;
|
||||||
extern const gchar *vconv9_fragment_source;
|
extern const gchar *vconv7_fragment_source;
|
||||||
extern const gchar *sum_fragment_source;
|
extern const gchar *sum_fragment_source;
|
||||||
extern const gchar *luma_to_curve_fragment_source;
|
extern const gchar *luma_to_curve_fragment_source;
|
||||||
extern const gchar *rgb_to_curve_fragment_source;
|
extern const gchar *rgb_to_curve_fragment_source;
|
||||||
|
|
|
@ -23,9 +23,7 @@
|
||||||
#include <gstgleffectlumatocurve.h>
|
#include <gstgleffectlumatocurve.h>
|
||||||
|
|
||||||
static gboolean kernel_ready = FALSE;
|
static gboolean kernel_ready = FALSE;
|
||||||
static float gauss_kernel[9];
|
static float gauss_kernel[7];
|
||||||
|
|
||||||
/* Normalization Constant = 0.999885 */
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_gl_effects_xray_step_one (gint width, gint height, guint texture,
|
gst_gl_effects_xray_step_one (gint width, gint height, guint texture,
|
||||||
|
@ -52,12 +50,12 @@ gst_gl_effects_xray_step_two (gint width, gint height, guint texture,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!kernel_ready) {
|
if (!kernel_ready) {
|
||||||
fill_gaussian_kernel (gauss_kernel, 9, 1.5);
|
fill_gaussian_kernel (gauss_kernel, 7, 1.5);
|
||||||
kernel_ready = TRUE;
|
kernel_ready = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_return_if_fail (gst_gl_shader_compile_and_check (shader,
|
g_return_if_fail (gst_gl_shader_compile_and_check (shader,
|
||||||
hconv9_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
|
hconv7_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
|
||||||
|
|
||||||
glMatrixMode (GL_PROJECTION);
|
glMatrixMode (GL_PROJECTION);
|
||||||
glLoadIdentity ();
|
glLoadIdentity ();
|
||||||
|
@ -90,7 +88,7 @@ gst_gl_effects_xray_step_three (gint width, gint height, guint texture,
|
||||||
}
|
}
|
||||||
|
|
||||||
g_return_if_fail (gst_gl_shader_compile_and_check (shader,
|
g_return_if_fail (gst_gl_shader_compile_and_check (shader,
|
||||||
vconv9_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
|
vconv7_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
|
||||||
|
|
||||||
glMatrixMode (GL_PROJECTION);
|
glMatrixMode (GL_PROJECTION);
|
||||||
glLoadIdentity ();
|
glLoadIdentity ();
|
||||||
|
|
|
@ -101,10 +101,10 @@ gst_gl_differencematte_init_gl_resources (GstGLFilter * filter)
|
||||||
g_return_if_fail (gst_gl_shader_compile_and_check (differencematte->shader[0],
|
g_return_if_fail (gst_gl_shader_compile_and_check (differencematte->shader[0],
|
||||||
difference_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
|
difference_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
|
||||||
g_return_if_fail (gst_gl_shader_compile_and_check (differencematte->shader[1],
|
g_return_if_fail (gst_gl_shader_compile_and_check (differencematte->shader[1],
|
||||||
hconv9_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
|
hconv7_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
|
||||||
|
|
||||||
g_return_if_fail (gst_gl_shader_compile_and_check (differencematte->shader[2],
|
g_return_if_fail (gst_gl_shader_compile_and_check (differencematte->shader[2],
|
||||||
vconv9_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
|
vconv7_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
|
||||||
|
|
||||||
g_return_if_fail (gst_gl_shader_compile_and_check (differencematte->shader[3],
|
g_return_if_fail (gst_gl_shader_compile_and_check (differencematte->shader[3],
|
||||||
texture_interp_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
|
texture_interp_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
|
||||||
|
@ -204,7 +204,7 @@ gst_gl_differencematte_init (GstGLDifferenceMatte * differencematte,
|
||||||
differencematte->newbgtexture = 0;
|
differencematte->newbgtexture = 0;
|
||||||
differencematte->bg_has_changed = FALSE;
|
differencematte->bg_has_changed = FALSE;
|
||||||
|
|
||||||
fill_gaussian_kernel (differencematte->kernel, 9, 3.0);
|
fill_gaussian_kernel (differencematte->kernel, 7, 30.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -341,7 +341,7 @@ gst_gl_differencematte_hblur (gint width, gint height, guint texture,
|
||||||
|
|
||||||
gst_gl_shader_set_uniform_1i (differencematte->shader[1], "tex", 0);
|
gst_gl_shader_set_uniform_1i (differencematte->shader[1], "tex", 0);
|
||||||
|
|
||||||
gst_gl_shader_set_uniform_1fv (differencematte->shader[1], "kernel", 9,
|
gst_gl_shader_set_uniform_1fv (differencematte->shader[1], "kernel", 7,
|
||||||
differencematte->kernel);
|
differencematte->kernel);
|
||||||
|
|
||||||
gst_gl_differencematte_draw_texture (differencematte, texture);
|
gst_gl_differencematte_draw_texture (differencematte, texture);
|
||||||
|
@ -365,7 +365,7 @@ gst_gl_differencematte_vblur (gint width, gint height, guint texture,
|
||||||
|
|
||||||
gst_gl_shader_set_uniform_1i (differencematte->shader[2], "tex", 0);
|
gst_gl_shader_set_uniform_1i (differencematte->shader[2], "tex", 0);
|
||||||
|
|
||||||
gst_gl_shader_set_uniform_1fv (differencematte->shader[2], "kernel", 9,
|
gst_gl_shader_set_uniform_1fv (differencematte->shader[2], "kernel", 7,
|
||||||
differencematte->kernel);
|
differencematte->kernel);
|
||||||
|
|
||||||
gst_gl_differencematte_draw_texture (differencematte, texture);
|
gst_gl_differencematte_draw_texture (differencematte, texture);
|
||||||
|
|
|
@ -48,7 +48,7 @@ struct _GstGLDifferenceMatte
|
||||||
GLuint newbgtexture;
|
GLuint newbgtexture;
|
||||||
GLuint midtexture[4];
|
GLuint midtexture[4];
|
||||||
GLuint intexture;
|
GLuint intexture;
|
||||||
float kernel[9];
|
float kernel[7];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GstGLDifferenceMatteClass
|
struct _GstGLDifferenceMatteClass
|
||||||
|
|
|
@ -126,7 +126,7 @@ gst_gl_filterblur_init (GstGLFilterBlur * filterblur,
|
||||||
/* gaussian kernel (well, actually vector), size 9, standard
|
/* gaussian kernel (well, actually vector), size 9, standard
|
||||||
* deviation 3.0 */
|
* deviation 3.0 */
|
||||||
/* FIXME: eventually make this a runtime property */
|
/* FIXME: eventually make this a runtime property */
|
||||||
fill_gaussian_kernel (filterblur->gauss_kernel, 9, 3.0);
|
fill_gaussian_kernel (filterblur->gauss_kernel, 7, 3.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -173,11 +173,11 @@ gst_gl_filterblur_init_shader (GstGLFilter * filter)
|
||||||
GstGLFilterBlur *blur_filter = GST_GL_FILTERBLUR (filter);
|
GstGLFilterBlur *blur_filter = GST_GL_FILTERBLUR (filter);
|
||||||
|
|
||||||
//blocking call, wait the opengl thread has compiled the shader
|
//blocking call, wait the opengl thread has compiled the shader
|
||||||
gst_gl_display_gen_shader (filter->display, 0, hconv9_fragment_source,
|
gst_gl_display_gen_shader (filter->display, 0, hconv7_fragment_source,
|
||||||
&blur_filter->shader0);
|
&blur_filter->shader0);
|
||||||
|
|
||||||
//blocking call, wait the opengl thread has compiled the shader
|
//blocking call, wait the opengl thread has compiled the shader
|
||||||
gst_gl_display_gen_shader (filter->display, 0, vconv9_fragment_source,
|
gst_gl_display_gen_shader (filter->display, 0, vconv7_fragment_source,
|
||||||
&blur_filter->shader1);
|
&blur_filter->shader1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -214,7 +214,7 @@ gst_gl_filterblur_hcallback (gint width, gint height, guint texture,
|
||||||
glDisable (GL_TEXTURE_RECTANGLE_ARB);
|
glDisable (GL_TEXTURE_RECTANGLE_ARB);
|
||||||
|
|
||||||
gst_gl_shader_set_uniform_1i (filterblur->shader0, "tex", 1);
|
gst_gl_shader_set_uniform_1i (filterblur->shader0, "tex", 1);
|
||||||
gst_gl_shader_set_uniform_1fv (filterblur->shader0, "kernel", 9,
|
gst_gl_shader_set_uniform_1fv (filterblur->shader0, "kernel", 7,
|
||||||
filterblur->gauss_kernel);
|
filterblur->gauss_kernel);
|
||||||
|
|
||||||
gst_gl_filter_draw_texture (filter, texture);
|
gst_gl_filter_draw_texture (filter, texture);
|
||||||
|
@ -239,7 +239,7 @@ gst_gl_filterblur_vcallback (gint width, gint height, guint texture,
|
||||||
glDisable (GL_TEXTURE_RECTANGLE_ARB);
|
glDisable (GL_TEXTURE_RECTANGLE_ARB);
|
||||||
|
|
||||||
gst_gl_shader_set_uniform_1i (filterblur->shader1, "tex", 1);
|
gst_gl_shader_set_uniform_1i (filterblur->shader1, "tex", 1);
|
||||||
gst_gl_shader_set_uniform_1fv (filterblur->shader1, "kernel", 9,
|
gst_gl_shader_set_uniform_1fv (filterblur->shader1, "kernel", 7,
|
||||||
filterblur->gauss_kernel);
|
filterblur->gauss_kernel);
|
||||||
|
|
||||||
gst_gl_filter_draw_texture (filter, texture);
|
gst_gl_filter_draw_texture (filter, texture);
|
||||||
|
|
|
@ -40,7 +40,7 @@ struct _GstGLFilterBlur
|
||||||
GstGLShader *shader1;
|
GstGLShader *shader1;
|
||||||
|
|
||||||
GLuint midtexture;
|
GLuint midtexture;
|
||||||
float gauss_kernel[9];
|
float gauss_kernel[7];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GstGLFilterBlurClass
|
struct _GstGLFilterBlurClass
|
||||||
|
|
Loading…
Reference in a new issue