glutSetWindow (display->glutWinId);
if (GLEW_ARB_fragment_shader)
{
- gboolean isAlive = TRUE;
- GError *error = NULL;
-
- display->gen_shader = gst_gl_shader_new ();
+ if (display->gen_shader_vertex_source ||
+ display->gen_shader_fragment_source)
+ {
+ gboolean isAlive = TRUE;
+ GError *error = NULL;
+
+ display->gen_shader = gst_gl_shader_new ();
- if (display->gen_shader_vertex_source)
- gst_gl_shader_set_vertex_source(display->gen_shader, display->gen_shader_vertex_source);
+ if (display->gen_shader_vertex_source)
+ gst_gl_shader_set_vertex_source(display->gen_shader, display->gen_shader_vertex_source);
- if (display->gen_shader_fragment_source)
- gst_gl_shader_set_fragment_source(display->gen_shader, display->gen_shader_fragment_source);
+ if (display->gen_shader_fragment_source)
+ gst_gl_shader_set_fragment_source(display->gen_shader, display->gen_shader_fragment_source);
- gst_gl_shader_compile (display->gen_shader, &error);
- if (error)
- {
- GST_CAT_ERROR (GST_CAT_DEFAULT, "%s", error->message);
- g_error_free (error);
- error = NULL;
- gst_gl_shader_use (NULL);
- isAlive = FALSE;
- }
+ gst_gl_shader_compile (display->gen_shader, &error);
+ if (error)
+ {
+ GST_CAT_ERROR (GST_CAT_DEFAULT, "%s", error->message);
+ g_error_free (error);
+ error = NULL;
+ gst_gl_shader_use (NULL);
+ isAlive = FALSE;
+ }
- if (!isAlive)
- {
- display->isAlive = FALSE;
- g_object_unref (G_OBJECT (display->gen_shader));
- display->gen_shader = NULL;
+ if (!isAlive)
+ {
+ display->isAlive = FALSE;
+ g_object_unref (G_OBJECT (display->gen_shader));
+ display->gen_shader = NULL;
+ }
}
}
else
display->gen_shader_fragment_source = shader_fragment_source;
gst_gl_display_post_message (GST_GL_DISPLAY_ACTION_GEN_SHADER, display);
g_cond_wait (display->cond_gen_shader, display->mutex);
- *shader = display->gen_shader;
+ if (shader)
+ *shader = display->gen_shader;
display->gen_shader = NULL;
display->gen_shader_vertex_source = NULL;
display->gen_shader_fragment_source = NULL;
static void gst_gl_effects_init_resources (GstGLFilter* filter);
static void gst_gl_effects_reset_resources (GstGLFilter* filter);
+static void gst_gl_effects_on_init_gl_context (GstGLFilter* filter);
+
static void gst_gl_effects_ghash_func_clean (gpointer key, gpointer value, gpointer data);
static gboolean gst_gl_effects_filter (GstGLFilter * filter,
GST_GL_FILTER_CLASS (klass)->display_reset_cb = gst_gl_effects_reset_gl_resources;
GST_GL_FILTER_CLASS (klass)->onStart = gst_gl_effects_init_resources;
GST_GL_FILTER_CLASS (klass)->onStop = gst_gl_effects_reset_resources;
+ GST_GL_FILTER_CLASS (klass)->onInitFBO = gst_gl_effects_on_init_gl_context;
g_object_class_install_property (
gobject_class,
}
}
+static void
+gst_gl_effects_on_init_gl_context (GstGLFilter* filter)
+{
+ //check that your hardware supports shader
+ //if not the pipeline correctly shut down
+ gst_gl_display_gen_shader (filter->display, 0, 0, NULL);
+}
+
static gboolean
gst_gl_effects_filter (GstGLFilter* filter, GstGLBuffer* inbuf,
GstGLBuffer* outbuf)