diff options
author | Matthew Waters <ystreet00@gmail.com> | 2013-08-14 10:44:19 +1000 |
---|---|---|
committer | Matthew Waters <ystreet00@gmail.com> | 2014-03-15 18:37:01 +0100 |
commit | cf5e910d9b25d5d3e5633831be7c9a51507c12a3 (patch) | |
tree | 1db0ba5829e96233c7220a597d2db501bf8d690e /gst | |
parent | b5d595f402150835d1303b678288e6632d390c80 (diff) | |
download | gstreamer-plugins-bad-cf5e910d9b25d5d3e5633831be7c9a51507c12a3.tar.gz |
[793/906] add a GstGLContext object that will be the basis of OpenGL contexts
At the moment it just sits in between GstGLDisplay and GstGLWindow
performing some of the stuff that GstGLWindow used to do.
Diffstat (limited to 'gst')
-rw-r--r-- | gst/gl/gstglimagesink.c | 35 | ||||
-rw-r--r-- | gst/gl/gstgltestsrc.c | 10 |
2 files changed, 31 insertions, 14 deletions
diff --git a/gst/gl/gstglimagesink.c b/gst/gl/gstglimagesink.c index 5aede4329..9741622dc 100644 --- a/gst/gl/gstglimagesink.c +++ b/gst/gl/gstglimagesink.c @@ -415,12 +415,14 @@ gst_glimage_sink_change_state (GstElement * element, GstStateChange transition) g_atomic_int_set (&glimage_sink->to_quit, 0); if (!glimage_sink->display) { GstGLWindow *window; + GstGLContext *context; GError *error = NULL; GST_INFO ("Creating GstGLDisplay"); glimage_sink->display = gst_gl_display_new (); - window = gst_gl_window_new (glimage_sink->display); - gst_gl_display_set_window (glimage_sink->display, window); + context = gst_gl_context_new (glimage_sink->display); + gst_gl_display_set_context (glimage_sink->display, context); + window = gst_gl_context_get_window (context); if (!glimage_sink->window_id && !glimage_sink->new_window_id) gst_video_overlay_prepare_window_handle (GST_VIDEO_OVERLAY @@ -431,7 +433,7 @@ gst_glimage_sink_change_state (GstElement * element, GstStateChange transition) gst_gl_window_set_window_handle (window, glimage_sink->window_id); } - if (!gst_gl_window_create_context (window, 0, &error)) { + if (!gst_gl_context_create (context, 0, &error)) { GST_ELEMENT_ERROR (glimage_sink, RESOURCE, NOT_FOUND, ("%s", error->message), (NULL)); @@ -439,7 +441,7 @@ gst_glimage_sink_change_state (GstElement * element, GstStateChange transition) gst_object_unref (glimage_sink->display); glimage_sink->display = NULL; } - gst_object_unref (window); + gst_object_unref (context); return GST_STATE_CHANGE_FAILURE; } @@ -456,6 +458,7 @@ gst_glimage_sink_change_state (GstElement * element, GstStateChange transition) gst_object_ref (glimage_sink), (GDestroyNotify) gst_object_unref); gst_object_unref (window); + gst_object_unref (context); } break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: @@ -494,7 +497,9 @@ gst_glimage_sink_change_state (GstElement * element, GstStateChange transition) GST_VIDEO_SINK_WIDTH (glimage_sink) = 1; GST_VIDEO_SINK_HEIGHT (glimage_sink) = 1; if (glimage_sink->display) { - GstGLWindow *window = gst_gl_display_get_window (glimage_sink->display); + GstGLContext *context = + gst_gl_display_get_context (glimage_sink->display); + GstGLWindow *window = gst_gl_context_get_window (context); gst_gl_window_send_message (window, GST_GL_WINDOW_CB (gst_glimage_sink_cleanup_glthread), glimage_sink); @@ -504,6 +509,7 @@ gst_glimage_sink_change_state (GstElement * element, GstStateChange transition) gst_gl_window_set_close_callback (window, NULL, NULL, NULL); gst_object_unref (window); + gst_object_unref (context); gst_object_unref (glimage_sink->display); glimage_sink->display = NULL; } @@ -692,12 +698,14 @@ gst_glimage_sink_render (GstBaseSink * bsink, GstBuffer * buf) } if (glimage_sink->window_id != glimage_sink->new_window_id) { - GstGLWindow *window = gst_gl_display_get_window (glimage_sink->display); + GstGLContext *context = gst_gl_display_get_context (glimage_sink->display); + GstGLWindow *window = gst_gl_context_get_window (context); glimage_sink->window_id = glimage_sink->new_window_id; gst_gl_window_set_window_handle (window, glimage_sink->window_id); gst_object_unref (window); + gst_object_unref (context); } gst_buffer_replace (&glimage_sink->stored_buffer, buf); @@ -771,12 +779,15 @@ gst_glimage_sink_expose (GstVideoOverlay * overlay) if (glimage_sink->display && glimage_sink->window_id) { if (glimage_sink->window_id != glimage_sink->new_window_id) { - GstGLWindow *window = gst_gl_display_get_window (glimage_sink->display); + GstGLContext *context = + gst_gl_display_get_context (glimage_sink->display); + GstGLWindow *window = gst_gl_context_get_window (context); glimage_sink->window_id = glimage_sink->new_window_id; gst_gl_window_set_window_handle (window, glimage_sink->window_id); gst_object_unref (window); + gst_object_unref (context); } gst_glimage_sink_redisplay (glimage_sink, 0, 0, 0, 0, 0, @@ -959,6 +970,7 @@ gst_glimage_sink_on_draw (GstGLImageSink * gl_sink) /* check if a client draw callback is registered */ if (gl_sink->clientDrawCallback) { + gboolean doRedisplay = gl_sink->clientDrawCallback (gl_sink->redisplay_texture, gl_sink->redisplay_texture_width, @@ -966,12 +978,14 @@ gst_glimage_sink_on_draw (GstGLImageSink * gl_sink) gl_sink->client_data); if (doRedisplay) { - GstGLWindow *window = gst_gl_display_get_window (gl_sink->display); + GstGLContext *context = gst_gl_display_get_context (gl_sink->display); + GstGLWindow *window = gst_gl_context_get_window (context); gst_gl_window_draw_unlocked (window, gl_sink->redisplay_texture_width, gl_sink->redisplay_texture_height); gst_object_unref (window); + gst_object_unref (context); } } /* default opengl scene */ @@ -1062,10 +1076,12 @@ gst_glimage_sink_redisplay (GstGLImageSink * gl_sink, GLuint texture, gint gl_width, gint gl_height, gint window_width, gint window_height, gboolean keep_aspect_ratio) { + GstGLContext *context; GstGLWindow *window; gboolean alive; - window = gst_gl_display_get_window (gl_sink->display); + context = gst_gl_display_get_context (gl_sink->display); + window = gst_gl_context_get_window (context); if (window && gst_gl_window_is_running (window)) { @@ -1089,6 +1105,7 @@ gst_glimage_sink_redisplay (GstGLImageSink * gl_sink, GLuint texture, } alive = gst_gl_window_is_running (window); gst_object_unref (window); + gst_object_unref (context); return alive; } diff --git a/gst/gl/gstgltestsrc.c b/gst/gl/gstgltestsrc.c index 00df7f15b..2f169b888 100644 --- a/gst/gl/gstgltestsrc.c +++ b/gst/gl/gstgltestsrc.c @@ -561,16 +561,16 @@ gst_gl_test_src_start (GstBaseSrc * basesrc) src->display = gst_object_ref (GST_GL_DISPLAY (g_value_get_pointer (id_value))); else { - GstGLWindow *window; + GstGLContext *context; GError *error = NULL; GST_INFO ("Creating GstGLDisplay"); src->display = gst_gl_display_new (); - window = gst_gl_window_new (src->display); - gst_gl_display_set_window (src->display, window); - gst_object_unref (window); + context = gst_gl_context_new (src->display); + gst_gl_display_set_context (src->display, context); + gst_object_unref (context); - if (!gst_gl_window_create_context (window, 0, &error)) { + if (!gst_gl_context_create (context, 0, &error)) { GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, ("%s", error->message), (NULL)); return FALSE; |