textrender: Don't pass plaintext as pango markup to Pango
authorSebastian Dröge <sebastian@centricular.com>
Mon, 21 Nov 2022 16:47:50 +0000 (18:47 +0200)
committerSebastian Dröge <sebastian@centricular.com>
Mon, 21 Nov 2022 16:47:50 +0000 (18:47 +0200)
Otherwise e.g. & in the text will cause Pango to complain about invalid
markup and render the text incorrectly.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3445>

subprojects/gst-plugins-base/ext/pango/gsttextrender.c
subprojects/gst-plugins-base/ext/pango/gsttextrender.h

index f451753..52ab737 100644 (file)
@@ -531,7 +531,10 @@ gst_text_render_chain (GstPad * pad, GstObject * parent, GstBuffer * inbuf)
 
   /* render text */
   GST_DEBUG ("rendering '%*s'", (gint) size, data);
-  pango_layout_set_markup (render->layout, (gchar *) data, size);
+  if (render->have_pango_markup)
+    pango_layout_set_markup (render->layout, (gchar *) data, size);
+  else
+    pango_layout_set_text (render->layout, (gchar *) data, size);
   gst_text_render_render_pangocairo (render);
   gst_buffer_unmap (inbuf, &map);
 
@@ -630,6 +633,23 @@ gst_text_render_event (GstPad * pad, GstObject * parent, GstEvent * event)
       }
       break;
     }
+    case GST_EVENT_CAPS:
+    {
+      GstCaps *caps;
+      GstStructure *structure;
+      const gchar *format;
+
+      gst_event_parse_caps (event, &caps);
+
+      structure = gst_caps_get_structure (caps, 0);
+      format = gst_structure_get_string (structure, "format");
+      render->have_pango_markup = (strcmp (format, "pango-markup") == 0);
+
+      gst_event_unref (event);
+      ret = TRUE;
+
+      break;
+    }
     default:
       ret = gst_pad_event_default (pad, parent, event);
       break;
index 535fe10..596715d 100644 (file)
@@ -93,6 +93,7 @@ struct _GstTextRender {
     gint ypad;
 
     GstEvent             *segment_event;
+    gboolean              have_pango_markup;
 };
 
 struct _GstTextRenderClass {