diff options
author | Matthew Waters <ystreet00@gmail.com> | 2013-06-12 23:17:30 +1000 |
---|---|---|
committer | Sebastian Dröge <slomo@circular-chaos.org> | 2013-06-29 10:08:56 +0200 |
commit | ef7e6c2a9f30f9c3ea41809badcb5b6a66745fe2 (patch) | |
tree | 31f56c16a35b3de588629ff522857ea53575afd9 /gst | |
parent | 4b918e7784c4dc50f53d395a92e85c04c17bba7c (diff) |
display: move context creation into window
Diffstat (limited to 'gst')
-rw-r--r-- | gst/gl/effects/gstgleffectidentity.c | 10 | ||||
-rw-r--r-- | gst/gl/effects/gstgleffectmirror.c | 10 | ||||
-rw-r--r-- | gst/gl/effects/gstgleffectsqueeze.c | 10 | ||||
-rw-r--r-- | gst/gl/gltestsrc.c | 6 | ||||
-rw-r--r-- | gst/gl/gstglbumper.c | 2 | ||||
-rw-r--r-- | gst/gl/gstgleffects.c | 4 | ||||
-rw-r--r-- | gst/gl/gstglfiltercube.c | 3 | ||||
-rw-r--r-- | gst/gl/gstglimagesink.c | 86 | ||||
-rw-r--r-- | gst/gl/gstglimagesink.h | 1 | ||||
-rw-r--r-- | gst/gl/gstgloverlay.c | 5 | ||||
-rw-r--r-- | gst/gl/gstgltestsrc.c | 11 |
11 files changed, 90 insertions, 58 deletions
diff --git a/gst/gl/effects/gstgleffectidentity.c b/gst/gl/effects/gstgleffectidentity.c index 8640f19..636706a 100644 --- a/gst/gl/effects/gstgleffectidentity.c +++ b/gst/gl/effects/gstgleffectidentity.c @@ -20,11 +20,11 @@ #include <gstgleffects.h> -#define USING_OPENGL(display) (gst_gl_display_get_gl_api_unlocked (display) & GST_GL_API_OPENGL) -#define USING_OPENGL3(display) (gst_gl_display_get_gl_api_unlocked (display) & GST_GL_API_OPENGL3) -#define USING_GLES(display) (gst_gl_display_get_gl_api_unlocked (display) & GST_GL_API_GLES) -#define USING_GLES2(display) (gst_gl_display_get_gl_api_unlocked (display) & GST_GL_API_GLES2) -#define USING_GLES3(display) (gst_gl_display_get_gl_api_unlocked (display) & GST_GL_API_GLES3) +#define USING_OPENGL(display) (gst_gl_display_get_gl_api (display) & GST_GL_API_OPENGL) +#define USING_OPENGL3(display) (gst_gl_display_get_gl_api (display) & GST_GL_API_OPENGL3) +#define USING_GLES(display) (gst_gl_display_get_gl_api (display) & GST_GL_API_GLES) +#define USING_GLES2(display) (gst_gl_display_get_gl_api (display) & GST_GL_API_GLES2) +#define USING_GLES3(display) (gst_gl_display_get_gl_api (display) & GST_GL_API_GLES3) static void gst_gl_effects_identity_callback (gint width, gint height, guint texture, diff --git a/gst/gl/effects/gstgleffectmirror.c b/gst/gl/effects/gstgleffectmirror.c index 20dda3d..7fd2473 100644 --- a/gst/gl/effects/gstgleffectmirror.c +++ b/gst/gl/effects/gstgleffectmirror.c @@ -20,11 +20,11 @@ #include <gstgleffects.h> -#define USING_OPENGL(display) (gst_gl_display_get_gl_api_unlocked (display) & GST_GL_API_OPENGL) -#define USING_OPENGL3(display) (gst_gl_display_get_gl_api_unlocked (display) & GST_GL_API_OPENGL3) -#define USING_GLES(display) (gst_gl_display_get_gl_api_unlocked (display) & GST_GL_API_GLES) -#define USING_GLES2(display) (gst_gl_display_get_gl_api_unlocked (display) & GST_GL_API_GLES2) -#define USING_GLES3(display) (gst_gl_display_get_gl_api_unlocked (display) & GST_GL_API_GLES3) +#define USING_OPENGL(display) (gst_gl_display_get_gl_api (display) & GST_GL_API_OPENGL) +#define USING_OPENGL3(display) (gst_gl_display_get_gl_api (display) & GST_GL_API_OPENGL3) +#define USING_GLES(display) (gst_gl_display_get_gl_api (display) & GST_GL_API_GLES) +#define USING_GLES2(display) (gst_gl_display_get_gl_api (display) & GST_GL_API_GLES2) +#define USING_GLES3(display) (gst_gl_display_get_gl_api (display) & GST_GL_API_GLES3) static void gst_gl_effects_mirror_callback (gint width, gint height, guint texture, diff --git a/gst/gl/effects/gstgleffectsqueeze.c b/gst/gl/effects/gstgleffectsqueeze.c index d55975e..0cdadfc 100644 --- a/gst/gl/effects/gstgleffectsqueeze.c +++ b/gst/gl/effects/gstgleffectsqueeze.c @@ -20,11 +20,11 @@ #include <gstgleffects.h> -#define USING_OPENGL(display) (gst_gl_display_get_gl_api_unlocked (display) & GST_GL_API_OPENGL) -#define USING_OPENGL3(display) (gst_gl_display_get_gl_api_unlocked (display) & GST_GL_API_OPENGL3) -#define USING_GLES(display) (gst_gl_display_get_gl_api_unlocked (display) & GST_GL_API_GLES) -#define USING_GLES2(display) (gst_gl_display_get_gl_api_unlocked (display) & GST_GL_API_GLES2) -#define USING_GLES3(display) (gst_gl_display_get_gl_api_unlocked (display) & GST_GL_API_GLES3) +#define USING_OPENGL(display) (gst_gl_display_get_gl_api (display) & GST_GL_API_OPENGL) +#define USING_OPENGL3(display) (gst_gl_display_get_gl_api (display) & GST_GL_API_OPENGL3) +#define USING_GLES(display) (gst_gl_display_get_gl_api (display) & GST_GL_API_GLES) +#define USING_GLES2(display) (gst_gl_display_get_gl_api (display) & GST_GL_API_GLES2) +#define USING_GLES3(display) (gst_gl_display_get_gl_api (display) & GST_GL_API_GLES3) static void gst_gl_effects_squeeze_callback (gint width, gint height, guint texture, diff --git a/gst/gl/gltestsrc.c b/gst/gl/gltestsrc.c index 996e9d8..2576efe 100644 --- a/gst/gl/gltestsrc.c +++ b/gst/gl/gltestsrc.c @@ -86,7 +86,7 @@ gst_gl_test_src_smpte (GstGLTestSrc * v, GstBuffer * buffer, int w, int h) #if GST_GL_HAVE_OPENGL int i; - if (gst_gl_display_get_gl_api_unlocked (v->display) & GST_GL_API_OPENGL) { + if (gst_gl_display_get_gl_api (v->display) & GST_GL_API_OPENGL) { glClearColor (0.0, 0.0, 0.0, 1.0); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -192,7 +192,7 @@ void gst_gl_test_src_snow (GstGLTestSrc * v, GstBuffer * buffer, int w, int h) { #if GST_GL_HAVE_OPENGL - if (gst_gl_display_get_gl_api_unlocked (v->display) & GST_GL_API_OPENGL) { + if (gst_gl_display_get_gl_api (v->display) & GST_GL_API_OPENGL) { glClearColor (0.0, 0.0, 0.0, 1.0); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -219,7 +219,7 @@ gst_gl_test_src_unicolor (GstGLTestSrc * v, GstBuffer * buffer, int w, int h, const struct vts_color_struct *color) { #if GST_GL_HAVE_OPENGL - if (gst_gl_display_get_gl_api_unlocked (v->display) & GST_GL_API_OPENGL) { + if (gst_gl_display_get_gl_api (v->display) & GST_GL_API_OPENGL) { glClearColor (color->R * (1 / 255.0f), color->G * (1 / 255.0f), color->B * (1 / 255.0f), 1.0f); glClear (GL_COLOR_BUFFER_BIT); diff --git a/gst/gl/gstglbumper.c b/gst/gl/gstglbumper.c index 854d268..25bd26b 100644 --- a/gst/gl/gstglbumper.c +++ b/gst/gl/gstglbumper.c @@ -139,7 +139,7 @@ static const gchar *bumper_f_src = " gl_FragColor = vec4(irradiance * textureColor.rgb, textureColor.w);\n" "}\n"; -#define LOAD_ERROR(display, msg) { gst_gl_display_set_error (display, "unable to load %s: %s", bumper->location, msg); display->isAlive = FALSE; return; } +#define LOAD_ERROR(display, msg) { gst_gl_display_set_error (display, "unable to load %s: %s", bumper->location, msg); return; } //png reading error handler static void diff --git a/gst/gl/gstgleffects.c b/gst/gl/gstgleffects.c index 985692d..8d953b6 100644 --- a/gst/gl/gstgleffects.c +++ b/gst/gl/gstgleffects.c @@ -280,7 +280,7 @@ gst_gl_effects_draw_texture (GstGLEffects * effects, GLuint tex, guint width, GstGLFuncs *gl = display->gl_vtable; #if GST_GL_HAVE_OPENGL - if (gst_gl_display_get_gl_api_unlocked (display) & GST_GL_API_OPENGL) { + if (gst_gl_display_get_gl_api (display) & GST_GL_API_OPENGL) { gfloat verts[] = { -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, @@ -347,7 +347,7 @@ set_horizontal_swap (GstGLDisplay * display, gpointer data) #if GST_GL_HAVE_OPENGL GstGLFuncs *gl = display->gl_vtable; - if (gst_gl_display_get_gl_api_unlocked (display) & GST_GL_API_OPENGL) { + if (gst_gl_display_get_gl_api (display) & GST_GL_API_OPENGL) { const gfloat mirrormatrix[16] = { -1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 diff --git a/gst/gl/gstglfiltercube.c b/gst/gl/gstglfiltercube.c index 43f116d..8526b3a 100644 --- a/gst/gl/gstglfiltercube.c +++ b/gst/gl/gstglfiltercube.c @@ -289,8 +289,7 @@ gst_gl_filter_cube_filter_texture (GstGLFilter * filter, guint in_tex, GLCB cb = NULL; GstGLAPI api; - api = - gst_gl_display_get_gl_api_unlocked (GST_GL_FILTER (cube_filter)->display); + api = gst_gl_display_get_gl_api (GST_GL_FILTER (cube_filter)->display); #if GST_GL_HAVE_OPENGL if (api & GST_GL_API_OPENGL) diff --git a/gst/gl/gstglimagesink.c b/gst/gl/gstglimagesink.c index 9012df1..77db45d 100644 --- a/gst/gl/gstglimagesink.c +++ b/gst/gl/gstglimagesink.c @@ -412,33 +412,38 @@ gst_glimage_sink_change_state (GstElement * element, GstStateChange transition) case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: + g_atomic_int_set (&glimage_sink->to_quit, 0); if (!glimage_sink->display) { - gboolean ok = FALSE; + GstGLWindow *window; + 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); - /* init opengl context */ - ok = gst_gl_display_create_context (glimage_sink->display, 0); - if (!ok) { + if (!gst_gl_window_create_context (window, 0, &error)) { GST_ELEMENT_ERROR (glimage_sink, RESOURCE, NOT_FOUND, - GST_GL_DISPLAY_ERR_MSG (glimage_sink->display), (NULL)); + ("%s", error->message), (NULL)); if (glimage_sink->display) { g_object_unref (glimage_sink->display); glimage_sink->display = NULL; } + gst_object_unref (window); return GST_STATE_CHANGE_FAILURE; } /* setup callbacks */ - gst_gl_window_set_resize_callback (glimage_sink->display->gl_window, + gst_gl_window_set_resize_callback (window, GST_GL_WINDOW_RESIZE_CB (gst_glimage_sink_on_resize), glimage_sink); - gst_gl_window_set_draw_callback (glimage_sink->display->gl_window, + gst_gl_window_set_draw_callback (window, GST_GL_WINDOW_CB (gst_glimage_sink_on_draw), glimage_sink); - gst_gl_window_set_close_callback (glimage_sink->display->gl_window, + gst_gl_window_set_close_callback (window, GST_GL_WINDOW_CB (gst_glimage_sink_on_close), glimage_sink); + + gst_object_unref (window); } break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: @@ -470,14 +475,14 @@ gst_glimage_sink_change_state (GstElement * element, GstStateChange transition) GST_VIDEO_SINK_WIDTH (glimage_sink) = 1; GST_VIDEO_SINK_HEIGHT (glimage_sink) = 1; - - gst_gl_window_set_resize_callback (glimage_sink->display->gl_window, - GST_GL_WINDOW_RESIZE_CB (NULL), NULL); - gst_gl_window_set_draw_callback (glimage_sink->display->gl_window, - GST_GL_WINDOW_CB (NULL), NULL); - gst_gl_window_set_close_callback (glimage_sink->display->gl_window, - GST_GL_WINDOW_CB (NULL), NULL); if (glimage_sink->display) { + GstGLWindow *window = gst_gl_display_get_window (glimage_sink->display); + + gst_gl_window_set_resize_callback (window, NULL, NULL); + gst_gl_window_set_draw_callback (window, NULL, NULL); + gst_gl_window_set_close_callback (window, NULL, NULL); + + g_object_unref (window); g_object_unref (glimage_sink->display); glimage_sink->display = NULL; } @@ -641,9 +646,12 @@ 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); + glimage_sink->window_id = glimage_sink->new_window_id; - gst_gl_window_set_window_handle (glimage_sink->display->gl_window, - glimage_sink->window_id); + gst_gl_window_set_window_handle (window, glimage_sink->window_id); + + gst_object_unref (window); } //the buffer is cleared when an other comes in if (glimage_sink->stored_buffer) { @@ -671,6 +679,12 @@ gst_glimage_sink_render (GstBaseSink * bsink, GstBuffer * buf) gst_video_frame_unmap (&frame); + if (g_atomic_int_get (&glimage_sink->to_quit) != 0) { + GST_ELEMENT_ERROR (glimage_sink, RESOURCE, NOT_FOUND, + GST_GL_DISPLAY_ERR_MSG (glimage_sink->display), (NULL)); + return GST_FLOW_ERROR; + } + return GST_FLOW_OK; /* ERRORS */ @@ -715,9 +729,12 @@ 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); + glimage_sink->window_id = glimage_sink->new_window_id; - gst_gl_window_set_window_handle (glimage_sink->display->gl_window, - glimage_sink->window_id); + gst_gl_window_set_window_handle (window, glimage_sink->window_id); + + gst_object_unref (window); } gst_glimage_sink_redisplay (glimage_sink, 0, 0, 0, 0, 0, @@ -900,15 +917,19 @@ gst_glimage_sink_on_draw (GstGLImageSink * gl_sink) /* check if a client draw callback is registered */ if (gl_sink->clientDrawCallback) { + GstGLWindow *window = gst_gl_display_get_window (gl_sink->display); + gboolean doRedisplay = gl_sink->clientDrawCallback (gl_sink->redisplay_texture, gl_sink->redisplay_texture_width, gl_sink->redisplay_texture_height, gl_sink->client_data); - if (doRedisplay && gl_sink->display->gl_window) - gst_gl_window_draw_unlocked (gl_sink->display->gl_window, + if (doRedisplay && window) + gst_gl_window_draw_unlocked (window, gl_sink->redisplay_texture_width, gl_sink->redisplay_texture_height); + + gst_object_unref (window); } /* default opengl scene */ else { @@ -990,6 +1011,8 @@ static void gst_glimage_sink_on_close (GstGLImageSink * gl_sink) { gst_gl_display_set_error (gl_sink->display, "Output window was closed"); + + g_atomic_int_set (&gl_sink->to_quit, 1); } static gboolean @@ -997,15 +1020,17 @@ 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) { - gboolean isAlive; + GstGLWindow *window; + gboolean alive; + + window = gst_gl_display_get_window (gl_sink->display); - gst_gl_display_lock (gl_sink->display); - if (gl_sink->display->isAlive) { + if (window && gst_gl_window_is_running (window)) { #if GST_GL_HAVE_GLES2 if (USING_GLES2 (gl_sink->display)) { if (!gl_sink->redisplay_shader) { - gst_gl_window_send_message (display->gl_window, + gst_gl_window_send_message (window, GST_GL_WINDOW_CB (gst_glimage_sink_thread_init_redisplay), display); } } @@ -1017,14 +1042,13 @@ gst_glimage_sink_redisplay (GstGLImageSink * gl_sink, GLuint texture, gl_sink->redisplay_texture_height = gl_height; } gl_sink->keep_aspect_ratio = keep_aspect_ratio; - if (gl_sink->display->gl_window) - gst_gl_window_draw (gl_sink->display->gl_window, window_width, - window_height); + if (window) + gst_gl_window_draw (window, window_width, window_height); } - isAlive = gl_sink->display->isAlive; - gst_gl_display_unlock (gl_sink->display); + alive = gst_gl_window_is_running (window); + gst_object_unref (window); - return isAlive; + return alive; } void diff --git a/gst/gl/gstglimagesink.h b/gst/gl/gstglimagesink.h index 2a97bf6..f75ea93 100644 --- a/gst/gl/gstglimagesink.h +++ b/gst/gl/gstglimagesink.h @@ -70,6 +70,7 @@ struct _GstGLImageSink CDCB clientDrawCallback; gpointer client_data; + volatile gint to_quit; gboolean keep_aspect_ratio; GValue *par; diff --git a/gst/gl/gstgloverlay.c b/gst/gl/gstgloverlay.c index 75b71ae..f228d92 100644 --- a/gst/gl/gstgloverlay.c +++ b/gst/gl/gstgloverlay.c @@ -632,8 +632,9 @@ init_pixbuf_texture (GstGLDisplay * display, gpointer data) gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); } - } else - display->isAlive = FALSE; + } + //else + // display->isAlive = FALSE; } static gboolean diff --git a/gst/gl/gstgltestsrc.c b/gst/gl/gstgltestsrc.c index 0c7fee0..afaa70d 100644 --- a/gst/gl/gstgltestsrc.c +++ b/gst/gl/gstgltestsrc.c @@ -554,11 +554,18 @@ gst_gl_test_src_start (GstBaseSrc * basesrc) src->display = g_object_ref (GST_GL_DISPLAY (g_value_get_pointer (id_value))); else { + GstGLWindow *window; + GError *error = NULL; + GST_INFO ("Creating GstGLDisplay"); src->display = gst_gl_display_new (); - if (!gst_gl_display_create_context (src->display, 0)) { + window = gst_gl_window_new (src->display); + gst_gl_display_set_window (src->display, window); + g_object_unref (window); + + if (!gst_gl_window_create_context (window, 0, &error)) { GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, - GST_GL_DISPLAY_ERR_MSG (src->display), (NULL)); + ("%s", error->message), (NULL)); return FALSE; } } |