summaryrefslogtreecommitdiff
path: root/gst
diff options
context:
space:
mode:
authorMatthew Waters <ystreet00@gmail.com>2013-06-12 23:17:30 +1000
committerSebastian Dröge <slomo@circular-chaos.org>2013-06-29 10:08:56 +0200
commitef7e6c2a9f30f9c3ea41809badcb5b6a66745fe2 (patch)
tree31f56c16a35b3de588629ff522857ea53575afd9 /gst
parent4b918e7784c4dc50f53d395a92e85c04c17bba7c (diff)
display: move context creation into window
Diffstat (limited to 'gst')
-rw-r--r--gst/gl/effects/gstgleffectidentity.c10
-rw-r--r--gst/gl/effects/gstgleffectmirror.c10
-rw-r--r--gst/gl/effects/gstgleffectsqueeze.c10
-rw-r--r--gst/gl/gltestsrc.c6
-rw-r--r--gst/gl/gstglbumper.c2
-rw-r--r--gst/gl/gstgleffects.c4
-rw-r--r--gst/gl/gstglfiltercube.c3
-rw-r--r--gst/gl/gstglimagesink.c86
-rw-r--r--gst/gl/gstglimagesink.h1
-rw-r--r--gst/gl/gstgloverlay.c5
-rw-r--r--gst/gl/gstgltestsrc.c11
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;
}
}