Merge branch 'master' into 0.11
[platform/upstream/gstreamer.git] / ext / pango / gsttextrender.c
index e200758..cc174f7 100644 (file)
@@ -162,7 +162,8 @@ gst_text_render_line_align_get_type (void)
 static void gst_text_render_adjust_values_with_fontdesc (GstTextRender *
     render, PangoFontDescription * desc);
 
-GST_BOILERPLATE (GstTextRender, gst_text_render, GstElement, GST_TYPE_ELEMENT);
+#define gst_text_render_parent_class parent_class
+G_DEFINE_TYPE (GstTextRender, gst_text_render, GST_TYPE_ELEMENT);
 
 static void gst_text_render_finalize (GObject * object);
 static void gst_text_render_set_property (GObject * object,
@@ -171,29 +172,14 @@ static void gst_text_render_get_property (GObject * object,
     guint prop_id, GValue * value, GParamSpec * pspec);
 
 static void
-gst_text_render_base_init (gpointer g_class)
-{
-  GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
-
-  gst_element_class_add_pad_template (element_class,
-      gst_static_pad_template_get (&src_template_factory));
-  gst_element_class_add_pad_template (element_class,
-      gst_static_pad_template_get (&sink_template_factory));
-
-  gst_element_class_set_details_simple (element_class, "Text renderer",
-      "Filter/Editor/Video",
-      "Renders a text string to an image bitmap",
-      "David Schleef <ds@schleef.org>, "
-      "GStreamer maintainers <gstreamer-devel@lists.sourceforge.net>");
-}
-
-static void
 gst_text_render_class_init (GstTextRenderClass * klass)
 {
   GObjectClass *gobject_class;
+  GstElementClass *gstelement_class;
   PangoFontMap *fontmap;
 
   gobject_class = (GObjectClass *) klass;
+  gstelement_class = (GstElementClass *) klass;
 
   parent_class = g_type_class_peek_parent (klass);
 
@@ -201,6 +187,17 @@ gst_text_render_class_init (GstTextRenderClass * klass)
   gobject_class->set_property = gst_text_render_set_property;
   gobject_class->get_property = gst_text_render_get_property;
 
+  gst_element_class_add_pad_template (gstelement_class,
+      gst_static_pad_template_get (&src_template_factory));
+  gst_element_class_add_pad_template (gstelement_class,
+      gst_static_pad_template_get (&sink_template_factory));
+
+  gst_element_class_set_details_simple (gstelement_class, "Text renderer",
+      "Filter/Editor/Video",
+      "Renders a text string to an image bitmap",
+      "David Schleef <ds@schleef.org>, "
+      "GStreamer maintainers <gstreamer-devel@lists.sourceforge.net>");
+
   fontmap = pango_cairo_font_map_get_default ();
   klass->pango_context =
       pango_cairo_font_map_create_context (PANGO_CAIRO_FONT_MAP (fontmap));
@@ -467,14 +464,16 @@ gst_text_render_chain (GstPad * pad, GstBuffer * inbuf)
   GstTextRender *render;
   GstFlowReturn ret;
   GstBuffer *outbuf;
-  GstCaps *caps = NULL, *padcaps, *peercaps;
-  guint8 *data = GST_BUFFER_DATA (inbuf);
-  guint size = GST_BUFFER_SIZE (inbuf);
+  GstCaps *caps = NULL, *padcaps;
+  guint8 *data;
+  gsize size;
   gint n;
   gint xpos, ypos;
 
   render = GST_TEXT_RENDER (gst_pad_get_parent (pad));
 
+  data = gst_buffer_map (inbuf, &size, NULL, GST_MAP_READ);
+
   /* somehow pango barfs over "\0" buffers... */
   while (size > 0 &&
       (data[size - 1] == '\r' ||
@@ -486,14 +485,13 @@ gst_text_render_chain (GstPad * pad, GstBuffer * inbuf)
   GST_DEBUG ("rendering '%*s'", size, data);
   pango_layout_set_markup (render->layout, (gchar *) data, size);
   gst_text_render_render_pangocairo (render);
+  gst_buffer_unmap (inbuf, data, size);
 
   gst_text_render_check_argb (render);
 
-  peercaps = gst_pad_peer_get_caps (render->srcpad);
-  padcaps = gst_pad_get_caps (render->srcpad);
-  caps = gst_caps_intersect (padcaps, peercaps);
+  padcaps = gst_pad_get_caps (render->srcpad, NULL);
+  caps = gst_pad_peer_get_caps (render->srcpad, padcaps);
   gst_caps_unref (padcaps);
-  gst_caps_unref (peercaps);
 
   if (!caps || gst_caps_is_empty (caps)) {
     GST_ELEMENT_ERROR (render, CORE, NEGOTIATION, (NULL), (NULL));
@@ -511,15 +509,10 @@ gst_text_render_chain (GstPad * pad, GstBuffer * inbuf)
   }
 
   GST_DEBUG ("Allocating buffer WxH = %dx%d", render->width, render->height);
-  ret =
-      gst_pad_alloc_buffer_and_set_caps (render->srcpad, GST_BUFFER_OFFSET_NONE,
-      render->width * render->height * 4, caps, &outbuf);
-
-  if (ret != GST_FLOW_OK)
-    goto done;
+  outbuf = gst_buffer_new_and_alloc (render->width * render->height * 4);
 
-  gst_buffer_copy_metadata (outbuf, inbuf, GST_BUFFER_COPY_TIMESTAMPS);
-  data = GST_BUFFER_DATA (outbuf);
+  gst_buffer_copy_into (outbuf, inbuf, GST_BUFFER_COPY_TIMESTAMPS, 0, -1);
+  data = gst_buffer_map (outbuf, &size, NULL, GST_MAP_WRITE);
 
   if (render->use_ARGB) {
     memset (data, 0, render->width * render->height * 4);
@@ -568,6 +561,7 @@ gst_text_render_chain (GstPad * pad, GstBuffer * inbuf)
           render->width * 4);
     }
   }
+  gst_buffer_unmap (outbuf, data, size);
 
   ret = gst_pad_push (render->srcpad, outbuf);
 
@@ -593,7 +587,7 @@ gst_text_render_finalize (GObject * object)
 }
 
 static void
-gst_text_render_init (GstTextRender * render, GstTextRenderClass * klass)
+gst_text_render_init (GstTextRender * render)
 {
   GstPadTemplate *template;