summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFilippo Argiolas <filippo.argiolas@gmail.com>2010-04-29 20:49:02 +0200
committerFilippo Argiolas <filippo.argiolas@gmail.com>2010-04-30 15:52:36 +0200
commit0f535f0969cad4309725f9caa4569643dbacb6a7 (patch)
treed92449621ba9b92151f8ad7723fe493c101bf1c0
parentc0cef762dc681140f79194a59df021788e8b1372 (diff)
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.
-rw-r--r--gst/gl/effects/gstgleffectglow.c12
-rw-r--r--gst/gl/effects/gstgleffectssources.c32
-rw-r--r--gst/gl/effects/gstgleffectssources.h4
-rw-r--r--gst/gl/effects/gstgleffectxray.c10
-rw-r--r--gst/gl/gstgldifferencematte.c10
-rw-r--r--gst/gl/gstgldifferencematte.h2
-rw-r--r--gst/gl/gstglfilterblur.c10
-rw-r--r--gst/gl/gstglfilterblur.h2
8 files changed, 38 insertions, 44 deletions
diff --git a/gst/gl/effects/gstgleffectglow.c b/gst/gl/effects/gstgleffectglow.c
index d6422e6..d4cf6d2 100644
--- a/gst/gl/effects/gstgleffectglow.c
+++ b/gst/gl/effects/gstgleffectglow.c
@@ -21,7 +21,7 @@
#include <gstgleffects.h>
static gboolean kernel_ready = FALSE;
-static float gauss_kernel[9];
+static float gauss_kernel[7];
static void
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) {
- fill_gaussian_kernel (gauss_kernel, 9, 10.0);
+ fill_gaussian_kernel (gauss_kernel, 7, 10.0);
kernel_ready = TRUE;
}
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);
glLoadIdentity ();
@@ -88,7 +88,7 @@ gst_gl_effects_glow_step_two (gint width, gint height, guint texture,
glDisable (GL_TEXTURE_RECTANGLE_ARB);
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);
}
@@ -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,
- vconv9_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
+ vconv7_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
@@ -121,7 +121,7 @@ gst_gl_effects_glow_step_three (gint width, gint height, guint texture,
glDisable (GL_TEXTURE_RECTANGLE_ARB);
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);
}
diff --git a/gst/gl/effects/gstgleffectssources.c b/gst/gl/effects/gstgleffectssources.c
index 1d77f2b..4442007 100644
--- a/gst/gl/effects/gstgleffectssources.c
+++ b/gst/gl/effects/gstgleffectssources.c
@@ -348,50 +348,46 @@ const gchar *sep_sobel_vconv3_fragment_source =
" gl_FragColor = sum + vec4(0.5, 0.0, 0.0, 0.0);"
"}";
-/* horizontal convolution 9x9 */
-const gchar *hconv9_fragment_source =
+/* horizontal convolution 7x7 */
+const gchar *hconv7_fragment_source =
"#extension GL_ARB_texture_rectangle : enable\n"
"uniform sampler2DRect tex;"
- "uniform float kernel[9];"
+ "uniform float kernel[7];"
"void main () {"
- " vec2 texturecoord[9];"
- " texturecoord[4] = gl_TexCoord[0].st;"
- " texturecoord[3] = texturecoord[4] - vec2(1.0, 0.0);"
+ " vec2 texturecoord[7];"
+ " texturecoord[3] = gl_TexCoord[0].st;"
" texturecoord[2] = texturecoord[3] - vec2(1.0, 0.0);"
" texturecoord[1] = texturecoord[2] - 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[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;"
" vec4 sum = vec4 (0.0);"
- " for (i = 0; i < 9; i++) { "
+ " for (i = 0; i < 7; i++) { "
" vec4 neighbor = texture2DRect(tex, texturecoord[i]); "
" sum += neighbor * kernel[i];"
" }"
" gl_FragColor = sum;"
"}";
-/* vertical convolution 9x9 */
-const gchar *vconv9_fragment_source =
+/* vertical convolution 7x7 */
+const gchar *vconv7_fragment_source =
"#extension GL_ARB_texture_rectangle : enable\n"
"uniform sampler2DRect tex;"
- "uniform float kernel[9];"
+ "uniform float kernel[7];"
"void main () {"
- " vec2 texturecoord[9];"
- " texturecoord[4] = gl_TexCoord[0].st;"
- " texturecoord[3] = texturecoord[4] - vec2(0.0, 1.0);"
+ " vec2 texturecoord[7];"
+ " texturecoord[3] = gl_TexCoord[0].st;"
" texturecoord[2] = texturecoord[3] - vec2(0.0, 1.0);"
" texturecoord[1] = texturecoord[2] - 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[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;"
" vec4 sum = vec4 (0.0);"
- " for (i = 0; i < 9; i++) { "
+ " for (i = 0; i < 7; i++) { "
" vec4 neighbor = texture2DRect(tex, texturecoord[i]);"
" sum += neighbor * kernel[i];"
" }"
diff --git a/gst/gl/effects/gstgleffectssources.h b/gst/gl/effects/gstgleffectssources.h
index b442962..5e0081a 100644
--- a/gst/gl/effects/gstgleffectssources.h
+++ b/gst/gl/effects/gstgleffectssources.h
@@ -36,8 +36,8 @@ extern const gchar *sep_sobel_length_fragment_source;
extern const gchar *desaturate_fragment_source;
extern const gchar *sep_sobel_hconv3_fragment_source;
extern const gchar *sep_sobel_vconv3_fragment_source;
-extern const gchar *hconv9_fragment_source;
-extern const gchar *vconv9_fragment_source;
+extern const gchar *hconv7_fragment_source;
+extern const gchar *vconv7_fragment_source;
extern const gchar *sum_fragment_source;
extern const gchar *luma_to_curve_fragment_source;
extern const gchar *rgb_to_curve_fragment_source;
diff --git a/gst/gl/effects/gstgleffectxray.c b/gst/gl/effects/gstgleffectxray.c
index 0cdcd37..5b7cc1d 100644
--- a/gst/gl/effects/gstgleffectxray.c
+++ b/gst/gl/effects/gstgleffectxray.c
@@ -23,9 +23,7 @@
#include <gstgleffectlumatocurve.h>
static gboolean kernel_ready = FALSE;
-static float gauss_kernel[9];
-
-/* Normalization Constant = 0.999885 */
+static float gauss_kernel[7];
static void
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) {
- fill_gaussian_kernel (gauss_kernel, 9, 1.5);
+ fill_gaussian_kernel (gauss_kernel, 7, 1.5);
kernel_ready = TRUE;
}
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);
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,
- vconv9_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
+ vconv7_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
diff --git a/gst/gl/gstgldifferencematte.c b/gst/gl/gstgldifferencematte.c
index 4e3f7a8..872b133 100644
--- a/gst/gl/gstgldifferencematte.c
+++ b/gst/gl/gstgldifferencematte.c
@@ -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],
difference_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
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],
- 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],
texture_interp_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
@@ -204,7 +204,7 @@ gst_gl_differencematte_init (GstGLDifferenceMatte * differencematte,
differencematte->newbgtexture = 0;
differencematte->bg_has_changed = FALSE;
- fill_gaussian_kernel (differencematte->kernel, 9, 3.0);
+ fill_gaussian_kernel (differencematte->kernel, 7, 30.0);
}
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_1fv (differencematte->shader[1], "kernel", 9,
+ gst_gl_shader_set_uniform_1fv (differencematte->shader[1], "kernel", 7,
differencematte->kernel);
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_1fv (differencematte->shader[2], "kernel", 9,
+ gst_gl_shader_set_uniform_1fv (differencematte->shader[2], "kernel", 7,
differencematte->kernel);
gst_gl_differencematte_draw_texture (differencematte, texture);
diff --git a/gst/gl/gstgldifferencematte.h b/gst/gl/gstgldifferencematte.h
index 06f1d0a..6225ee5 100644
--- a/gst/gl/gstgldifferencematte.h
+++ b/gst/gl/gstgldifferencematte.h
@@ -48,7 +48,7 @@ struct _GstGLDifferenceMatte
GLuint newbgtexture;
GLuint midtexture[4];
GLuint intexture;
- float kernel[9];
+ float kernel[7];
};
struct _GstGLDifferenceMatteClass
diff --git a/gst/gl/gstglfilterblur.c b/gst/gl/gstglfilterblur.c
index 907a412..39675ec 100644
--- a/gst/gl/gstglfilterblur.c
+++ b/gst/gl/gstglfilterblur.c
@@ -126,7 +126,7 @@ gst_gl_filterblur_init (GstGLFilterBlur * filterblur,
/* gaussian kernel (well, actually vector), size 9, standard
* deviation 3.0 */
/* 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
@@ -173,11 +173,11 @@ gst_gl_filterblur_init_shader (GstGLFilter * filter)
GstGLFilterBlur *blur_filter = GST_GL_FILTERBLUR (filter);
//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);
//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);
}
@@ -214,7 +214,7 @@ gst_gl_filterblur_hcallback (gint width, gint height, guint texture,
glDisable (GL_TEXTURE_RECTANGLE_ARB);
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);
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);
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);
gst_gl_filter_draw_texture (filter, texture);
diff --git a/gst/gl/gstglfilterblur.h b/gst/gl/gstglfilterblur.h
index 7157281..060ad63 100644
--- a/gst/gl/gstglfilterblur.h
+++ b/gst/gl/gstglfilterblur.h
@@ -40,7 +40,7 @@ struct _GstGLFilterBlur
GstGLShader *shader1;
GLuint midtexture;
- float gauss_kernel[9];
+ float gauss_kernel[7];
};
struct _GstGLFilterBlurClass