[222/906] Finish TODO task 17
authorJulien Isorce <julien.isorce@gmail.com>
Sun, 14 Sep 2008 17:56:50 +0000 (19:56 +0200)
committerMatthew Waters <ystreet00@gmail.com>
Sat, 15 Mar 2014 17:36:27 +0000 (18:36 +0100)
gst-libs/gst/gl/gstgldisplay.c
gst/gl/gstgleffects.c

index c4e83b6..78cd1ea 100644 (file)
@@ -1624,32 +1624,36 @@ gst_gl_display_thread_gen_shader (GstGLDisplay* display)
   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
@@ -2297,7 +2301,8 @@ gst_gl_display_gen_shader (GstGLDisplay* display,
   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;
index 398c8ea..248d35d 100644 (file)
@@ -44,6 +44,8 @@ static void gst_gl_effects_get_property (GObject * object, guint prop_id,
 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,
@@ -219,6 +221,7 @@ gst_gl_effects_class_init (GstGLEffectsClass * klass)
   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,
@@ -371,6 +374,14 @@ gst_gl_effects_init_resources (GstGLFilter* filter)
   }
 }
 
+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)