diff options
author | Lionel Landwerlin <llandwerlin@gmail.com> | 2014-05-28 00:11:52 +0100 |
---|---|---|
committer | Lionel Landwerlin <llandwerlin@gmail.com> | 2014-05-28 08:27:54 +0100 |
commit | ae29e6d0dd897b235b8f254b9deca36a3e61f4c2 (patch) | |
tree | 07e23b1bd15c4b4a03778270d80e8ddc19cd0df4 | |
parent | 61f1a5a00c500e212976a4f7f82076f21ebcdd7f (diff) | |
download | clutter-gst-ae29e6d0dd897b235b8f254b9deca36a3e61f4c2.tar.gz |
video-sink: add gl texture upload support
-rw-r--r-- | 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; } |