diff options
author | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2012-10-17 10:08:10 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2012-10-18 14:35:19 +0200 |
commit | 0ac17bcbc2ee3a0e70ad33a86b799ccfccd06509 (patch) | |
tree | 8a94c673a6c43f16f35a28d1b17bbdc5f08d63a1 | |
parent | e766bd1e0a22fbe371b544ff6c09ab631d053b61 (diff) | |
download | gstreamer-plugins-bad-0ac17bcbc2ee3a0e70ad33a86b799ccfccd06509.tar.gz |
eglglessink: Make window setting/handling a bit more threadsafe
-rw-r--r-- | ext/eglgles/gsteglglessink.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/ext/eglgles/gsteglglessink.c b/ext/eglgles/gsteglglessink.c index 6f81c4875..2b0588c44 100644 --- a/ext/eglgles/gsteglglessink.c +++ b/ext/eglgles/gsteglglessink.c @@ -1309,8 +1309,6 @@ gst_eglglessink_create_window (GstEglGlesSink * eglglessink, gint width, GST_ERROR_OBJECT (eglglessink, "Could not create window"); return window; } - gst_x_overlay_got_window_handle (GST_X_OVERLAY (eglglessink), - (guintptr) window); return window; } @@ -1998,12 +1996,12 @@ gst_eglglessink_set_window_handle (GstXOverlay * overlay, guintptr id) GstEglGlesSink *eglglessink = GST_EGLGLESSINK (overlay); g_return_if_fail (GST_IS_EGLGLESSINK (eglglessink)); - GST_DEBUG_OBJECT (eglglessink, "We got a window handle: %p", (void *) id); + GST_DEBUG_OBJECT (eglglessink, "We got a window handle: %p", (gpointer) id); /* OK, we have a new window */ GST_OBJECT_LOCK (eglglessink); eglglessink->eglglesctx.window = (EGLNativeWindowType) id; - eglglessink->have_window = TRUE; + eglglessink->have_window = ((gpointer) id != NULL); GST_OBJECT_UNLOCK (eglglessink); return; @@ -2388,7 +2386,6 @@ gst_eglglessink_configure_caps (GstEglGlesSink *eglglessink, GstCaps * caps) gboolean ret = TRUE; gint width, height; int par_n, par_d; - EGLNativeWindowType window; GstEglGlesImageFmt *format; if (!(ret = gst_video_format_parse_caps (caps, &eglglessink->format, &width, @@ -2497,18 +2494,26 @@ gst_eglglessink_configure_caps (GstEglGlesSink *eglglessink, GstCaps * caps) /* By now the application should have set a window * if it meant to do so */ + GST_OBJECT_LOCK (eglglessink); if (!eglglessink->have_window) { + EGLNativeWindowType window; + GST_INFO_OBJECT (eglglessink, "No window. Will attempt internal window creation"); if (!(window = gst_eglglessink_create_window (eglglessink, width, height))) { GST_ERROR_OBJECT (eglglessink, "Internal window creation failed!"); + GST_OBJECT_UNLOCK (eglglessink); goto HANDLE_ERROR; } eglglessink->using_own_window = TRUE; - gst_eglglessink_set_window_handle (GST_X_OVERLAY (eglglessink), - (guintptr) window); + eglglessink->eglglesctx.window = window; + eglglessink->have_window = TRUE; } + GST_DEBUG_OBJECT (eglglessink, "Using window handle %p", eglglessink->eglglesctx.window); eglglessink->eglglesctx.used_window = eglglessink->eglglesctx.window; + GST_OBJECT_UNLOCK (eglglessink); + gst_x_overlay_got_window_handle (GST_X_OVERLAY (eglglessink), + (guintptr) eglglessink->eglglesctx.used_window); if (!eglglessink->have_surface) { if (!gst_eglglessink_init_egl_surface (eglglessink)) { |