[clutter-gst] video-sink: add gl texture upload support



commit ae29e6d0dd897b235b8f254b9deca36a3e61f4c2
Author: Lionel Landwerlin <llandwerlin gmail com>
Date:   Wed May 28 00:11:52 2014 +0100

    video-sink: add gl texture upload support

 clutter-gst/clutter-gst-video-sink.c |   88 ++++++++++++++++++++++++++++++++--
 1 files changed, 84 insertions(+), 4 deletions(-)
---
diff --git a/clutter-gst/clutter-gst-video-sink.c b/clutter-gst/clutter-gst-video-sink.c
index d9f427d..1959c4e 100644
--- a/clutter-gst/clutter-gst-video-sink.c
+++ b/clutter-gst/clutter-gst-video-sink.c
@@ -100,7 +100,11 @@
 
 static const char clutter_gst_video_sink_caps_str[] =
   GST_VIDEO_CAPS_MAKE_WITH_FEATURES(GST_CAPS_FEATURE_MEMORY_SYSTEM_MEMORY,
-                                    BASE_SINK_CAPS);
+                                    BASE_SINK_CAPS)
+  ";"
+  GST_VIDEO_CAPS_MAKE_WITH_FEATURES(GST_CAPS_FEATURE_META_GST_VIDEO_GL_TEXTURE_UPLOAD_META,
+                                    "RGBA");
+
 
   static GstStaticPadTemplate sinktemplate_all =
     GST_STATIC_PAD_TEMPLATE ("sink",
@@ -189,6 +193,8 @@ typedef struct _ClutterGstRenderer
                           CoglPipeline *pipeline);
   gboolean (*upload) (ClutterGstVideoSink *sink,
                       GstBuffer *buffer);
+  gboolean (*upload_gl) (ClutterGstVideoSink *sink,
+                         GstBuffer *buffer);
   void (*shutdown) (ClutterGstVideoSink *sink);
 } ClutterGstRenderer;
 
@@ -877,6 +883,12 @@ clear_frame_textures (ClutterGstVideoSink *sink)
 
 /**/
 
+static gboolean
+clutter_gst_dummy_upload_gl (ClutterGstVideoSink *sink, GstBuffer *buffer)
+{
+  return FALSE;
+}
+
 static void
 clutter_gst_dummy_shutdown (ClutterGstVideoSink *sink)
 {
@@ -1026,6 +1038,7 @@ static ClutterGstRenderer rgb24_glsl_renderer =
     1, /* n_layers */
     clutter_gst_rgb24_glsl_setup_pipeline,
     clutter_gst_rgb24_upload,
+    clutter_gst_dummy_upload_gl,
     clutter_gst_dummy_shutdown,
   };
 
@@ -1039,6 +1052,7 @@ static ClutterGstRenderer rgb24_renderer =
     1, /* n_layers */
     clutter_gst_rgb24_setup_pipeline,
     clutter_gst_rgb24_upload,
+    clutter_gst_dummy_upload_gl,
     clutter_gst_dummy_shutdown,
   };
 
@@ -1130,16 +1144,69 @@ clutter_gst_rgb32_upload (ClutterGstVideoSink *sink,
   }
 }
 
+
+static gboolean
+clutter_gst_rgb32_upload_gl (ClutterGstVideoSink *sink,
+                             GstBuffer *buffer)
+{
+  ClutterGstVideoSinkPrivate *priv = sink->priv;
+  GstVideoGLTextureUploadMeta *upload_meta;
+  guint gl_handle[1];
+
+  //clear_frame_textures (sink);
+
+  upload_meta = gst_buffer_get_video_gl_texture_upload_meta (buffer);
+  if (!upload_meta) {
+    GST_WARNING ("Buffer does not support GLTextureUploadMeta API");
+    return FALSE;
+  }
+
+  if (upload_meta->n_textures != priv->renderer->n_layers ||
+      upload_meta->texture_type[0] != GST_VIDEO_GL_TEXTURE_TYPE_RGBA) {
+    GST_WARNING ("cogl-gst-video-sink only supports gl upload in a single RGBA texture");
+    return FALSE;
+  }
+
+  if (priv->frame[0] == NULL)
+    {
+      priv->frame[0] = COGL_TEXTURE (cogl_texture_2d_new_with_size (priv->ctx,
+                                                                    priv->info.width,
+                                                                    priv->info.height));
+      cogl_texture_set_components (priv->frame[0], COGL_TEXTURE_COMPONENTS_RGBA);
+
+      if (!cogl_texture_allocate (priv->frame[0], NULL)) {
+        GST_WARNING ("Couldn't allocate cogl texture");
+        return FALSE;
+      }
+    }
+
+  if (!cogl_texture_get_gl_texture (priv->frame[0], &gl_handle[0], NULL)) {
+    GST_WARNING ("Couldn't get gl texture");
+    return FALSE;
+  }
+
+  if (!gst_video_gl_texture_upload_meta_upload (upload_meta, gl_handle)) {
+    GST_WARNING ("GL texture upload failed");
+    return FALSE;
+  }
+
+  return TRUE;
+}
+
 static ClutterGstRenderer rgb32_glsl_renderer =
   {
     "RGB 32",
     CLUTTER_GST_RGB32,
     CLUTTER_GST_RENDERER_NEEDS_GLSL,
     GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES(GST_CAPS_FEATURE_MEMORY_SYSTEM_MEMORY,
-                                                       "{ RGBA, BGRA }")),
+                                                       "{ RGBA, BGRA }")
+
+                     ";" 
GST_VIDEO_CAPS_MAKE_WITH_FEATURES(GST_CAPS_FEATURE_META_GST_VIDEO_GL_TEXTURE_UPLOAD_META,
+                                                           "RGBA")),
     1, /* n_layers */
     clutter_gst_rgb32_glsl_setup_pipeline,
     clutter_gst_rgb32_upload,
+    clutter_gst_rgb32_upload_gl,
     clutter_gst_dummy_shutdown,
   };
 
@@ -1153,6 +1220,7 @@ static ClutterGstRenderer rgb32_renderer =
     2, /* n_layers */
     clutter_gst_rgb32_setup_pipeline,
     clutter_gst_rgb32_upload,
+    clutter_gst_dummy_upload_gl,
     clutter_gst_dummy_shutdown,
   };
 
@@ -1301,6 +1369,7 @@ static ClutterGstRenderer yv12_glsl_renderer =
     3, /* n_layers */
     clutter_gst_yv12_glsl_setup_pipeline,
     clutter_gst_yv12_upload,
+    clutter_gst_dummy_upload_gl,
     clutter_gst_dummy_shutdown,
   };
 
@@ -1314,6 +1383,7 @@ static ClutterGstRenderer i420_glsl_renderer =
     3, /* n_layers */
     clutter_gst_yv12_glsl_setup_pipeline,
     clutter_gst_i420_upload,
+    clutter_gst_dummy_upload_gl,
     clutter_gst_dummy_shutdown,
   };
 
@@ -1397,6 +1467,7 @@ static ClutterGstRenderer ayuv_glsl_renderer =
     1, /* n_layers */
     clutter_gst_ayuv_glsl_setup_pipeline,
     clutter_gst_ayuv_upload,
+    clutter_gst_dummy_upload_gl,
     clutter_gst_dummy_shutdown,
   };
 
@@ -1491,6 +1562,7 @@ static ClutterGstRenderer nv12_glsl_renderer =
     2, /* n_layers */
     clutter_gst_nv12_glsl_setup_pipeline,
     clutter_gst_nv12_upload,
+    clutter_gst_dummy_upload_gl,
     clutter_gst_dummy_shutdown,
   };
 
@@ -1750,8 +1822,14 @@ clutter_gst_source_dispatch (GSource *source,
 
   if (buffer)
     {
-      if (!priv->renderer->upload (gst_source->sink, buffer))
-        goto fail_upload;
+      if (gst_buffer_get_video_gl_texture_upload_meta (buffer) != NULL) {
+        if (!priv->renderer->upload_gl (gst_source->sink, buffer)) {
+          goto fail_upload;
+        }
+      } else {
+        if (!priv->renderer->upload (gst_source->sink, buffer))
+          goto fail_upload;
+      }
 
       priv->had_upload_once = TRUE;
 
@@ -2012,6 +2090,8 @@ clutter_gst_video_sink_propose_allocation (GstBaseSink *base_sink, GstQuery *que
 
   gst_query_add_allocation_meta (query,
                                  GST_VIDEO_META_API_TYPE, NULL);
+  gst_query_add_allocation_meta (query,
+                                 GST_VIDEO_GL_TEXTURE_UPLOAD_META_API_TYPE, NULL);
 
   return TRUE;
 }


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