mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-22 05:56:31 +00:00
clip: Make top effect priority inside the clip priority range
And simplify the way we start computing children priority making min_priority already relative to the clip itself. Differential Revision: https://phabricator.freedesktop.org/D1275
This commit is contained in:
parent
ae93594f3c
commit
2854c91ebc
2 changed files with 26 additions and 24 deletions
|
@ -88,6 +88,9 @@ static GParamSpec *properties[PROP_LAST];
|
|||
* Listen to our children *
|
||||
****************************************************/
|
||||
|
||||
/* @min_priority: The absolute minimum priority a child of @container should have
|
||||
* @max_priority: The absolute maximum priority a child of @container should have
|
||||
*/
|
||||
static void
|
||||
_get_priority_range (GESContainer * container, guint32 * min_priority,
|
||||
guint32 * max_priority)
|
||||
|
@ -95,10 +98,10 @@ _get_priority_range (GESContainer * container, guint32 * min_priority,
|
|||
GESLayer *layer = GES_CLIP (container)->priv->layer;
|
||||
|
||||
if (layer) {
|
||||
*min_priority = layer->min_nle_priority;
|
||||
*min_priority = _PRIORITY (container) + layer->min_nle_priority;
|
||||
*max_priority = layer->max_nle_priority;
|
||||
} else {
|
||||
*min_priority = MIN_NLE_PRIO;
|
||||
*min_priority = _PRIORITY (container) + MIN_NLE_PRIO;
|
||||
*max_priority = G_MAXUINT32;
|
||||
}
|
||||
}
|
||||
|
@ -119,7 +122,7 @@ _child_priority_changed_cb (GESTimelineElement * child,
|
|||
_get_priority_range (container, &min_prio, &max_prio);
|
||||
|
||||
_ges_container_set_priority_offset (container, child,
|
||||
min_prio + _PRIORITY (container) - _PRIORITY (child));
|
||||
min_prio - _PRIORITY (child));
|
||||
}
|
||||
|
||||
/*****************************************************
|
||||
|
@ -222,9 +225,9 @@ _set_priority (GESTimelineElement * element, guint32 priority)
|
|||
|
||||
_get_priority_range (container, &min_prio, &max_prio);
|
||||
|
||||
container->children_control_mode = GES_CHILDREN_UPDATE_OFFSETS;
|
||||
container->children_control_mode = GES_CHILDREN_IGNORE_NOTIFIES;
|
||||
for (tmp = container->children; tmp; tmp = g_list_next (tmp)) {
|
||||
guint32 real_tck_prio;
|
||||
guint32 track_element_prio;
|
||||
GESTimelineElement *child = (GESTimelineElement *) tmp->data;
|
||||
gint off = _ges_container_get_priority_offset (container, child);
|
||||
|
||||
|
@ -236,16 +239,21 @@ _set_priority (GESTimelineElement * element, guint32 priority)
|
|||
off = 0;
|
||||
}
|
||||
|
||||
real_tck_prio = min_prio + priority - off;
|
||||
/* We need to remove our current priority from @min_prio
|
||||
* as it is the absolute minimum priority @child could have
|
||||
* before we set @container to @priority.
|
||||
*/
|
||||
track_element_prio = min_prio - _PRIORITY (container) + priority - off;
|
||||
|
||||
if (real_tck_prio > max_prio) {
|
||||
if (track_element_prio > max_prio) {
|
||||
GST_WARNING ("%p priority of %i, is outside of the its containing "
|
||||
"layer space. (%d/%d) setting it to the maximum it can be",
|
||||
container, priority, min_prio, max_prio);
|
||||
container, priority, min_prio - _PRIORITY (container) + priority,
|
||||
max_prio);
|
||||
|
||||
real_tck_prio = max_prio;
|
||||
track_element_prio = max_prio;
|
||||
}
|
||||
_set_priority0 (child, real_tck_prio);
|
||||
_set_priority0 (child, track_element_prio);
|
||||
}
|
||||
container->children_control_mode = GES_CHILDREN_UPDATE;
|
||||
_compute_height (container);
|
||||
|
@ -308,8 +316,7 @@ _add_child (GESContainer * container, GESTimelineElement * element)
|
|||
|
||||
GST_DEBUG_OBJECT (container, "Adding %ith effect: %" GST_PTR_FORMAT
|
||||
" Priority %i", priv->nb_effects + 1, element,
|
||||
min_prio + GES_TIMELINE_ELEMENT_PRIORITY (container) +
|
||||
priv->nb_effects);
|
||||
min_prio + priv->nb_effects);
|
||||
|
||||
tmp = g_list_nth (GES_CONTAINER_CHILDREN (container), priv->nb_effects);
|
||||
container->children_control_mode = GES_CHILDREN_UPDATE_OFFSETS;
|
||||
|
@ -318,14 +325,12 @@ _add_child (GESContainer * container, GESTimelineElement * element)
|
|||
GES_TIMELINE_ELEMENT_PRIORITY (tmp->data) + 1);
|
||||
}
|
||||
|
||||
_set_priority0 (element, min_prio +
|
||||
GES_TIMELINE_ELEMENT_PRIORITY (container) + priv->nb_effects);
|
||||
_set_priority0 (element, min_prio + priv->nb_effects);
|
||||
container->children_control_mode = mode;
|
||||
priv->nb_effects++;
|
||||
} else {
|
||||
/* We add the track element on top of the effect list */
|
||||
_set_priority0 (element, min_prio +
|
||||
GES_TIMELINE_ELEMENT_PRIORITY (container) + priv->nb_effects);
|
||||
_set_priority0 (element, min_prio + priv->nb_effects);
|
||||
}
|
||||
|
||||
/* We set the timing value of the child to ours, we avoid infinite loop
|
||||
|
@ -932,8 +937,7 @@ ges_clip_create_track_elements (GESClip * clip, GESTrackType type)
|
|||
ges_timeline_element_set_max_duration (GES_TIMELINE_ELEMENT (elem),
|
||||
GES_TIMELINE_ELEMENT_MAX_DURATION (clip));
|
||||
|
||||
_set_priority0 (elem, min_prio + GES_TIMELINE_ELEMENT_PRIORITY (clip)
|
||||
+ clip->priv->nb_effects);
|
||||
_set_priority0 (elem, min_prio + clip->priv->nb_effects);
|
||||
|
||||
ges_container_add (GES_CONTAINER (clip), elem);
|
||||
}
|
||||
|
@ -1188,8 +1192,7 @@ ges_clip_get_top_effect_index (GESClip * clip, GESBaseEffect * effect)
|
|||
|
||||
_get_priority_range (GES_CONTAINER (clip), &min_prio, &max_prio);
|
||||
|
||||
return GES_TIMELINE_ELEMENT_PRIORITY (effect) - min_prio +
|
||||
GES_TIMELINE_ELEMENT_PRIORITY (clip);
|
||||
return GES_TIMELINE_ELEMENT_PRIORITY (effect) - min_prio;
|
||||
}
|
||||
|
||||
/* TODO 2.0 remove as it is Deprecated */
|
||||
|
|
|
@ -241,7 +241,6 @@ GST_END_TEST;
|
|||
|
||||
GST_START_TEST (test_priorities_clip)
|
||||
{
|
||||
gint i;
|
||||
GList *effects, *tmp;
|
||||
GESTimeline *timeline;
|
||||
GESLayer *layer;
|
||||
|
@ -314,7 +313,7 @@ GST_START_TEST (test_priorities_clip)
|
|||
assert_equals_int (GES_CONTAINER_HEIGHT (effect_clip), 4);
|
||||
|
||||
effects = ges_clip_get_top_effects (GES_CLIP (effect_clip));
|
||||
for (tmp = effects, i = 0; tmp; tmp = tmp->next, i++) {
|
||||
for (tmp = effects; tmp; tmp = tmp->next) {
|
||||
gint priority = ges_clip_get_top_effect_position (GES_CLIP (effect_clip),
|
||||
GES_BASE_EFFECT (tmp->data));
|
||||
fail_unless (priority > effect_prio);
|
||||
|
@ -330,10 +329,10 @@ GST_START_TEST (test_priorities_clip)
|
|||
assert_equals_int (GES_CONTAINER_HEIGHT (effect_clip), 4);
|
||||
effects = ges_clip_get_top_effects (GES_CLIP (effect_clip));
|
||||
effect_prio = 0;
|
||||
for (tmp = effects, i = 0; tmp; tmp = tmp->next, i++) {
|
||||
for (tmp = effects; tmp; tmp = tmp->next) {
|
||||
gint priority = ges_clip_get_top_effect_position (GES_CLIP (effect_clip),
|
||||
GES_BASE_EFFECT (tmp->data));
|
||||
fail_unless (priority > effect_prio);
|
||||
fail_unless (priority >= effect_prio, "%d >= %d", priority, effect_prio);
|
||||
fail_unless (GES_IS_EFFECT (tmp->data));
|
||||
effect_prio = priority;
|
||||
|
||||
|
|
Loading…
Reference in a new issue