gl/colorconvert: fix up alpha clobbering
authorMatthew Waters <ystreet00@gmail.com>
Tue, 13 May 2014 04:07:39 +0000 (14:07 +1000)
committerTim-Philipp Müller <tim@centricular.com>
Sat, 9 Dec 2017 19:31:40 +0000 (19:31 +0000)
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

index 643bbff..f9055be 100644 (file)
@@ -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