{
gint64 new_duration;
- if (_PRIORITY (self->next_source) / LAYER_HEIGHT !=
- _PRIORITY (self->previous_source) / LAYER_HEIGHT) {
+ if (_ges_track_element_get_layer_priority (self->next_source) !=
+ _ges_track_element_get_layer_priority (self->previous_source)) {
GST_DEBUG_OBJECT (self, "Destroy changed layer");
g_signal_emit (self, auto_transition_signals[DESTROY_ME], 0);
return;
GST_DEBUG_OBJECT (container, "Adding %ith effect: %" GST_PTR_FORMAT
" Priority %i", priv->nb_effects + 1, element,
- GES_TIMELINE_ELEMENT_PRIORITY (container) + priv->nb_effects);
+ min_prio + GES_TIMELINE_ELEMENT_PRIORITY (container) +
+ priv->nb_effects);
tmp = g_list_nth (GES_CONTAINER_CHILDREN (container), priv->nb_effects);
for (; tmp; tmp = tmp->next)
track_element = GES_TRACK_ELEMENT (effect);
current_prio = _PRIORITY (track_element);
+ /* FIXME, do we actually want to change what the user is telling us to do? */
+ newpriority = newpriority + MIN_GNL_PRIO;
/* We don't change the priority */
if (current_prio == newpriority ||
(G_UNLIKELY (GES_CLIP (GES_TIMELINE_ELEMENT_PARENT (track_element)) !=
clip)))
return FALSE;
- if (newpriority > (clip->priv->nb_effects - 1)) {
+ if (newpriority > (clip->priv->nb_effects - 1 + MIN_GNL_PRIO)) {
GST_DEBUG ("You are trying to make %p not a top effect", effect);
return FALSE;
}
- if (current_prio > clip->priv->nb_effects) {
+ if (current_prio > clip->priv->nb_effects + MIN_GNL_PRIO) {
GST_DEBUG ("%p is not a top effect", effect);
return FALSE;
}
GST_DEBUG_CATEGORY_EXTERN (_ges_debug);
#define GST_CAT_DEFAULT _ges_debug
+/* The first 2 GNL priorities are used for:
+ * 0- The Mixing element
+ * 1- The Gaps
+ */
+#define MIN_GNL_PRIO 2
#define LAYER_HEIGHT 1000
#define _START(obj) GES_TIMELINE_ELEMENT_START (obj)
/****************************************************
* GESTrackElement *
****************************************************/
-gboolean ges_track_element_set_track (GESTrackElement * object, GESTrack * track);
+G_GNUC_INTERNAL gboolean ges_track_element_set_track (GESTrackElement * object, GESTrack * track);
+G_GNUC_INTERNAL guint32 _ges_track_element_get_layer_priority (GESTrackElement * element);
#endif /* __GES_INTERNAL_H__ */
self->priv->priority = 0;
self->priv->auto_transition = FALSE;
- self->min_gnl_priority = 0;
- self->max_gnl_priority = LAYER_HEIGHT;
+ self->min_gnl_priority = MIN_GNL_PRIO;
+ self->max_gnl_priority = LAYER_HEIGHT + MIN_GNL_PRIO;
}
/**
if (priority != layer->priv->priority) {
layer->priv->priority = priority;
- layer->min_gnl_priority = (priority * LAYER_HEIGHT);
- layer->max_gnl_priority = ((priority + 1) * LAYER_HEIGHT) - 1;
+ layer->min_gnl_priority = (priority * LAYER_HEIGHT) + MIN_GNL_PRIO;
+ layer->max_gnl_priority = ((priority + 1) * LAYER_HEIGHT) + MIN_GNL_PRIO;
ges_layer_resync_priorities (layer);
}
gboolean valid = TRUE;
GESSimpleLayerPrivate *priv = self->priv;
- priority = GES_LAYER (self)->min_gnl_priority + 2;
+ priority = GES_LAYER (self)->min_gnl_priority;
GST_DEBUG ("recalculating values");
start_or_end);
/* Only object that are in that layer and track */
- if ((_PRIORITY (next) / LAYER_HEIGHT) != layer_prio ||
+ if (_ges_track_element_get_layer_priority (next) != layer_prio ||
(track && track != ges_track_element_get_track (next)))
continue;
track = ges_track_element_get_track (track_element);
layer_node = g_list_find_custom (timeline->layers,
- GINT_TO_POINTER (_PRIORITY (track_element) / LAYER_HEIGHT),
+ GINT_TO_POINTER (_ges_track_element_get_layer_priority (track_element)),
(GCompareFunc) find_layer_by_prio);
_create_transitions_on_layer (timeline,
TrackObjIters *iters;
GESTimelinePrivate *priv = timeline->priv;
- guint layer_prio = _PRIORITY (trackelement) / LAYER_HEIGHT;
+ guint layer_prio = _ges_track_element_get_layer_priority (trackelement);
GList *layer_node = g_list_find_custom (timeline->layers,
GINT_TO_POINTER (layer_prio), (GCompareFunc) find_layer_by_prio);
GESLayer *layer = layer_node ? layer_node->data : NULL;
GESTimelinePrivate *priv = timeline->priv;
GList *layer_node = g_list_find_custom (timeline->layers,
- GINT_TO_POINTER (_PRIORITY (child) / LAYER_HEIGHT),
+ GINT_TO_POINTER (_ges_track_element_get_layer_priority (child)),
(GCompareFunc) find_layer_by_prio);
GESLayer *layer = layer_node ? layer_node->data : NULL;
TrackObjIters *iters = g_hash_table_lookup (priv->obj_iters,
priv->pending_start = 0;
priv->pending_inpoint = 0;
priv->pending_duration = GST_SECOND;
- priv->pending_priority = 1;
+ priv->pending_priority = MIN_GNL_PRIO;
priv->pending_active = TRUE;
priv->properties_hashtable = NULL;
priv->bindings_hashtable = g_hash_table_new_full (g_str_hash, g_str_equal,
{
GESTrackElement *object = GES_TRACK_ELEMENT (element);
+ if (priority <= MIN_GNL_PRIO) {
+ GST_INFO_OBJECT (element, "Priority (%d) < MIN_GNL_PRIO, setting it to %d",
+ priority, MIN_GNL_PRIO);
+ priority = MIN_GNL_PRIO;
+ }
+
GST_DEBUG ("object:%p, priority:%" G_GUINT32_FORMAT, object, priority);
if (object->priv->gnlobject != NULL) {
return priv->bindings_hashtable;
}
+guint32
+_ges_track_element_get_layer_priority (GESTrackElement * element)
+{
+ if (_PRIORITY (element) < LAYER_HEIGHT + MIN_GNL_PRIO)
+ return 0;
+
+ return (_PRIORITY (element) - MIN_GNL_PRIO) / LAYER_HEIGHT;
+}
+
/**
* ges_track_element_get_track:
* @object: a #GESTrackElement
g_object_set (gnlsrc, "start", new_gap->start, "duration", new_gap->duration,
- "priority", 0, NULL);
+ "priority", 1, NULL);
GST_DEBUG_OBJECT (track,
"Created gap with start %" GST_TIME_FORMAT " duration %" GST_TIME_FORMAT,
fail_unless (ges_timeline_commit (timeline));
/* And let's also check that it propagated correctly to GNonLin */
gnl_object_check (ges_track_element_get_gnlobject (trackelement), 42, 51, 12,
- 51, 0, TRUE);
+ 51, MIN_GNL_PRIO, TRUE);
/* Change more properties, see if they propagate */
g_object_set (clip, "start", (guint64) 420, "duration", (guint64) 510,
fail_unless (ges_timeline_commit (timeline));
/* And let's also check that it propagated correctly to GNonLin */
gnl_object_check (ges_track_element_get_gnlobject (trackelement), 420, 510,
- 120, 510, 0, TRUE);
+ 120, 510, MIN_GNL_PRIO + 0, TRUE);
/* Test mute support */
g_object_set (clip, "mute", TRUE, NULL);
fail_unless (ges_timeline_commit (timeline));
gnl_object_check (ges_track_element_get_gnlobject (trackelement), 420, 510,
- 120, 510, 0, FALSE);
+ 120, 510, MIN_GNL_PRIO + 0, FALSE);
g_object_set (clip, "mute", FALSE, NULL);
fail_unless (ges_timeline_commit (timeline));
gnl_object_check (ges_track_element_get_gnlobject (trackelement), 420, 510,
- 120, 510, 0, TRUE);
+ 120, 510, MIN_GNL_PRIO + 0, TRUE);
ges_container_remove (GES_CONTAINER (clip),
GES_TIMELINE_ELEMENT (trackelement));
/* And let's also check that it propagated correctly to GNonLin */
gnl_object_check (ges_track_element_get_gnlobject (trackelement), 42, 51, 12,
- 51, 0, TRUE);
+ 51, MIN_GNL_PRIO, TRUE);
/* Change more properties, see if they propagate */
g_object_set (clip, "start", (guint64) 420, "duration", (guint64) 510,
/* And let's also check that it propagated correctly to GNonLin */
ges_timeline_commit (timeline);
gnl_object_check (ges_track_element_get_gnlobject (trackelement), 420, 510,
- 120, 510, 0, TRUE);
+ 120, 510, MIN_GNL_PRIO + 0, TRUE);
/* This time, we move the trackelement to see if the changes move
assert_equals_uint64 (_START (clip), 400);
assert_equals_uint64 (_START (trackelement), 400);
gnl_object_check (ges_track_element_get_gnlobject (trackelement), 400, 510,
- 120, 510, 0, TRUE);
+ 120, 510, MIN_GNL_PRIO + 0, TRUE);
ges_container_remove (GES_CONTAINER (clip),
GES_TIMELINE_ELEMENT (trackelement));
/* And let's also check that it propagated correctly to GNonLin */
gnl_object_check (ges_track_element_get_gnlobject (trackelement), 42, 50, 12,
- 50, 0, TRUE);
+ 50, MIN_GNL_PRIO, TRUE);
splitclip = ges_clip_split (clip, 67);
fail_unless (GES_IS_CLIP (splitclip));
assert_equals_int (g_list_length (GES_CONTAINER_CHILDREN (source)), 1);
video_source = GES_CONTAINER_CHILDREN (source)->data;
fail_unless (GES_IS_VIDEO_TEST_SOURCE (video_source));
- assert_equals_int (_PRIORITY (video_source), 2);
+ assert_equals_int (_PRIORITY (video_source), MIN_GNL_PRIO);
GST_DEBUG ("Create effect");
effect = ges_effect_new ("agingtv");
GES_TIMELINE_ELEMENT (effect)));
fail_unless (ges_track_element_get_track (GES_TRACK_ELEMENT (effect)) ==
track_video);
- assert_equals_int (_PRIORITY (effect), 2);
- assert_equals_int (_PRIORITY (video_source), 3);
+ assert_equals_int (_PRIORITY (effect), MIN_GNL_PRIO + 0);
+ assert_equals_int (_PRIORITY (video_source), MIN_GNL_PRIO + 1);
GST_DEBUG ("Adding effect 1");
fail_unless (ges_container_add (GES_CONTAINER (source),
GES_TIMELINE_ELEMENT (effect1)));
fail_unless (ges_track_element_get_track (GES_TRACK_ELEMENT (effect1)) ==
track_video);
- assert_equals_int (_PRIORITY (effect), 2);
- assert_equals_int (_PRIORITY (effect1), 3);
- assert_equals_int (_PRIORITY (video_source), 4);
+ assert_equals_int (_PRIORITY (effect), MIN_GNL_PRIO);
+ assert_equals_int (_PRIORITY (effect1), MIN_GNL_PRIO + 1);
+ assert_equals_int (_PRIORITY (video_source), MIN_GNL_PRIO + 2);
GST_DEBUG ("Adding effect 2");
fail_unless (ges_container_add (GES_CONTAINER (source),
fail_unless (GES_IS_EFFECT (video_effect));
/* FIXME This is ridiculus, both effects should have the same priority (0) */
- assert_equals_int (_PRIORITY (audio_effect), 0);
- assert_equals_int (_PRIORITY (video_effect), 1);
+ assert_equals_int (_PRIORITY (audio_effect), MIN_GNL_PRIO);
+ assert_equals_int (_PRIORITY (video_effect), MIN_GNL_PRIO + 1);
assert_equals_int (GES_CONTAINER_HEIGHT (effect_clip), 2);
effect = ges_effect_new ("agingtv");
fail_unless (ges_clip_set_top_effect_priority (GES_CLIP (effect_clip),
GES_BASE_EFFECT (effect1), 0));
- assert_equals_int (_PRIORITY (effect), 3);
- assert_equals_int (_PRIORITY (effect1), 0);
+ assert_equals_int (_PRIORITY (effect), 3 + MIN_GNL_PRIO);
+ assert_equals_int (_PRIORITY (effect1), 0 + MIN_GNL_PRIO);
assert_equals_int (GES_CONTAINER_HEIGHT (effect_clip), 4);
fail_unless (ges_clip_set_top_effect_priority (GES_CLIP (effect_clip),
GES_BASE_EFFECT (effect1), 3));
- assert_equals_int (_PRIORITY (effect), 2);
- assert_equals_int (_PRIORITY (effect1), 3);
+ assert_equals_int (_PRIORITY (effect), 2 + MIN_GNL_PRIO);
+ assert_equals_int (_PRIORITY (effect1), 3 + MIN_GNL_PRIO);
assert_equals_int (GES_CONTAINER_HEIGHT (effect_clip), 4);
effects = ges_clip_get_top_effects (GES_CLIP (effect_clip));
assert_equals_uint64 (_PRIORITY (clip), 0);
ges_timeline_commit (timeline);
gnl_object_check (ges_track_element_get_gnlobject (trackelement), 42, 51, 12,
- 51, 0, TRUE);
+ 51, MIN_GNL_PRIO, TRUE);
/* Change the priority of the layer */
g_object_set (layer, "priority", 1, NULL);
assert_equals_uint64 (_PRIORITY (clip), 0);
ges_timeline_commit (timeline);
gnl_object_check (ges_track_element_get_gnlobject (trackelement), 42, 51, 12,
- 51, LAYER_HEIGHT, TRUE);
+ 51, LAYER_HEIGHT + MIN_GNL_PRIO, TRUE);
/* Change it to an insanely high value */
g_object_set (layer, "priority", 31, NULL);
assert_equals_uint64 (_PRIORITY (clip), 0);
ges_timeline_commit (timeline);
gnl_object_check (ges_track_element_get_gnlobject (trackelement), 42, 51, 12,
- 51, LAYER_HEIGHT * 31, TRUE);
+ 51, MIN_GNL_PRIO + LAYER_HEIGHT * 31, TRUE);
/* and back to 0 */
g_object_set (layer, "priority", 0, NULL);
assert_equals_uint64 (_PRIORITY (clip), 0);
ges_timeline_commit (timeline);
gnl_object_check (ges_track_element_get_gnlobject (trackelement), 42, 51, 12,
- 51, 0, TRUE);
+ 51, MIN_GNL_PRIO + 0, TRUE);
gst_object_unref (trackelement);
fail_unless (ges_layer_remove_clip (layer, clip));
gnlobj1 = ges_track_element_get_gnlobject (trackelement1);
fail_unless (gnlobj1 != NULL);
g_object_get (gnlobj1, "priority", &prio1, NULL);
- assert_equals_int (prio1, 0);
+ assert_equals_int (prio1, MIN_GNL_PRIO);
assert_equals_int (_PRIORITY (clip2), 1);
gnlobj2 = ges_track_element_get_gnlobject (trackelement2);
fail_unless (gnlobj2 != NULL);
g_object_get (gnlobj2, "priority", &prio2, NULL);
/* clip2 is on the second layer and has a priority of 1 */
- assert_equals_int (prio2, LAYER_HEIGHT + 1);
+ assert_equals_int (prio2, MIN_GNL_PRIO + LAYER_HEIGHT + 1);
assert_equals_int (_PRIORITY (clip3), LAYER_HEIGHT - 1);
gnlobj3 = ges_track_element_get_gnlobject (trackelement3);
/* clip3 is on the third layer and has a priority of LAYER_HEIGHT + 1
* it priority must have the maximum priority of this layer*/
g_object_get (gnlobj3, "priority", &prio3, NULL);
- assert_equals_int (prio3, LAYER_HEIGHT * 3 - 1);
+ assert_equals_int (prio3, MIN_GNL_PRIO + LAYER_HEIGHT * 3 - 1);
/* Move layers around */
g_object_set (layer1, "priority", 2, NULL);
g_object_get (gnlobj1, "priority", &prio1, NULL);
g_object_get (gnlobj2, "priority", &prio2, NULL);
g_object_get (gnlobj3, "priority", &prio3, NULL);
- assert_equals_int (prio1, 2 * LAYER_HEIGHT);
- assert_equals_int (prio2, 1);
- assert_equals_int (prio3, LAYER_HEIGHT * 2 - 1);
+ assert_equals_int (prio1, 2 * LAYER_HEIGHT + MIN_GNL_PRIO);
+ assert_equals_int (prio2, MIN_GNL_PRIO + 1);
+ assert_equals_int (prio3, LAYER_HEIGHT * 2 - 1 + MIN_GNL_PRIO);
/* And move objects around */
fail_unless (ges_clip_move_to_layer (clip2, layer1));
g_object_get (gnlobj1, "priority", &prio1, NULL);
g_object_get (gnlobj2, "priority", &prio2, NULL);
g_object_get (gnlobj3, "priority", &prio3, NULL);
- assert_equals_int (prio1, 2 * LAYER_HEIGHT);
- assert_equals_int (prio2, 2 * LAYER_HEIGHT + 1);
- assert_equals_int (prio3, LAYER_HEIGHT * 3 - 1);
+ assert_equals_int (prio1, 2 * LAYER_HEIGHT + MIN_GNL_PRIO);
+ assert_equals_int (prio2, 2 * LAYER_HEIGHT + 1 + MIN_GNL_PRIO);
+ assert_equals_int (prio3, LAYER_HEIGHT * 3 - 1 + MIN_GNL_PRIO);
/* And change TrackElement-s priorities and check that changes are not
* refected on it containing Clip */
/* And let's also check that it propagated correctly to GNonLin */
gnl_object_check (ges_track_element_get_gnlobject (trackelement), 42, 51, 12,
- 51, 0, TRUE);
+ 51, MIN_GNL_PRIO, TRUE);
/* Change more properties, see if they propagate */
g_object_set (clip, "start", (guint64) 420, "duration", (guint64) 510,
/* And let's also check that it propagated correctly to GNonLin */
gnl_object_check (ges_track_element_get_gnlobject (trackelement), 420, 510,
- 120, 510, 0, TRUE);
+ 120, 510, MIN_GNL_PRIO + 0, TRUE);
ges_container_remove (GES_CONTAINER (clip),
GES_TIMELINE_ELEMENT (trackelement));
assert_equals_int (nb_scratch_lines, 12);
gnl_object_check (ges_track_element_get_gnlobject (trackelement),
- 0, 1000000000, 0, 1000000000, 0, TRUE);
+ 0, 1000000000, 0, 1000000000, MIN_GNL_PRIO, TRUE);
} else {
gnl_object_check (ges_track_element_get_gnlobject (trackelement),
- 0, 1000000000, 0, 1000000000, 1, TRUE);
+ 0, 1000000000, 0, 1000000000, MIN_GNL_PRIO + 1, TRUE);
}
}
break;
#include <gst/check/gstcheck.h>
GESTimelinePipeline * ges_test_create_pipeline (GESTimeline *timeline);
+/* The first 2 GNL priorities are used for:
+ * 0- The Mixing element
+ * 1- The Gaps
+ */
+#define MIN_GNL_PRIO 2
+
gchar * ges_test_get_audio_only_uri (void);
gchar * ges_test_get_audio_video_uri (void);
gchar * ges_test_get_image_uri (void);
/* And let's also check that it propagated correctly to GNonLin */
gnl_object_check (ges_track_element_get_gnlobject (trackelement), 42, 51, 12,
- 51, 0, TRUE);
+ 51, MIN_GNL_PRIO, TRUE);
/* Change more properties, see if they propagate */
g_object_set (clip, "start", (guint64) 420, "duration", (guint64) 510,
/* And let's also check that it propagated correctly to GNonLin */
gnl_object_check (ges_track_element_get_gnlobject (trackelement), 420, 510,
- 120, 510, 0, TRUE);
+ 120, 510, MIN_GNL_PRIO + 0, TRUE);
ges_container_remove (GES_CONTAINER (clip),
GES_TIMELINE_ELEMENT (trackelement));
/* And let's also check that it propagated correctly to GNonLin */
gnl_object_check (ges_track_element_get_gnlobject (trackelement), 42, 51, 12,
- 51, 0, TRUE);
+ 51, MIN_GNL_PRIO, TRUE);
/* Change more properties, see if they propagate */
g_object_set (clip, "start", (guint64) 420, "duration", (guint64) 510,
/* And let's also check that it propagated correctly to GNonLin */
gnl_object_check (ges_track_element_get_gnlobject (trackelement), 420, 510,
- 120, 510, 0, TRUE);
+ 120, 510, MIN_GNL_PRIO + 0, TRUE);
/* test changing vtype */
GST_DEBUG ("Setting to crossfade");
/* And let's also check that it propagated correctly to GNonLin */
gnl_object_check (ges_track_element_get_gnlobject (trackelement), 42, 51, 12,
- 51, 0, TRUE);
+ 51, MIN_GNL_PRIO, TRUE);
/* Change more properties, see if they propagate */
g_object_set (clip, "start", (guint64) 420, "duration", (guint64) 510,
/* And let's also check that it propagated correctly to GNonLin */
gnl_object_check (ges_track_element_get_gnlobject (trackelement), 420, 510,
- 120, 510, 0, TRUE);
+ 120, 510, MIN_GNL_PRIO + 0, TRUE);
/* Test mute support */
g_object_set (clip, "mute", TRUE, NULL);
ges_timeline_commit (timeline);
gnl_object_check (ges_track_element_get_gnlobject (trackelement), 420, 510,
- 120, 510, 0, FALSE);
+ 120, 510, MIN_GNL_PRIO + 0, FALSE);
g_object_set (clip, "mute", FALSE, NULL);
ges_timeline_commit (timeline);
gnl_object_check (ges_track_element_get_gnlobject (trackelement), 420, 510,
- 120, 510, 0, TRUE);
+ 120, 510, MIN_GNL_PRIO + 0, TRUE);
ges_container_remove (GES_CONTAINER (clip),
GES_TIMELINE_ELEMENT (trackelement));