diff options
author | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2012-10-04 15:47:54 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2012-10-18 14:35:17 +0200 |
commit | c91238a2afbdb0088514de60bb7e8f4e8680f317 (patch) | |
tree | d2c94670b92352fa47f31a5f3ca7f3d49e71237a | |
parent | 310e5111b70961e224b44b7aa7a87aaf0e925766 (diff) | |
download | gstreamer-plugins-bad-c91238a2afbdb0088514de60bb7e8f4e8680f317.tar.gz |
eglglessink: Fix handling of caps changes by only releasing what needs to be released
And not terminating the display connection
-rw-r--r-- | ext/eglgles/gsteglglessink.c | 61 |
1 files changed, 27 insertions, 34 deletions
diff --git a/ext/eglgles/gsteglglessink.c b/ext/eglgles/gsteglglessink.c index 5717d5949..a1472c72a 100644 --- a/ext/eglgles/gsteglglessink.c +++ b/ext/eglgles/gsteglglessink.c @@ -378,7 +378,8 @@ static inline gboolean got_gl_error (const char *wtf); static inline void show_egl_error (const char *wtf); static void gst_eglglessink_wipe_fmt (gpointer data); static inline gboolean egl_init (GstEglGlesSink * eglglessink); -static gboolean gst_eglglessink_context_make_current (GstEglGlesSink * eglglessink, gboolean bind, gboolean streaming_thread); +static gboolean gst_eglglessink_context_make_current (GstEglGlesSink * + eglglessink, gboolean bind, gboolean streaming_thread); static GstBufferClass *gsteglglessink_buffer_parent_class = NULL; #define GST_TYPE_EGLGLESBUFFER (gst_eglglesbuffer_get_type()) @@ -1444,7 +1445,7 @@ static pthread_key_t context_key; static void detach_context (void *data) { - GstEglGlesSink * eglglessink = data; + GstEglGlesSink *eglglessink = data; GST_DEBUG_OBJECT (eglglessink, "Detaching current context from streaming thread"); @@ -1453,7 +1454,8 @@ detach_context (void *data) } static gboolean -gst_eglglessink_context_make_current (GstEglGlesSink * eglglessink, gboolean bind, gboolean streaming_thread) +gst_eglglessink_context_make_current (GstEglGlesSink * eglglessink, + gboolean bind, gboolean streaming_thread) { g_assert (eglglessink->eglglesctx->display != NULL); @@ -1469,7 +1471,8 @@ gst_eglglessink_context_make_current (GstEglGlesSink * eglglessink, gboolean bin GST_DEBUG_OBJECT (eglglessink, "Attaching context to streaming thread"); if (!eglMakeCurrent (eglglessink->eglglesctx->display, - eglglessink->eglglesctx->surface, eglglessink->eglglesctx->surface, + eglglessink->eglglesctx->surface, + eglglessink->eglglesctx->surface, eglglessink->eglglesctx->eglcontext)) { show_egl_error ("eglMakeCurrent"); GST_ERROR_OBJECT (eglglessink, "Couldn't bind context"); @@ -1482,7 +1485,8 @@ gst_eglglessink_context_make_current (GstEglGlesSink * eglglessink, gboolean bin } else { GST_DEBUG_OBJECT (eglglessink, "Attaching context"); if (!eglMakeCurrent (eglglessink->eglglesctx->display, - eglglessink->eglglesctx->surface, eglglessink->eglglesctx->surface, + eglglessink->eglglesctx->surface, + eglglessink->eglglesctx->surface, eglglessink->eglglesctx->eglcontext)) { show_egl_error ("eglMakeCurrent"); GST_ERROR_OBJECT (eglglessink, "Couldn't bind context"); @@ -1492,8 +1496,7 @@ gst_eglglessink_context_make_current (GstEglGlesSink * eglglessink, gboolean bin } else { GST_DEBUG_OBJECT (eglglessink, "Detaching context"); if (!eglMakeCurrent (eglglessink->eglglesctx->display, - EGL_NO_SURFACE, EGL_NO_SURFACE, - EGL_NO_CONTEXT)) { + EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)) { show_egl_error ("eglMakeCurrent"); GST_ERROR_OBJECT (eglglessink, "Couldn't unbind context"); return FALSE; @@ -1793,7 +1796,8 @@ gst_eglglessink_init_egl_display (GstEglGlesSink * eglglessink) } if (!eglInitialize (eglglessink->eglglesctx->display, - &eglglessink->eglglesctx->egl_major, &eglglessink->eglglesctx->egl_minor)) { + &eglglessink->eglglesctx->egl_major, + &eglglessink->eglglesctx->egl_minor)) { show_egl_error ("eglInitialize"); GST_ERROR_OBJECT (eglglessink, "Could not init EGL display connection"); goto HANDLE_EGL_ERROR; @@ -2120,17 +2124,18 @@ gst_eglglessink_render_and_display (GstEglGlesSink * eglglessink, eglglessink->eglglesctx->surface_height; } else { if (!gst_video_calculate_display_ratio (&dar_n, &dar_d, w, h, - eglglessink->par_n, eglglessink->par_d, - eglglessink->eglglesctx->pixel_aspect_ratio, EGL_DISPLAY_SCALING)) { + eglglessink->par_n, eglglessink->par_d, + eglglessink->eglglesctx->pixel_aspect_ratio, + EGL_DISPLAY_SCALING)) { GST_WARNING_OBJECT (eglglessink, "Could not compute resulting DAR"); frame.w = w; frame.h = h; } else { - /* Find suitable matching new size acording to dar & par - * rationale for prefering leaving the height untouched - * comes from interlacing considerations. - * XXX: Move this to gstutils? - */ + /* Find suitable matching new size acording to dar & par + * rationale for prefering leaving the height untouched + * comes from interlacing considerations. + * XXX: Move this to gstutils? + */ if (h % dar_d == 0) { frame.w = gst_util_uint64_scale_int (h, dar_n, dar_d); frame.h = h; @@ -2286,6 +2291,10 @@ gst_eglglessink_setcaps (GstBaseSink * bsink, GstCaps * caps) GST_DEBUG_OBJECT (eglglessink, "Caps are not compatible, reconfiguring"); /* Cleanup */ + + if (!gst_eglglessink_context_make_current (eglglessink, TRUE, TRUE)) + return FALSE; + if (eglglessink->rendering_path == GST_EGLGLESSINK_RENDER_SLOW) { glUseProgram (0); @@ -2315,6 +2324,9 @@ gst_eglglessink_setcaps (GstBaseSink * bsink, GstCaps * caps) } } + if (!gst_eglglessink_context_make_current (eglglessink, FALSE, TRUE)) + return FALSE; + if (eglglessink->eglglesctx->surface) { eglDestroySurface (eglglessink->eglglesctx->display, eglglessink->eglglesctx->surface); @@ -2328,25 +2340,6 @@ gst_eglglessink_setcaps (GstBaseSink * bsink, GstCaps * caps) eglglessink->eglglesctx->eglcontext = NULL; } - /* Terminate display connection */ - if (eglMakeCurrent (eglglessink->eglglesctx->display, EGL_NO_SURFACE, - EGL_NO_SURFACE, EGL_NO_CONTEXT) == EGL_FALSE) { - show_egl_error ("eglMakeCurrent"); - goto HANDLE_ERROR; - } - - if (eglTerminate (eglglessink->eglglesctx->display) == EGL_FALSE) { - show_egl_error ("eglTerminate"); - goto HANDLE_ERROR; - } - - eglglessink->eglglesctx->display = NULL; - - if (!gst_eglglessink_init_egl_display (eglglessink)) { - GST_ERROR_OBJECT (eglglessink, "Could not reinit display connection"); - goto HANDLE_ERROR; - } - g_mutex_lock (eglglessink->flow_lock); /* Reset display region * XXX: Should probably keep old ones if set_render_rect() |