diff --git a/ext/gl/gstglimagesink.c b/ext/gl/gstglimagesink.c index 469255224c..7373fcd2f3 100644 --- a/ext/gl/gstglimagesink.c +++ b/ext/gl/gstglimagesink.c @@ -179,7 +179,8 @@ enum PROP_FORCE_ASPECT_RATIO, PROP_PIXEL_ASPECT_RATIO, PROP_CONTEXT, - PROP_HANDLE_EVENTS + PROP_HANDLE_EVENTS, + PROP_IGNORE_ALPHA, }; enum @@ -297,6 +298,11 @@ gst_glimage_sink_class_init (GstGLImageSinkClass * klass) "When enabled, XEvents will be selected and handled", TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_HANDLE_EVENTS, + g_param_spec_boolean ("ignore-alpha", "Ignore Alpha", + "When enabled, alpha will be ignored and converted to black", TRUE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + gst_element_class_set_metadata (element_class, "OpenGL video sink", "Sink/Video", "A videosink based on OpenGL", "Julien Isorce "); @@ -370,6 +376,7 @@ gst_glimage_sink_init (GstGLImageSink * glimage_sink) glimage_sink->stored_buffer = NULL; glimage_sink->redisplay_texture = 0; glimage_sink->handle_events = TRUE; + glimage_sink->ignore_alpha = TRUE; g_mutex_init (&glimage_sink->drawing_lock); } @@ -406,6 +413,9 @@ gst_glimage_sink_set_property (GObject * object, guint prop_id, gst_glimage_sink_handle_events (GST_VIDEO_OVERLAY (glimage_sink), g_value_get_boolean (value)); break; + case PROP_IGNORE_ALPHA: + glimage_sink->ignore_alpha = g_value_get_boolean (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -460,6 +470,9 @@ gst_glimage_sink_get_property (GObject * object, guint prop_id, case PROP_HANDLE_EVENTS: g_value_set_boolean (value, glimage_sink->handle_events); break; + case PROP_IGNORE_ALPHA: + g_value_set_boolean (value, glimage_sink->ignore_alpha); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1372,11 +1385,22 @@ gst_glimage_sink_on_draw (GstGLImageSink * gl_sink) GST_VIDEO_INFO_HEIGHT (&gl_sink->info), &do_redisplay); if (!do_redisplay) { + gfloat alpha = gl_sink->ignore_alpha ? 1.0f : 0.0f; GLushort indices[] = { 0, 1, 2, 0, 2, 3 }; - gl->ClearColor (0.0, 0.0, 0.0, 0.0); + gl->ClearColor (0.0, 0.0, 0.0, alpha); gl->Clear (GL_COLOR_BUFFER_BIT); + if (gl_sink->ignore_alpha) { + GLenum dst_func = + gl_sink->ignore_alpha ? GL_CONSTANT_COLOR : GL_ONE_MINUS_SRC_ALPHA; + + gl->BlendColor (0.0, 0.0, 0.0, alpha); + gl->BlendFunc (GL_SRC_ALPHA, dst_func); + gl->BlendEquation (GL_FUNC_ADD); + gl->Enable (GL_BLEND); + } + gst_gl_shader_use (gl_sink->redisplay_shader); if (gl->GenVertexArrays) @@ -1394,6 +1418,9 @@ gst_glimage_sink_on_draw (GstGLImageSink * gl_sink) gl->BindVertexArray (0); else _unbind_buffer (gl_sink); + + if (gl_sink->ignore_alpha) + gl->Disable (GL_BLEND); } /* end default opengl scene */ window->is_drawing = FALSE; diff --git a/ext/gl/gstglimagesink.h b/ext/gl/gstglimagesink.h index ab981966a4..01851a4d49 100644 --- a/ext/gl/gstglimagesink.h +++ b/ext/gl/gstglimagesink.h @@ -67,6 +67,7 @@ struct _GstGLImageSink GstGLContext *context; GstGLContext *other_context; gboolean handle_events; + gboolean ignore_alpha; GstGLUpload *upload; GstGLColorConvert *convert;