From 9ac74c59db5b2cb7090b9e18fda1894c8511e881 Mon Sep 17 00:00:00 2001 From: Stefan Kost Date: Mon, 14 Mar 2011 11:14:04 +0200 Subject: [PATCH] textoverlay: use a class wide mutex to work around pango reentrance issues Pango is not reentrant. Use a class wide mutex to protect pange use in gst_text_overlay_render_pangocairo(). This works reliable in contrast to the hack in my previous commit. Fixes Bug #412678 --- ext/pango/gsttextoverlay.c | 6 ++++++ ext/pango/gsttextoverlay.h | 1 + 2 files changed, 7 insertions(+) diff --git a/ext/pango/gsttextoverlay.c b/ext/pango/gsttextoverlay.c index 54a260f..ca38dc1 100644 --- a/ext/pango/gsttextoverlay.c +++ b/ext/pango/gsttextoverlay.c @@ -375,6 +375,8 @@ gst_text_overlay_class_init (GstTextOverlayClass * klass) gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_text_overlay_change_state); + klass->pango_lock = g_mutex_new (); + klass->get_text = gst_text_overlay_get_text; fontmap = pango_cairo_font_map_get_default (); klass->pango_context = @@ -1235,6 +1237,8 @@ gst_text_overlay_render_pangocairo (GstTextOverlay * overlay, double scalef = 1.0; double a, r, g, b; + g_mutex_lock (GST_TEXT_OVERLAY_GET_CLASS (overlay)->pango_lock); + if (overlay->auto_adjust_size) { /* 640 pixel is default */ scalef = (double) (overlay->width) / DEFAULT_SCALE_BASIS; @@ -1298,6 +1302,8 @@ gst_text_overlay_render_pangocairo (GstTextOverlay * overlay, cairo_matrix_init_scale (&cairo_matrix, scalef, scalef); } + g_mutex_unlock (GST_TEXT_OVERLAY_GET_CLASS (overlay)->pango_lock); + /* reallocate surface */ overlay->text_image = g_realloc (overlay->text_image, 4 * width * height); diff --git a/ext/pango/gsttextoverlay.h b/ext/pango/gsttextoverlay.h index 10dd947..d230121 100644 --- a/ext/pango/gsttextoverlay.h +++ b/ext/pango/gsttextoverlay.h @@ -155,6 +155,7 @@ struct _GstTextOverlayClass { GstElementClass parent_class; PangoContext *pango_context; + GMutex *pango_lock; gchar * (*get_text) (GstTextOverlay *overlay, GstBuffer *video_frame); }; -- 2.7.4