textoverlay: use a class wide mutex to work around pango reentrance issues
authorStefan Kost <ensonic@users.sf.net>
Mon, 14 Mar 2011 09:14:04 +0000 (11:14 +0200)
committerStefan Kost <ensonic@users.sf.net>
Mon, 14 Mar 2011 09:17:10 +0000 (11:17 +0200)
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
ext/pango/gsttextoverlay.h

index 54a260f..ca38dc1 100644 (file)
@@ -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);
 
index 10dd947..d230121 100644 (file)
@@ -155,6 +155,7 @@ struct _GstTextOverlayClass {
     GstElementClass parent_class;
 
     PangoContext *pango_context;
+    GMutex       *pango_lock;
 
     gchar *     (*get_text) (GstTextOverlay *overlay, GstBuffer *video_frame);
 };