From e8d27cadf75b87184f4adf8df1165b2988a25153 Mon Sep 17 00:00:00 2001 From: Filippo Argiolas Date: Thu, 14 Aug 2008 08:03:49 +0200 Subject: [PATCH] [162/906] import stretch effect from cvs --- gst/gl/Makefile.am | 3 +- gst/gl/effects/gstgleffects.h | 1 + gst/gl/effects/gstgleffectssources.c | 17 +++++++ gst/gl/effects/gstgleffectssources.h | 1 + gst/gl/effects/gstgleffectstretch.c | 68 ++++++++++++++++++++++++++ gst/gl/gstgleffects.c | 73 +++++++++++++++------------- 6 files changed, 127 insertions(+), 36 deletions(-) create mode 100644 gst/gl/effects/gstgleffectstretch.c diff --git a/gst/gl/Makefile.am b/gst/gl/Makefile.am index 55a83dceb8..65f610493d 100644 --- a/gst/gl/Makefile.am +++ b/gst/gl/Makefile.am @@ -31,7 +31,8 @@ libgstopengl_la_SOURCES = \ effects/gstgleffectssources.h \ effects/gstgleffectidentity.c \ effects/gstgleffectmirror.c \ - effects/gstgleffectsqueeze.c + effects/gstgleffectsqueeze.c \ + effects/gstgleffectstretch.c # check order of CFLAGS and LIBS, shouldn't the order be the other way around diff --git a/gst/gl/effects/gstgleffects.h b/gst/gl/effects/gstgleffects.h index 1eb5df30d5..e7ae933ab3 100644 --- a/gst/gl/effects/gstgleffects.h +++ b/gst/gl/effects/gstgleffects.h @@ -78,6 +78,7 @@ void gst_gl_effects_draw_texture (GstGLEffects * effects, GLuint tex); void gst_gl_effects_identity (GstGLEffects *effects); void gst_gl_effects_mirror (GstGLEffects *effects); void gst_gl_effects_squeeze (GstGLEffects *effects); +void gst_gl_effects_stretch (GstGLEffects *effects); G_END_DECLS diff --git a/gst/gl/effects/gstgleffectssources.c b/gst/gl/effects/gstgleffectssources.c index 55acdd3b17..99ceae18b4 100644 --- a/gst/gl/effects/gstgleffectssources.c +++ b/gst/gl/effects/gstgleffectssources.c @@ -59,3 +59,20 @@ const gchar *squeeze_fragment_source = " gl_FragColor = color * gl_Color;" "}"; + +/* Stretch Effect */ +const gchar *stretch_fragment_source = +"#extension GL_ARB_texture_rectangle : enable\n" +"uniform sampler2DRect tex;" +"uniform float width, height;" +"void main () {" +" vec2 tex_size = vec2 (width, height);" +" vec2 texturecoord = gl_TexCoord[0].xy;" +" vec2 normcoord;" +" normcoord = texturecoord / tex_size - 1.0;" +" float r = length (normcoord);" +" normcoord *= 2.0 - smoothstep(0.0, 0.7, r);" +" texturecoord = (normcoord + 1.0) * tex_size;" +" vec4 color = texture2DRect (tex, texturecoord);" +" gl_FragColor = color * gl_Color;" +"}"; diff --git a/gst/gl/effects/gstgleffectssources.h b/gst/gl/effects/gstgleffectssources.h index dee149f58d..505b6e5e55 100644 --- a/gst/gl/effects/gstgleffectssources.h +++ b/gst/gl/effects/gstgleffectssources.h @@ -25,5 +25,6 @@ const gchar *mirror_fragment_source; const gchar *squeeze_fragment_source; +const gchar *stretch_fragment_source; #endif /* __GST_GL_EFFECTS_SOURCES_H__ */ diff --git a/gst/gl/effects/gstgleffectstretch.c b/gst/gl/effects/gstgleffectstretch.c new file mode 100644 index 0000000000..503244ab2d --- /dev/null +++ b/gst/gl/effects/gstgleffectstretch.c @@ -0,0 +1,68 @@ +/* + * GStreamer + * Copyright (C) 2008 Filippo Argiolas + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include + +static void +gst_gl_effects_stretch_callback (gint width, gint height, guint texture, gpointer data) +{ + GstGLEffects* effects = GST_GL_EFFECTS (data); + + GstGLShader *shader; + gfloat tex_size[2]; + + shader = g_hash_table_lookup (effects->shaderstable, "stretch0"); + + if (!shader) { + shader = gst_gl_shader_new (); + g_hash_table_insert (effects->shaderstable, "stretch0", shader); + } + + g_return_if_fail ( + gst_gl_shader_compile_and_check (shader, stretch_fragment_source, + GST_GL_SHADER_FRAGMENT_SOURCE)); + + glMatrixMode (GL_PROJECTION); + glLoadIdentity (); + + gst_gl_shader_use (shader); + + glActiveTexture (GL_TEXTURE0); + glEnable (GL_TEXTURE_RECTANGLE_ARB); + glBindTexture (GL_TEXTURE_RECTANGLE_ARB, texture); + + gst_gl_shader_set_uniform_1i (shader, "tex", 0); + + tex_size[0] = GST_GL_FILTER(effects)->width / 2.0; + tex_size[1] = GST_GL_FILTER(effects)->height / 2.0; + + gst_gl_shader_set_uniform_1f (shader, "width", tex_size[0]); + gst_gl_shader_set_uniform_1f (shader, "height", tex_size[1]); + + gst_gl_effects_draw_texture (effects, texture); +} + +void +gst_gl_effects_stretch (GstGLEffects *effects) { + GstGLFilter *filter = GST_GL_FILTER (effects); + + gst_gl_filter_render_to_target (filter, effects->intexture, effects->outtexture, + gst_gl_effects_stretch_callback, effects); +} diff --git a/gst/gl/gstgleffects.c b/gst/gl/gstgleffects.c index 942bea4498..79885b2b0c 100644 --- a/gst/gl/gstgleffects.c +++ b/gst/gl/gstgleffects.c @@ -53,11 +53,12 @@ static const GstElementDetails element_details = GST_ELEMENT_DETAILS ( "GL Shading Language effects", "Filippo Argiolas "); - +/* dont' forget to edit the following when a new effect is added */ typedef enum { GST_GL_EFFECT_IDENTITY, GST_GL_EFFECT_MIRROR, GST_GL_EFFECT_SQUEEZE, + GST_GL_EFFECT_STRETCH, GST_GL_N_EFFECTS } GstGLEffectsEffect; @@ -70,6 +71,7 @@ gst_gl_effects_effect_get_type (void) { GST_GL_EFFECT_IDENTITY, "Do nothing Effect", "identity" }, { GST_GL_EFFECT_MIRROR, "Mirror Effect", "mirror" }, { GST_GL_EFFECT_SQUEEZE, "Squeeze Effect", "squeeze" }, + { GST_GL_EFFECT_STRETCH, "Stretch Effect", "stretch" }, { 0, NULL, NULL } }; @@ -80,6 +82,28 @@ gst_gl_effects_effect_get_type (void) return gl_effects_effect_type; } +static void +gst_gl_effects_set_effect (GstGLEffects *effects, gint effect_type) { + + switch (effect_type) { + case GST_GL_EFFECT_IDENTITY: + effects->effect = (GstGLEffectProcessFunc) gst_gl_effects_identity; + break; + case GST_GL_EFFECT_MIRROR: + effects->effect = (GstGLEffectProcessFunc) gst_gl_effects_mirror; + break; + case GST_GL_EFFECT_SQUEEZE: + effects->effect = (GstGLEffectProcessFunc) gst_gl_effects_squeeze; + break; + case GST_GL_EFFECT_STRETCH: + effects->effect = (GstGLEffectProcessFunc) gst_gl_effects_stretch; + break; + default: + g_assert_not_reached (); + } + effects->current_effect = effect_type; +} + /* init resources that need a gl context */ static void gst_gl_effects_init_gl_resources (GstGLFilter *filter) @@ -169,23 +193,21 @@ gst_gl_effects_draw_texture (GstGLEffects * effects, GLuint tex) glEnd (); } -#if 0 -static void -change_view (GstGLDisplay *display, gpointer data) -{ -// GstGLEffects *effects = GST_GL_EFFECTS (data); +/* static void */ +/* set_orizonthal_switch (GstGLDisplay *display, gpointer data) */ +/* { */ +/* // GstGLEffects *effects = GST_GL_EFFECTS (data); */ - const double mirrormatrix[16] = { - -1.0, 0.0, 0.0, 0.0, - 0.0, 1.0, 0.0, 0.0, - 0.0, 0.0, 1.0, 0.0, - 0.0, 0.0, 0.0, 1.0 - }; +/* const double mirrormatrix[16] = { */ +/* -1.0, 0.0, 0.0, 0.0, */ +/* 0.0, 1.0, 0.0, 0.0, */ +/* 0.0, 0.0, 1.0, 0.0, */ +/* 0.0, 0.0, 0.0, 1.0 */ +/* }; */ - glMatrixMode (GL_MODELVIEW); - glLoadMatrixd (mirrormatrix); -} -#endif +/* glMatrixMode (GL_MODELVIEW); */ +/* glLoadMatrixd (mirrormatrix); */ +/* } */ static void gst_gl_effects_init (GstGLEffects * effects, GstGLEffectsClass * klass) @@ -206,25 +228,6 @@ gst_gl_effects_reset_resources (GstGLFilter* filter) effects->shaderstable = NULL; } -static void -gst_gl_effects_set_effect (GstGLEffects *effects, gint effect_type) { - - switch (effect_type) { - case GST_GL_EFFECT_IDENTITY: - effects->effect = (GstGLEffectProcessFunc) gst_gl_effects_identity; - break; - case GST_GL_EFFECT_MIRROR: - effects->effect = (GstGLEffectProcessFunc) gst_gl_effects_mirror; - break; - case GST_GL_EFFECT_SQUEEZE: - effects->effect = (GstGLEffectProcessFunc) gst_gl_effects_squeeze; - break; - default: - g_assert_not_reached (); - } - effects->current_effect = effect_type; -} - static void gst_gl_effects_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec)