summaryrefslogtreecommitdiff
path: root/gst
diff options
context:
space:
mode:
authorMatthew Waters <ystreet00@gmail.com>2013-08-14 10:44:19 +1000
committerMatthew Waters <ystreet00@gmail.com>2014-03-15 18:37:01 +0100
commitcf5e910d9b25d5d3e5633831be7c9a51507c12a3 (patch)
tree1db0ba5829e96233c7220a597d2db501bf8d690e /gst
parentb5d595f402150835d1303b678288e6632d390c80 (diff)
downloadgstreamer-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.c35
-rw-r--r--gst/gl/gstgltestsrc.c10
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;