diff --git a/docs/libs/ges-sections.txt b/docs/libs/ges-sections.txt index 3c7c3da88d..a209cd4475 100644 --- a/docs/libs/ges-sections.txt +++ b/docs/libs/ges-sections.txt @@ -359,6 +359,22 @@ GES_TIMELINE_TITLE_SOURCE_CLASS GES_TIMELINE_TITLE_SOURCE_GET_CLASS +
+ges-timeline-overlay +GESTimelineOverlay +GESTimelineOverlay +GESTimelineOverlayClass +ges_timeline_overlay_new +ges_tl_overlay_get_type + +GES_IS_TIMELINE_OVERLAY +GES_IS_TIMELINE_OVERLAY_CLASS +GES_TIMELINE_OVERLAY +GES_TIMELINE_OVERLAY_CLASS +GES_TIMELINE_OVERLAY_GET_CLASS +GES_TYPE_TIMELINE_OVERLAY +
+
ges-track-video-background-source GESTrackVideoBackgroundSource diff --git a/ges/Makefile.am b/ges/Makefile.am index e53c3b35d7..f29ec17474 100644 --- a/ges/Makefile.am +++ b/ges/Makefile.am @@ -20,6 +20,7 @@ libges_@GST_MAJORMINOR@_la_SOURCES = \ ges-timeline-transition.c \ ges-timeline-background-source.c \ ges-timeline-title-source.c \ + ges-timeline-overlay.c \ ges-track.c \ ges-track-object.c \ ges-track-source.c \ @@ -51,6 +52,7 @@ libges_@GST_MAJORMINOR@include_HEADERS = \ ges-timeline-transition.h \ ges-timeline-background-source.h \ ges-timeline-title-source.h \ + ges-timeline-overlay.h \ ges-track.h \ ges-track-object.h \ ges-track-source.h \ diff --git a/ges/ges-timeline-overlay.c b/ges/ges-timeline-overlay.c new file mode 100644 index 0000000000..c4c91f64c1 --- /dev/null +++ b/ges/ges-timeline-overlay.c @@ -0,0 +1,427 @@ +/* GStreamer Editing Services + * Copyright (C) 2009 Edward Hervey + * 2009 Nokia Corporation + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/** + * SECTION:ges-timeline-overlay + * @short_description: An object for manipulating media files in a GESTimeline + * + * Represents all the output treams from a particular uri. It is assumed that + * the URI points to a file of some type. + */ + +#include "ges-internal.h" +#include "ges-timeline-overlay.h" +#include "ges-timeline-source.h" +#include "ges-track-object.h" +#include "ges-track-video-title-source.h" +//#include "ges-track-video-overlay.h" +//#include "ges-track-audio-overlay.h" +#include + +G_DEFINE_TYPE (GESTimelineOverlay, ges_tl_overlay, GES_TYPE_TIMELINE_SOURCE); + +#define DEFAULT_PROP_TEXT "" +#define DEFAULT_PROP_FONT_DESC DEFAULT_FONT_DESC +#define DEFAULT_PROP_VALIGNMENT DEFAULT_VALIGNMENT +#define DEFAULT_PROP_HALIGNMENT DEFAULT_HALIGNMENT +#define GES_TIMELINE_TITLE_SRC_VALIGN_TYPE (ges_timeline_overlay_valign_get_type()) +#define GES_TIMELINE_TITLE_SRC_HALIGN_TYPE (ges_timeline_overlay_halign_get_type()) + +enum +{ + PROP_0, + PROP_MUTE, + PROP_TEXT, + PROP_FONT_DESC, + PROP_HALIGNMENT, + PROP_VALIGNMENT, +}; + +static void ges_tl_overlay_set_mute (GESTimelineOverlay * self, gboolean mute); + +static void +ges_tl_overlay_set_text (GESTimelineOverlay * self, const gchar * text); + +static void +ges_tl_overlay_set_font_desc (GESTimelineOverlay * self, const gchar * + font_desc); + +static void +ges_tl_overlay_set_valign (GESTimelineOverlay * self, + GESTrackVideoTitleSrcVAlign); + +static void +ges_tl_overlay_set_halign (GESTimelineOverlay * self, + GESTrackVideoTitleSrcHAlign); + +static GESTrackObject + * ges_tl_overlay_create_track_object (GESTimelineObject * obj, + GESTrack * track); + +static GType ges_timeline_overlay_valign_get_type (void); + +static GType ges_timeline_overlay_halign_get_type (void); + +static void +ges_tl_overlay_get_property (GObject * object, guint property_id, + GValue * value, GParamSpec * pspec) +{ + GESTimelineOverlay *tfs = GES_TIMELINE_OVERLAY (object); + + switch (property_id) { + case PROP_MUTE: + g_value_set_boolean (value, tfs->mute); + break; + case PROP_TEXT: + g_value_set_string (value, tfs->text); + break; + case PROP_FONT_DESC: + g_value_set_string (value, tfs->font_desc); + break; + case PROP_HALIGNMENT: + g_value_set_enum (value, tfs->halign); + break; + case PROP_VALIGNMENT: + g_value_set_enum (value, tfs->valign); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +static void +ges_tl_overlay_set_property (GObject * object, guint property_id, + const GValue * value, GParamSpec * pspec) +{ + GESTimelineOverlay *tfs = GES_TIMELINE_OVERLAY (object); + + switch (property_id) { + case PROP_MUTE: + ges_tl_overlay_set_mute (tfs, g_value_get_boolean (value)); + break; + case PROP_TEXT: + ges_tl_overlay_set_text (tfs, g_value_get_string (value)); + break; + case PROP_FONT_DESC: + ges_tl_overlay_set_font_desc (tfs, g_value_get_string (value)); + break; + case PROP_HALIGNMENT: + ges_tl_overlay_set_halign (tfs, g_value_get_enum (value)); + break; + case PROP_VALIGNMENT: + ges_tl_overlay_set_valign (tfs, g_value_get_enum (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +static void +ges_tl_overlay_dispose (GObject * object) +{ + GESTimelineOverlay *self = GES_TIMELINE_OVERLAY (object); + + if (self->text) + g_free (self->text); + if (self->font_desc) + g_free (self->font_desc); + + G_OBJECT_CLASS (ges_tl_overlay_parent_class)->dispose (object); +} + +static void +ges_tl_overlay_finalize (GObject * object) +{ + G_OBJECT_CLASS (ges_tl_overlay_parent_class)->finalize (object); +} + +static void +ges_tl_overlay_class_init (GESTimelineOverlayClass * klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GESTimelineObjectClass *timobj_class = GES_TIMELINE_OBJECT_CLASS (klass); + + object_class->get_property = ges_tl_overlay_get_property; + object_class->set_property = ges_tl_overlay_set_property; + object_class->dispose = ges_tl_overlay_dispose; + object_class->finalize = ges_tl_overlay_finalize; + + /** + * GESTimelineOverlay:text + * + * The text to diplay + */ + + g_object_class_install_property (object_class, PROP_TEXT, + g_param_spec_string ("text", "Text", "The text to display", + DEFAULT_PROP_TEXT, G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + + /** + * GESTimelineOverlay:font-dec + * + * Pango font description string + */ + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_FONT_DESC, + g_param_spec_string ("font-desc", "font description", + "Pango font description of font to be used for rendering. " + "See documentation of pango_font_description_from_string " + "for syntax.", DEFAULT_PROP_FONT_DESC, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GESTimelineOverlay:valignment + * + * Vertical alignent of the text + */ + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_VALIGNMENT, + g_param_spec_enum ("valignment", "vertical alignment", + "Vertical alignment of the text", GES_TIMELINE_TITLE_SRC_VALIGN_TYPE, + DEFAULT_PROP_VALIGNMENT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GESTimelineOverlay:halignment + * + * Horizontal alignment of the text + */ + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_HALIGNMENT, + g_param_spec_enum ("halignment", "horizontal alignment", + "Horizontal alignment of the text", + GES_TIMELINE_TITLE_SRC_HALIGN_TYPE, DEFAULT_PROP_HALIGNMENT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GESTimelineOverlay:mute: + * + * Whether the sound will be played or not. + */ + g_object_class_install_property (object_class, PROP_MUTE, + g_param_spec_boolean ("mute", "Mute", "Mute audio track", + FALSE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + + timobj_class->create_track_object = ges_tl_overlay_create_track_object; + timobj_class->need_fill_track = FALSE; +} + +static void +ges_tl_overlay_init (GESTimelineOverlay * self) +{ + GES_TIMELINE_OBJECT (self)->duration = 0; + self->text = NULL; + self->text = NULL; + self->halign = DEFAULT_PROP_HALIGNMENT; + self->valign = DEFAULT_PROP_VALIGNMENT; +} + +static GType +ges_timeline_overlay_valign_get_type (void) +{ + static GType text_overlay_valign_type = 0; + static gsize initialized = 0; + static const GEnumValue text_overlay_valign[] = { + {GES_TRACK_VIDEO_TITLE_SRC_VALIGN_BASELINE, "baseline", "baseline"}, + {GES_TRACK_VIDEO_TITLE_SRC_VALIGN_BOTTOM, "bottom", "bottom"}, + {GES_TRACK_VIDEO_TITLE_SRC_VALIGN_TOP, "top", "top"}, + {0, NULL, NULL}, + }; + + if (g_once_init_enter (&initialized)) { + text_overlay_valign_type = + g_enum_register_static ("GESTimelineOverlayVAlign", + text_overlay_valign); + g_once_init_leave (&initialized, 1); + } + return text_overlay_valign_type; +} + +static GType +ges_timeline_overlay_halign_get_type (void) +{ + static GType text_overlay_halign_type = 0; + static gsize initialized = 0; + static const GEnumValue text_overlay_halign[] = { + {GES_TRACK_VIDEO_TITLE_SRC_HALIGN_LEFT, "left", "left"}, + {GES_TRACK_VIDEO_TITLE_SRC_HALIGN_CENTER, "center", "center"}, + {GES_TRACK_VIDEO_TITLE_SRC_HALIGN_RIGHT, "right", "right"}, + {0, NULL, NULL}, + }; + + if (g_once_init_enter (&initialized)) { + text_overlay_halign_type = + g_enum_register_static ("GESTimelineOverlayHAlign", + text_overlay_halign); + g_once_init_leave (&initialized, 1); + } + return text_overlay_halign_type; +} + +static void +ges_tl_overlay_set_text (GESTimelineOverlay * self, const gchar * text) +{ + //GList *tmp; + //GESTimelineObject *object = (GESTimelineObject *) self; + + GST_DEBUG ("self:%p, text:%s", self, text); + + if (self->text) + g_free (self->text); + + self->text = g_strdup (text); + +#if 0 + for (tmp = object->trackobjects; tmp; tmp = tmp->next) { + GESTrackObject *trackobject = (GESTrackObject *) tmp->data; + + if (trackobject->track->type == GES_TRACK_TYPE_VIDEO) + ges_track_video_overlay_set_text (GES_TRACK_VIDEO_OVERLAY + (trackobject), self->text); + } +#endif +} + +static void +ges_tl_overlay_set_font_desc (GESTimelineOverlay * self, const gchar * + font_desc) +{ + //GList *tmp; + //GESTimelineObject *object = (GESTimelineObject *) self; + + GST_DEBUG ("self:%p, font_desc:%s", self, font_desc); + + if (self->font_desc) + g_free (self->font_desc); + + self->font_desc = g_strdup (font_desc); +#if 0 + for (tmp = object->trackobjects; tmp; tmp = tmp->next) { + GESTrackObject *trackobject = (GESTrackObject *) tmp->data; + + if (trackobject->track->type == GES_TRACK_TYPE_VIDEO) + ges_track_video_overlay_set_font_desc (GES_TRACK_VIDEO_OVERLAY + (trackobject), self->font_desc); + } +#endif +} + +static void +ges_tl_overlay_set_halign (GESTimelineOverlay * self, + GESTrackVideoTitleSrcHAlign halign) +{ + //GList *tmp; + //GESTimelineObject *object = (GESTimelineObject *) self; + + GST_DEBUG ("self:%p, halign:%d", self, halign); + + self->halign = halign; + +#if 0 + for (tmp = object->trackobjects; tmp; tmp = tmp->next) { + GESTrackObject *trackobject = (GESTrackObject *) tmp->data; + + if (trackobject->track->type == GES_TRACK_TYPE_VIDEO) + ges_track_video_overlay_set_halignment (GES_TRACK_VIDEO_OVERLAY + (trackobject), self->halign); + } +#endif +} + +static void +ges_tl_overlay_set_valign (GESTimelineOverlay * self, + GESTrackVideoTitleSrcVAlign valign) +{ + //GList *tmp; + //GESTimelineObject *object = (GESTimelineObject *) self; + + GST_DEBUG ("self:%p, valign:%d", self, valign); + + self->valign = valign; +#if 0 + for (tmp = object->trackobjects; tmp; tmp = tmp->next) { + GESTrackObject *trackobject = (GESTrackObject *) tmp->data; + + if (trackobject->track->type == GES_TRACK_TYPE_VIDEO) + ges_track_video_overlay_set_valignment (GES_TRACK_VIDEO_OVERLAY + (trackobject), self->valign); + } +#endif +} + +static void +ges_tl_overlay_set_mute (GESTimelineOverlay * self, gboolean mute) +{ + GList *tmp; + GESTimelineObject *object = (GESTimelineObject *) self; + + GST_DEBUG ("self:%p, mute:%d", self, mute); + + self->mute = mute; + + /* Go over tracked objects, and update 'active' status on all audio objects */ + for (tmp = object->trackobjects; tmp; tmp = tmp->next) { + GESTrackObject *trackobject = (GESTrackObject *) tmp->data; + + if (trackobject->track->type == GES_TRACK_TYPE_AUDIO) + ges_track_object_set_active (trackobject, !mute); + } +} + +static GESTrackObject * +ges_tl_overlay_create_track_object (GESTimelineObject * obj, GESTrack * track) +{ + +#if 0 + GESTimelineOverlay *tfs = (GESTimelineOverlay *) obj; + GESTrackObject *res = NULL; + + GST_DEBUG ("Creating a GESTrackOverlay"); + + if (track->type == GES_TRACK_TYPE_VIDEO) { + res = (GESTrackObject *) ges_track_video_overlay_new (); + GST_DEBUG ("Setting text property"); + ges_track_video_overlay_set_text ((GESTrackVideoOverlay *) res, tfs->text); + } + + else if (track->type == GES_TRACK_TYPE_AUDIO) { + res = (GESTrackObject *) ges_track_audio_overlay_new (); + if (tfs->mute) + ges_track_object_set_active (res, FALSE); + } + + else { + res = GES_TRACK_OBJECT (ges_track_overlay_new ()); + } + + return res; +#endif + return NULL; +} + +/** + * ges_timeline_titlesource_new: + * + * Creates a new #GESTimelineOverlay + * + * Returns: The newly created #GESTimelineOverlay, or NULL if there was an + * error. + */ +GESTimelineOverlay * +ges_timeline_overlay_new (void) +{ + /* FIXME : Check for validity/existence of URI */ + return g_object_new (GES_TYPE_TIMELINE_OVERLAY, NULL); +} diff --git a/ges/ges-timeline-overlay.h b/ges/ges-timeline-overlay.h new file mode 100644 index 0000000000..dabfa316b6 --- /dev/null +++ b/ges/ges-timeline-overlay.h @@ -0,0 +1,83 @@ +/* GStreamer Editing Services + * Copyright (C) 2009 Brandon Lewis + * 2009 Nokia Corporation + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef _GES_TL_OVERLAY +#define _GES_TL_OVERLAY + +#include +#include +#include +#include + +G_BEGIN_DECLS + +#define GES_TYPE_TIMELINE_OVERLAY ges_tl_overlay_get_type() + +#define GES_TIMELINE_OVERLAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), GES_TYPE_TIMELINE_OVERLAY, GESTimelineOverlay)) + +#define GES_TIMELINE_OVERLAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), GES_TYPE_TIMELINE_OVERLAY, GESTimelineOverlayClass)) + +#define GES_IS_TIMELINE_OVERLAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GES_TYPE_TIMELINE_OVERLAY)) + +#define GES_IS_TIMELINE_OVERLAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), GES_TYPE_TIMELINE_OVERLAY)) + +#define GES_TIMELINE_OVERLAY_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), GES_TYPE_TIMELINE_OVERLAY, GESTimelineOverlayClass)) + +/** + * GESTimelineOverlay: + * @parent: parent + * + */ + +struct _GESTimelineOverlay { + GESTimelineObject parent; + + /*< private >*/ + gboolean mute; + gchar *text; + gchar *font_desc; + gint halign; + gint valign; +}; + +/** + * GESTimelineOverlayClass: + * @parent_class: parent class + */ + +struct _GESTimelineOverlayClass { + GESTimelineObjectClass parent_class; + + /*< public >*/ +}; + +GType ges_tl_overlay_get_type (void); + +GESTimelineOverlay* ges_timeline_overlay_new (void); + +G_END_DECLS + +#endif /* _GES_TL_OVERLAY */ + diff --git a/ges/ges-types.h b/ges/ges-types.h index a3380c83d8..b0cb1b9ae7 100644 --- a/ges/ges-types.h +++ b/ges/ges-types.h @@ -54,6 +54,9 @@ typedef struct _GESTimelineBackgroundSourceClass GESTimelineBackgroundSourceClas typedef struct _GESTimelineTitleSource GESTimelineTitleSource; typedef struct _GESTimelineTitleSourceClass GESTimelineTitleSourceClass; +typedef struct _GESTimelineOverlay GESTimelineOverlay; +typedef struct _GESTimelineOverlayClass GESTimelineOverlayClass; + typedef struct _GESTrack GESTrack; typedef struct _GESTrackClass GESTrackClass; diff --git a/ges/ges.h b/ges/ges.h index 1f088ec426..49b73235b9 100644 --- a/ges/ges.h +++ b/ges/ges.h @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include