summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLionel Landwerlin <llandwerlin@gmail.com>2014-05-28 00:11:52 +0100
committerLionel Landwerlin <llandwerlin@gmail.com>2014-05-28 08:27:54 +0100
commitae29e6d0dd897b235b8f254b9deca36a3e61f4c2 (patch)
tree07e23b1bd15c4b4a03778270d80e8ddc19cd0df4
parent61f1a5a00c500e212976a4f7f82076f21ebcdd7f (diff)
downloadclutter-gst-ae29e6d0dd897b235b8f254b9deca36a3e61f4c2.tar.gz
video-sink: add gl texture upload support
-rw-r--r--clutter-gst/clutter-gst-video-sink.c88
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;
}