summaryrefslogtreecommitdiffstats
path: root/gst-libs/gst/gl/gstgloverlaycompositor.c
diff options
context:
space:
mode:
Diffstat (limited to 'gst-libs/gst/gl/gstgloverlaycompositor.c')
-rw-r--r--gst-libs/gst/gl/gstgloverlaycompositor.c34
1 files changed, 30 insertions, 4 deletions
diff --git a/gst-libs/gst/gl/gstgloverlaycompositor.c b/gst-libs/gst/gl/gstgloverlaycompositor.c
index 61f342a99..21bbc1ec8 100644
--- a/gst-libs/gst/gl/gstgloverlaycompositor.c
+++ b/gst-libs/gst/gl/gstgloverlaycompositor.c
@@ -349,10 +349,26 @@ gst_gl_composition_overlay_upload (GstGLCompositionOverlay * overlay,
GstVideoMeta *vmeta;
GstVideoFrame *comp_frame;
GstVideoFrame gl_frame;
+ GstVideoOverlayFormatFlags flags;
+ GstVideoOverlayFormatFlags alpha_flags;
+
+ flags = gst_video_overlay_rectangle_get_flags (overlay->rectangle);
+
+ flags = 0;
+ if (flags & GST_VIDEO_OVERLAY_FORMAT_FLAG_PREMULTIPLIED_ALPHA) {
+ alpha_flags = GST_VIDEO_OVERLAY_FORMAT_FLAG_PREMULTIPLIED_ALPHA;
+ } else if (!overlay->context->gl_vtable->BlendFuncSeparate) {
+ GST_FIXME_OBJECT (overlay, "No separate blend mode function, "
+ "cannot perform correct blending of unmultipled alpha in OpenGL. "
+ "Software converting");
+ alpha_flags = GST_VIDEO_OVERLAY_FORMAT_FLAG_PREMULTIPLIED_ALPHA;
+ } else {
+ alpha_flags = 0;
+ }
comp_buffer =
gst_video_overlay_rectangle_get_pixels_unscaled_argb (overlay->rectangle,
- GST_VIDEO_OVERLAY_FORMAT_FLAG_PREMULTIPLIED_ALPHA);
+ alpha_flags);
comp_frame = g_slice_new (GstVideoFrame);
@@ -448,8 +464,7 @@ enum
#define DEFAULT_YINVERT FALSE
G_DEFINE_TYPE_WITH_CODE (GstGLOverlayCompositor, gst_gl_overlay_compositor,
- GST_TYPE_OBJECT, G_ADD_PRIVATE (GstGLOverlayCompositor);
- DEBUG_INIT);
+ GST_TYPE_OBJECT, G_ADD_PRIVATE (GstGLOverlayCompositor); DEBUG_INIT);
static void gst_gl_overlay_compositor_finalize (GObject * object);
static void gst_gl_overlay_compositor_set_property (GObject * object,
@@ -692,7 +707,6 @@ gst_gl_overlay_compositor_draw_overlays (GstGLOverlayCompositor * compositor)
GList *l;
gl->Enable (GL_BLEND);
- gl->BlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
gst_gl_shader_use (compositor->shader);
gl->ActiveTexture (GL_TEXTURE0);
@@ -700,6 +714,18 @@ gst_gl_overlay_compositor_draw_overlays (GstGLOverlayCompositor * compositor)
for (l = compositor->overlays; l != NULL; l = l->next) {
GstGLCompositionOverlay *overlay = (GstGLCompositionOverlay *) l->data;
+ GstVideoOverlayFormatFlags flags;
+
+ flags = gst_video_overlay_rectangle_get_flags (overlay->rectangle);
+ flags = 0;
+
+ if (flags & GST_VIDEO_OVERLAY_FORMAT_FLAG_PREMULTIPLIED_ALPHA
+ || !gl->BlendFuncSeparate) {
+ gl->BlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+ } else {
+ gl->BlendFuncSeparate (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE,
+ GL_ONE_MINUS_SRC_ALPHA);
+ }
gst_gl_composition_overlay_draw (overlay, compositor->shader);
}