1 /* GStreamer Editing Services
2 * Copyright (C) 2009 Edward Hervey <edward.hervey@collabora.co.uk>
3 * 2009 Nokia Corporation
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.
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.
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., 51 Franklin St, Fifth Floor,
18 * Boston, MA 02110-1301, USA.
22 * SECTION:gestextoverlayclip
23 * @title: GESTextOverlayClip
24 * @short_description: Render text onto another stream in a GESLayer
26 * Renders text onto the next lower priority stream using textrender.
32 #include "ges-internal.h"
33 #include "ges-text-overlay-clip.h"
34 #include "ges-track-element.h"
35 #include "ges-text-overlay.h"
39 #define DEFAULT_PROP_TEXT ""
40 #define DEFAULT_PROP_FONT_DESC "Serif 36"
41 #define DEFAULT_PROP_VALIGNMENT GES_TEXT_VALIGN_BASELINE
42 #define DEFAULT_PROP_HALIGNMENT GES_TEXT_HALIGN_CENTER
44 struct _GESTextOverlayClipPrivate
67 G_DEFINE_TYPE_WITH_PRIVATE (GESTextOverlayClip, ges_text_overlay_clip,
68 GES_TYPE_OVERLAY_CLIP);
70 static GESTrackElement
71 * ges_text_overlay_clip_create_track_element (GESClip * clip,
75 ges_text_overlay_clip_get_property (GObject * object, guint property_id,
76 GValue * value, GParamSpec * pspec)
78 GESTextOverlayClipPrivate *priv = GES_OVERLAY_TEXT_CLIP (object)->priv;
80 switch (property_id) {
82 g_value_set_string (value, priv->text);
85 g_value_set_string (value, priv->font_desc);
88 g_value_set_enum (value, priv->halign);
91 g_value_set_enum (value, priv->valign);
94 g_value_set_uint (value, priv->color);
97 g_value_set_double (value, priv->xpos);
100 g_value_set_double (value, priv->ypos);
103 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
108 ges_text_overlay_clip_set_property (GObject * object, guint property_id,
109 const GValue * value, GParamSpec * pspec)
111 GESTextOverlayClip *uriclip = GES_OVERLAY_TEXT_CLIP (object);
113 switch (property_id) {
115 ges_text_overlay_clip_set_text (uriclip, g_value_get_string (value));
118 ges_text_overlay_clip_set_font_desc (uriclip, g_value_get_string (value));
120 case PROP_HALIGNMENT:
121 ges_text_overlay_clip_set_halign (uriclip, g_value_get_enum (value));
123 case PROP_VALIGNMENT:
124 ges_text_overlay_clip_set_valign (uriclip, g_value_get_enum (value));
127 ges_text_overlay_clip_set_color (uriclip, g_value_get_uint (value));
130 ges_text_overlay_clip_set_xpos (uriclip, g_value_get_double (value));
133 ges_text_overlay_clip_set_ypos (uriclip, g_value_get_double (value));
136 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
141 ges_text_overlay_clip_dispose (GObject * object)
143 GESTextOverlayClipPrivate *priv = GES_OVERLAY_TEXT_CLIP (object)->priv;
148 g_free (priv->font_desc);
150 G_OBJECT_CLASS (ges_text_overlay_clip_parent_class)->dispose (object);
154 ges_text_overlay_clip_class_init (GESTextOverlayClipClass * klass)
156 GObjectClass *object_class = G_OBJECT_CLASS (klass);
157 GESClipClass *timobj_class = GES_CLIP_CLASS (klass);
159 object_class->get_property = ges_text_overlay_clip_get_property;
160 object_class->set_property = ges_text_overlay_clip_set_property;
161 object_class->dispose = ges_text_overlay_clip_dispose;
164 * GESTextOverlayClip:text:
169 g_object_class_install_property (object_class, PROP_TEXT,
170 g_param_spec_string ("text", "Text", "The text to display",
171 DEFAULT_PROP_TEXT, G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
174 * GESTextOverlayClip:font-desc:
176 * Pango font description string
179 g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_FONT_DESC,
180 g_param_spec_string ("font-desc", "font description",
181 "Pango font description of font to be used for rendering. "
182 "See documentation of pango_font_description_from_string "
183 "for syntax.", DEFAULT_PROP_FONT_DESC,
184 G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS));
187 * GESTextOverlayClip:valignment:
189 * Vertical alignent of the text
191 g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_VALIGNMENT,
192 g_param_spec_enum ("valignment", "vertical alignment",
193 "Vertical alignment of the text", GES_TEXT_VALIGN_TYPE,
194 DEFAULT_PROP_VALIGNMENT, G_PARAM_READWRITE | G_PARAM_CONSTRUCT |
195 G_PARAM_STATIC_STRINGS));
197 * GESTextOverlayClip:halignment:
199 * Horizontal alignment of the text
201 g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_HALIGNMENT,
202 g_param_spec_enum ("halignment", "horizontal alignment",
203 "Horizontal alignment of the text",
204 GES_TEXT_HALIGN_TYPE, DEFAULT_PROP_HALIGNMENT,
205 G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS));
207 timobj_class->create_track_element =
208 ges_text_overlay_clip_create_track_element;
211 * GESTextOverlayClip:color:
213 * The color of the text
216 g_object_class_install_property (object_class, PROP_COLOR,
217 g_param_spec_uint ("color", "Color", "The color of the text",
218 0, G_MAXUINT32, G_MAXUINT32, G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
221 * GESTextOverlayClip:xpos:
223 * The horizontal position of the text
226 g_object_class_install_property (object_class, PROP_XPOS,
227 g_param_spec_double ("xpos", "Xpos", "The horizontal position",
228 0, 1, 0.5, G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
231 * GESTextOverlayClip:ypos:
233 * The vertical position of the text
236 g_object_class_install_property (object_class, PROP_YPOS,
237 g_param_spec_double ("ypos", "Ypos", "The vertical position",
238 0, 1, 0.5, G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
242 ges_text_overlay_clip_init (GESTextOverlayClip * self)
244 self->priv = ges_text_overlay_clip_get_instance_private (self);
246 GES_TIMELINE_ELEMENT (self)->duration = 0;
247 /* Not 100% needed since gobject contents are memzero'd when created */
248 self->priv->text = NULL;
249 self->priv->font_desc = NULL;
250 self->priv->halign = DEFAULT_PROP_HALIGNMENT;
251 self->priv->valign = DEFAULT_PROP_VALIGNMENT;
252 self->priv->color = G_MAXUINT32;
253 self->priv->xpos = 0.5;
254 self->priv->ypos = 0.5;
258 * ges_text_overlay_clip_set_text:
259 * @self: the #GESTextOverlayClip* to set text on
260 * @text: the text to render. an internal copy of this text will be
263 * Sets the text this clip will render.
267 ges_text_overlay_clip_set_text (GESTextOverlayClip * self, const gchar * text)
271 GST_DEBUG ("self:%p, text:%s", self, text);
273 if (self->priv->text)
274 g_free (self->priv->text);
276 self->priv->text = g_strdup (text);
278 for (tmp = GES_CONTAINER_CHILDREN (self); tmp; tmp = tmp->next) {
279 GESTrackElement *trackelement = (GESTrackElement *) tmp->data;
281 if (ges_track_element_get_track (trackelement)->type ==
282 GES_TRACK_TYPE_VIDEO)
283 ges_text_overlay_set_text (GES_TEXT_OVERLAY (trackelement),
289 * ges_text_overlay_clip_set_font_desc:
290 * @self: the #GESTextOverlayClip*
291 * @font_desc: the pango font description
293 * Sets the pango font description of the text
297 ges_text_overlay_clip_set_font_desc (GESTextOverlayClip * self,
298 const gchar * font_desc)
302 GST_DEBUG ("self:%p, font_desc:%s", self, font_desc);
304 if (self->priv->font_desc)
305 g_free (self->priv->font_desc);
307 self->priv->font_desc = g_strdup (font_desc);
309 for (tmp = GES_CONTAINER_CHILDREN (self); tmp; tmp = tmp->next) {
310 GESTrackElement *trackelement = (GESTrackElement *) tmp->data;
312 if (ges_track_element_get_track (trackelement)->type ==
313 GES_TRACK_TYPE_VIDEO)
314 ges_text_overlay_set_font_desc (GES_TEXT_OVERLAY
315 (trackelement), self->priv->font_desc);
321 * ges_text_overlay_clip_set_halign:
322 * @self: the #GESTextOverlayClip* to set horizontal alignement of text on
323 * @halign: #GESTextHAlign
325 * Sets the horizontal aligment of the text.
329 ges_text_overlay_clip_set_halign (GESTextOverlayClip * self,
330 GESTextHAlign halign)
334 GST_DEBUG ("self:%p, halign:%d", self, halign);
336 self->priv->halign = halign;
338 for (tmp = GES_CONTAINER_CHILDREN (self); tmp; tmp = tmp->next) {
339 GESTrackElement *trackelement = (GESTrackElement *) tmp->data;
341 if (ges_track_element_get_track (trackelement)->type ==
342 GES_TRACK_TYPE_VIDEO)
343 ges_text_overlay_set_halignment (GES_TEXT_OVERLAY
344 (trackelement), self->priv->halign);
350 * ges_text_overlay_clip_set_valign:
351 * @self: the #GESTextOverlayClip* to set vertical alignement of text on
352 * @valign: #GESTextVAlign
354 * Sets the vertical aligment of the text.
358 ges_text_overlay_clip_set_valign (GESTextOverlayClip * self,
359 GESTextVAlign valign)
363 GST_DEBUG ("self:%p, valign:%d", self, valign);
365 self->priv->valign = valign;
367 for (tmp = GES_CONTAINER_CHILDREN (self); tmp; tmp = tmp->next) {
368 GESTrackElement *trackelement = (GESTrackElement *) tmp->data;
370 if (ges_track_element_get_track (trackelement)->type ==
371 GES_TRACK_TYPE_VIDEO)
372 ges_text_overlay_set_valignment (GES_TEXT_OVERLAY
373 (trackelement), self->priv->valign);
379 * ges_text_overlay_clip_set_color:
380 * @self: the #GESTextOverlayClip* to set
381 * @color: The color @self is being set to
383 * Sets the color of the text.
386 ges_text_overlay_clip_set_color (GESTextOverlayClip * self, guint32 color)
390 GST_DEBUG ("self:%p, color:%d", self, color);
392 self->priv->color = color;
394 for (tmp = GES_CONTAINER_CHILDREN (self); tmp; tmp = tmp->next) {
395 GESTrackElement *trackelement = (GESTrackElement *) tmp->data;
397 if (ges_track_element_get_track (trackelement)->type ==
398 GES_TRACK_TYPE_VIDEO)
399 ges_text_overlay_set_color (GES_TEXT_OVERLAY (trackelement),
405 * ges_text_overlay_clip_set_xpos:
406 * @self: the #GESTextOverlayClip* to set
407 * @position: The horizontal position @self is being set to
409 * Sets the horizontal position of the text.
412 ges_text_overlay_clip_set_xpos (GESTextOverlayClip * self, gdouble position)
416 GST_DEBUG ("self:%p, xpos:%f", self, position);
418 self->priv->xpos = position;
420 for (tmp = GES_CONTAINER_CHILDREN (self); tmp; tmp = tmp->next) {
421 GESTrackElement *trackelement = (GESTrackElement *) tmp->data;
423 if (ges_track_element_get_track (trackelement)->type ==
424 GES_TRACK_TYPE_VIDEO)
425 ges_text_overlay_set_xpos (GES_TEXT_OVERLAY (trackelement),
431 * ges_text_overlay_clip_set_ypos:
432 * @self: the #GESTextOverlayClip* to set
433 * @position: The vertical position @self is being set to
435 * Sets the vertical position of the text.
438 ges_text_overlay_clip_set_ypos (GESTextOverlayClip * self, gdouble position)
442 GST_DEBUG ("self:%p, ypos:%f", self, position);
444 self->priv->ypos = position;
446 for (tmp = GES_CONTAINER_CHILDREN (self); tmp; tmp = tmp->next) {
447 GESTrackElement *trackelement = (GESTrackElement *) tmp->data;
449 if (ges_track_element_get_track (trackelement)->type ==
450 GES_TRACK_TYPE_VIDEO)
451 ges_text_overlay_set_ypos (GES_TEXT_OVERLAY (trackelement),
457 * ges_text_overlay_clip_get_text:
458 * @self: a #GESTextOverlayClip
460 * Get the text currently set on @self.
462 * Returns: The text currently set on @self.
466 ges_text_overlay_clip_get_text (GESTextOverlayClip * self)
468 return self->priv->text;
472 * ges_text_overlay_clip_get_font_desc:
473 * @self: a #GESTextOverlayClip
475 * Get the pango font description used by @self.
477 * Returns: The pango font description used by @self.
480 ges_text_overlay_clip_get_font_desc (GESTextOverlayClip * self)
482 return self->priv->font_desc;
486 * ges_text_overlay_clip_get_halignment:
487 * @self: a #GESTextOverlayClip
489 * Get the horizontal aligment used by @self.
491 * Returns: The horizontal aligment used by @self.
494 ges_text_overlay_clip_get_halignment (GESTextOverlayClip * self)
496 return self->priv->halign;
500 * ges_text_overlay_clip_get_valignment:
501 * @self: a #GESTextOverlayClip
503 * Get the vertical aligment used by @self.
505 * Returns: The vertical aligment used by @self.
508 ges_text_overlay_clip_get_valignment (GESTextOverlayClip * self)
510 return self->priv->valign;
514 * ges_text_overlay_clip_get_color:
515 * @self: a #GESTextOverlayClip
517 * Get the color used by @source.
519 * Returns: The color used by @source.
523 ges_text_overlay_clip_get_color (GESTextOverlayClip * self)
525 return self->priv->color;
529 * ges_text_overlay_clip_get_xpos:
530 * @self: a #GESTextOverlayClip
532 * Get the horizontal position used by @source.
534 * Returns: The horizontal position used by @source.
538 ges_text_overlay_clip_get_xpos (GESTextOverlayClip * self)
540 return self->priv->xpos;
544 * ges_text_overlay_clip_get_ypos:
545 * @self: a #GESTextOverlayClip
547 * Get the vertical position used by @source.
549 * Returns: The vertical position used by @source.
553 ges_text_overlay_clip_get_ypos (GESTextOverlayClip * self)
555 return self->priv->ypos;
558 static GESTrackElement *
559 ges_text_overlay_clip_create_track_element (GESClip * clip, GESTrackType type)
562 GESTextOverlayClipPrivate *priv = GES_OVERLAY_TEXT_CLIP (clip)->priv;
563 GESTrackElement *res = NULL;
565 GST_DEBUG ("Creating a GESTrackOverlay");
567 if (type == GES_TRACK_TYPE_VIDEO) {
568 res = (GESTrackElement *) ges_text_overlay_new ();
569 GST_DEBUG ("Setting text property");
570 ges_text_overlay_set_text ((GESTextOverlay *) res, priv->text);
571 ges_text_overlay_set_font_desc ((GESTextOverlay *) res, priv->font_desc);
572 ges_text_overlay_set_halignment ((GESTextOverlay *) res, priv->halign);
573 ges_text_overlay_set_valignment ((GESTextOverlay *) res, priv->valign);
574 ges_text_overlay_set_color ((GESTextOverlay *) res, priv->color);
575 ges_text_overlay_set_xpos ((GESTextOverlay *) res, priv->xpos);
576 ges_text_overlay_set_ypos ((GESTextOverlay *) res, priv->ypos);
583 * ges_text_overlay_clip_new:
585 * Creates a new #GESTextOverlayClip
587 * Returns: (transfer floating) (nullable): The newly created
588 * #GESTextOverlayClip, or %NULL if there was an error.
591 ges_text_overlay_clip_new (void)
593 GESTextOverlayClip *new_clip;
594 GESAsset *asset = ges_asset_request (GES_TYPE_OVERLAY_TEXT_CLIP, NULL, NULL);
596 new_clip = GES_OVERLAY_TEXT_CLIP (ges_asset_extract (asset, NULL));
597 gst_object_unref (asset);