timeline-object: Add TrackObject to the Track after the TimelineObject
[platform/upstream/gstreamer.git] / ges / ges-track-text-overlay.c
1 /* GStreamer Editing Services
2  * Copyright (C) 2010 Brandon Lewis <brandon.lewis@collabora.co.uk>
3  *               2010 Nokia Corporation
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public
16  * License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18  * Boston, MA 02111-1307, USA.
19  */
20
21 /**
22  * SECTION:ges-track-text-overlay
23  * @short_description: render text onto another video stream in a
24  * #GESTimelineLayer
25  *
26  */
27
28 #include "ges-internal.h"
29 #include "ges-track-object.h"
30 #include "ges-track-title-source.h"
31 #include "ges-track-text-overlay.h"
32
33 G_DEFINE_TYPE (GESTrackTextOverlay, ges_track_text_overlay,
34     GES_TYPE_TRACK_OPERATION);
35
36 struct _GESTrackTextOverlayPrivate
37 {
38   gchar *text;
39   gchar *font_desc;
40   GESTextHAlign halign;
41   GESTextVAlign valign;
42   guint32 color;
43   gdouble xpos;
44   gdouble ypos;
45   GstElement *text_el;
46 };
47
48 enum
49 {
50   PROP_0,
51 };
52
53 static void ges_track_text_overlay_dispose (GObject * object);
54
55 static void ges_track_text_overlay_finalize (GObject * object);
56
57 static void ges_track_text_overlay_get_property (GObject * object, guint
58     property_id, GValue * value, GParamSpec * pspec);
59
60 static void ges_track_text_overlay_set_property (GObject * object, guint
61     property_id, const GValue * value, GParamSpec * pspec);
62
63 static GstElement *ges_track_text_overlay_create_element (GESTrackObject
64     * self);
65
66 static void
67 ges_track_text_overlay_class_init (GESTrackTextOverlayClass * klass)
68 {
69   GObjectClass *object_class = G_OBJECT_CLASS (klass);
70   GESTrackObjectClass *bg_class = GES_TRACK_OBJECT_CLASS (klass);
71
72   g_type_class_add_private (klass, sizeof (GESTrackTextOverlayPrivate));
73
74   object_class->get_property = ges_track_text_overlay_get_property;
75   object_class->set_property = ges_track_text_overlay_set_property;
76   object_class->dispose = ges_track_text_overlay_dispose;
77   object_class->finalize = ges_track_text_overlay_finalize;
78
79   bg_class->create_element = ges_track_text_overlay_create_element;
80 }
81
82 static void
83 ges_track_text_overlay_init (GESTrackTextOverlay * self)
84 {
85   self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
86       GES_TYPE_TRACK_TEXT_OVERLAY, GESTrackTextOverlayPrivate);
87
88   self->priv->text = NULL;
89   self->priv->font_desc = NULL;
90   self->priv->text_el = NULL;
91   self->priv->halign = DEFAULT_HALIGNMENT;
92   self->priv->valign = DEFAULT_VALIGNMENT;
93   self->priv->color = G_MAXUINT32;
94   self->priv->xpos = 0.5;
95   self->priv->ypos = 0.5;
96 }
97
98 static void
99 ges_track_text_overlay_dispose (GObject * object)
100 {
101   GESTrackTextOverlay *self = GES_TRACK_TEXT_OVERLAY (object);
102   if (self->priv->text) {
103     g_free (self->priv->text);
104   }
105
106   if (self->priv->font_desc) {
107     g_free (self->priv->font_desc);
108   }
109
110   if (self->priv->text_el) {
111     g_object_unref (self->priv->text_el);
112     self->priv->text_el = NULL;
113   }
114
115   G_OBJECT_CLASS (ges_track_text_overlay_parent_class)->dispose (object);
116 }
117
118 static void
119 ges_track_text_overlay_finalize (GObject * object)
120 {
121   G_OBJECT_CLASS (ges_track_text_overlay_parent_class)->finalize (object);
122 }
123
124 static void
125 ges_track_text_overlay_get_property (GObject * object,
126     guint property_id, GValue * value, GParamSpec * pspec)
127 {
128   switch (property_id) {
129     default:
130       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
131   }
132 }
133
134 static void
135 ges_track_text_overlay_set_property (GObject * object,
136     guint property_id, const GValue * value, GParamSpec * pspec)
137 {
138   switch (property_id) {
139     default:
140       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
141   }
142 }
143
144 static GstElement *
145 ges_track_text_overlay_create_element (GESTrackObject * object)
146 {
147   GstElement *ret, *text, *iconv, *oconv;
148   GstPad *src_target, *sink_target;
149   GstPad *src, *sink;
150   GESTrackTextOverlay *self = GES_TRACK_TEXT_OVERLAY (object);
151
152   text = gst_element_factory_make ("textoverlay", NULL);
153   iconv = gst_element_factory_make ("ffmpegcolorspace", NULL);
154   oconv = gst_element_factory_make ("ffmpegcolorspace", NULL);
155   self->priv->text_el = text;
156   g_object_ref (text);
157
158   if (self->priv->text)
159     g_object_set (text, "text", (gchar *) self->priv->text, NULL);
160   if (self->priv->font_desc)
161     g_object_set (text, "font-desc", (gchar *) self->priv->font_desc, NULL);
162
163   g_object_set (text, "halignment", (gint) self->priv->halign, "valignment",
164       (gint) self->priv->valign, NULL);
165   g_object_set (text, "color", (guint32) self->priv->color, NULL);
166   g_object_set (text, "xpos", (gdouble) self->priv->xpos, NULL);
167   g_object_set (text, "ypos", (gdouble) self->priv->ypos, NULL);
168
169   ret = gst_bin_new ("overlay-bin");
170   gst_bin_add_many (GST_BIN (ret), text, iconv, oconv, NULL);
171   gst_element_link_many (iconv, text, oconv, NULL);
172
173   src_target = gst_element_get_static_pad (oconv, "src");
174   sink_target = gst_element_get_static_pad (iconv, "sink");
175
176   src = gst_ghost_pad_new ("src", src_target);
177   sink = gst_ghost_pad_new ("video_sink", sink_target);
178   g_object_unref (src_target);
179   g_object_unref (sink_target);
180
181   gst_element_add_pad (ret, src);
182   gst_element_add_pad (ret, sink);
183
184   return ret;
185 }
186
187 /**
188  * ges_track_text_overlay_set_text:
189  * @self: the #GESTrackTextOverlay* to set text on
190  * @text: the text to render. an internal copy of this text will be
191  * made.
192  *
193  * Sets the text this track object will render.
194  *
195  */
196 void
197 ges_track_text_overlay_set_text (GESTrackTextOverlay * self, const gchar * text)
198 {
199   GST_DEBUG ("self:%p, text:%s", self, text);
200
201   if (self->priv->text)
202     g_free (self->priv->text);
203
204   self->priv->text = g_strdup (text);
205   if (self->priv->text_el)
206     g_object_set (self->priv->text_el, "text", text, NULL);
207 }
208
209 /**
210  * ges_track_text_overlay_set_font_desc:
211  * @self: the #GESTrackTextOverlay
212  * @font_desc: the pango font description
213  *
214  * Sets the pango font description of the text this track object
215  * will render.
216  *
217  */
218 void
219 ges_track_text_overlay_set_font_desc (GESTrackTextOverlay * self,
220     const gchar * font_desc)
221 {
222   GST_DEBUG ("self:%p, font_desc:%s", self, font_desc);
223
224   if (self->priv->font_desc)
225     g_free (self->priv->font_desc);
226
227   self->priv->font_desc = g_strdup (font_desc);
228   GST_LOG ("setting font-desc to '%s'", font_desc);
229   if (self->priv->text_el)
230     g_object_set (self->priv->text_el, "font-desc", font_desc, NULL);
231 }
232
233 /**
234  * ges_track_text_overlay_set_valignment:
235  * @self: the #GESTrackTextOverlay* to set text on
236  * @valign: The #GESTextVAlign defining the vertical alignment
237  * of the text render by @self.
238  *
239  * Sets the vertical aligment of the text.
240  *
241  */
242 void
243 ges_track_text_overlay_set_valignment (GESTrackTextOverlay * self,
244     GESTextVAlign valign)
245 {
246   GST_DEBUG ("self:%p, halign:%d", self, valign);
247
248   self->priv->valign = valign;
249   if (self->priv->text_el)
250     g_object_set (self->priv->text_el, "valignment", valign, NULL);
251 }
252
253 /**
254  * ges_track_text_overlay_set_halignment:
255  * @self: the #GESTrackTextOverlay* to set text on
256  * @halign: The #GESTextHAlign defining the horizontal alignment
257  * of the text render by @self.
258  *
259  * Sets the horizontal aligment of the text.
260  *
261  */
262 void
263 ges_track_text_overlay_set_halignment (GESTrackTextOverlay * self,
264     GESTextHAlign halign)
265 {
266   GST_DEBUG ("self:%p, halign:%d", self, halign);
267
268   self->priv->halign = halign;
269   if (self->priv->text_el)
270     g_object_set (self->priv->text_el, "halignment", halign, NULL);
271 }
272
273 /**
274  * ges_track_text_overlay_set_color:
275  * @self: the #GESTrackTextOverlay* to set
276  * @color: The color @self is being set to
277  *
278  * Sets the color of the text.
279  *
280  * Since: 0.10.2
281  */
282 void
283 ges_track_text_overlay_set_color (GESTrackTextOverlay * self, guint32 color)
284 {
285   GST_DEBUG ("self:%p, color:%d", self, color);
286
287   self->priv->color = color;
288   if (self->priv->text_el)
289     g_object_set (self->priv->text_el, "color", color, NULL);
290 }
291
292 /**
293  * ges_track_text_overlay_set_xpos:
294  * @self: the #GESTrackTextOverlay* to set
295  * @position: The horizontal position @self is being set to
296  *
297  * Sets the horizontal position of the text.
298  *
299  * Since: 0.10.2
300  */
301 void
302 ges_track_text_overlay_set_xpos (GESTrackTextOverlay * self, gdouble position)
303 {
304   GST_DEBUG ("self:%p, xpos:%f", self, position);
305
306   self->priv->xpos = position;
307   if (self->priv->text_el)
308     g_object_set (self->priv->text_el, "xpos", position, NULL);
309 }
310
311 /**
312  * ges_track_text_overlay_set_ypos:
313  * @self: the #GESTrackTextOverlay* to set
314  * @position: The vertical position @self is being set to
315  *
316  * Sets the vertical position of the text.
317  *
318  * Since: 0.10.2
319  */
320 void
321 ges_track_text_overlay_set_ypos (GESTrackTextOverlay * self, gdouble position)
322 {
323   GST_DEBUG ("self:%p, ypos:%f", self, position);
324
325   self->priv->ypos = position;
326   if (self->priv->text_el)
327     g_object_set (self->priv->text_el, "ypos", position, NULL);
328 }
329
330 /**
331  * ges_track_text_overlay_get_text:
332  * @self: a GESTrackTextOverlay
333  *
334  * Get the text currently set on @source.
335  *
336  * Returns: The text currently set on @source.
337  */
338 const gchar *
339 ges_track_text_overlay_get_text (GESTrackTextOverlay * self)
340 {
341   return self->priv->text;
342 }
343
344 /**
345  * ges_track_text_overlay_get_font_desc:
346  * @self: a GESTrackTextOverlay
347  *
348  * Get the pango font description currently set on @source.
349  *
350  * Returns: The pango font description currently set on @source.
351  */
352 const char *
353 ges_track_text_overlay_get_font_desc (GESTrackTextOverlay * self)
354 {
355   return self->priv->font_desc;
356 }
357
358 /**
359  * ges_track_text_overlay_get_halignment:
360  * @self: a GESTrackTextOverlay
361  *
362  * Get the horizontal aligment used by @source.
363  *
364  * Returns: The horizontal aligment used by @source.
365  */
366 GESTextHAlign
367 ges_track_text_overlay_get_halignment (GESTrackTextOverlay * self)
368 {
369   return self->priv->halign;
370 }
371
372 /**
373  * ges_track_text_overlay_get_valignment:
374  * @self: a GESTrackTextOverlay
375  *
376  * Get the vertical aligment used by @source.
377  *
378  * Returns: The vertical aligment used by @source.
379  */
380 GESTextVAlign
381 ges_track_text_overlay_get_valignment (GESTrackTextOverlay * self)
382 {
383   return self->priv->valign;
384 }
385
386 /**
387  * ges_track_text_overlay_get_color:
388  * @self: a GESTrackTextOverlay
389  *
390  * Get the color used by @source.
391  *
392  * Returns: The color used by @source.
393  *
394  * Since: 0.10.2
395  */
396 const guint32
397 ges_track_text_overlay_get_color (GESTrackTextOverlay * self)
398 {
399   return self->priv->color;
400 }
401
402 /**
403  * ges_track_text_overlay_get_xpos:
404  * @self: a GESTrackTextOverlay
405  *
406  * Get the horizontal position used by @source.
407  *
408  * Returns: The horizontal position used by @source.
409  *
410  * Since: 0.10.2
411  */
412 const gdouble
413 ges_track_text_overlay_get_xpos (GESTrackTextOverlay * self)
414 {
415   return self->priv->xpos;
416 }
417
418 /**
419  * ges_track_text_overlay_get_ypos:
420  * @self: a GESTrackTextOverlay
421  *
422  * Get the vertical position used by @source.
423  *
424  * Returns: The vertical position used by @source.
425  *
426  * Since: 0.10.2
427  */
428 const gdouble
429 ges_track_text_overlay_get_ypos (GESTrackTextOverlay * self)
430 {
431   return self->priv->ypos;
432 }
433
434 /**
435  * ges_track_text_overlay_new:
436  *
437  * Creates a new #GESTrackTextOverlay.
438  *
439  * Returns: The newly created #GESTrackTextOverlay or %NULL if something went
440  * wrong.
441  */
442 GESTrackTextOverlay *
443 ges_track_text_overlay_new (void)
444 {
445   return g_object_new (GES_TYPE_TRACK_TEXT_OVERLAY, NULL);
446 }