return kernel;
}
-static void
-gst_gl_effects_blur_callback_hconv (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader = NULL;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
-
- if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "hconv0",
- hconv7_fragment_source_gles2))) {
- GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (GST_GL_BASE_FILTER (filter)->context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
- gst_gl_shader_set_uniform_1f (shader, "gauss_width", width);
- gst_gl_shader_set_uniform_1fv (shader, "kernel", 7,
- gst_gl_effects_blur_kernel ());
-
- gst_gl_filter_draw_fullscreen_quad (filter);
- }
-}
-
-static void
-gst_gl_effects_blur_callback_vconv (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader = NULL;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
-
- if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "vconv0",
- vconv7_fragment_source_gles2))) {
- GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (GST_GL_BASE_FILTER (filter)->context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
- gst_gl_shader_set_uniform_1f (shader, "gauss_height", height);
- gst_gl_shader_set_uniform_1fv (shader, "kernel", 7,
- gst_gl_effects_blur_kernel ());
-
- gst_gl_filter_draw_fullscreen_quad (filter);
- }
-}
-
void
gst_gl_effects_blur (GstGLEffects * effects)
{
GstGLFilter *filter = GST_GL_FILTER (effects);
-
- gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
- effects->midtexture[0], gst_gl_effects_blur_callback_hconv, effects);
- gst_gl_filter_render_to_target (filter, FALSE, effects->midtexture[0],
- effects->outtexture, gst_gl_effects_blur_callback_vconv, effects);
+ GstGLShader *shader;
+
+ shader = gst_gl_effects_get_fragment_shader (effects, "hconv0",
+ hconv7_fragment_source_gles2);
+ gst_gl_shader_use (shader);
+ gst_gl_shader_set_uniform_1f (shader, "gauss_width",
+ GST_VIDEO_INFO_WIDTH (&filter->in_info));
+ gst_gl_shader_set_uniform_1fv (shader, "kernel", 7,
+ gst_gl_effects_blur_kernel ());
+ gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
+ effects->midtexture[0], shader);
+
+ shader = gst_gl_effects_get_fragment_shader (effects, "vconv0",
+ vconv7_fragment_source_gles2);
+ gst_gl_shader_use (shader);
+ gst_gl_shader_set_uniform_1f (shader, "gauss_height",
+ GST_VIDEO_INFO_HEIGHT (&filter->in_info));
+ gst_gl_shader_set_uniform_1fv (shader, "kernel", 7,
+ gst_gl_effects_blur_kernel ());
+ gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[0],
+ effects->outtexture, shader);
}
#include "../gstgleffects.h"
-static void
-gst_gl_effects_bulge_callback (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
-
- shader = gst_gl_effects_get_fragment_shader (effects, "bulge",
- bulge_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
-
- gst_gl_filter_draw_fullscreen_quad (filter);
-}
-
void
gst_gl_effects_bulge (GstGLEffects * effects)
{
GstGLFilter *filter = GST_GL_FILTER (effects);
+ GstGLShader *shader;
- gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
- effects->outtexture, gst_gl_effects_bulge_callback, effects);
+ shader = gst_gl_effects_get_fragment_shader (effects, "bulge",
+ bulge_fragment_source_gles2);
+ gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
+ effects->outtexture, shader);
}
#include "../gstgleffects.h"
-static void
-gst_gl_effects_fisheye_callback (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
-
- shader = gst_gl_effects_get_fragment_shader (effects, "fisheye",
- fisheye_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
-
- gst_gl_filter_draw_fullscreen_quad (filter);
-}
-
void
gst_gl_effects_fisheye (GstGLEffects * effects)
{
GstGLFilter *filter = GST_GL_FILTER (effects);
+ GstGLShader *shader;
- gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
- effects->outtexture, gst_gl_effects_fisheye_callback, effects);
+ shader = gst_gl_effects_get_fragment_shader (effects, "fisheye",
+ fisheye_fragment_source_gles2);
+ gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
+ effects->outtexture, shader);
}
static gboolean kernel_ready = FALSE;
static float gauss_kernel[7];
-static void
-gst_gl_effects_glow_step_one (gint width, gint height, guint texture,
- gpointer data)
+void
+gst_gl_effects_glow (GstGLEffects * effects)
{
- GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
+ const GstGLFuncs *gl = GST_GL_BASE_FILTER (effects)->context->gl_vtable;
GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
-
- shader = gst_gl_effects_get_fragment_shader (effects, "luma_threshold",
- luma_threshold_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
-
- gst_gl_filter_draw_fullscreen_quad (filter);
-}
-
-static void
-gst_gl_effects_glow_step_two (gint width, gint height, guint texture,
- gpointer data)
-{
GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
-
- shader = gst_gl_effects_get_fragment_shader (effects, "hconv7",
- hconv7_fragment_source_gles2);
-
- if (!shader)
- return;
if (!kernel_ready) {
fill_gaussian_kernel (gauss_kernel, 7, 10.0);
kernel_ready = TRUE;
}
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
- gl->ActiveTexture (GL_TEXTURE1);
- gl->BindTexture (GL_TEXTURE_2D, texture);
+ /* threshold */
+ shader = gst_gl_effects_get_fragment_shader (effects, "luma_threshold",
+ luma_threshold_fragment_source_gles2);
+ gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
+ effects->midtexture[0], shader);
- gst_gl_shader_set_uniform_1i (shader, "tex", 1);
+ /* blur */
+ shader = gst_gl_effects_get_fragment_shader (effects, "hconv7",
+ hconv7_fragment_source_gles2);
+ gst_gl_shader_use (shader);
gst_gl_shader_set_uniform_1fv (shader, "kernel", 7, gauss_kernel);
- gst_gl_shader_set_uniform_1f (shader, "gauss_width", width);
-
- gst_gl_filter_draw_fullscreen_quad (filter);
-}
-
-static void
-gst_gl_effects_glow_step_three (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
+ gst_gl_shader_set_uniform_1f (shader, "gauss_width",
+ GST_VIDEO_INFO_WIDTH (&filter->out_info));
+ gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[0],
+ effects->midtexture[1], shader);
shader = gst_gl_effects_get_fragment_shader (effects, "vconv7",
vconv7_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE1);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 1);
gst_gl_shader_set_uniform_1fv (shader, "kernel", 7, gauss_kernel);
- gst_gl_shader_set_uniform_1f (shader, "gauss_height", height);
-
- gst_gl_filter_draw_fullscreen_quad (filter);
-}
-
-static void
-gst_gl_effects_glow_step_four (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
+ gst_gl_shader_set_uniform_1f (shader, "gauss_height",
+ GST_VIDEO_INFO_HEIGHT (&filter->out_info));
+ gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[1],
+ effects->midtexture[2], shader);
+ /* add blurred luma to intexture */
shader = gst_gl_effects_get_fragment_shader (effects, "sum",
sum_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
gst_gl_shader_use (shader);
gl->ActiveTexture (GL_TEXTURE2);
- gl->BindTexture (GL_TEXTURE_2D, effects->intexture->tex_id);
+ gl->BindTexture (GL_TEXTURE_2D,
+ gst_gl_memory_get_texture_id (effects->intexture));
gst_gl_shader_set_uniform_1f (shader, "alpha", 1.0f);
gst_gl_shader_set_uniform_1i (shader, "base", 2);
gl->ActiveTexture (GL_TEXTURE1);
- gl->BindTexture (GL_TEXTURE_2D, texture);
+ gl->BindTexture (GL_TEXTURE_2D,
+ gst_gl_memory_get_texture_id (effects->midtexture[2]));
gst_gl_shader_set_uniform_1f (shader, "beta", (gfloat) 1 / 3.5f);
gst_gl_shader_set_uniform_1i (shader, "blend", 1);
-
- gst_gl_filter_draw_fullscreen_quad (filter);
-}
-
-void
-gst_gl_effects_glow (GstGLEffects * effects)
-{
- GstGLFilter *filter = GST_GL_FILTER (effects);
-
- /* threshold */
- gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
- effects->midtexture[0], gst_gl_effects_glow_step_one, effects);
-
- /* blur */
- gst_gl_filter_render_to_target (filter, FALSE, effects->midtexture[0],
- effects->midtexture[1], gst_gl_effects_glow_step_two, effects);
-
- gst_gl_filter_render_to_target (filter, FALSE, effects->midtexture[1],
- effects->midtexture[2], gst_gl_effects_glow_step_three, effects);
-
- /* add blurred luma to intexture */
- gst_gl_filter_render_to_target (filter, FALSE, effects->midtexture[2],
- effects->outtexture, gst_gl_effects_glow_step_four, effects);
+ gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[2],
+ effects->outtexture, shader);
}
#include "../gstgleffects.h"
-static void
-gst_gl_effects_identity_callback (gint width, gint height, guint texture,
- gpointer data)
+void
+gst_gl_effects_identity (GstGLEffects * effects)
{
- GstGLEffects *effects = GST_GL_EFFECTS (data);
+ GstGLContext *context = GST_GL_BASE_FILTER (effects)->context;
GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
GstGLShader *shader;
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
shader = g_hash_table_lookup (effects->shaderstable, "identity0");
if (!shader) {
GError *error = NULL;
return;
}
- filter->draw_attr_position_loc =
- gst_gl_shader_get_attribute_location (shader, "a_position");
- filter->draw_attr_texture_loc =
- gst_gl_shader_get_attribute_location (shader, "a_texcoord");
-
g_hash_table_insert (effects->shaderstable, (gchar *) "identity0", shader);
}
gst_gl_shader_use (shader);
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
-
- gst_gl_filter_draw_fullscreen_quad (filter);
-}
-
-void
-gst_gl_effects_identity (GstGLEffects * effects)
-{
- GstGLFilter *filter = GST_GL_FILTER (effects);
-
- gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
- effects->outtexture, gst_gl_effects_identity_callback, effects);
+ gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
+ effects->outtexture, shader);
}
#include "../gstgleffects.h"
-static void
-gst_gl_effects_laplacian_callback (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader = NULL;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
-
- if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "conv0",
- conv9_fragment_source_gles2))) {
- GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
- static gfloat kernel[9] = { 0.0, -1.0, 0.0,
- -1.0, 4.0, -1.0,
- 0.0, -1.0, 0.0
- };
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (GST_GL_BASE_FILTER (filter)->context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
- gst_gl_shader_set_uniform_1f (shader, "height", height);
- gst_gl_shader_set_uniform_1f (shader, "width", width);
- gst_gl_shader_set_uniform_1fv (shader, "kernel", 9, kernel);
- gst_gl_shader_set_uniform_1i (shader, "invert", effects->invert);
-
- gst_gl_filter_draw_fullscreen_quad (filter);
- }
-}
+static gfloat kernel[9] = {
+ 0.0, -1.0, 0.0,
+ -1.0, 4.0, -1.0,
+ 0.0, -1.0, 0.0
+};
void
gst_gl_effects_laplacian (GstGLEffects * effects)
{
- gst_gl_filter_render_to_target (GST_GL_FILTER (effects), TRUE,
- effects->intexture, effects->outtexture,
- gst_gl_effects_laplacian_callback, effects);
+ GstGLFilter *filter = GST_GL_FILTER (effects);
+ GstGLShader *shader;
+
+ shader = gst_gl_effects_get_fragment_shader (effects, "conv0",
+ conv9_fragment_source_gles2);
+ gst_gl_shader_use (shader);
+ gst_gl_shader_set_uniform_1f (shader, "height",
+ GST_VIDEO_INFO_HEIGHT (&filter->in_info));
+ gst_gl_shader_set_uniform_1f (shader, "width",
+ GST_VIDEO_INFO_WIDTH (&filter->in_info));
+ gst_gl_shader_set_uniform_1fv (shader, "kernel", 9, kernel);
+ gst_gl_shader_set_uniform_1i (shader, "invert", effects->invert);
+
+ gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
+ effects->outtexture, shader);
}
void
gst_gl_effects_luma_to_curve (GstGLEffects * effects,
- const GstGLEffectsCurve * curve,
- gint curve_index, gint width, gint height, GLuint texture)
+ const GstGLEffectsCurve * curve, gint curve_index, GstGLMemory * in_tex,
+ GstGLMemory * out_tex)
{
- GstGLShader *shader;
+ GstGLContext *context = GST_GL_BASE_FILTER (effects)->context;
GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
+ const GstGLFuncs *gl = context->gl_vtable;
+ GstGLShader *shader;
shader = gst_gl_effects_get_fragment_shader (effects, "luma_to_curve",
luma_to_curve_fragment_source_gles2);
}
#endif
- gst_gl_shader_use (shader);
-
if (effects->curve[curve_index] == 0) {
/* this parameters are needed to have a right, predictable, mapping */
gl->GenTextures (1, &effects->curve[curve_index]);
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->BindTexture (GL_TEXTURE_1D, effects->curve[curve_index]);
- gl->TexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- gl->TexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- gl->TexParameteri (GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP);
- gl->TexParameteri (GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_CLAMP);
-
- gl->TexImage1D (GL_TEXTURE_1D, 0, curve->bytes_per_pixel,
- curve->width, 0, GL_RGB, GL_UNSIGNED_BYTE, curve->pixel_data);
- }
-#endif
- if (USING_GLES2 (context) || USING_OPENGL3 (context)) {
- gl->BindTexture (GL_TEXTURE_2D, effects->curve[curve_index]);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-
- gl->TexImage2D (GL_TEXTURE_2D, 0, GL_RGB,
- curve->width, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, curve->pixel_data);
- }
- }
-
- gl->ActiveTexture (GL_TEXTURE2);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 2);
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->ActiveTexture (GL_TEXTURE1);
- gl->BindTexture (GL_TEXTURE_1D, effects->curve[curve_index]);
-
- gst_gl_shader_set_uniform_1i (shader, "curve", 1);
- }
-#endif
- if (USING_GLES2 (context) || USING_OPENGL3 (context)) {
- gl->ActiveTexture (GL_TEXTURE1);
gl->BindTexture (GL_TEXTURE_2D, effects->curve[curve_index]);
+ gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- gst_gl_shader_set_uniform_1i (shader, "curve", 1);
+ gl->TexImage2D (GL_TEXTURE_2D, 0, GL_RGB,
+ curve->width, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, curve->pixel_data);
}
- gst_gl_filter_draw_fullscreen_quad (filter);
-}
+ gst_gl_shader_use (shader);
+ gl->ActiveTexture (GL_TEXTURE2);
+ gl->BindTexture (GL_TEXTURE_2D, effects->curve[curve_index]);
-static void
-gst_gl_effects_heat_callback (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLEffects *effects = GST_GL_EFFECTS (data);
+ gst_gl_shader_set_uniform_1i (shader, "curve", 2);
- gst_gl_effects_luma_to_curve (effects, &heat_curve, GST_GL_EFFECTS_CURVE_HEAT,
- width, height, texture);
+ gst_gl_filter_render_to_target_with_shader (filter, in_tex, out_tex, shader);
}
void
gst_gl_effects_heat (GstGLEffects * effects)
{
- GstGLFilter *filter = GST_GL_FILTER (effects);
-
- gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
- effects->outtexture, gst_gl_effects_heat_callback, effects);
-}
-
-static void
-gst_gl_effects_sepia_callback (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLEffects *effects = GST_GL_EFFECTS (data);
-
- gst_gl_effects_luma_to_curve (effects, &sepia_curve,
- GST_GL_EFFECTS_CURVE_SEPIA, width, height, texture);
+ gst_gl_effects_luma_to_curve (effects, &heat_curve,
+ GST_GL_EFFECTS_CURVE_HEAT, effects->intexture, effects->outtexture);
}
void
gst_gl_effects_sepia (GstGLEffects * effects)
{
- GstGLFilter *filter = GST_GL_FILTER (effects);
-
- gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
- effects->outtexture, gst_gl_effects_sepia_callback, effects);
-}
-
-static void
-gst_gl_effects_luma_xpro_callback (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLEffects *effects = GST_GL_EFFECTS (data);
-
- gst_gl_effects_luma_to_curve (effects, &luma_xpro_curve,
- GST_GL_EFFECTS_CURVE_LUMA_XPRO, width, height, texture);
+ gst_gl_effects_luma_to_curve (effects, &sepia_curve,
+ GST_GL_EFFECTS_CURVE_SEPIA, effects->intexture, effects->outtexture);
}
void
gst_gl_effects_luma_xpro (GstGLEffects * effects)
{
- GstGLFilter *filter = GST_GL_FILTER (effects);
-
- gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
- effects->outtexture, gst_gl_effects_luma_xpro_callback, effects);
+ gst_gl_effects_luma_to_curve (effects, &luma_xpro_curve,
+ GST_GL_EFFECTS_CURVE_LUMA_XPRO, effects->intexture, effects->outtexture);
}
void gst_gl_effects_luma_to_curve (GstGLEffects *effects,
const GstGLEffectsCurve *curve,
gint curve_index,
- gint width, gint height,
- GLuint texture);
+ GstGLMemory *in_tex,
+ GstGLMemory *out_tex);
G_END_DECLS
#endif /* __GST_GL_LUMA_TO_CURVE_H__ */
#include "../gstgleffects.h"
-static void
-gst_gl_effects_mirror_callback (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLFilter *filter = GST_GL_FILTER (data);
- GstGLEffects *effects = GST_GL_EFFECTS (filter);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
-
- shader = gst_gl_effects_get_fragment_shader (effects, "mirror",
- mirror_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
-
- gst_gl_filter_draw_fullscreen_quad (filter);
-}
-
void
gst_gl_effects_mirror (GstGLEffects * effects)
{
GstGLFilter *filter = GST_GL_FILTER (effects);
+ GstGLShader *shader;
- gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
- effects->outtexture, gst_gl_effects_mirror_callback, effects);
+ shader = gst_gl_effects_get_fragment_shader (effects, "mirror",
+ mirror_fragment_source_gles2);
+ gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
+ effects->outtexture, shader);
}
static void
gst_gl_effects_rgb_to_curve (GstGLEffects * effects,
- const GstGLEffectsCurve * curve,
- gint curve_index, gint width, gint height, GLuint texture)
+ const GstGLEffectsCurve * curve, gint curve_index, GstGLMemory * in_tex,
+ GstGLMemory * out_tex)
{
- GstGLShader *shader;
+ GstGLContext *context = GST_GL_BASE_FILTER (effects)->context;
GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
+ const GstGLFuncs *gl = context->gl_vtable;
+ GstGLShader *shader;
shader = gst_gl_effects_get_fragment_shader (effects, "rgb_to_curve",
rgb_to_curve_fragment_source_gles2);
}
#endif
- gst_gl_shader_use (shader);
-
if (effects->curve[curve_index] == 0) {
/* this parameters are needed to have a right, predictable, mapping */
gl->GenTextures (1, &effects->curve[curve_index]);
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->BindTexture (GL_TEXTURE_1D, effects->curve[curve_index]);
- gl->TexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- gl->TexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- gl->TexParameteri (GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP);
- gl->TexParameteri (GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_CLAMP);
-
- gl->TexImage1D (GL_TEXTURE_1D, 0, GL_RGB,
- curve->width, 0, GL_RGB, GL_UNSIGNED_BYTE, curve->pixel_data);
- }
-#endif
- if (USING_GLES2 (context) || USING_OPENGL3 (context)) {
- gl->BindTexture (GL_TEXTURE_2D, effects->curve[curve_index]);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-
- gl->TexImage2D (GL_TEXTURE_2D, 0, GL_RGB,
- curve->width, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, curve->pixel_data);
- }
- }
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->ActiveTexture (GL_TEXTURE1);
- gl->BindTexture (GL_TEXTURE_1D, effects->curve[curve_index]);
- gst_gl_shader_set_uniform_1i (shader, "curve", 1);
- }
-#endif
- if (USING_GLES2 (context) || USING_OPENGL3 (context)) {
- gl->ActiveTexture (GL_TEXTURE1);
gl->BindTexture (GL_TEXTURE_2D, effects->curve[curve_index]);
+ gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- gst_gl_shader_set_uniform_1i (shader, "curve", 1);
+ gl->TexImage2D (GL_TEXTURE_2D, 0, GL_RGB,
+ curve->width, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, curve->pixel_data);
}
- gst_gl_filter_draw_fullscreen_quad (filter);
-}
+ gst_gl_shader_use (shader);
+ gl->ActiveTexture (GL_TEXTURE2);
+ gl->BindTexture (GL_TEXTURE_2D, effects->curve[curve_index]);
-static void
-gst_gl_effects_xpro_callback (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLEffects *effects = GST_GL_EFFECTS (data);
+ gst_gl_shader_set_uniform_1i (shader, "curve", 2);
- gst_gl_effects_rgb_to_curve (effects, &xpro_curve, GST_GL_EFFECTS_CURVE_XPRO,
- width, height, texture);
+ gst_gl_filter_render_to_target_with_shader (filter, in_tex, out_tex, shader);
}
void
gst_gl_effects_xpro (GstGLEffects * effects)
{
- GstGLFilter *filter = GST_GL_FILTER (effects);
-
- gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
- effects->outtexture, gst_gl_effects_xpro_callback, effects);
+ gst_gl_effects_rgb_to_curve (effects, &xpro_curve, GST_GL_EFFECTS_CURVE_XPRO,
+ effects->intexture, effects->outtexture);
}
#include "../gstgleffects.h"
-static void
-gst_gl_effects_sin_callback (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
-
- shader = gst_gl_effects_get_fragment_shader (effects, "sin",
- sin_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
-
- gst_gl_filter_draw_fullscreen_quad (filter);
-}
-
void
gst_gl_effects_sin (GstGLEffects * effects)
{
GstGLFilter *filter = GST_GL_FILTER (effects);
+ GstGLShader *shader;
- gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
- effects->outtexture, gst_gl_effects_sin_callback, effects);
+ shader = gst_gl_effects_get_fragment_shader (effects, "sin",
+ sin_fragment_source_gles2);
+ gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
+ effects->outtexture, shader);
}
#include "../gstgleffects.h"
-static void
-gst_gl_effects_sobel_callback_desaturate (gint width, gint height,
- guint texture, gpointer data)
-{
- GstGLShader *shader = NULL;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
-
- if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "desat0",
- desaturate_fragment_source_gles2))) {
- GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (GST_GL_BASE_FILTER (filter)->context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
-
- gst_gl_filter_draw_fullscreen_quad (filter);
- }
-}
-
-static void
-gst_gl_effects_sobel_callback_hconv (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader = NULL;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
-
- if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "hconv0",
- sep_sobel_hconv3_fragment_source_gles2))) {
- GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (GST_GL_BASE_FILTER (filter)->context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
- gst_gl_shader_set_uniform_1f (shader, "width", width);
-
- gst_gl_filter_draw_fullscreen_quad (filter);
- }
-}
-
-static void
-gst_gl_effects_sobel_callback_vconv (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader = NULL;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
-
- if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "vconv0",
- sep_sobel_vconv3_fragment_source_gles2))) {
- GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (GST_GL_BASE_FILTER (filter)->context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
- gst_gl_shader_set_uniform_1f (shader, "height", height);
-
- gst_gl_filter_draw_fullscreen_quad (filter);
- }
-}
-
-static void
-gst_gl_effects_sobel_callback_length (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader = NULL;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
-
- if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "len0",
- sep_sobel_length_fragment_source_gles2))) {
- GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (GST_GL_BASE_FILTER (filter)->context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
- gst_gl_shader_set_uniform_1i (shader, "invert", effects->invert);
-
- gst_gl_filter_draw_fullscreen_quad (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);
+ GstGLShader *shader;
+
+ shader = gst_gl_effects_get_fragment_shader (effects, "desat0",
+ desaturate_fragment_source_gles2);
+ gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
+ effects->midtexture[0], shader);
+
+ shader = gst_gl_effects_get_fragment_shader (effects, "hconv0",
+ sep_sobel_hconv3_fragment_source_gles2);
+ gst_gl_shader_use (shader);
+ gst_gl_shader_set_uniform_1f (shader, "height",
+ GST_VIDEO_INFO_HEIGHT (&filter->out_info));
+ gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[0],
+ effects->midtexture[1], shader);
+
+ shader = gst_gl_effects_get_fragment_shader (effects, "vconv0",
+ sep_sobel_vconv3_fragment_source_gles2);
+ gst_gl_shader_use (shader);
+ gst_gl_shader_set_uniform_1f (shader, "width",
+ GST_VIDEO_INFO_WIDTH (&filter->out_info));
+ gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[1],
+ effects->midtexture[0], shader);
+
+ shader = gst_gl_effects_get_fragment_shader (effects, "len0",
+ sep_sobel_length_fragment_source_gles2);
+ gst_gl_shader_use (shader);
+ gst_gl_shader_set_uniform_1i (shader, "invert", effects->invert);
+ gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[0],
+ effects->outtexture, shader);
}
#include "../gstgleffects.h"
-static void
-gst_gl_effects_square_callback (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
-
- shader = gst_gl_effects_get_fragment_shader (effects, "square",
- square_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
-
- gst_gl_filter_draw_fullscreen_quad (filter);
-}
-
void
gst_gl_effects_square (GstGLEffects * effects)
{
GstGLFilter *filter = GST_GL_FILTER (effects);
+ GstGLShader *shader;
- gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
- effects->outtexture, gst_gl_effects_square_callback, effects);
+ shader = gst_gl_effects_get_fragment_shader (effects, "square",
+ square_fragment_source_gles2);
+ gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
+ effects->outtexture, shader);
}
#include "../gstgleffects.h"
-static void
-gst_gl_effects_squeeze_callback (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLFilter *filter = GST_GL_FILTER (data);
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
-
- shader = gst_gl_effects_get_fragment_shader (effects, "squeeze",
- squeeze_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
-
- gst_gl_filter_draw_fullscreen_quad (filter);
-}
-
void
gst_gl_effects_squeeze (GstGLEffects * effects)
{
GstGLFilter *filter = GST_GL_FILTER (effects);
+ GstGLShader *shader;
- gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
- effects->outtexture, gst_gl_effects_squeeze_callback, effects);
+ shader = gst_gl_effects_get_fragment_shader (effects, "squeeze",
+ squeeze_fragment_source_gles2);
+ gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
+ effects->outtexture, shader);
}
#include "../gstgleffects.h"
-static void
-gst_gl_effects_stretch_callback (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
-
- shader = gst_gl_effects_get_fragment_shader (effects, "stretch",
- stretch_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
-
- gst_gl_filter_draw_fullscreen_quad (filter);
-}
-
void
gst_gl_effects_stretch (GstGLEffects * effects)
{
GstGLFilter *filter = GST_GL_FILTER (effects);
+ GstGLShader *shader;
- gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
- effects->outtexture, gst_gl_effects_stretch_callback, effects);
+ shader = gst_gl_effects_get_fragment_shader (effects, "stretch",
+ stretch_fragment_source_gles2);
+ gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
+ effects->outtexture, shader);
}
#include "../gstgleffects.h"
-static void
-gst_gl_effects_tunnel_callback (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
-
- shader = gst_gl_effects_get_fragment_shader (effects, "tunnel",
- tunnel_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
-
- gst_gl_filter_draw_fullscreen_quad (filter);
-}
-
void
gst_gl_effects_tunnel (GstGLEffects * effects)
{
GstGLFilter *filter = GST_GL_FILTER (effects);
+ GstGLShader *shader;
- gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
- effects->outtexture, gst_gl_effects_tunnel_callback, effects);
+ shader = gst_gl_effects_get_fragment_shader (effects, "tunnel",
+ tunnel_fragment_source_gles2);
+ gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
+ effects->outtexture, shader);
}
#include "../gstgleffects.h"
-static void
-gst_gl_effects_twirl_callback (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
-
- shader = gst_gl_effects_get_fragment_shader (effects, "twirl",
- twirl_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
-
- gst_gl_filter_draw_fullscreen_quad (filter);
-}
-
void
gst_gl_effects_twirl (GstGLEffects * effects)
{
GstGLFilter *filter = GST_GL_FILTER (effects);
+ GstGLShader *shader;
- gst_gl_filter_render_to_target (filter, TRUE, effects->intexture,
- effects->outtexture, gst_gl_effects_twirl_callback, effects);
+ shader = gst_gl_effects_get_fragment_shader (effects, "twirl",
+ twirl_fragment_source_gles2);
+ gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
+ effects->outtexture, shader);
}
static gboolean kernel_ready = FALSE;
static float gauss_kernel[7];
-static void
-gst_gl_effects_xray_step_one (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLEffects *effects = GST_GL_EFFECTS (data);
-
- gst_gl_effects_luma_to_curve (effects, &xray_curve, GST_GL_EFFECTS_CURVE_XRAY,
- width, height, texture);
-}
-
-static void
-gst_gl_effects_xray_step_two (gint width, gint height, guint texture,
- gpointer data)
+void
+gst_gl_effects_xray (GstGLEffects * effects)
{
- GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
+ const GstGLFuncs *gl = GST_GL_BASE_FILTER (effects)->context->gl_vtable;
GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
-
- shader = gst_gl_effects_get_fragment_shader (effects, "hconv7",
- hconv7_fragment_source_gles2);
-
- if (!shader)
- return;
+ GstGLShader *shader;
if (!kernel_ready) {
fill_gaussian_kernel (gauss_kernel, 7, 1.5);
kernel_ready = TRUE;
}
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
- gl->ActiveTexture (GL_TEXTURE1);
- gl->BindTexture (GL_TEXTURE_2D, texture);
+ /* map luma to xray curve */
+ gst_gl_effects_luma_to_curve (effects, &xray_curve, GST_GL_EFFECTS_CURVE_XRAY,
+ effects->intexture, effects->midtexture[0]);
- gst_gl_shader_set_uniform_1i (shader, "tex", 1);
+ /* horizontal blur */
+ shader = gst_gl_effects_get_fragment_shader (effects, "hconv7",
+ hconv7_fragment_source_gles2);
+ gst_gl_shader_use (shader);
gst_gl_shader_set_uniform_1fv (shader, "kernel", 9, gauss_kernel);
- gst_gl_shader_set_uniform_1f (shader, "gauss_width", width);
-
- gst_gl_filter_draw_fullscreen_quad (filter);
-}
-
-static void
-gst_gl_effects_xray_step_three (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
+ gst_gl_shader_set_uniform_1f (shader, "gauss_width",
+ GST_VIDEO_INFO_WIDTH (&filter->in_info));
+ gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[0],
+ effects->midtexture[1], shader);
+ /* vertical blur */
shader = gst_gl_effects_get_fragment_shader (effects, "vconv7",
vconv7_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE1);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- 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_1f (shader, "gauss_height", height);
-
- gst_gl_filter_draw_fullscreen_quad (filter);
-}
-
-/* multipass separable sobel */
-static void
-gst_gl_effects_xray_desaturate (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
+ gst_gl_shader_set_uniform_1f (shader, "gauss_height",
+ GST_VIDEO_INFO_HEIGHT (&filter->out_info));
+ gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[1],
+ effects->midtexture[2], shader);
+ /* 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 */
shader = gst_gl_effects_get_fragment_shader (effects, "desaturate",
desaturate_fragment_source_gles2);
+ gst_gl_filter_render_to_target_with_shader (filter, effects->intexture,
+ effects->midtexture[3], shader);
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
- gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE1);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 1);
- gst_gl_filter_draw_fullscreen_quad (filter);
-}
-
-static void
-gst_gl_effects_xray_sobel_hconv (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
-
+ /* horizonal convolution */
shader = gst_gl_effects_get_fragment_shader (effects, "sobel_hconv3",
sep_sobel_hconv3_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
gst_gl_shader_use (shader);
+ gst_gl_shader_set_uniform_1f (shader, "width",
+ GST_VIDEO_INFO_WIDTH (&filter->out_info));
+ gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[3],
+ effects->midtexture[4], shader);
- gl->ActiveTexture (GL_TEXTURE1);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 1);
- gst_gl_shader_set_uniform_1f (shader, "width", width);
-
- gst_gl_filter_draw_fullscreen_quad (filter);
-}
-
-static void
-gst_gl_effects_xray_sobel_vconv (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
-
+ /* vertical convolution */
shader = gst_gl_effects_get_fragment_shader (effects, "sobel_vconv3",
sep_sobel_vconv3_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
gst_gl_shader_use (shader);
+ gst_gl_shader_set_uniform_1f (shader, "height",
+ GST_VIDEO_INFO_HEIGHT (&filter->out_info));
+ gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[4],
+ effects->midtexture[3], shader);
- gl->ActiveTexture (GL_TEXTURE1);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 1);
- gst_gl_shader_set_uniform_1f (shader, "height", height);
-
- gst_gl_filter_draw_fullscreen_quad (filter);
-}
-
-static void
-gst_gl_effects_xray_sobel_length (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
-
+ /* gradient length */
shader = gst_gl_effects_get_fragment_shader (effects, "sobel_length",
sep_sobel_length_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
gst_gl_shader_use (shader);
-
- gl->ActiveTexture (GL_TEXTURE1);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (shader, "tex", 1);
gst_gl_shader_set_uniform_1i (shader, "invert", TRUE);
- gst_gl_filter_draw_fullscreen_quad (filter);
-}
-
-/* end of sobel passes */
-
-static void
-gst_gl_effects_xray_step_five (gint width, gint height, guint texture,
- gpointer data)
-{
- GstGLShader *shader;
- GstGLEffects *effects = GST_GL_EFFECTS (data);
- GstGLFilter *filter = GST_GL_FILTER (effects);
- GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
+ gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[3],
+ effects->midtexture[4], shader);
+ /* multiply edges with the blurred image */
shader = gst_gl_effects_get_fragment_shader (effects, "multiply",
multiply_fragment_source_gles2);
-
- if (!shader)
- return;
-
-#if GST_GL_HAVE_OPENGL
- if (USING_OPENGL (context)) {
- gl->MatrixMode (GL_PROJECTION);
- gl->LoadIdentity ();
- }
-#endif
-
gst_gl_shader_use (shader);
gl->ActiveTexture (GL_TEXTURE2);
- gl->BindTexture (GL_TEXTURE_2D, effects->midtexture[2]->tex_id);
+ gl->BindTexture (GL_TEXTURE_2D,
+ gst_gl_memory_get_texture_id (effects->midtexture[2]));
gst_gl_shader_set_uniform_1i (shader, "base", 2);
gl->ActiveTexture (GL_TEXTURE1);
- gl->BindTexture (GL_TEXTURE_2D, texture);
+ gl->BindTexture (GL_TEXTURE_2D,
+ gst_gl_memory_get_texture_id (effects->midtexture[4]));
gst_gl_shader_set_uniform_1f (shader, "alpha", (gfloat) 0.5f);
gst_gl_shader_set_uniform_1i (shader, "blend", 1);
- gst_gl_filter_draw_fullscreen_quad (filter);
-}
-
-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, TRUE, effects->intexture,
- effects->midtexture[0], gst_gl_effects_xray_step_one, effects);
- /* horizontal blur */
- gst_gl_filter_render_to_target (filter, FALSE, effects->midtexture[0],
- effects->midtexture[1], gst_gl_effects_xray_step_two, effects);
- /* vertical blur */
- gst_gl_filter_render_to_target (filter, FALSE, 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, TRUE, effects->intexture,
- effects->midtexture[3], gst_gl_effects_xray_desaturate, effects);
- /* horizonal convolution */
- gst_gl_filter_render_to_target (filter, FALSE, effects->midtexture[3],
- effects->midtexture[4], gst_gl_effects_xray_sobel_hconv, effects);
- /* vertical convolution */
- gst_gl_filter_render_to_target (filter, FALSE, effects->midtexture[4],
- effects->midtexture[3], gst_gl_effects_xray_sobel_vconv, effects);
- /* gradient length */
- gst_gl_filter_render_to_target (filter, FALSE, 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, FALSE, effects->midtexture[4],
- effects->outtexture, gst_gl_effects_xray_step_five, effects);
+ gst_gl_filter_render_to_target_with_shader (filter, effects->midtexture[4],
+ effects->outtexture, shader);
}
gst_object_sync_values (GST_OBJECT (balance), stream_time);
}
-static void
-gst_gl_color_balance_callback (gint width, gint height, guint tex_id,
- gpointer data)
+static gboolean
+gst_gl_color_balance_filter_texture (GstGLFilter * filter, GstGLMemory * in_tex,
+ GstGLMemory * out_tex)
{
- GstGLColorBalance *balance = GST_GL_COLOR_BALANCE (data);
- GstGLFilter *filter = GST_GL_FILTER (data);
- const GstGLFuncs *gl = GST_GL_BASE_FILTER (data)->context->gl_vtable;
+ GstGLColorBalance *balance = GST_GL_COLOR_BALANCE (filter);
if (!balance->shader)
_create_shader (balance);
gst_gl_shader_set_uniform_1f (balance->shader, "hue", balance->hue);
GST_OBJECT_UNLOCK (balance);
- gl->BindTexture (GL_TEXTURE_2D, tex_id);
-
- gst_gl_filter_draw_fullscreen_quad (filter);
-}
-
-static gboolean
-gst_gl_color_balance_filter_texture (GstGLFilter * filter, GstGLMemory * in_tex,
- GstGLMemory * out_tex)
-{
- gst_gl_filter_render_to_target (filter, TRUE, in_tex, out_tex,
- (GLCB) gst_gl_color_balance_callback, filter);
+ gst_gl_filter_render_to_target_with_shader (filter, in_tex, out_tex,
+ balance->shader);
return TRUE;
}
GstGLColorscale *colorscale = GST_GL_COLORSCALE (filter);
if (gst_gl_context_get_gl_api (GST_GL_BASE_FILTER (filter)->context))
- gst_gl_filter_render_to_target_with_shader (filter, TRUE, in_tex, out_tex,
+ gst_gl_filter_render_to_target_with_shader (filter, in_tex, out_tex,
colorscale->shader);
return TRUE;
GstBuffer * inbuf, GstBuffer * outbuf);
static gboolean gst_gl_deinterlace_filter_texture (GstGLFilter * filter,
GstGLMemory * in_tex, GstGLMemory * out_tex);
-static void gst_gl_deinterlace_vfir_callback (gint width, gint height,
- guint texture, gpointer stuff);
-static void gst_gl_deinterlace_greedyh_callback (gint width, gint height,
- guint texture, gpointer stuff);
+static gboolean gst_gl_deinterlace_vfir_callback (GstGLFilter * filter,
+ GstGLMemory * in_tex, gpointer stuff);
+static gboolean gst_gl_deinterlace_greedyh_callback (GstGLFilter * filter,
+ GstGLMemory * in_tex, gpointer stuff);
/* *INDENT-OFF* */
static const gchar *greedyh_fragment_source =
filter->deinterlacefunc = gst_gl_deinterlace_vfir_callback;
filter->current_method = GST_GL_DEINTERLACE_VFIR;
filter->prev_buffer = NULL;
- filter->prev_tex = 0;
+ filter->prev_tex = NULL;
}
static gboolean
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_filter_render_to_target (filter, in_tex, out_tex,
deinterlace_filter->deinterlacefunc, deinterlace_filter);
return TRUE;
return shader;
}
-static void
-gst_gl_deinterlace_vfir_callback (gint width, gint height, guint texture,
- gpointer stuff)
+static gboolean
+gst_gl_deinterlace_vfir_callback (GstGLFilter * filter, GstGLMemory * in_tex,
+ gpointer user_data)
{
- GstGLShader *shader;
- GstGLFilter *filter = GST_GL_FILTER (stuff);
GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
- GstGLFuncs *gl = context->gl_vtable;
+ const GstGLFuncs *gl = context->gl_vtable;
+ GstGLShader *shader;
shader = gst_gl_deinterlace_get_fragment_shader (filter, "vfir",
vfir_fragment_source);
if (!shader)
- return;
+ return FALSE;
#if GST_GL_HAVE_OPENGL
if (USING_OPENGL (context)) {
gst_gl_shader_use (shader);
gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
+ gl->BindTexture (GL_TEXTURE_2D, gst_gl_memory_get_texture_id (in_tex));
gst_gl_shader_set_uniform_1i (shader, "tex", 0);
gst_gl_shader_set_uniform_1f (shader, "width",
GST_VIDEO_INFO_HEIGHT (&filter->out_info));
gst_gl_filter_draw_fullscreen_quad (filter);
+
+ return TRUE;
}
-static void
-gst_gl_deinterlace_greedyh_callback (gint width, gint height, guint texture,
- gpointer stuff)
+static gboolean
+gst_gl_deinterlace_greedyh_callback (GstGLFilter * filter, GstGLMemory * in_tex,
+ gpointer user_data)
{
GstGLShader *shader;
- GstGLFilter *filter = GST_GL_FILTER (stuff);
GstGLDeinterlace *deinterlace_filter = GST_GL_DEINTERLACE (filter);
GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
GstGLFuncs *gl = context->gl_vtable;
greedyh_fragment_source);
if (!shader)
- return;
+ return FALSE;
#if GST_GL_HAVE_OPENGL
if (USING_OPENGL (context)) {
gst_gl_shader_use (shader);
- if (G_LIKELY (deinterlace_filter->prev_tex != 0)) {
+ if (G_LIKELY (deinterlace_filter->prev_tex != NULL)) {
gl->ActiveTexture (GL_TEXTURE1);
gst_gl_shader_set_uniform_1i (shader, "tex_prev", 1);
- gl->BindTexture (GL_TEXTURE_2D, deinterlace_filter->prev_tex);
+ gl->BindTexture (GL_TEXTURE_2D,
+ gst_gl_memory_get_texture_id (deinterlace_filter->prev_tex));
}
gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
+ gl->BindTexture (GL_TEXTURE_2D, gst_gl_memory_get_texture_id (in_tex));
gst_gl_shader_set_uniform_1i (shader, "tex", 0);
gst_gl_shader_set_uniform_1f (shader, "max_comb", 5.0f / 255.0f);
gst_gl_filter_draw_fullscreen_quad (filter);
/* we keep the previous buffer around so this is safe */
- deinterlace_filter->prev_tex = texture;
+ deinterlace_filter->prev_tex = in_tex;
+
+ return TRUE;
}
struct _GstGLDeinterlace
{
- GstGLFilter filter;
+ GstGLFilter filter;
- GLCB deinterlacefunc;
- GHashTable *shaderstable;
- GstBuffer *prev_buffer;
- guint prev_tex;
+ GstGLFilterRenderFunc deinterlacefunc;
+ GHashTable *shaderstable;
+ GstBuffer *prev_buffer;
+ GstGLMemory * prev_tex;
- gint current_method;
+ gint current_method;
};
struct _GstGLDeinterlaceClass
gst_object_unref (tex_alloc);
}
-static void
-gst_gl_differencematte_diff (gint width, gint height, guint texture,
+static gboolean
+gst_gl_differencematte_diff (GstGLFilter * filter, GstGLMemory * in_tex,
gpointer stuff)
{
- GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (stuff);
- GstGLFilter *filter = GST_GL_FILTER (stuff);
- GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
+ GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (filter);
+ const GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
gst_gl_shader_use (differencematte->shader[0]);
gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
+ gl->BindTexture (GL_TEXTURE_2D, gst_gl_memory_get_texture_id (in_tex));
gst_gl_shader_set_uniform_1i (differencematte->shader[0], "current", 0);
gl->ActiveTexture (GL_TEXTURE1);
- gl->BindTexture (GL_TEXTURE_2D, differencematte->savedbgtexture->tex_id);
+ gl->BindTexture (GL_TEXTURE_2D,
+ gst_gl_memory_get_texture_id (differencematte->savedbgtexture));
gst_gl_shader_set_uniform_1i (differencematte->shader[0], "saved", 1);
gst_gl_filter_draw_fullscreen_quad (filter);
+
+ return TRUE;
}
-static void
-gst_gl_differencematte_hblur (gint width, gint height, guint texture,
+static gboolean
+gst_gl_differencematte_hblur (GstGLFilter * filter, GstGLMemory * in_tex,
gpointer stuff)
{
- GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (stuff);
- GstGLFilter *filter = GST_GL_FILTER (stuff);
- GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
+ GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (filter);
+ const GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
gst_gl_shader_use (differencematte->shader[1]);
gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
+ gl->BindTexture (GL_TEXTURE_2D, gst_gl_memory_get_texture_id (in_tex));
gst_gl_shader_set_uniform_1i (differencematte->shader[1], "tex", 0);
gst_gl_shader_set_uniform_1fv (differencematte->shader[1], "kernel", 7,
differencematte->kernel);
gst_gl_shader_set_uniform_1f (differencematte->shader[1], "gauss_width",
- width);
+ GST_VIDEO_INFO_WIDTH (&filter->out_info));
gst_gl_filter_draw_fullscreen_quad (filter);
+
+ return TRUE;
}
-static void
-gst_gl_differencematte_vblur (gint width, gint height, guint texture,
+static gboolean
+gst_gl_differencematte_vblur (GstGLFilter * filter, GstGLMemory * in_tex,
gpointer stuff)
{
- GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (stuff);
- GstGLFilter *filter = GST_GL_FILTER (stuff);
- GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
+ GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (filter);
+ const GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
gst_gl_shader_use (differencematte->shader[2]);
gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
+ gl->BindTexture (GL_TEXTURE_2D, gst_gl_memory_get_texture_id (in_tex));
gst_gl_shader_set_uniform_1i (differencematte->shader[2], "tex", 0);
gst_gl_shader_set_uniform_1fv (differencematte->shader[2], "kernel", 7,
differencematte->kernel);
gst_gl_shader_set_uniform_1f (differencematte->shader[2], "gauss_height",
- height);
+ GST_VIDEO_INFO_HEIGHT (&filter->out_info));
gst_gl_filter_draw_fullscreen_quad (filter);
+
+ return TRUE;
}
-static void
-gst_gl_differencematte_interp (gint width, gint height, guint texture,
+static gboolean
+gst_gl_differencematte_interp (GstGLFilter * filter, GstGLMemory * in_tex,
gpointer stuff)
{
- GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (stuff);
- GstGLFilter *filter = GST_GL_FILTER (stuff);
- GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
+ GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (filter);
+ const GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
gst_gl_shader_use (differencematte->shader[3]);
gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
+ gl->BindTexture (GL_TEXTURE_2D, gst_gl_memory_get_texture_id (in_tex));
gst_gl_shader_set_uniform_1i (differencematte->shader[3], "blend", 0);
gst_gl_shader_set_uniform_1i (differencematte->shader[3], "alpha", 2);
gst_gl_filter_draw_fullscreen_quad (filter);
-}
-static void
-gst_gl_differencematte_identity (gint width, gint height, guint texture,
- gpointer stuff)
-{
- GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (stuff);
- GstGLFilter *filter = GST_GL_FILTER (differencematte);
- GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
-
- gst_gl_shader_use (differencematte->identity_shader);
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gst_gl_shader_set_uniform_1i (differencematte->identity_shader, "tex", 0);
-
- gst_gl_filter_draw_fullscreen_quad (filter);
+ return TRUE;
}
static gboolean
/* 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);
+ gst_gl_filter_render_to_target_with_shader (filter, in_tex,
+ differencematte->savedbgtexture, differencematte->identity_shader);
if (differencematte->pixbuf) {
free (differencematte->pixbuf);
}
if (differencematte->savedbgtexture != NULL) {
- 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);
+ gst_gl_filter_render_to_target (filter, in_tex,
+ differencematte->midtexture[0], gst_gl_differencematte_diff, NULL);
+ gst_gl_filter_render_to_target (filter, differencematte->midtexture[0],
+ differencematte->midtexture[1], gst_gl_differencematte_hblur, NULL);
+ gst_gl_filter_render_to_target (filter, differencematte->midtexture[1],
+ differencematte->midtexture[2], gst_gl_differencematte_vblur, NULL);
+ gst_gl_filter_render_to_target (filter, in_tex, out_tex,
+ gst_gl_differencematte_interp, NULL);
} else {
- gst_gl_filter_render_to_target (filter, TRUE, in_tex, out_tex,
- gst_gl_differencematte_identity, differencematte);
+ gst_gl_filter_render_to_target_with_shader (filter, in_tex, out_tex,
+ differencematte->identity_shader);
}
return TRUE;
out_tex, _emit_draw_signal, &cb);
if (default_draw) {
- gst_gl_filter_render_to_target_with_shader (filter, TRUE, in_tex, out_tex,
+ gst_gl_filter_render_to_target_with_shader (filter, in_tex, out_tex,
filter->default_shader);
}
GstBuffer * inbuf, GstBuffer * outbuf);
static gboolean gst_gl_filtershader_filter_texture (GstGLFilter * filter,
GstGLMemory * in_tex, GstGLMemory * out_tex);
-static void gst_gl_filtershader_hcallback (gint width, gint height,
- guint texture, gpointer stuff);
+static gboolean gst_gl_filtershader_hcallback (GstGLFilter * filter,
+ GstGLMemory * in_tex, gpointer stuff);
static void
gst_gl_filtershader_class_init (GstGLFilterShaderClass * klass)
{
GstGLFilterShader *filtershader = GST_GL_FILTERSHADER (filter);
- gst_gl_filter_render_to_target (filter, TRUE, in_tex, out_tex,
- gst_gl_filtershader_hcallback, filtershader);
+ gst_gl_filter_render_to_target (filter, in_tex, out_tex,
+ gst_gl_filtershader_hcallback, NULL);
if (!filtershader->shader)
return FALSE;
return NULL;
}
-static void
-gst_gl_filtershader_hcallback (gint width, gint height, guint texture,
+static gboolean
+gst_gl_filtershader_hcallback (GstGLFilter * filter, GstGLMemory * in_tex,
gpointer stuff)
{
- GstGLFilter *filter = GST_GL_FILTER (stuff);
GstGLFilterShader *filtershader = GST_GL_FILTERSHADER (filter);
GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
GstGLShader *shader;
if (!(shader = _maybe_recompile_shader (filtershader)))
- return;
+ return FALSE;
gl->ClearColor (0.0, 0.0, 0.0, 1.0);
gl->Clear (GL_COLOR_BUFFER_BIT);
/* FIXME: propertise these */
gst_gl_shader_set_uniform_1i (shader, "tex", 0);
- gst_gl_shader_set_uniform_1f (shader, "width", width);
- gst_gl_shader_set_uniform_1f (shader, "height", height);
+ gst_gl_shader_set_uniform_1f (shader, "width",
+ GST_VIDEO_INFO_WIDTH (&filter->out_info));
+ gst_gl_shader_set_uniform_1f (shader, "height",
+ GST_VIDEO_INFO_HEIGHT (&filter->out_info));
gst_gl_shader_set_uniform_1f (shader, "time", filtershader->time);
/* FIXME: propertise these */
gst_gl_shader_get_attribute_location (shader, "a_texcoord");
gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
+ gl->BindTexture (GL_TEXTURE_2D, gst_gl_memory_get_texture_id (in_tex));
gst_gl_filter_draw_fullscreen_quad (filter);
gst_object_unref (shader);
+
+ return TRUE;
}
static void
_unbind_buffer (GstGLOverlay * overlay)
{
+ GstGLFilter *filter = GST_GL_FILTER (overlay);
const GstGLFuncs *gl = GST_GL_BASE_FILTER (overlay)->context->gl_vtable;
gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, 0);
gl->BindBuffer (GL_ARRAY_BUFFER, 0);
- gl->DisableVertexAttribArray (overlay->attr_position);
- gl->DisableVertexAttribArray (overlay->attr_texture);
+ gl->DisableVertexAttribArray (filter->draw_attr_position_loc);
+ gl->DisableVertexAttribArray (filter->draw_attr_texture_loc);
}
static void
_bind_buffer (GstGLOverlay * overlay, GLuint vbo)
{
+ GstGLFilter *filter = GST_GL_FILTER (overlay);
const GstGLFuncs *gl = GST_GL_BASE_FILTER (overlay)->context->gl_vtable;
gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, overlay->vbo_indices);
gl->BindBuffer (GL_ARRAY_BUFFER, vbo);
- gl->EnableVertexAttribArray (overlay->attr_position);
- gl->EnableVertexAttribArray (overlay->attr_texture);
+ gl->EnableVertexAttribArray (filter->draw_attr_position_loc);
+ gl->EnableVertexAttribArray (filter->draw_attr_texture_loc);
- gl->VertexAttribPointer (overlay->attr_position, 3, GL_FLOAT,
+ gl->VertexAttribPointer (filter->draw_attr_position_loc, 3, GL_FLOAT,
GL_FALSE, 5 * sizeof (GLfloat), (void *) 0);
- gl->VertexAttribPointer (overlay->attr_texture, 2, GL_FLOAT,
+ gl->VertexAttribPointer (filter->draw_attr_texture_loc, 2, GL_FLOAT,
GL_FALSE, 5 * sizeof (GLfloat), (void *) (3 * sizeof (GLfloat)));
}
static const GLushort indices[] = { 0, 1, 2, 0, 2, 3, };
/* *INDENT-ON* */
-static void
-gst_gl_overlay_callback (gint width, gint height, guint texture, gpointer stuff)
+static gboolean
+gst_gl_overlay_callback (GstGLFilter * filter, GstGLMemory * in_tex,
+ gpointer stuff)
{
- GstGLOverlay *overlay = GST_GL_OVERLAY (stuff);
- GstGLFilter *filter = GST_GL_FILTER (overlay);
+ GstGLOverlay *overlay = GST_GL_OVERLAY (filter);
GstMapInfo map_info;
guint image_tex;
gboolean memory_mapped = FALSE;
const GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
+ gboolean ret = FALSE;
#if GST_GL_HAVE_OPENGL
if (gst_gl_context_get_gl_api (GST_GL_BASE_FILTER (filter)->context) &
#endif
gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
+ gl->BindTexture (GL_TEXTURE_2D, gst_gl_memory_get_texture_id (in_tex));
gst_gl_shader_use (overlay->shader);
gst_gl_shader_set_uniform_1f (overlay->shader, "alpha", 1.0f);
gst_gl_shader_set_uniform_1i (overlay->shader, "texture", 0);
- overlay->attr_position =
+ filter->draw_attr_position_loc =
gst_gl_shader_get_attribute_location (overlay->shader, "a_position");
- overlay->attr_texture =
+ filter->draw_attr_texture_loc =
gst_gl_shader_get_attribute_location (overlay->shader, "a_texcoord");
- if (!overlay->vbo) {
- if (gl->GenVertexArrays) {
- gl->GenVertexArrays (1, &overlay->vao);
- gl->BindVertexArray (overlay->vao);
- }
-
- gl->GenBuffers (1, &overlay->vbo);
- gl->BindBuffer (GL_ARRAY_BUFFER, overlay->vbo);
- gl->BufferData (GL_ARRAY_BUFFER, 4 * 5 * sizeof (GLfloat), v_vertices,
- GL_STATIC_DRAW);
-
- gl->GenBuffers (1, &overlay->vbo_indices);
- gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, overlay->vbo_indices);
- gl->BufferData (GL_ELEMENT_ARRAY_BUFFER, sizeof (indices), indices,
- GL_STATIC_DRAW);
-
- if (gl->GenVertexArrays) {
- _bind_buffer (overlay, overlay->vbo);
- gl->BindVertexArray (0);
- }
-
- gl->BindBuffer (GL_ARRAY_BUFFER, 0);
- gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, 0);
- }
-
- if (gl->GenVertexArrays)
- gl->BindVertexArray (overlay->vao);
- else
- _bind_buffer (overlay, overlay->vbo);
-
- gl->DrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0);
+ gst_gl_filter_draw_fullscreen_quad (filter);
if (!overlay->image_memory)
goto out;
gl->BindVertexArray (overlay->overlay_vao);
}
+ gl->GenBuffers (1, &overlay->vbo_indices);
+ gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, overlay->vbo_indices);
+ gl->BufferData (GL_ELEMENT_ARRAY_BUFFER, sizeof (indices), indices,
+ GL_STATIC_DRAW);
+
gl->GenBuffers (1, &overlay->overlay_vbo);
gl->BindBuffer (GL_ARRAY_BUFFER, overlay->overlay_vbo);
gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, overlay->vbo_indices);
gl->DrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0);
gl->Disable (GL_BLEND);
+ ret = TRUE;
out:
if (gl->GenVertexArrays) {
gst_memory_unmap ((GstMemory *) overlay->image_memory, &map_info);
overlay->geometry_change = FALSE;
+
+ return ret;
}
static gboolean
overlay->location_has_changed = FALSE;
}
- gst_gl_filter_render_to_target (filter, TRUE, in_tex, out_tex,
+ gst_gl_filter_render_to_target (filter, in_tex, out_tex,
gst_gl_overlay_callback, overlay);
return TRUE;
return ret ? GST_FLOW_OK : GST_FLOW_ERROR;
}
-struct glcb2
+struct glcb
{
- GLCB func;
+ GstGLFilter *filter;
+ GstGLFilterRenderFunc func;
+ GstGLMemory *in_tex;
gpointer data;
- guint texture;
- guint width;
- guint height;
};
-/* convenience functions to simplify filter development */
static gboolean
-_glcb2 (gpointer data)
+_glcb (gpointer data)
{
- struct glcb2 *cb = data;
-
- cb->func (cb->width, cb->height, cb->texture, cb->data);
+ struct glcb *cb = data;
- return TRUE;
+ return cb->func (cb->filter, cb->in_tex, cb->data);
}
/**
* gst_gl_filter_render_to_target:
* @filter: a #GstGLFilter
- * @resize: whether to automatically resize the texture between the input size
- * and the output size
* @input: the input texture
- * @target: the output texture
+ * @output: the output texture
* @func: the function to transform @input into @output. called with @data
* @data: the data associated with @func
*
- * Transforms @input into @output using @func on through FBO. @resize should
- * only ever be %TRUE whenever @input is the input texture of @filter.
+ * Transforms @input into @output using @func on through FBO.
+ *
+ * Returns: the return value of @func
*/
-void
-gst_gl_filter_render_to_target (GstGLFilter * filter, gboolean resize,
- GstGLMemory * input, GstGLMemory * output, GLCB func, gpointer data)
+gboolean
+gst_gl_filter_render_to_target (GstGLFilter * filter, GstGLMemory * input,
+ GstGLMemory * output, GstGLFilterRenderFunc func, gpointer data)
{
- guint in_width, in_height, out_width, out_height;
- struct glcb2 cb;
-
- out_width = GST_VIDEO_INFO_WIDTH (&filter->out_info);
- out_height = GST_VIDEO_INFO_HEIGHT (&filter->out_info);
- if (resize) {
- in_width = GST_VIDEO_INFO_WIDTH (&filter->in_info);
- in_height = GST_VIDEO_INFO_HEIGHT (&filter->in_info);
- } else {
- in_width = out_width;
- in_height = out_height;
- }
-
- GST_LOG ("rendering to target. in %u, %ux%u out %u, %ux%u", input->tex_id,
- in_width, in_height, output->tex_id, out_width, out_height);
+ struct glcb cb;
+ cb.filter = filter;
cb.func = func;
+ cb.in_tex = input;
cb.data = data;
- cb.texture = input->tex_id;
- cb.width = in_width;
- cb.height = in_height;
- gst_gl_framebuffer_draw_to_texture (filter->fbo, output, _glcb2, &cb);
+ return gst_gl_framebuffer_draw_to_texture (filter->fbo, output, _glcb, &cb);
}
static void
filter->valid_attributes = TRUE;
}
-static void
-_draw_with_shader_cb (gint width, gint height, guint texture, gpointer stuff)
+static gboolean
+_draw_with_shader_cb (GstGLFilter * filter, GstGLMemory * in_tex,
+ gpointer unused)
{
- GstGLFilter *filter = GST_GL_FILTER (stuff);
GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
GstGLFuncs *gl = context->gl_vtable;
gst_gl_shader_use (filter->default_shader);
gl->ActiveTexture (GL_TEXTURE1);
- gl->BindTexture (GL_TEXTURE_2D, texture);
+ gl->BindTexture (GL_TEXTURE_2D, gst_gl_memory_get_texture_id (in_tex));
gst_gl_shader_set_uniform_1i (filter->default_shader, "tex", 1);
- gst_gl_shader_set_uniform_1f (filter->default_shader, "width", width);
- gst_gl_shader_set_uniform_1f (filter->default_shader, "height", height);
+ gst_gl_shader_set_uniform_1f (filter->default_shader, "width",
+ GST_VIDEO_INFO_WIDTH (&filter->out_info));
+ gst_gl_shader_set_uniform_1f (filter->default_shader, "height",
+ GST_VIDEO_INFO_HEIGHT (&filter->out_info));
gst_gl_filter_draw_fullscreen_quad (filter);
+
+ return TRUE;
}
/**
* gst_gl_filter_render_to_target_with_shader:
* @filter: a #GstGLFilter
- * @resize: whether to automatically resize the texture between the input size
- * and the output size
* @input: the input texture
- * @target: the output texture
+ * @output: the output texture
* @shader: the shader to use.
*
- * Transforms @input into @output using @shader on FBO. @resize should
- * only ever be %TRUE whenever @input is the input texture of @filter.
+ * Transforms @input into @output using @shader with a FBO.
*
* See also: gst_gl_filter_render_to_target()
*/
* the shader, render input to a quad */
void
gst_gl_filter_render_to_target_with_shader (GstGLFilter * filter,
- gboolean resize, GstGLMemory * input, GstGLMemory * output,
- GstGLShader * shader)
+ GstGLMemory * input, GstGLMemory * output, GstGLShader * shader)
{
if (filter->default_shader != shader)
filter->valid_attributes = FALSE;
filter->default_shader = shader;
- gst_gl_filter_render_to_target (filter, resize, input, output,
- _draw_with_shader_cb, filter);
+ gst_gl_filter_render_to_target (filter, input, output, _draw_with_shader_cb,
+ NULL);
}
/* *INDENT-OFF* */
#define GST_IS_GL_FILTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_GL_FILTER))
#define GST_GL_FILTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_GL_FILTER,GstGLFilterClass))
+typedef gboolean (*GstGLFilterRenderFunc) (GstGLFilter * filter, GstGLMemory * in_tex, gpointer user_data);
+
/**
* GstGLFilter:
* @base_transform: parent #GstBaseTransform
gboolean gst_gl_filter_filter_texture (GstGLFilter * filter, GstBuffer * inbuf,
GstBuffer * outbuf);
-void gst_gl_filter_render_to_target (GstGLFilter *filter,
- gboolean resize,
+gboolean gst_gl_filter_render_to_target (GstGLFilter *filter,
GstGLMemory * input,
GstGLMemory * output,
- GLCB func,
+ GstGLFilterRenderFunc func,
gpointer data);
void gst_gl_filter_draw_fullscreen_quad (GstGLFilter *filter);
void gst_gl_filter_render_to_target_with_shader (GstGLFilter * filter,
- gboolean resize,
GstGLMemory * input,
GstGLMemory * output,
GstGLShader *shader);
--- /dev/null
+/*
+ * GStreamer
+ * Copyright (C) 2015 Matthew Waters <matthew@centricular.com>
+ *
+ * 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., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
G_BEGIN_DECLS
-/**
- * CDCB:
- * @texture: texture to draw
- * @width: new width
- * @height: new height:
- * @data: user data
- *
- * client draw callback
- */
-typedef gboolean (*CDCB) (GLuint texture, GLuint width, GLuint height, gpointer data);
-/**
- * GLCB:
- * @width: the width
- * @height: the height
- * @texture: texture
- * @stuff: user data
- *
- * callback definition for operating on textures
- */
-typedef void (*GLCB) (gint, gint, guint, gpointer stuff);
-
gboolean gst_gl_context_gen_shader (GstGLContext * context,
const gchar * shader_vertex_source,
const gchar * shader_fragment_source, GstGLShader ** shader);