void Timeline:: remove(int index) { GESTimelineObject * obj; if (!(obj = ges_simple_timeline_layer_nth(layer, index))) return; beginRemoveRows(QModelIndex(), index, index); ges_timeline_layer_remove_object(GES_TIMELINE_LAYER(layer), obj); }
static void ges_timeline_layer_dispose (GObject * object) { GESTimelineLayer *layer = GES_TIMELINE_LAYER (object); GESTimelineLayerPrivate *priv = layer->priv; GST_DEBUG ("Disposing layer"); while (priv->clips_start) ges_timeline_layer_remove_clip (layer, (GESClip *) priv->clips_start->data); G_OBJECT_CLASS (ges_timeline_layer_parent_class)->dispose (object); }
/* GObject standard vmethods */ static void ges_timeline_layer_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec) { GESTimelineLayer *layer = GES_TIMELINE_LAYER (object); switch (property_id) { case PROP_PRIORITY: g_value_set_uint (value, layer->priv->priority); break; case PROP_AUTO_TRANSITION: g_value_set_boolean (value, layer->priv->auto_transition); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } }
GESTimelinePipeline * make_timeline (char *path, float duration, char *text, guint32 color, gdouble xpos, gdouble ypos) { GESTimeline *timeline; GESTrack *trackv, *tracka; GESTimelineLayer *layer1; GESTimelineObject *srca; GESTimelineObject *overlay; GESTimelinePipeline *pipeline; guint64 aduration; pipeline = ges_timeline_pipeline_new (); ges_timeline_pipeline_set_mode (pipeline, TIMELINE_MODE_PREVIEW_VIDEO); timeline = ges_timeline_new (); ges_timeline_pipeline_add_timeline (pipeline, timeline); trackv = ges_track_video_raw_new (); ges_timeline_add_track (timeline, trackv); tracka = ges_track_audio_raw_new (); ges_timeline_add_track (timeline, tracka); layer1 = GES_TIMELINE_LAYER (ges_timeline_layer_new ()); g_object_set (layer1, "priority", (gint32) 0, NULL); if (!ges_timeline_add_layer (timeline, layer1)) exit (-1); aduration = (guint64) (duration * GST_SECOND); srca = make_source (path, 0, aduration, 1); overlay = make_overlay (text, 0, aduration, 0, color, xpos, ypos); ges_timeline_layer_add_object (layer1, srca); ges_timeline_layer_add_object (layer1, overlay); return pipeline; }
Timeline:: Timeline(QObject *parent) : QAbstractListModel(parent) { timeline = ges_timeline_new_audio_video(); layer = ges_simple_timeline_layer_new(); ges_timeline_add_layer(timeline, GES_TIMELINE_LAYER(layer)); g_signal_connect(G_OBJECT(layer), "object-added", G_CALLBACK(layer_object_added_cb), this); g_signal_connect(G_OBJECT(layer), "object-moved", G_CALLBACK(layer_object_moved_cb), this); g_signal_connect(G_OBJECT(layer), "object-removed", G_CALLBACK(layer_object_removed_cb), this); QHash <int, QByteArray> rolenames; rolenames[thumb_uri_role] = "thumb_uri"; rolenames[media_uri_role] = "media_uri"; rolenames[inpoint_role] = "in_point"; rolenames[outpoint_role] = "out_point"; rolenames[duration_role] = "duration"; rolenames[duration_only_role] = "duration_only"; setRoleNames(rolenames); row_count = 0; }
static void gstl_recalculate (GESSimpleTimelineLayer * self) { GList *tmp; gint64 pos = 0; gint priority = 0; gint transition_priority = 0; gint height; GESTimelineObject *prev_object = NULL; GESTimelineObject *prev_transition = NULL; gboolean valid = TRUE; GESSimpleTimelineLayerPrivate *priv = self->priv; priority = GES_TIMELINE_LAYER (self)->min_gnl_priority + 2; GST_DEBUG ("recalculating values"); if (priv->objects && GES_IS_TIMELINE_TRANSITION (priv->objects->data)) { valid = FALSE; } for (tmp = priv->objects; tmp; tmp = tmp->next) { GESTimelineObject *obj; guint64 dur; GList *l_next; obj = (GESTimelineObject *) tmp->data; dur = GES_TIMELINE_OBJECT_DURATION (obj); height = GES_TIMELINE_OBJECT_HEIGHT (obj); if (GES_IS_TIMELINE_SOURCE (obj)) { GST_LOG ("%p obj: height: %d: priority %d", obj, height, priority); if (G_UNLIKELY (GES_TIMELINE_OBJECT_START (obj) != pos)) { ges_timeline_object_set_start (obj, pos); } if (G_UNLIKELY (GES_TIMELINE_OBJECT_PRIORITY (obj) != priority)) { ges_timeline_object_set_priority (obj, priority); } transition_priority = MAX (0, priority - 1); priority += height; pos += dur; g_assert (priority != -1); } else if (GES_IS_TIMELINE_TRANSITION (obj)) { pos -= dur; if (pos < 0) pos = 0; GST_LOG ("%p obj: height: %d: trans_priority %d Position: %" G_GINT64_FORMAT ", duration %" G_GINT64_FORMAT, obj, height, transition_priority, pos, dur); g_assert (transition_priority != -1); if (G_UNLIKELY (GES_TIMELINE_OBJECT_START (obj) != pos)) ges_timeline_object_set_start (obj, pos); if (G_UNLIKELY (GES_TIMELINE_OBJECT_PRIORITY (obj) != transition_priority)) { ges_timeline_object_set_priority (obj, transition_priority); } /* sanity checks */ l_next = g_list_next (tmp); if (GES_IS_TIMELINE_TRANSITION (prev_object)) { GST_ERROR ("two transitions in sequence!"); valid = FALSE; } if (prev_object && (GES_TIMELINE_OBJECT_DURATION (prev_object) < dur)) { GST_ERROR ("transition duration exceeds that of previous neighbor!"); valid = FALSE; } if (l_next && (GES_TIMELINE_OBJECT_DURATION (l_next->data) < dur)) { GST_ERROR ("transition duration exceeds that of next neighbor!"); valid = FALSE; } if (prev_transition) { guint64 start, end; end = (GES_TIMELINE_OBJECT_DURATION (prev_transition) + GES_TIMELINE_OBJECT_START (prev_transition)); start = pos; if (end > start) { GST_ERROR ("%" G_GUINT64_FORMAT ", %" G_GUINT64_FORMAT ": " "overlapping transitions!", start, end); valid = FALSE; } } prev_transition = obj; } prev_object = obj; } if (prev_object && GES_IS_TIMELINE_TRANSITION (prev_object)) { valid = FALSE; } GST_DEBUG ("Finished recalculating: final start pos is: %" GST_TIME_FORMAT, GST_TIME_ARGS (pos)); GES_TIMELINE_LAYER (self)->max_gnl_priority = priority; if (valid != self->priv->valid) { self->priv->valid = valid; g_object_notify (G_OBJECT (self), "valid"); } }