diff options
author | Matthew Waters <ystreet00@gmail.com> | 2014-03-06 18:11:22 +1100 |
---|---|---|
committer | Matthew Waters <ystreet00@gmail.com> | 2014-03-06 18:15:36 +1100 |
commit | 169c737e51cdb90dcc09e7b5d52286f364313c90 (patch) | |
tree | f2f69e04a122a6f317c2db1b44aa10ffef3ecb8f | |
parent | b685a199ee520b81a7b90c34624df7888fa0f340 (diff) |
glimagesink: add an other-context property
Allows applications to provide us with an OpenGL context with which
to share with.
-rw-r--r-- | gst/gl/gstglimagesink.c | 29 | ||||
-rw-r--r-- | gst/gl/gstglimagesink.h | 2 |
2 files changed, 26 insertions, 5 deletions
diff --git a/gst/gl/gstglimagesink.c b/gst/gl/gstglimagesink.c index a609b1b..269234a 100644 --- a/gst/gl/gstglimagesink.c +++ b/gst/gl/gstglimagesink.c @@ -183,7 +183,8 @@ enum PROP_CLIENT_DRAW_CALLBACK, PROP_CLIENT_DATA, PROP_FORCE_ASPECT_RATIO, - PROP_PIXEL_ASPECT_RATIO + PROP_PIXEL_ASPECT_RATIO, + PROP_OTHER_CONTEXT }; #define gst_glimage_sink_parent_class parent_class @@ -244,6 +245,12 @@ gst_glimage_sink_class_init (GstGLImageSinkClass * klass) "Sink/Video", "A videosink based on OpenGL", "Julien Isorce <julien.isorce@gmail.com>"); + g_object_class_install_property (gobject_class, PROP_OTHER_CONTEXT, + g_param_spec_object ("other-context", + "External OpenGL context", + "Give an external OpenGL context with which to share textures", + GST_GL_TYPE_CONTEXT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&gst_glimage_sink_template)); @@ -322,6 +329,13 @@ gst_glimage_sink_set_property (GObject * object, guint prop_id, glimage_sink->par_d = gst_value_get_fraction_denominator (value); break; } + case PROP_OTHER_CONTEXT: + { + if (glimage_sink->other_context) + gst_object_unref (glimage_sink->other_context); + glimage_sink->other_context = g_value_dup_object (value); + break; + } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -364,6 +378,9 @@ gst_glimage_sink_get_property (GObject * object, guint prop_id, case PROP_PIXEL_ASPECT_RATIO: gst_value_set_fraction (value, glimage_sink->par_n, glimage_sink->par_d); break; + case PROP_OTHER_CONTEXT: + g_value_set_object (value, glimage_sink->other_context); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -380,7 +397,8 @@ _ensure_gl_setup (GstGLImageSink * gl_sink) if (!gl_sink->context) { gl_sink->context = gst_gl_context_new (gl_sink->display); - if (!gst_gl_context_create (gl_sink->context, NULL, &error)) + if (!gst_gl_context_create (gl_sink->context, gl_sink->other_context, + &error)) goto context_error; } @@ -498,9 +516,10 @@ gst_glimage_sink_change_state (GstElement * element, GstStateChange transition) gst_gl_window_set_window_handle (window, glimage_sink->window_id); } - if (!gst_gl_context_create (glimage_sink->context, 0, &error)) { - GST_ELEMENT_ERROR (glimage_sink, RESOURCE, NOT_FOUND, - ("%s", error->message), (NULL)); + if (!gst_gl_context_create (glimage_sink->context, + glimage_sink->other_context, &error)) { + GST_ELEMENT_ERROR (glimage_sink, RESOURCE, NOT_FOUND, ("%s", + error->message), (NULL)); if (glimage_sink->display) { gst_object_unref (glimage_sink->display); diff --git a/gst/gl/gstglimagesink.h b/gst/gl/gstglimagesink.h index 88cdbff..ea158fe 100644 --- a/gst/gl/gstglimagesink.h +++ b/gst/gl/gstglimagesink.h @@ -62,6 +62,8 @@ struct _GstGLImageSink GstGLDisplay *display; GstGLContext *context; + GstGLContext *other_context; + GstGLUpload *upload; GLuint tex_id; |