From 5efb69304afc8b38bf6d6b43198926a18659b3fa Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Tue, 13 May 2014 14:07:39 +1000 Subject: [PATCH] gl/colorconvert: fix up alpha clobbering Previously it would only work if the alpha value was in the last component (RGBx, BGRx). Now it works wherever the alpha value may be (xRGB, xBGR, etc). --- gst-libs/gst/gl/gstglcolorconvert.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/gst-libs/gst/gl/gstglcolorconvert.c b/gst-libs/gst/gl/gstglcolorconvert.c index 643bbff398..f9055be8cf 100644 --- a/gst-libs/gst/gl/gstglcolorconvert.c +++ b/gst-libs/gst/gl/gstglcolorconvert.c @@ -133,7 +133,7 @@ static const gchar frag_REORDER[] = "void main(void)\n" "{\n" " vec4 t = texture2D(tex, v_texcoord * tex_scale0);\n" - " %s;\n" /* clobber alpha channel? */ + " %s\n" /* clobber alpha channel? */ " gl_FragColor = vec4(t.%c, t.%c, t.%c, t.%c);\n" "}"; @@ -674,15 +674,17 @@ _RGB_to_RGB (GstGLColorConvert * convert) GstVideoFormat out_format = GST_VIDEO_INFO_FORMAT (&convert->out_info); const gchar *out_format_str = gst_video_format_to_string (out_format); gchar *pixel_order = _RGB_pixel_order (in_format_str, out_format_str); - const gchar *alpha = ""; + gchar *alpha = NULL; info->in_n_textures = 1; info->out_n_textures = 1; if (_is_RGBx (in_format)) - alpha = "t.a = 1.0"; - info->frag_prog = g_strdup_printf (frag_REORDER, alpha, pixel_order[0], - pixel_order[1], pixel_order[2], pixel_order[3]); + alpha = g_strdup_printf ("t.%c = 1.0;", pixel_order[3]); + info->frag_prog = g_strdup_printf (frag_REORDER, alpha ? alpha : "", + pixel_order[0], pixel_order[1], pixel_order[2], pixel_order[3]); info->shader_tex_names[0] = "tex"; + + g_free (alpha); } static void @@ -855,23 +857,25 @@ _RGB_to_GRAY (GstGLColorConvert * convert) GstVideoFormat in_format = GST_VIDEO_INFO_FORMAT (&convert->in_info); const gchar *in_format_str = gst_video_format_to_string (in_format); gchar *pixel_order = _RGB_pixel_order (in_format_str, "rgba"); - const gchar *alpha = ""; + gchar *alpha = NULL; info->in_n_textures = 1; info->out_n_textures = 1; info->shader_tex_names[0] = "tex"; if (_is_RGBx (in_format)) - alpha = "t.a = 1.0"; + alpha = g_strdup_printf ("t.%c = 1.0;", pixel_order[3]); switch (GST_VIDEO_INFO_FORMAT (&convert->out_info)) { case GST_VIDEO_FORMAT_GRAY8: - info->frag_prog = g_strdup_printf (frag_REORDER, alpha, pixel_order[0], - pixel_order[0], pixel_order[0], pixel_order[3]); + info->frag_prog = g_strdup_printf (frag_REORDER, alpha ? alpha : "", + pixel_order[0], pixel_order[0], pixel_order[0], pixel_order[3]); break; default: break; } + + g_free (alpha); } static void