diff options
author | Thibault Saunier <tsaunier@gnome.org> | 2016-08-11 10:36:44 -0400 |
---|---|---|
committer | Thibault Saunier <thibault.saunier@osg.samsung.com> | 2016-09-26 13:32:57 -0300 |
commit | f79c73789f81ffeedc860229c91956016f96863d (patch) | |
tree | 6e7e7303a23f8d1fbeaa13a1031c69490d7539a9 | |
parent | eb48faf34234811faec1699692a2c096daaceefd (diff) |
layer: Handle operation priorities
All operations should have higher priorites and sources should be
on top of those. We now first set the operations priorities in
a first pass and then stack sources on top of those.
Differential Revision: https://phabricator.freedesktop.org/D1279
-rw-r--r-- | ges/ges-layer.c | 53 |
1 files changed, 36 insertions, 17 deletions
diff --git a/ges/ges-layer.c b/ges/ges-layer.c index 81602945..f7e98442 100644 --- a/ges/ges-layer.c +++ b/ges/ges-layer.c @@ -218,36 +218,28 @@ ges_layer_init (GESLayer * self) _register_metas (self); } -/** - * ges_layer_resync_priorities: - * @layer: a #GESLayer - * - * Resyncs the priorities of the clips controlled by @layer. - * This method - */ -gboolean -ges_layer_resync_priorities (GESLayer * layer) +static gint +ges_layer_resync_priorities_by_type (GESLayer * layer, + gint starting_priority, GType type) { GstClockTime next_reset = 0; - gint priority = 1; + gint priority = starting_priority, max_priority = priority; GList *tmp; GESTimelineElement *element; - GST_INFO_OBJECT (layer, "Resync priorities (prio: %d)", - layer->priv->priority); - for (tmp = layer->priv->clips_start; tmp; tmp = tmp->next) { element = GES_TIMELINE_ELEMENT (tmp->data); if (GES_IS_TRANSITION_CLIP (element)) { + /* Blindly set transitions priorities to 0 */ _set_priority0 (element, 0); - continue; - } + } else if (!g_type_is_a (G_OBJECT_TYPE (element), type)) + continue; if (element->start > next_reset) { - priority = 1; + priority = starting_priority; next_reset = 0; } @@ -256,8 +248,34 @@ ges_layer_resync_priorities (GESLayer * layer) _set_priority0 (element, priority); priority = priority + GES_CONTAINER_HEIGHT (element); + + if (priority > max_priority) + max_priority = priority; } + return max_priority; +} + +/** + * ges_layer_resync_priorities: + * @layer: a #GESLayer + * + * Resyncs the priorities of the clips controlled by @layer. + */ +gboolean +ges_layer_resync_priorities (GESLayer * layer) +{ + gint min_source_prios; + + GST_INFO_OBJECT (layer, "Resync priorities (prio: %d)", + layer->priv->priority); + + min_source_prios = ges_layer_resync_priorities_by_type (layer, 1, + GES_TYPE_OPERATION_CLIP); + + ges_layer_resync_priorities_by_type (layer, min_source_prios, + GES_TYPE_SOURCE_CLIP); + return TRUE; } @@ -398,6 +416,7 @@ ges_layer_set_priority (GESLayer * layer, guint priority) layer->priv->priority = priority; layer->min_nle_priority = (priority * LAYER_HEIGHT) + MIN_NLE_PRIO; layer->max_nle_priority = ((priority + 1) * LAYER_HEIGHT) + MIN_NLE_PRIO; + ges_layer_resync_priorities (layer); } @@ -530,7 +549,7 @@ ges_layer_add_clip (GESLayer * layer, GESClip * clip) g_return_val_if_fail (GES_IS_LAYER (layer), FALSE); g_return_val_if_fail (GES_IS_CLIP (clip), FALSE); - GST_DEBUG_OBJECT (layer, "adding clip: %s", GES_TIMELINE_ELEMENT_NAME (clip)); + GST_DEBUG_OBJECT (layer, "adding clip:%p", clip); priv = layer->priv; current_layer = ges_clip_get_layer (clip); |