[clutter-gst/clutter-gst-3.0] video-sink: use uniform for yuv->rgb matrix conversion



commit e02f37a4001a775ed6f1a7f14da02dbd00fb04f7
Author: Lionel Landwerlin <llandwerlin gmail com>
Date:   Sat Oct 10 02:10:08 2015 +0100

    video-sink: use uniform for yuv->rgb matrix conversion

 clutter-gst/clutter-gst-video-sink.c |  160 ++++++++++++++++++----------------
 1 files changed, 86 insertions(+), 74 deletions(-)
---
diff --git a/clutter-gst/clutter-gst-video-sink.c b/clutter-gst/clutter-gst-video-sink.c
index d57a6c8..0a988c3 100644
--- a/clutter-gst/clutter-gst-video-sink.c
+++ b/clutter-gst/clutter-gst-video-sink.c
@@ -745,10 +745,38 @@ clutter_gst_video_sink_attach_frame (ClutterGstVideoSink *sink,
 /* Color balance */
 
 static const gchar *no_color_balance_shader =
+  "\n"
   "#define clutter_gst_get_corrected_color_from_yuv(arg) (arg)\n"
   "#define clutter_gst_get_corrected_color_from_rgb(arg) (arg)\n";
 
 static const gchar *color_balance_shader =
+  "\n"
+  "vec3\n"
+  "clutter_gst_rgb_to_yuv (vec3 rgb)\n"
+  "{\n"
+  "  return mat3 (0.2126, -0.114626,  0.5,\n"
+  "               0.7152, -0.385428, -0.454153,\n"
+  "               0.0722,  0.5,       0.045847 ) * rgb;\n"
+  "}\n"
+  "\n"
+  /* " /\* bt601 version *\/\n" */
+  /* "vec3\n" */
+  /* "clutter_gst_rgb_to_yuv (vec3 rgb)\n" */
+  /* "{\n" */
+  /* "  return mat3 (0.299,  0.5,      -0.168736,\n" */
+  /* "               0.587, -0.418688, -0.331264,\n" */
+  /* "               0.114, -0.081312,  0.5      ) * rgb;\n" */
+  /* "}\n" */
+  /* "\n" */
+  /* " /\* bt2020 version *\/\n" */
+  /* "vec3\n" */
+  /* "clutter_gst_rgb_to_bt2020 (vec3 rgb)\n" */
+  /* "{\n" */
+  /* "  return mat3 (0.2627, -0.139630,  0.503380,\n" */
+  /* "               0.6780, -0.360370, -0.462893,\n" */
+  /* "               0.0593,  0.5,      -0.040486 ) * rgb;\n" */
+  /* "}\n" */
+
   "vec3\n"
   "clutter_gst_get_corrected_color_from_yuv (vec3 yuv)\n"
   "{\n"
@@ -761,11 +789,11 @@ static const gchar *color_balance_shader =
   "vec3\n"
   "clutter_gst_get_corrected_color_from_rgb (vec3 rgb)\n"
   "{\n"
-  "  vec3 yuv = clutter_gst_yuv_srgb_to_bt601 (rgb);\n"
+  "  vec3 yuv = clutter_gst_rgb_to_yuv (rgb);\n"
   "  vec3 corrected_yuv = vec3 (texture2D (cogl_sampler%i, vec2 (yuv[0], 0)).a,\n"
   "                             texture2D (cogl_sampler%i, vec2 (yuv[2], yuv[1])).a,\n"
   "                             texture2D (cogl_sampler%i, vec2 (yuv[2], yuv[1])).a);\n"
-  "  return clutter_gst_yuv_bt601_to_srgb (corrected_yuv);\n"
+  "  return clutter_gst_yuv_to_rgb (corrected_yuv);\n"
   "}\n";
 
 static void
@@ -864,86 +892,64 @@ clutter_gst_video_sink_setup_balance (ClutterGstVideoSink *sink,
 
 /* YUV <-> RGB conversions */
 
-static const gchar *color_conversions_shaders =
+static const gchar *no_color_conversions_shader =
+  "\n"
+  "#define clutter_gst_yuv_to_rgb(color) (color)\n";
+static const gchar *color_conversions_shader =
   "\n"
-  "/* These conversion functions take : */\n"
+  "/* This conversion functions take : */\n"
   "/*   Y = [0, 1] */\n"
   "/*   U = [-0.5, 0.5] */\n"
   "/*   V = [-0.5, 0.5] */\n"
-  "vec3\n"
-  "clutter_gst_yuv_bt601_to_srgb (vec3 yuv)\n"
-  "{\n"
-  "  return mat3 (1.0,    1.0,      1.0,\n"
-  "               0.0,   -0.344136, 1.772,\n"
-  "               1.402, -0.714136, 0.0   ) * yuv;\n"
-  "}\n"
-  "\n"
-  "vec3\n"
-  "clutter_gst_yuv_bt709_to_srgb (vec3 yuv)\n"
-  "{\n"
-  "  return mat3 (1.0,     1.0,      1.0,\n"
-  "               0.0,    -0.187324, 1.8556,\n"
-  "               1.5748, -0.468124, 0.0    ) * yuv;\n"
-  "}\n"
-  "\n"
-  "vec3\n"
-  "clutter_gst_yuv_bt2020_to_srgb (vec3 yuv)\n"
-  "{\n"
-  "  return mat3 (1.0,     1.0,      1.0,\n"
-  "               0.0,     0.571353, 1.8814,\n"
-  "               1.4746,  0.164553, 0.0    ) * yuv;\n"
-  "}\n"
-  "/* Original transformation, still no idea where these values come from... */\n"
-  "vec3\n"
-  "clutter_gst_yuv_originalyuv_to_srgb (vec3 yuv)\n"
-  "{\n"
-  "  return mat3 (1.0,         1.0,      1.0,\n"
-  "               0.0,        -0.390625, 2.015625,\n"
-  "               1.59765625, -0.8125,   0.0      ) * yuv;\n"
-  "}\n"
-  "\n"
-  "vec3\n"
-  "clutter_gst_yuv_srgb_to_bt601 (vec3 rgb)\n"
-  "{\n"
-  "  return mat3 (0.299,  0.5,      -0.168736,\n"
-  "               0.587, -0.418688, -0.331264,\n"
-  "               0.114, -0.081312,  0.5      ) * rgb;\n"
-  "}\n"
-  "\n"
-  "vec3\n"
-  "clutter_gst_yuv_srgb_to_bt709 (vec3 rgb)\n"
-  "{\n"
-  "  return mat3 (0.2126, -0.114626,  0.5,\n"
-  "               0.7152, -0.385428, -0.454153,\n"
-  "               0.0722,  0.5,       0.045847 ) * rgb;\n"
-  "}\n"
-  "\n"
-  "vec3\n"
-  "clutter_gst_yuv_srgb_to_bt2020 (vec3 rgb)\n"
-  "{\n"
-  "  return mat3 (0.2627, -0.139630,  0.503380,\n"
-  "               0.6780, -0.360370, -0.462893,\n"
-  "               0.0593,  0.5,      -0.040486 ) * rgb;\n"
-  "}\n"
-  "\n"
-  "#define clutter_gst_default_yuv_to_srgb(arg) clutter_gst_yuv_%s_to_srgb(arg)\n"
+  "uniform mat3 clutter_gst_yuv_to_rgb_;\n"
+  "#define clutter_gst_yuv_to_rgb(yuv) (clutter_gst_yuv_to_rgb_ * (yuv))\n"
   "\n";
 
-static const char *
-_gst_video_color_matrix_to_string (GstVideoColorMatrix matrix)
-{
+static const float *
+_matrix_from_colorimetry (GstVideoColorMatrix matrix)
+{
+  static const float bt601[] = { 1.0,    1.0,      1.0,
+                                 0.0,   -0.344136, 1.772,
+                                 1.402, -0.714136, 0.0    };
+  static const float bt709[] = { 1.0,     1.0,      1.0,
+                                 0.0,    -0.187324, 1.8556,
+                                 1.5748, -0.468124, 0.0     };
+#if GST_CHECK_VERSION(1, 6, 0)
+  static const float bt2020[] = { 1.0,     1.0,      1.0,
+                                  0.0,     0.571353, 1.8814,
+                                  1.4746,  0.164553, 0.0     };
+#endif
+#if 0
+  /* Original transformation from the clutter-gst 2.0/1.6 days.
+   * Still no idea where these values come from...
+   */
+  static const float original[] = { 1.0,         1.0,      1.0,
+                                    0.0,        -0.390625, 2.015625,
+                                    1.59765625, -0.8125,   0.0       };
+#endif
+
   switch (matrix)
     {
+#if GST_CHECK_VERSION(1, 6, 0)
+    case GST_VIDEO_COLOR_MATRIX_BT2020:
+      return bt2020;
+#endif
     case GST_VIDEO_COLOR_MATRIX_BT601:
-      return "bt601";
+      return bt601;
     case GST_VIDEO_COLOR_MATRIX_BT709:
-      return "bt709";
-
     default:
-      return "bt709";
+      return bt709;
     }
 }
 
+static const gchar *
+_shader_from_colorimetry (GstVideoColorMatrix matrix)
+{
+  if (matrix == GST_VIDEO_COLOR_MATRIX_RGB)
+    return no_color_conversions_shader;
+  return color_conversions_shader;
+}
+
 static void
 clutter_gst_video_sink_setup_conversions (ClutterGstVideoSink *sink,
                                           CoglPipeline *pipeline)
@@ -955,15 +961,21 @@ clutter_gst_video_sink_setup_conversions (ClutterGstVideoSink *sink,
 
   if (entry == NULL)
     {
-      char *source = g_strdup_printf (color_conversions_shaders,
-                                      _gst_video_color_matrix_to_string (matrix));
-
+      const char *source = _shader_from_colorimetry (matrix);
       entry = add_global_cache_entry (&snippet_cache, source, matrix);
-      g_free (source);
     }
 
   cogl_pipeline_add_snippet (pipeline, entry->vertex_snippet);
   cogl_pipeline_add_snippet (pipeline, entry->fragment_snippet);
+
+  if (matrix != GST_VIDEO_COLOR_MATRIX_RGB)
+    {
+      gint yuv_to_rgb_location =
+        cogl_pipeline_get_uniform_location (pipeline, "clutter_gst_yuv_to_rgb_");
+      cogl_pipeline_set_uniform_matrix (pipeline, yuv_to_rgb_location,
+                                        3, 1, FALSE,
+                                        _matrix_from_colorimetry (matrix));
+    }
 }
 
 /* Transformation for cropped videos */
@@ -1513,7 +1525,7 @@ clutter_gst_yv12_glsl_setup_pipeline (ClutterGstVideoSink *sink,
                          "  float v = texture2D (cogl_sampler%i, UV).a - 0.5;\n"
                          "  vec3 corrected = clutter_gst_get_corrected_color_from_yuv (vec3 (y, u, v));\n"
                          "  vec4 color;\n"
-                         "  color.rgb = clutter_gst_default_yuv_to_srgb (corrected);\n"
+                         "  color.rgb = clutter_gst_yuv_to_rgb (corrected);\n"
                          "  color.a = 1.0;\n"
                          "  return color;\n"
                          "}\n",
@@ -1581,7 +1593,7 @@ clutter_gst_ayuv_glsl_setup_pipeline (ClutterGstVideoSink *sink,
                            "  float v = color.a - 0.5;\n"
                            "  vec3 corrected = clutter_gst_get_corrected_color_from_yuv (vec3 (y, u, v));\n"
                            "  color.a = color.r;\n"
-                           "  color.rgb = clutter_gst_default_yuv_to_srgb (corrected);\n"
+                           "  color.rgb = clutter_gst_yuv_to_rgb (corrected);\n"
                            /* Premultiply the color */
                            "  color.rgb *= color.a;\n"
                            "  return color;\n"
@@ -1668,7 +1680,7 @@ clutter_gst_nv12_glsl_setup_pipeline (ClutterGstVideoSink *sink,
                          "  float u = uv.x;\n"
                          "  float v = uv.y;\n"
                          "  vec3 corrected = clutter_gst_get_corrected_color_from_yuv (vec3 (y, u, v));\n"
-                         "  color.rgb = clutter_gst_default_yuv_to_srgb (corrected);\n"
+                         "  color.rgb = clutter_gst_yuv_to_rgb (corrected);\n"
                          "  color.a = 1.0;\n"
                          "  return color;\n"
                          "}\n",


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]