diff --git a/ext/gl/gstglfilterapp.c b/ext/gl/gstglfilterapp.c index d7dbd8847d..3176c7cddd 100644 --- a/ext/gl/gstglfilterapp.c +++ b/ext/gl/gstglfilterapp.c @@ -161,23 +161,42 @@ _emit_draw_signal (guint tex, gint width, gint height, gpointer data) app_filter->default_draw = !drawn; } +struct glcb2 +{ + GLCB func; + gpointer data; + guint texture; + guint width; + guint height; +}; + +/* convenience functions to simplify filter development */ +static void +_glcb2 (gpointer data) +{ + struct glcb2 *cb = data; + + cb->func (cb->width, cb->height, cb->texture, cb->data); +} + static gboolean gst_gl_filter_app_filter_texture (GstGLFilter * filter, guint in_tex, guint out_tex) { GstGLFilterApp *app_filter = GST_GL_FILTER_APP (filter); + struct glcb2 cb; + + cb.func = (GLCB) _emit_draw_signal; + cb.data = filter; + cb.texture = in_tex; + cb.width = GST_VIDEO_INFO_WIDTH (&filter->in_info); + cb.height = GST_VIDEO_INFO_HEIGHT (&filter->in_info); //blocking call, use a FBO - gst_gl_context_use_fbo (filter->context, + gst_gl_context_use_fbo_v2 (filter->context, GST_VIDEO_INFO_WIDTH (&filter->out_info), GST_VIDEO_INFO_HEIGHT (&filter->out_info), - filter->fbo, filter->depthbuffer, out_tex, (GLCB) _emit_draw_signal, - GST_VIDEO_INFO_WIDTH (&filter->in_info), - GST_VIDEO_INFO_HEIGHT (&filter->in_info), - in_tex, 45, - (gfloat) GST_VIDEO_INFO_WIDTH (&filter->out_info) / - (gfloat) GST_VIDEO_INFO_HEIGHT (&filter->out_info), - 0.1, 100, GST_GL_DISPLAY_PROJECTION_PERSPECTIVE, filter); + filter->fbo, filter->depthbuffer, out_tex, _glcb2, &cb); if (app_filter->default_draw) { gst_gl_filter_render_to_target (filter, TRUE, in_tex, out_tex, @@ -195,8 +214,12 @@ gst_gl_filter_app_callback (gint width, gint height, guint texture, GstGLFilter *filter = GST_GL_FILTER (stuff); GstGLFuncs *gl = filter->context->gl_vtable; - gl->MatrixMode (GL_PROJECTION); - gl->LoadIdentity (); +#if GST_GL_HAVE_OPENGL + if (gst_gl_context_get_gl_api (filter->context) & GST_GL_API_OPENGL) { + gl->MatrixMode (GL_PROJECTION); + gl->LoadIdentity (); + } +#endif gst_gl_filter_draw_texture (filter, texture, width, height); } diff --git a/ext/gl/gstopengl.c b/ext/gl/gstopengl.c index 1e0354de34..e71ec10fc2 100644 --- a/ext/gl/gstopengl.c +++ b/ext/gl/gstopengl.c @@ -50,6 +50,7 @@ #include "gstglcolorscale.h" #include "gstglvideomixer.h" #include "gstglfiltershader.h" +#include "gstglfilterapp.h" #if HAVE_GRAPHENE #include "gstgltransformation.h" #endif @@ -63,7 +64,6 @@ #include "gstgltestsrc.h" #include "gstglfilterlaplacian.h" #include "gstglfilterglass.h" -#include "gstglfilterapp.h" #include "gstglfilterblur.h" #include "gstglfilterreflectedscreen.h" #include "gstglfiltersobel.h" @@ -131,10 +131,16 @@ plugin_init (GstPlugin * plugin) GST_RANK_NONE, GST_TYPE_GL_VIDEO_MIXER)) { return FALSE; } + if (!gst_element_register (plugin, "glshader", GST_RANK_NONE, gst_gl_filtershader_get_type ())) { return FALSE; } + + if (!gst_element_register (plugin, "glfilterapp", + GST_RANK_NONE, GST_TYPE_GL_FILTER_APP)) { + return FALSE; + } #if HAVE_JPEG #if HAVE_PNG if (!gst_element_register (plugin, "gloverlay", @@ -169,11 +175,6 @@ plugin_init (GstPlugin * plugin) return FALSE; } - if (!gst_element_register (plugin, "glfilterapp", - GST_RANK_NONE, GST_TYPE_GL_FILTER_APP)) { - return FALSE; - } - if (!gst_element_register (plugin, "glfilterreflectedscreen", GST_RANK_NONE, GST_TYPE_GL_FILTER_REFLECTED_SCREEN)) { return FALSE;